merge in new upstream WPILib for 2014 (20130302 update)
diff --git a/.gitignore b/.gitignore
index 0879261..0d20b64 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1 @@
-/out_atom/
-/out_crio/
-/output/
 *.pyc
diff --git a/971CV/src/org/frc971/AccepterThread.java b/971CV/src/org/frc971/AccepterThread.java
deleted file mode 100644
index 1cd71e8..0000000
--- a/971CV/src/org/frc971/AccepterThread.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * 
- */
-package org.frc971;
-
-/**
- * @author daniel
- * Accepts clients for data server
- */
-
-import java.io.IOException;
-
-import java.nio.ByteBuffer;
-import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-public class AccepterThread extends Thread {
-	
-	private final static Logger LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
-	
-	private ServerSocketChannel sock;
-	
-	private List<SocketChannel> connected = new ArrayList<SocketChannel>(); 
-	
-	/* Holds overflow data when socket's send buffer gets full, so that
-	 * thread can continue running.
-	 */
-	private Map<SocketChannel, ByteBuffer> toSend;
-	/* Keeps track of how many times a write operation on a socket
-	 * has failed because it's buffer was full.
-	 */
-	private Map<SocketChannel, Integer> failedAttempts; //doesn't like primitive types
-	
-	/** Helper function to completely erase a peer from
-	 *  all three lists and maps that might contain it.
-	 */
-	private void erasePeer(SocketChannel peer) {
-		connected.remove(peer);
-		toSend.remove(peer);
-		failedAttempts.remove(peer);
-	}
-	
-	/** Constructor
-	 * 
-	 * @param sock is the ServerSocketChannel that you want to monitor
-	 */
-	public AccepterThread(ServerSocketChannel sock) {
-		super("Accepter Thread");
-		setPriority(3); //lowish priority so Image Processor overrides it
-		this.sock = sock;
-		start();
-	}
-	
-	/** Runs in separate thread. Continually accepts new connections. */
-	public void run() {
-		SocketChannel clientSock;
-		while (true) {
-			try {
-				clientSock = sock.accept();
-				//our writes must not block
-				clientSock.configureBlocking(false);
-				connected.add(clientSock);
-			}
-			catch (IOException e) {
-				LOG.warning("Cannot serve image processing results to client:" + e.getMessage());
-				Messages.warning("Cannot serve image processing results to client:" + e.getMessage());
-			}
-		}
-	}
-	
-	/** Sends a message to all currently connected clients.
-	 * 
-	 * @param message is the message that you want to send.
-	 */
-	public void sendtoAll(ByteBuffer message) {
-		/* Copy our connected list, so we don't have 
-		 * to hold our lock forever if the writes block.
-		 */
-		List<SocketChannel> connectedTemp = new ArrayList<SocketChannel>();
-		for (SocketChannel channel : connected) {
-			connectedTemp.add(channel);
-		}
-		
-		int result;
-		for (SocketChannel conn : connectedTemp) {
-			try {
-				
-				/** If this socket has data from the 
-				 * last send operation still waiting to be
-				 * sent, send this instead of our original
-				 * message. Since we generally want only
-				 * current data, our original message will
-				 * not be missed. However, it is imperative
-				 * that we finish our pending transmission, 
-				 * because an incomplete transmission could
-				 * leave a client thread somewhere blocking
-				 * indefinitely.
-				 */
-				if (toSend.containsKey(conn)) {
-					message = toSend.get(conn);
-				}
-				
-				result = conn.write(message);
-				
-				/*if our send buffer is full, store our message away
-				 * so we can try again later without halting the thread.
-				 */
-				if (message.remaining() > 0) {
-					toSend.put(conn, message);
-					//check and update our count of failed send attempts
-					if (failedAttempts.containsKey(conn)) {
-						int failures = failedAttempts.get(conn);
-						++failures;
-						if (failures >= 100) {
-							//Socket has become dysfunctional
-							LOG.info("Write would have blocked 100 times. Assuming peer disconect.");
-							erasePeer(conn);
-						}
-						failedAttempts.put(conn, failures);
-					}
-					else {
-						failedAttempts.put(conn, 1);
-					}
-				}
-				
-				if (result == -1) {
-					//The write failed. This is probably because the client disconnected.
-					LOG.info("Write returned -1. Client has probably disconnected.");
-					erasePeer(conn);
-				}
-			}
-			catch (IOException e) {
-				//The write failed. This is probably because the client disconnected.
-				LOG.info("Write threw IOException. Client has probably disconnected.");
-				erasePeer(conn);
-			}
-		}
-	}
-	
-	/** Overloaded sendtoAll method for byte arrays. */
-	public void sendtoAll(byte[] message) {
-		sendtoAll(ByteBuffer.wrap(message));
-	}
-	
-	/** Overloaded sendtoAll method for Strings. */
-	public void sendtoAll(String message) {
-		sendtoAll(message.getBytes());
-	}
-}
diff --git a/971CV/src/org/frc971/DebugCanvas.java b/971CV/src/org/frc971/DebugCanvas.java
deleted file mode 100644
index 484620c..0000000
--- a/971CV/src/org/frc971/DebugCanvas.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.frc971;

-

-import com.googlecode.javacv.CanvasFrame;

-import com.googlecode.javacv.cpp.opencv_core.IplImage;

-

-public class DebugCanvas {

-    public boolean show;

-    private CanvasFrame canvasFrame;

-    private String name;

-

-    public DebugCanvas(String name) {

-	this.name = name;

-    }

-

-    public void showImage(IplImage image) {

-        if (show) {

-            if (canvasFrame == null) {

-        	canvasFrame = new CanvasFrame(name);

-            }

-            canvasFrame.setName(name);

-            canvasFrame.showImage(image.getBufferedImage());

-        } else {

-            if (canvasFrame != null) {

-        	canvasFrame.dispose();

-        	canvasFrame = null;

-            }

-        }

-    }

-}

diff --git a/971CV/src/org/frc971/DebugServerRun.java b/971CV/src/org/frc971/DebugServerRun.java
deleted file mode 100644
index cccf241..0000000
--- a/971CV/src/org/frc971/DebugServerRun.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.frc971;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
-
-import java.util.Arrays;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.googlecode.javacv.OpenCVFrameGrabber;
-import com.googlecode.javacv.cpp.opencv_core.*;
-import static com.googlecode.javacv.cpp.opencv_highgui.*;
-
-public class DebugServerRun {
-	
-		private final static Logger LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
-		
-		final OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(-1);
-		
-		private ServerSocketChannel sock;
-		private SocketChannel client;
-	
-	/** Constructs a formatted boundary header from a timestamp and content length. */	
-	private ByteBuffer CreateTransmission(long content_length, double timestamp) {
-		StringBuilder ret = new StringBuilder();
-		ret.append("\r\n--boundarydonotcross\r\n");
-        ret.append("Content-Type: image/jpeg\r\n");
-        ret.append("Content-Length: ");
-        ret.append(content_length);
-        ret.append("\r\n");
-        ret.append("X-Timestamp: ");
-        ret.append(timestamp);
-        ret.append("\r\n\r\n");
-        return ByteBuffer.wrap(ret.toString().getBytes());
-	}
-	
-	/** Loop that pushes a data stream to the client. */
-	private void push() {
-		try {
-			grabber.start();
-		}
-		catch (Exception e) {
-			LOG.severe("Could not start frame grabber.");
-			return;
-		}
-		IplImage img;
-		long content_size;
-		File buff_file;
-		InputStream input;
-		double timestamp;
-		while (true) {
-			//get some image data
-			try {
-				img = grabber.grab();
-				timestamp = System.currentTimeMillis();
-				/*We buffer through /dev/shm, just to make the conversion process easier.
-				 * I know this is really ugly, but it works a lot better than what
-				 * I was doing before, which segfaulted.
-				 */
-				cvSaveImage("/dev/shm/DebugServerBuffer.jpg", img);
-				buff_file = new File("/dev/shm/DebugServerBuffer.jpg");
-				content_size = buff_file.length();
-				int totalBytesRead = 0;
-		        input = new BufferedInputStream(new FileInputStream(buff_file));
-		        byte[] result = new byte[(int)content_size];
-		        while(totalBytesRead < result.length){
-		          int bytesRemaining = result.length - totalBytesRead;
-		          //input.read() returns -1, 0, or more :
-		          int bytesRead = input.read(result, totalBytesRead, bytesRemaining); 
-		          if (bytesRead > 0){
-		            totalBytesRead = totalBytesRead + bytesRead;
-		          }
-		        }
-		        ByteBuffer header = CreateTransmission(content_size, timestamp);
-		        ByteBuffer bbuf = ByteBuffer.wrap(result);
-		        ByteBuffer to_send = ByteBuffer.allocate(header.capacity() + bbuf.capacity());
-		        to_send.put(header);
-		        to_send.put(bbuf);
-		        to_send.rewind();
-		        SocketCommon.sendAll(client, to_send);
-			}
-			catch (Exception e) {
-				LOG.warning("Could not grab frame.");
-				continue;
-			}
-		}
-	}
-	
-	/** Constructor to start the server and bind it to a port. */
-	public DebugServerRun(final int port) throws IOException {
-		sock = ServerSocketChannel.open();
-		sock.socket().bind(new InetSocketAddress(9714));
-		client = sock.accept();
-		client.configureBlocking(false);
-		//we are now connected to our client. Wait for them to send us a header.
-		LOG.info("Reading headers...");
-		SocketCommon.readtoBoundary(client, "\r\n\r\n");
-		//send one back
-		LOG.info("Writing headers...");
-		SocketCommon.sendAll(client, "donotcross\r\n");
-	}
-	
-	/** Runs the server, and concurrently starts the vision processor with -vision flag. */
-	public static void main(final String args[]) throws IOException {
-		//main function for server
-		
-		String atomIP = null;
-    	try {
-    		atomIP = args[0];
-    	}
-    	catch (ArrayIndexOutOfBoundsException e) {
-    		System.out.println("Usage: VisionTuner [atom ip]");
-    		System.exit(0);
-    	}
-		
-		//set logger to log everything
-        LOG.setLevel(Level.ALL);
-        try {
-        	LogHandler handler = new LogHandler("ds_vision.log");
-        	TimeFormatter formatter = new TimeFormatter();
-            handler.setFormatter(formatter);
-            LOG.addHandler(handler);
-        }
-        catch (FileNotFoundException e) {
-        	System.err.println("Warning: Logging initialization failed.");
-        }
-        
-		if (Arrays.asList(args).contains("-vision")) {
-			LOG.info("Starting vision processor.");
-			new TestClient(atomIP);
-		}
-		
-		DebugServerRun server = new DebugServerRun(9714);
-		server.push();
-	}
-}
diff --git a/971CV/src/org/frc971/HTTPClient.java b/971CV/src/org/frc971/HTTPClient.java
deleted file mode 100644
index 96308a1..0000000
--- a/971CV/src/org/frc971/HTTPClient.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.frc971;
-
-//@author: daniel
-
-import java.io.*;
-import java.net.*;
-
-import java.awt.image.BufferedImage;
-
-import java.nio.channels.SocketChannel;
-import java.nio.ByteBuffer;
-
-import java.util.logging.Logger;
-
-import javax.imageio.ImageIO;
-
-import aos.ChannelImageGetter;
-
-import edu.wpi.first.wpijavacv.WPIColorImage;
-
-public class HTTPClient {
-	//Connects to HTTP Server on robot and receives images
-	
-	/** whether or not to print debug messages to stdout. */
-	private final static boolean LOCAL_DEBUG = false;
-	
-	private String atomIP;
-	
-	private SocketChannel sock;
-	
-	private ChannelImageGetter cgetter;
-	
-	private final static Logger LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
-	
-	/** Small helper method for printing debug messages to stdout. */
-	private void WriteDebug(String message) {
-		//small helper function to write debug messages
-		if (LOCAL_DEBUG)
-			LOG.info("LOCAL_DEBUG: " + message);
-	}
-	
-	/** the constructor, initializes connection, and sets up aos getter. 
-	 * @throws IOException */
-	public HTTPClient(String atomIP) throws IOException {
-		//Initialize socket connection to robot
-		this.atomIP = atomIP;
-		sock = SocketChannel.open();
-		WriteDebug("Connecting to server at " + atomIP);
-		sock.connect(new InetSocketAddress(atomIP, 9714));
-		sock.configureBlocking(false);
-		//Write headers
-		//HTTPStreamer does not actually use the headers, so we can just write terminating chars.
-		WriteDebug("Writing headers...");
-		SocketCommon.sendAll(sock, "\r\n\r\n");
-		//Receive headers
-		WriteDebug("Reading headers...");
-		SocketCommon.readtoBoundary(sock, "donotcross\r\n");
-		WriteDebug("Now receiving data.");
-		cgetter = new ChannelImageGetter(sock);
-	}
-	
-	/** Grabs the most current frame from the HTTPStreamer stream.
-	 * Returns a class instance with image and timestamp attributes. */
-	public ImageWithTimestamp GetFrame() {
-		ImageWithTimestamp final_image = new ImageWithTimestamp();
-		//Use Brian's code to extract an image and timestamp from raw server data.
-		ByteBuffer binaryImage = cgetter.getJPEG();
-		if (binaryImage == null) {
-			Messages.severe("Could not parse data from robot. See the log for details.");
-			return null;
-		}
-		//Decode ByteBuffer into an IplImage
-		byte[] b = new byte[binaryImage.remaining()];
-		binaryImage.get(b);
-		try {
-			InputStream iis = new ByteArrayInputStream(b);
-			BufferedImage bImageFromConvert = ImageIO.read(iis);
-			final_image.image = new WPIColorImage(bImageFromConvert);
-			final_image.timestamp = cgetter.getTimestamp();
-			WriteDebug("Image processing successful.");
-			return final_image;
-		}
-		catch (IOException e) {
-			LOG.warning("Image processing failed: " + e.getMessage());
-			return null;
-		}
-	}	
-	
-	/** Gets the name to display at the top of the image window. */
-	public String GetName() {
-		return atomIP;
-	}
-}
diff --git a/971CV/src/org/frc971/ImageWithTimestamp.java b/971CV/src/org/frc971/ImageWithTimestamp.java
deleted file mode 100644
index 51b156f..0000000
--- a/971CV/src/org/frc971/ImageWithTimestamp.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.frc971;
-
-import edu.wpi.first.wpijavacv.WPIColorImage;
-
-/** Small helper class for associating images and timestamps. */
-public class ImageWithTimestamp {
-	WPIColorImage image = null;
-	double timestamp;
-}
diff --git a/971CV/src/org/frc971/LogHandler.java b/971CV/src/org/frc971/LogHandler.java
deleted file mode 100644
index fd486fb..0000000
--- a/971CV/src/org/frc971/LogHandler.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * 
- */
-package org.frc971;
-
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.PrintWriter;
-
-import java.util.logging.Handler;
-import java.util.logging.LogRecord;
-
-/**
- * @author daniel
- * 
- */
-
-/** Logs data to custom files, using specific formatting. */
-public class LogHandler extends Handler {
-	
-	private FileOutputStream ofstream;
-	PrintWriter writer;
-	
-	/** Constructor for log handler. 
-	 * 
-	 * @param filename is the name of the file you want to log to.
-	 * @throws FileNotFoundException if file cannot be opened or created.
-	 */
-	public LogHandler (String filename) throws FileNotFoundException {
-		super();
-		
-		if (filename == null || filename == "") {
-			filename = "logfile.log";
-		}
-		
-		//check if file exists, and if not, create it
-		ofstream = new FileOutputStream(filename);
-		writer = new PrintWriter(ofstream);
-		setFormatter(new TimeFormatter());
-	}
-	
-	/*Required methods*/
-	
-	/** Is required by API. Writes a new message to the log.
-	 * @param message is the message you want to log.
-	 */
-	public void publish(LogRecord message) {
-		//record a message
-		if (!isLoggable(message)) {
-			//ensure that this message should be logged by this handler
-			return;
-		}
-		writer.print(getFormatter().format(message)); //Formatter adds trailing \n
-	}
-	
-	/** Is required by API. Flushes the writer. */
-	public void flush() {
-		writer.flush();
-	}
-	
-	/** Is required by API. Closes logfile. */
-	public void close() throws SecurityException {
-		writer.close();
-	}
-}
diff --git a/971CV/src/org/frc971/Recognizer.java b/971CV/src/org/frc971/Recognizer.java
deleted file mode 100644
index 9292357..0000000
--- a/971CV/src/org/frc971/Recognizer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.frc971;

-

-import edu.wpi.first.wpijavacv.WPIColorImage;

-

-/**

- * Vision target recognizer.

- *

- * @author jerry

- */

-public interface Recognizer {

-

-    /**

-     * Sets the HSV filter to allow H in [minHue .. maxHue], S >= minSat,

-     * V >= minVal.

-     */

-    void setHSVRange(int minHue, int maxHue, int minSat, int minVal);

-

-    int getHueMin();

-    int getHueMax();

-    int getSatMin();

-    int getValMin();

-

-    /** Enables/disables windows to view intermediate stages, for tuning. */

-    void showIntermediateStages(boolean enable);

-

-    /**

-     * Processes a camera image, returning an image to display for targeting

-     * and debugging, e.g. with cross-hairs and marked targets.

-     *<p>

-     * SIDE EFFECTS: May modify cameraImage.

-     */

-    Target processImage(WPIColorImage cameraImage);

-}

diff --git a/971CV/src/org/frc971/Recognizer2013.java b/971CV/src/org/frc971/Recognizer2013.java
deleted file mode 100644
index 812c78b..0000000
--- a/971CV/src/org/frc971/Recognizer2013.java
+++ /dev/null
@@ -1,296 +0,0 @@
-package org.frc971;

-

-import java.util.ArrayList;

-import java.util.logging.Logger;

-

-import com.googlecode.javacv.cpp.opencv_core;

-import com.googlecode.javacv.cpp.opencv_core.CvSize;

-import com.googlecode.javacv.cpp.opencv_core.IplImage;

-import com.googlecode.javacv.cpp.opencv_imgproc;

-import com.googlecode.javacv.cpp.opencv_imgproc.IplConvKernel;

-

-import edu.wpi.first.wpijavacv.DaisyExtensions;

-import edu.wpi.first.wpijavacv.WPIBinaryImage;

-import edu.wpi.first.wpijavacv.WPIColor;

-import edu.wpi.first.wpijavacv.WPIColorImage;

-import edu.wpi.first.wpijavacv.WPIContour;

-import edu.wpi.first.wpijavacv.WPIPoint;

-import edu.wpi.first.wpijavacv.WPIPolygon;

-

-/**

- * Vision target recognizer for FRC 2013.

- *

- * @author jrussell

- * @author jerry

- */

-public class Recognizer2013 implements Recognizer {

-	

-	private final static Logger LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

-

-    // --- Tunable recognizer constants.

-    static final double kRoughlyHorizontalSlope = Math.tan(Math.toRadians(30));

-    static final double kRoughlyVerticalSlope = Math.tan(Math.toRadians(90 - 30));

-    static final int kHoleClosingIterations = 2;

-    static final double kPolygonPercentFit = 12;

-    static final int kMinWidthAt320 = 35; // for high goal and middle goals

-

-    // --- Field dimensions.

-    // The target aspect ratios are for the midlines of the vision target tape.

-    static final double kGoalWidthIn = 54; // of the high and middle targets

-    static final double kTargetWidthIn = kGoalWidthIn + 4;

-    static final double kHighGoalAspect = (21 + 4) / kTargetWidthIn;

-    static final double kMiddleGoalAspect = (24 + 4) / kTargetWidthIn;

-    static final double kMinAspect = kHighGoalAspect * 0.6;

-    static final double kMaxAspect = kMiddleGoalAspect * 1.4;

-    static final double kTopTargetHeightIn = 104.125 + 21.0/2; // center of target

-

-    // --- Robot and camera dimensions.

-    static final double kShooterOffsetDeg = 0; // azimuth offset from camera to shooter

-    static final double kHorizontalFOVDeg = 44.0; // Logitech C210 camera

-    static final double kVerticalFOVDeg = 480.0 / 640.0 * kHorizontalFOVDeg;

-    static final double kCameraHeightIn = 24.0; // TODO

-    static final double kCameraPitchDeg = 21.0; // TODO

-    static final double kTanHFOV2 = Math.tan(Math.toRadians(kHorizontalFOVDeg / 2));

-    static final double kTanVFOV2 = Math.tan(Math.toRadians(kVerticalFOVDeg / 2));

-

-    // --- Colors for drawing indicators on the image.

-    private static final WPIColor reject1Color = WPIColor.GRAY;

-    private static final WPIColor reject2Color = WPIColor.YELLOW;

-    private static final WPIColor candidateColor = WPIColor.BLUE;

-    private static final WPIColor targetColor = WPIColor.RED;

-

-    // --- Color thresholds, initialized in the constructor.

-    private int min1Hue, max1Hue, min1Sat, min1Val;

-

-    // Show intermediate images for parameter tuning.

-    private final DebugCanvas thresholdedCanvas = new DebugCanvas("thresholded");

-    private final DebugCanvas morphedCanvas = new DebugCanvas("morphed");

-

-    // Data to reuse for each frame.

-    private final DaisyExtensions daisyExtensions = new DaisyExtensions();

-    private final IplConvKernel morphKernel = IplConvKernel.create(3, 3, 1, 1,

-            opencv_imgproc.CV_SHAPE_RECT, null);

-    private final ArrayList<WPIPolygon> polygons = new ArrayList<WPIPolygon>();

-

-    // Frame-size-dependent data to reuse for each frame.

-    private CvSize size = null;

-    private WPIColorImage rawImage;

-    private IplImage bin;

-    private IplImage hsv;

-    private IplImage hue;

-    private IplImage sat;

-    private IplImage val;

-    private int minWidth;

-    private WPIPoint linePt1, linePt2; // crosshair endpoints

-

-    public Recognizer2013() {

-        setHSVRange(70, 106, 137, 27);

-    }

-

-    @Override

-    public void setHSVRange(int minHue, int maxHue, int minSat, int minVal) {

-        min1Hue = minHue - 1; // - 1 because cvThreshold() does > instead of >=

-        max1Hue = maxHue + 1;

-        min1Sat = minSat - 1;

-        min1Val = minVal - 1;

-    }

-    @Override

-    public int getHueMin() { return min1Hue + 1; }

-    @Override

-    public int getHueMax() { return max1Hue - 1; }

-    @Override

-    public int getSatMin() { return min1Sat + 1; }

-    @Override

-    public int getValMin() { return min1Val + 1; }

-

-    @Override

-    public void showIntermediateStages(boolean enable) {

-        thresholdedCanvas.show = enable;

-        morphedCanvas.show = enable;

-    }

-

-    @Override

-    public Target processImage(WPIColorImage cameraImage) {

-        // (Re)allocate the intermediate images if the input is a different

-        // size than the previous image.

-        if (size == null || size.width() != cameraImage.getWidth()

-                || size.height() != cameraImage.getHeight()) {

-            size = opencv_core.cvSize(cameraImage.getWidth(),

-                    cameraImage.getHeight());

-            rawImage = DaisyExtensions.makeWPIColorImage(

-                    DaisyExtensions.getIplImage(cameraImage));

-            bin = IplImage.create(size, 8, 1);

-            hsv = IplImage.create(size, 8, 3);

-            hue = IplImage.create(size, 8, 1);

-            sat = IplImage.create(size, 8, 1);

-            val = IplImage.create(size, 8, 1);

-            minWidth = (kMinWidthAt320 * cameraImage.getWidth() + 319) / 320;

-

-            int horizontalOffsetPixels = (int)Math.round(

-                    kShooterOffsetDeg * size.width() / kHorizontalFOVDeg);

-            int x = size.width() / 2 + horizontalOffsetPixels;

-            linePt1 = new WPIPoint(x, size.height() - 1);

-            linePt2 = new WPIPoint(x, 0);

-        } else {

-            // Copy the camera image so it's safe to draw on.

-            opencv_core.cvCopy(DaisyExtensions.getIplImage(cameraImage),

-                    DaisyExtensions.getIplImage(rawImage));

-        }

-

-        IplImage input = DaisyExtensions.getIplImage(rawImage);

-

-        // Threshold the pixels in HSV color space.

-        // TODO(jerry): Do this in one pass of a pixel-processing loop.

-        opencv_imgproc.cvCvtColor(input, hsv, opencv_imgproc.CV_BGR2HSV_FULL);

-        opencv_core.cvSplit(hsv, hue, sat, val, null);

-

-        // NOTE: Since red is at the end of the cyclic color space, you can OR

-        // a threshold and an inverted threshold to match red pixels.

-        opencv_imgproc.cvThreshold(hue, bin, min1Hue, 255, opencv_imgproc.CV_THRESH_BINARY);

-        opencv_imgproc.cvThreshold(hue, hue, max1Hue, 255, opencv_imgproc.CV_THRESH_BINARY_INV);

-        opencv_imgproc.cvThreshold(sat, sat, min1Sat, 255, opencv_imgproc.CV_THRESH_BINARY);

-        opencv_imgproc.cvThreshold(val, val, min1Val, 255, opencv_imgproc.CV_THRESH_BINARY);

-

-        // Combine the results to obtain a binary image which is mostly the

-        // interesting pixels.

-        opencv_core.cvAnd(hue, bin, bin, null);

-        opencv_core.cvAnd(bin, sat, bin, null);

-        opencv_core.cvAnd(bin, val, bin, null);

-

-        thresholdedCanvas.showImage(bin);

-

-        // Fill in gaps using binary morphology.

-        opencv_imgproc.cvMorphologyEx(bin, bin, null, morphKernel,

-                opencv_imgproc.CV_MOP_CLOSE, kHoleClosingIterations);

-

-        morphedCanvas.showImage(bin);

-

-        // Find contours.

-        //

-        // NOTE: If we distinguished between the inner and outer boundaries of

-        // the vision target rectangles, we could apply a more accurate width

-        // filter and more accurately compute the target range.

-        WPIBinaryImage binWpi = DaisyExtensions.makeWPIBinaryImage(bin);

-        WPIContour[] contours = daisyExtensions.findConvexContours(binWpi);

-

-        // Simplify the contours to polygons and filter by size and aspect ratio.

-        //

-        // TODO(jerry): Also look for the two vertical stripe vision targets.

-        // They'll greatly increase the precision of measuring the distance. If

-        // both stripes are visible, they'll increase the accuracy for

-        // identifying the high goal.

-        polygons.clear();

-        for (WPIContour c : contours) {

-            if (c.getWidth() >= minWidth) {

-                double ratio = ((double) c.getHeight()) / c.getWidth();

-                if (ratio >= kMinAspect && ratio <= kMaxAspect) {

-                    polygons.add(c.approxPolygon(kPolygonPercentFit));

-                    //        	    System.out.println("  Accepted aspect ratio " + ratio);

-                } else {

-                    //        	    System.out.println("  Rejected aspect ratio " + ratio);

-                }

-            }

-        }

-

-        // Pick the target with the highest center-point that matches yet more

-        // filter criteria.

-        WPIPolygon bestTarget = null;

-        int highestY = Integer.MAX_VALUE;

-

-        for (WPIPolygon p : polygons) {

-            // TODO(jerry): Replace boolean filters with a scoring function?

-            if (p.isConvex() && p.getNumVertices() == 4) { // quadrilateral

-                WPIPoint[] points = p.getPoints();

-                // Filter for polygons with 2 ~horizontal and 2 ~vertical sides.

-                int numRoughlyHorizontal = 0;

-                int numRoughlyVertical = 0;

-                for (int i = 0; i < 4; ++i) {

-                    double dy = points[i].getY() - points[(i + 1) % 4].getY();

-                    double dx = points[i].getX() - points[(i + 1) % 4].getX();

-                    double slope = Double.MAX_VALUE;

-                    if (dx != 0) {

-                        slope = Math.abs(dy / dx);

-                    }

-

-                    if (slope < kRoughlyHorizontalSlope) {

-                        ++numRoughlyHorizontal;

-                    } else if (slope > kRoughlyVerticalSlope) {

-                        ++numRoughlyVertical;

-                    }

-                }

-

-                if (numRoughlyHorizontal >= 2 && numRoughlyVertical == 2) {

-                    int pCenterX = p.getX() + p.getWidth() / 2;

-                    int pCenterY = p.getY() + p.getHeight() / 2;

-

-                    rawImage.drawPolygon(p, candidateColor, 2);

-                    rawImage.drawPoint(new WPIPoint(pCenterX, pCenterY),

-                            targetColor, 2);

-                    if (pCenterY < highestY) {

-                        bestTarget = p;

-                        highestY = pCenterY;

-                    }

-                } else {

-                    rawImage.drawPolygon(p, reject2Color, 1);

-                }

-            } else {

-                rawImage.drawPolygon(p, reject1Color, 1);

-            }

-        }

-

-        Target found = null;

-        if (bestTarget != null) {

-            rawImage.drawPolygon(bestTarget, targetColor, 2);

-            found = measureTarget(bestTarget);

-        } else {

-            LOG.fine("No target found");

-        }

-

-        // Draw a crosshair

-        rawImage.drawLine(linePt1, linePt2, targetColor, 1);

-        

-        if (found == null) {

-        	found = new Target();

-        }

-        found.editedPicture = rawImage;

-

-        daisyExtensions.releaseMemory();

-        //System.gc();

-        

-        return found;

-    }

-

-    /**

-     * Uses the camera, field, and robot dimensions to compute targeting info.

-     */

-    private Target measureTarget(WPIPolygon target) {

-        double w = target.getWidth();

-        double h = target.getHeight();

-        double x = target.getX() + w / 2; // target center in view coords

-        double y = target.getY() + h / 2;

-

-        double vw = size.width();

-        double vh = size.height();

-        double xc = x - vw / 2; // target center pos'n ±from view center

-        double yc = vh / 2 - y; // ... in world coords on the viewing plane

-

-        // Target angles relative to the camera.

-        double azimuthCam = Math.atan2(xc * 2 * kTanHFOV2, vw);

-        double elevationCam = Math.atan2(yc * 2 * kTanVFOV2, vh);

-        double rangeIn = kTargetWidthIn * vw / (w * 2 * kTanHFOV2);

-

-        //Put results in target

-        Target data = new Target();

-        data.azimuth = (Math.toDegrees(azimuthCam) - kShooterOffsetDeg);

-        data.elevation = (Math.toDegrees(elevationCam));

-        data.range = (rangeIn / 12);

-        

-        LOG.fine("Best target at (" + x + ", " + y + ") " + w +" x " + h

-                + ", shot azimuth=" + (Math.toDegrees(azimuthCam) - kShooterOffsetDeg) + 

-                " elevation=" + (Math.toDegrees(elevationCam) + kCameraPitchDeg) + 

-                " range=" + (rangeIn / 12));

-        

-        return data;

-    }

-

-}

diff --git a/971CV/src/org/frc971/ResultSender.java b/971CV/src/org/frc971/ResultSender.java
deleted file mode 100644
index 441c105..0000000
--- a/971CV/src/org/frc971/ResultSender.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * 
- */
-package org.frc971;
-
-import java.io.IOException;
-
-import java.net.InetSocketAddress;
-
-import java.nio.channels.ServerSocketChannel;
-
-/**
- * @author daniel
- *
- */
-
-/**  Serves processing results back to the atom. */
-public class ResultSender {
-	private static final int PORT = 9716;
-	
-	private ServerSocketChannel sock;
-	
-	AccepterThread acceptor;
-	
-	/** Constructor. Connects to a socket and starts the accepter thread. */
-	public ResultSender() throws IOException {
-		sock = ServerSocketChannel.open();
-		sock.socket().bind(new InetSocketAddress(PORT));
-		
-		//start accepter thread
-		acceptor = new AccepterThread(sock);
-	}
-	
-	/** Sends a new message of calculated attributes to the clients.
-	 * 
-	 * @param azimuth is the calculated optimum azimuth for the shot.
-	 * @param elevation is the calculated optimum elevation for the shot.
-	 * @param range is the calculated optimum range for the shot.
-	 */
-	public void send(double azimuth, double elevation, double range) {
-		//Formulate a message as a String similar to an HTTP header.
-		if (azimuth != -1 && elevation != -1 && range != -1) {
-			StringBuilder message = new StringBuilder();
-			message.append("\r\n--boundarydonotcross\r\n");
-			message.append("Azimuth: ");
-			message.append(azimuth);
-			message.append("\r\nElevation: ");
-			message.append(elevation);
-			message.append("\r\nRange: ");
-			message.append(range);
-			
-			acceptor.sendtoAll(message.toString());
-		}
-	}
-}
diff --git a/971CV/src/org/frc971/SocketCommon.java b/971CV/src/org/frc971/SocketCommon.java
deleted file mode 100644
index daf3a6c..0000000
--- a/971CV/src/org/frc971/SocketCommon.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * 
- */
-package org.frc971;
-
-import java.io.IOException;
-
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-import java.util.logging.Logger;
-
-/**
- * @author daniel
- * Socket operations used by other classes
- */
-public class SocketCommon {
-
-	private final static Logger LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
-	
-	/** Reads on a SocketStream until it finds a given character sequence. */
-	public static String readtoBoundary(SocketChannel sock, String boundary) {
-		//reads from socket until it encounters a specific character combination
-		//if boundary is null, it reads until it runs out of data
-		ByteBuffer recvd = ByteBuffer.allocate(1024);
-		StringBuilder sb = new StringBuilder();
-		String message = "";
-		try {
-			int ret = 0;
-			while (ret != -1) {
-				ret = sock.read(recvd);
-				//System.out.println(ret);
-				if (ret == 0) {
-					//finished receiving
-					message = sb.toString();
-					if (boundary == null)
-						break;
-				}
-				else {
-					for (int i = 0; i < recvd.capacity() - recvd.remaining(); i++) {
-						sb.append((char)recvd.get(i));
-					}
-					recvd.clear();
-					if (boundary != null) {
-						if (sb.toString().contains(boundary)) {
-							message = sb.toString();
-							break;
-						}
-						else {
-							continue;
-						}
-					}
-				}
-			}
-		}
-		catch (IOException e) {
-			LOG.severe("Socket read failed. Check your network configuration.");
-			Messages.severe("Socket read failed. Check your network configuration.");
-			return null;
-		}
-		return message;
-	}
-	
-	/** Guarantees that large messages will be completely sent through a socket.
-	 * @return Returns 0 for success, -1 for failure.
-	 */
-	public static int sendAll(SocketChannel sock, ByteBuffer message) {
-		message.rewind();
-		while (message.remaining() > 0) {
-			try {
-				sock.write(message);
-			}
-			catch (IOException e) {
-				LOG.warning("Socket write failed. Check your network configuration.");
-				Messages.severe("Socket write failed. Check your network configuration.");
-				return -1;
-			}
-		}
-		return 0;
-	}
-	
-	/** Overloaded method for sending a byte array. */
-	public static void sendAll(SocketChannel sock, byte[] message) {
-		ByteBuffer buff = ByteBuffer.wrap(message);
-		sendAll(sock, buff);
-	}
-	
-	/** Overloaded method for sending a String. */
-	public static void sendAll(SocketChannel sock, String message) {
-		sendAll(sock, message.getBytes());
-	}
-}
diff --git a/971CV/src/org/frc971/TestClient.java b/971CV/src/org/frc971/TestClient.java
deleted file mode 100644
index 227c929..0000000
--- a/971CV/src/org/frc971/TestClient.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * 
- */
-package org.frc971;
-
-/**
- * @author daniel
- * 
- */
-
-/** Small thread for running vision code concurrently with debug server. */
-public class TestClient extends Thread {
-	
-	private String atomIP;
-	
-	/** Constructor to set up new thread. */
-	public TestClient(String atomIP) {
-		super("Test Client");
-		this.atomIP = atomIP;
-		start();
-	}
-	
-	/** Simple thread, runs the vision code. */
-	public void run() {
-		String[] args = {atomIP};
-		VisionTuner.main(args);
-	}
-}
diff --git a/971CV/src/org/frc971/TestImageGetter.java b/971CV/src/org/frc971/TestImageGetter.java
deleted file mode 100644
index 2577fa2..0000000
--- a/971CV/src/org/frc971/TestImageGetter.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * 
- */
-package org.frc971;
-
-/**
- * @author daniel
- *
- */
-
-import java.io.File;
-import java.io.IOException;
-
-import java.util.logging.Logger;
-
-import javax.imageio.ImageIO;
-
-import edu.wpi.first.wpijavacv.WPIColorImage;
-
-/** Get debug images for Java camera processor. */
-public class TestImageGetter {
-	
-	private String path_to_images;
-	
-	private final static Logger LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
-	
-	/** The names of our debugging images, without paths.
-	 * The GetNext method should be used to get the first
-	 * image, and not GetCurrent. */
-	final static String[] images = {"45in_DoubleGreen.jpg",
-									"57inLargeTarget_DoubleGreenBK.jpg",
-									"FullField_DoubleGreenBK3.jpg",
-									"FullField_SmallGreen.jpg",
-									"HybridLine_DoubleGreenBK2.jpg",
-									"HybridLine_DoubleGreenBK3.jpg",
-									"HybridLine_DoubleGreenBK4.jpg",
-									"HybridLine_SmallGreen2.jpg",
-									"HybridLine_SmallGreen3.jpg",
-									"HybridLine_SmallGreen4.jpg",
-									"Midfield_DoubleGreenBK2.jpg",
-									"Midfield_SmallGreen2.jpg",
-									"Midfield_SmallGreen3.jpg",
-									"Midfield_SmallGreen4.jpg",
-									"OppLine_DoubleGreenBK2.jpg",
-									"OppLine_SmallGreen2.jpg",
-									"PyramidRight_DoubleGreenBK2.jpg",
-									"PyramidRight_SmallGreen2.jpg"
-									};
-	
-	private int image_index = -1;
-	
-	private WPIColorImage current_image = null;
-	
-	/** Helper method to concatenate paths, similar to Python's os.path.join(). */
-	private String cocatenate_paths(String path1, String path2) {
-		if (path1.charAt(path1.length() - 1) == '/')
-			return path1 + path2;
-		else
-			return path1 + "/" + path2;
-	}
-	
-	/** Gets the name to display at the top of the image window. */
-	public String GetName() {
-		return images[image_index];
-	}
-	
-	/** Constructor
-	 * 
-	 * @param path_to_images is the path to the directory where our images are.
-	 */
-	public TestImageGetter(String path_to_images) {
-		this.path_to_images = path_to_images;
-	}
-	
-	/** Gets the next debugging image.
-	 * 
-	 * @return Returns a WPIColorImage.
-	 */
-	public WPIColorImage GetNext() {
-		image_index++;
-		if (image_index < images.length) {
-			String image_to_get = images[image_index];
-			try {
-				current_image = new WPIColorImage(ImageIO.read(new File(cocatenate_paths(path_to_images, image_to_get))));
-				return current_image;
-			}
-			catch (IOException e) {
-				LOG.warning("Could not open file.");
-				return null;
-			}
-		}
-		else
-			image_index--;
-			return null;
-	}
-	
-	/** Gets the previous debugging image.
-	 * 
-	 * @return Returns a WPIColorImage.
-	 */
-	public WPIColorImage GetPrev() {
-		image_index--;
-		if (image_index >= 0) {
-			String image_to_get = images[image_index];
-			try {
-				current_image = new WPIColorImage(ImageIO.read(new File(cocatenate_paths(path_to_images, image_to_get))));
-				return current_image;
-			}
-			catch (IOException e) {
-				LOG.warning("Could not open file.");
-				return null;
-			}
-		}
-		else
-			image_index++;
-			return null;
-	}
-	
-	/** Gets the current debugging image. This is vestigial, it is not longer used.
-	 * 
-	 * @return Returns a WPIColorImage
-	 */
-	public WPIColorImage GetCurrent() {
-		return current_image;
-	}
-}
diff --git a/971CV/src/org/frc971/TimeFormatter.java b/971CV/src/org/frc971/TimeFormatter.java
deleted file mode 100644
index 1bff96f..0000000
--- a/971CV/src/org/frc971/TimeFormatter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * 
- */
-package org.frc971;
-
-import java.util.logging.Formatter;
-import java.util.logging.LogRecord;
-import java.util.Date;
-
-/**
- * @author daniel
- * 
- */
-
-/** Formats log messages with adequate timestamp. */
-public class TimeFormatter extends Formatter{
-	
-	/** Constructor, see Formatter. */
-	public TimeFormatter() {
-		super();
-	}
-	
-	/** Format a message in the propper way.
-	 * @return Includes time, name of logger, level and message.
-	 */
-	public String format(LogRecord message) {
-		//we need to include the date and time in our message
-		StringBuffer out = new StringBuffer();
-		out.append("@");
-		Date date = new Date(message.getMillis());
-		out.append(date.toString());
-		out.append(" in [");
-		//add our logger's name
-		out.append(message.getLoggerName());
-		out.append("]: (");
-		//add message level
-		out.append(message.getLevel().getName());
-		out.append(") ");
-		//add actual message
-		out.append(formatMessage(message));
-		out.append("\n");
-		return out.toString();
-	}
-
-}
diff --git a/971CV/src/org/frc971/VisionTuner.java b/971CV/src/org/frc971/VisionTuner.java
deleted file mode 100644
index 357b58f..0000000
--- a/971CV/src/org/frc971/VisionTuner.java
+++ /dev/null
@@ -1,307 +0,0 @@
-package org.frc971;

-

-import java.awt.BorderLayout;

-import java.awt.GridLayout;

-import java.awt.event.ActionEvent;

-import java.awt.event.ActionListener;

-import java.awt.event.KeyEvent;

-

-import java.util.Arrays;

-import java.util.logging.Level;

-import java.util.logging.Logger;

-

-import java.io.FileNotFoundException;

-import java.io.IOException;

-

-import javax.swing.JButton;

-import javax.swing.JLabel;

-import javax.swing.JPanel;

-import javax.swing.JSlider;

-import javax.swing.WindowConstants;

-import javax.swing.event.ChangeEvent;

-import javax.swing.event.ChangeListener;

-

-import com.googlecode.javacv.CanvasFrame;

-import edu.wpi.first.wpijavacv.WPIColorImage;

-import edu.wpi.first.wpijavacv.WPIImage;

-

-/* REQUIRED JAVA LIBRARIES:

- *   external_jars/

- *     javacpp.jar

- *     javacv-YOUR_OS.jar

- *     javacv.jar

- *     WPIJavaCV.jar

- *

- * REQUIRED NATIVE CODE LIBRARIES ON $PATH:

- *   Program Files/WPIJavaCV/     [for example]

- *     JavaCV_2.2.0/javacv-bin/javacv-YOUR_OS.jar

- *     OpenCV_2.2.0/bin/*

- *

- * The native libraries and javacv-YOUR_OS.jar must match the 32 vs. 64-bit JVM.

- */

-/**

- * FRC 2013 vision-target recognizer tuner app.

- *

- * <p>

- * See {@link #processEvents()} for the keystroke commands.

- *

- * @author jerry

- * @author daniel

- */

-public class VisionTuner {

-    private Recognizer recognizer = new Recognizer2013();

-

-    private final static Logger LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

-    

-    private final CanvasFrame cameraFrame = new CanvasFrame("Camera");

-    private final JPanel panel = new JPanel();

-    private final JSlider hueMinSlider = new JSlider();

-    private final JSlider hueMaxSlider = new JSlider();

-    private final JSlider satMinSlider = new JSlider();

-    private final JSlider valMinSlider = new JSlider();

-    private final JButton showCalibration = new JButton("Calibrate");

-    

-    private ResultSender sender = null;

-

-    private int totalFrames = -1; // don't count the first (warm-up) frame

-    private double totalMsec;

-    private double minMsec = Double.MAX_VALUE;

-    private double maxMsec;

-    

-    private TestImageGetter getter;

-    

-    private WPIColorImage current;

-    

-    private String currentWindowTitle;

-    

-    private boolean debug = false;

-

-    public VisionTuner() {

-    	//set logger to log everything

-        LOG.setLevel(Level.ALL);

-        try {

-        	LogHandler handler = new LogHandler("ds_vision.log");

-        	TimeFormatter formatter = new TimeFormatter();

-            handler.setFormatter(formatter);

-            LOG.addHandler(handler);

-        }

-        catch (FileNotFoundException e) {

-        	Messages.warning("Logging initialization failed.");

-        }

-        

-        //initialize result sender

-        try {

-        	sender = new ResultSender();

-        }

-        catch (IOException e) {

-        	LOG.severe("Server initialization failed: " + e.getMessage() + ". Result reporting disabled.");

-        }

-        cameraFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

-

-        cameraFrame.getContentPane().add(panel, BorderLayout.SOUTH);

-        panel.setLayout(new GridLayout(0, 1, 0, 0));

-        

-        showCalibration.setToolTipText("Click here if the system is not finding targets well enough.");

-        panel.add(showCalibration);

-        showCalibration.addActionListener(new ActionListener() {

-        	public void actionPerformed(ActionEvent e) {

-        		showCalibrationWindow();

-        	}

-        });

-

-        LOG.fine("Initial HSV range ["

-                + hueMinSlider.getValue() + " .. "

-                + hueMaxSlider.getValue() + "] "

-                + satMinSlider.getValue() + "+ "

-                + valMinSlider.getValue() + "+");

-    }

-    

-    /** Shows a calibration window when the user clicks the Calibrate button. */

-    private void showCalibrationWindow() {

-    	final CanvasFrame calibrationWindow = new CanvasFrame("Calibration");

-    	calibrationWindow.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

-    	

-    	final JPanel panel = new JPanel();

-    	calibrationWindow.getContentPane().add(panel, BorderLayout.SOUTH);

-        panel.setLayout(new GridLayout(3, 3, 0, 0));

-        

-        hueMinSlider.setToolTipText("minimum HSV hue");

-        hueMinSlider.setMaximum(255);

-        hueMinSlider.setValue(recognizer.getHueMin());

-        panel.add(hueMinSlider);

-        

-        panel.add(new JLabel("min hue                          max hue")); 

-

-        hueMaxSlider.setToolTipText("maximum HSV hue");

-        hueMaxSlider.setMaximum(255);

-        hueMaxSlider.setValue(recognizer.getHueMax());

-        panel.add(hueMaxSlider);

-

-        satMinSlider.setToolTipText("minimum HSV color saturation");

-        satMinSlider.setMaximum(255);

-        satMinSlider.setValue(recognizer.getSatMin());

-        panel.add(satMinSlider);

-        

-        panel.add(new JLabel("min saturation  max saturation")); 

-

-        valMinSlider.setToolTipText("minimum HSV brightness value");

-        valMinSlider.setMaximum(255);

-        valMinSlider.setValue(recognizer.getValMin());

-        panel.add(valMinSlider);

-        

-        panel.add(new JLabel("")); //empty cells can cause problems

-        

-        final JButton done = new JButton("Done");

-        panel.add(done);

-        done.addActionListener(new ActionListener() {

-        	public void actionPerformed(ActionEvent e) {

-        		calibrationWindow.dispose();

-        	}

-        });

-        

-        panel.add(new JLabel("")); //empty cells can cause problems

-        

-        ChangeListener sliderListener = new ChangeListener() {

-            @Override

-            public void stateChanged(ChangeEvent e) {

-                LOG.fine("New HSV range ["

-                        + hueMinSlider.getValue() + " .. "

-                        + hueMaxSlider.getValue() + "] "

-                        + satMinSlider.getValue() + "+ "

-                        + valMinSlider.getValue() + "+");

-                recognizer.setHSVRange(

-                        hueMinSlider.getValue(), hueMaxSlider.getValue(),

-                        satMinSlider.getValue(),

-                        valMinSlider.getValue());

-                if (debug) {

-                	processImage(current, null);

-                }

-            }

-        };

-        

-        hueMinSlider.addChangeListener(sliderListener);

-        hueMaxSlider.addChangeListener(sliderListener);

-        satMinSlider.addChangeListener(sliderListener);

-        valMinSlider.addChangeListener(sliderListener);

-        

-        calibrationWindow.pack();

-  

-    }

-

-    /**

-     * Loads the named test image files.

-     * Sets testImageFilenames and testImages.

-     */

-    private void processImage(WPIColorImage cameraImage, String title) {

-    	current = cameraImage;

-    	

-    	//set window title if it needs to be changed

-    	if (title != null && !title.equals(currentWindowTitle)) {

-    		cameraFrame.setTitle(title);

-    		currentWindowTitle = title;

-    	}

-

-        long startTime = System.nanoTime();

-        Target target = recognizer.processImage(cameraImage);

-        WPIImage processedImage = target.editedPicture;

-        long endTime = System.nanoTime();

-

-        cameraFrame.showImage(processedImage.getBufferedImage());

-

-        double milliseconds = (endTime - startTime) / 1e6;

-        if (++totalFrames > 0) {

-            totalMsec += milliseconds;

-            minMsec = Math.min(minMsec, milliseconds);

-            maxMsec = Math.max(maxMsec, milliseconds);

-            LOG.fine("The recognizer took " + milliseconds + " ms, " + 

-            (1000 * totalFrames / totalMsec) + " fps, %.2f avg");

-        }

-        

-        //send results to atom. (and any connected clients)

-        if (sender != null) {

-        	sender.send(target.azimuth, target.elevation, target.range);

-        }

-        

-    }

-

-    private void previousImage() {

-    	WPIColorImage to_process = getter.GetPrev();

-    	if (to_process != null)

-    		processImage(to_process, getter.GetName());

-    }

-

-    private void nextImage() {

-    	WPIColorImage to_process = getter.GetNext();

-    	if (to_process != null)

-    		processImage(to_process, getter.GetName());

-    }

-

-    private void processEvents() {

-        KeyEvent e = cameraFrame.waitKey();

-

-        switch (e.getKeyCode()) {

-        case KeyEvent.VK_LEFT: // left arrow key: go to previous image

-            previousImage();

-            break;

-        case KeyEvent.VK_RIGHT: // right arrow key: go to next image

-            nextImage();

-            break;

-        case KeyEvent.VK_Q: // Q: print time measurements then quit

-            LOG.fine("The recognizer took " + (totalMsec / totalFrames) + "ms avg, " + minMsec +" min,"

-                    + maxMsec + " max, " + (1000 * totalFrames / totalMsec) + " fps avg");

-            System.exit(0);

-        }

-    }

-

-    public static void main(final String[] args) {

-    	VisionTuner tuner = new VisionTuner();

-    	Messages.SetWindow(tuner.cameraFrame);

-    	

-    	String atomIP = null;

-    	try {

-    		atomIP = args[0];

-    	}

-    	catch (ArrayIndexOutOfBoundsException e) {

-    		System.out.println("Usage: VisionTuner [atom ip]");

-    		System.exit(0);

-    	}

-    	

-        if (Arrays.asList(args).contains("-debug")) {

-        	//debug mode has been requested

-        	tuner.debug = true;

-        	

-        	//show debugging windows

-        	tuner.recognizer.showIntermediateStages(true);

-        	

-        	tuner.getter = new TestImageGetter(".");

-        	WPIColorImage to_process = tuner.getter.GetNext();

-        	if (to_process != null) {

-        		tuner.processImage(to_process, tuner.getter.GetName());

-        		for (;;) {

-        			tuner.processEvents();

-        		}

-        	}

-        	else {

-        		LOG.severe("Could not load test images.");

-        		Messages.severe("Could not load test images.");

-        	}	

-        }

-        else {

-        	try {

-        		HTTPClient client = new HTTPClient(atomIP);

-        		for (;;) {

-            		ImageWithTimestamp to_process = client.GetFrame();

-            		if (to_process.image != null) {

-            			tuner.processImage(to_process.image, client.GetName());

-            			LOG.fine("Captured time: " + Double.toString(to_process.timestamp));

-            		}

-            	}

-        	}

-        	catch (IOException e) {

-        		LOG.severe("Client initialization failed: " + e.getMessage() + ".");

-        		Messages.severe("Client initialization failed: " + e.getMessage() + ".");

-        	}

-        }

-    }

-

-}

diff --git a/971CV/src/org/frc971/private_aos_camera_jar.jar b/971CV/src/org/frc971/private_aos_camera_jar.jar
deleted file mode 100644
index 3836b5b..0000000
--- a/971CV/src/org/frc971/private_aos_camera_jar.jar
+++ /dev/null
Binary files differ
diff --git a/DaisyCV/src/edu/missdaisy/smartdashboard/daisycv/DaisyCVWidget.java b/DaisyCV/src/edu/missdaisy/smartdashboard/daisycv/DaisyCVWidget.java
index 128563a..5a5507f 100644
--- a/DaisyCV/src/edu/missdaisy/smartdashboard/daisycv/DaisyCVWidget.java
+++ b/DaisyCV/src/edu/missdaisy/smartdashboard/daisycv/DaisyCVWidget.java
@@ -7,8 +7,10 @@
 import java.util.Scanner;
 import java.util.TreeMap;
 
-import javax.imageio.ImageIO;
+import com.googlecode.javacv.CanvasFrame;
+import com.googlecode.javacv.OpenCVFrameGrabber;
 
+import javax.imageio.ImageIO;
 import com.googlecode.javacv.CanvasFrame;
 import com.googlecode.javacv.cpp.opencv_core;
 import com.googlecode.javacv.cpp.opencv_core.CvSize;
@@ -355,22 +357,25 @@
 
         // Create the widget
         DaisyCVWidget widget = new DaisyCVWidget(true);
-        CanvasFrame original = new CanvasFrame("Raw");
-        CanvasFrame result = new CanvasFrame("Result");
+        CanvasFrame original = new CanvasFrame("Raw", 1);
+        CanvasFrame result = new CanvasFrame("Result", 1);
 
+        IplImage image,im;
+        OpenCVFrameGrabber grabber,gr;
+        
         long totalTime = 0;
         for (int i = 0; i < args.length; i++)
         {
             // Load the image
-            WPIColorImage rawImage = null;
-            try
+            WPIColorImage rawImage = new WPIColorImage(image.getBufferedImage());
+            /*try
             {
                 rawImage = new WPIColorImage(ImageIO.read(new File(args[i%args.length])));
             } catch (IOException e)
             {
                 System.err.println("Could not find file!");
                 return;
-            }
+            }*/
 
             //shows the raw image before processing to eliminate the possibility
             //that both may be the modified image.
diff --git a/aos/README.txt b/aos/README.txt
index 00762f3..44b36a2 100644
--- a/aos/README.txt
+++ b/aos/README.txt
@@ -18,7 +18,6 @@
 common/messages is where the c++ wrappers for "queues" are
 
 [NOTES]
-C++ code should _only_ #include "aos/aos_core.h" because it has the extern "C" stuff etc. That should have all of the necessary header files #included, but if it doesn't, they should get added.
 Some functions need to be in separate translation units in order for them to be guaranteed to work. As the C standard says,
 	Alternatively, an implementation might perform various optimizations within each translation unit, such
 	that the actual semantics would agree with the abstract semantics only when making function calls across
diff --git a/aos/aos_core.h b/aos/aos_core.h
deleted file mode 100644
index 13a427e..0000000
--- a/aos/aos_core.h
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef _AOS_CORE_H_
-#define _AOS_CORE_H_
-
-#ifdef __VXWORKS__
-#include "WPILib/Task.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef __VXWORKS__
-#include "aos/atom_code/ipc_lib/resource.h"
-#include "aos/atom_code/ipc_lib/shared_mem.h"
-#include "aos/atom_code/ipc_lib/queue.h"
-#ifdef __cplusplus
-}
-#include "aos/atom_code/init.h"
-extern "C" {
-#endif
-
-// A macro that runs a control loop using AOS_RUN on linux, and lets the user
-// register the control loop on the cRIO.
-#define AOS_RUN_LOOP AOS_RUN
-
-// A macro that will create an instance of the given class using
-// its default constructor and call Run() on it on the cRIO or the atom.
-// It will generate a main on the atom and a function that the build system links
-// in a call to on the cRIO.
-// NOTE: No ; after this macro, and it should be used at the file scope (NO NAMESPACES!).
-#define AOS_RUN(classname) int main() { \
-  aos::Init(); \
-  classname looper; /* on the stack to avoid eigen alignment issue */ \
-  looper.Run(); \
-  aos::Cleanup(); \
-}
-// Same as AOS_RUN, except uses aos::init_nrt instead of aos::init.
-#define AOS_RUN_NRT(classname) int main() { \
-  aos::InitNRT(); \
-  classname looper; /* on the stack to avoid eigen alignment issue */ \
-  looper.Run(); \
-  aos::Cleanup(); \
-}
-// Same as AOS_RUN, except passes args to the constructor.
-#define AOS_RUN_ARGS(classname, args...) int () { \
-  aos::Init(); \
-  classname looper(args); /* on the stack to avoid eigen alignment issue */ \
-  looper.Run(); \
-  aos::Cleanup(); \
-}
-
-#else // ifndef __VXWORKS__
-
-// The cRIO doesn't need to run the Run method.  The cRIO main should register
-// all loops to get run.
-#define AOS_RUN_LOOP(classname) /* nop */
-
-#define AOS_RUN(classname) extern "C" void AOS_INITNAME() { \
-  classname *looper = new classname(); /* dynamically allocated because most (all?) Run functions store references */ \
-  looper->Run(); \
-}
-// Same as AOS_RUN, except it runs in a new Task (named name and at priority).
-// Calls both the constructor and Run in the new Task.
-#define AOS_RUN_FORK(classname, name, priority) \
-static void aos_init_(void *) { \
-  classname *looper = new classname(); /* dynamically allocated because most (all?) Run functions store references */ \
-  looper->Run(); \
-} \
-extern "C" void AOS_INITNAME() { \
-  (new Task(name, reinterpret_cast<FUNCPTR>(aos_init_), priority))->Start(); \
-}
-
-#endif // ifndef __VXWORKS__
-
-#ifdef __cplusplus
-}
-#endif
-
-#include "aos/common/logging/logging.h"
-
-#endif
diff --git a/aos/atom_code/async_action/AsyncAction.cpp.inc b/aos/atom_code/async_action/AsyncAction.cpp.inc
deleted file mode 100644
index 911bee8..0000000
--- a/aos/atom_code/async_action/AsyncAction.cpp.inc
+++ /dev/null
@@ -1,405 +0,0 @@
-#include <sys/syscall.h>
-#include <errno.h>
-#include <math.h>
-
-namespace aos {
-
-template<class T, class S> AsyncAction<T, S>::AsyncAction(const std::string name) : local_count(0), local_done_status(0), local_pid(0), 
-	done_index(0), status_index(0), next_status_count(0){
-	aos_type_sig async_action_status_sig = {sizeof(async_action_status<S>), 1234, 1};
-	status_queue = aos_fetch_queue(name.c_str(), &async_action_status_sig);
-	aos_type_sig async_action_start_sig = {sizeof(async_action_start<T>), 4321, 1};
-	start_queue = aos_fetch_queue(name.c_str(), &async_action_start_sig);
-}
-
-template<class T, class S> uint16_t AsyncAction<T, S>::Start(T &args){
-	CheckStop();
-	// write something to the start queue and increment the count in the status queue
-	async_action_start<S> *start = (async_action_start<S> *)aos_queue_get_msg(start_queue);
-	if(start == NULL)
-		return 0;
-	memcpy(&start->args, &args, sizeof(T));
-	async_action_status<T> *status = (async_action_status<T> *)aos_queue_read_msg(status_queue, 0); // wait until one starts it if didn't already
-	uint16_t r = 0;
-	aos_resource_entity *entity;
-	if(status == NULL)
-		goto err;
-	r = status->count + 1;
-	local_pid = status->pid;
-	start->count = r;
-	entity = status->resource_entity;
-	aos_queue_free_msg(status_queue, status);
-	status = (async_action_status<T> *)aos_queue_get_msg(status_queue);
-	status->count = r;
-	status->done_status = 0;
-	status->pid = local_pid;
-	status->resource_entity = entity; // the resource_entity of the action, not the caller!
-	start->parent = resource_entity; // if it's NULL, it'll get fixed when starting
-	if(aos_queue_write_msg(status_queue, status, OVERRIDE) < 0){
-		goto err;
-	} else {
-		status = NULL;
-	}
-	if(aos_queue_write_msg(start_queue, start, OVERRIDE) < 0){
-		goto err;
-	} else {
-		start = NULL;
-	}
-err:
-	if(start != NULL)
-		aos_queue_free_msg(start_queue, start);
-	if(status != NULL)
-		aos_queue_free_msg(status_queue, status);
-	local_count = r;
-	return r;
-}
-template<class T, class S> void AsyncAction<T, S>::Stop(int32_t count){
-	CheckStop();	
-	async_action_status<S> *status = (async_action_status<S> *)aos_queue_read_msg(status_queue, PEEK | NON_BLOCK);
-	if(status == NULL)
-		return;
-	local_pid = status->pid;
-	local_count = status->count;
-	aos_queue_free_msg(status_queue, status);
-	if(local_count != GetCount(count)) // if it's the wrong one
-		return;
-	async_action_start<S> *start = (async_action_start<S> *)aos_queue_read_msg(start_queue, PEEK | NON_BLOCK);
-	if(start == NULL) // if there isn't something in the start queue (aka one running)
-		return;
-	aos_queue_free_msg(start_queue, start);
-	union sigval sival;
-	sival.sival_int = 0;
-	if(sigqueue(local_pid, STOP_SIGNAL, sival) < 0){ // if sending the signal failed
-		fprintf(stderr, "sigqueue STOP_SIGNAL (which is %d) with pid %d failed with errno %d: ", STOP_SIGNAL, local_pid, errno);
-		perror(NULL);
-	}
-}
-
-template<class T, class S> bool AsyncAction<T, S>::IsDone(int32_t count){
-	CheckStop();
-	async_action_status<S> *status = (async_action_status<S> *)aos_queue_read_msg(status_queue, PEEK | NON_BLOCK);
-	// below = there is one running && it's the right one && it's done
-	bool r = status != NULL && status->count == GetCount(count) && ((status->done_status & 0x02) != 0);
-	aos_queue_free_msg(status_queue, status);
-	return r;
-}
-template<class T, class S> uint16_t AsyncAction<T, S>::Join(int32_t count_in){
-	const uint16_t count = GetCount(count_in);
-	if(count == 0){
-		fprintf(stderr, "not joining non-existent run 0\n");
-		return 0;
-	}
-	async_action_status<S> *status = NULL;
-	done_index = 0; // the queue's message numbering might have been reset
-	do {
-		aos_queue_free_msg(status_queue, status);
-		CheckStop();
-		status = (async_action_status<S> *)aos_queue_read_msg_index(status_queue, FROM_END, &done_index);
-	} while(status != NULL && (status->done_status & 0x02) == 0 && (status->count == count));
-	if(status == NULL){
-		fprintf(stderr, "bad news at %s: %d\n", __FILE__, __LINE__);
-		return 0;
-	}
-	aos_queue_free_msg(status_queue, status);
-	return count;
-}
-template<class T, class S> bool AsyncAction<T, S>::GetNextStatus(S &status_out, int32_t count_in){
-	async_action_status<S> *status = NULL;
-start:
-	CheckStop();
-	const uint16_t count = GetCount(count_in);
-	if(count != next_status_count){ // reset the index if another one gets started in case the queue indexes get reset
-		next_status_count = count;
-		status_index = 0;
-	}
-	status = (async_action_status<S> *)aos_queue_read_msg_index(status_queue, FROM_END, &status_index);
-	if(status == NULL)
-		goto start;
-	if(status->count != count){
-		aos_queue_free_msg(status_queue, status);
-		return false;
-	}
-	bool r = (status->done_status & 0x01) != 0;
-	memcpy(&status_out, &status->status, sizeof(S));
-	aos_queue_free_msg(status_queue, status);
-	return r;
-}
-template<class T, class S> bool AsyncAction<T, S>::GetStatus(S &status_out, int32_t count){
-	CheckStop();
-	async_action_status<S> *status = (async_action_status<S> *)aos_queue_read_msg(status_queue, PEEK | NON_BLOCK);
-	if(status == NULL)
-		return false;
-	if(status->count != GetCount(count)){
-		aos_queue_free_msg(status_queue, status);
-		return false;
-	}
-	bool r = (status->done_status & 0x01) != 0;
-	memcpy(&status_out, &status->status, sizeof(S));
-	aos_queue_free_msg(status_queue, status);
-	return r;
-}
-
-template<class T, class S> void AsyncAction<T, S>::PostStatus(S &status_in){
-	CheckStop();
-	async_action_status<S> *status = (async_action_status<S> *)aos_queue_get_msg(status_queue);
-	if(status == NULL)
-		return;
-	memcpy(&local_status, &status_in, sizeof(S));
-	memcpy(&status->status, &status_in, sizeof(S));
-	status->done_status = 0x01;
-	local_done_status = 0x01;
-	status->pid = local_pid;
-	status->resource_entity = resource_entity;
-	if(aos_queue_write_msg(status_queue, status, OVERRIDE) < 0){
-		local_done_status = 0;
-		memset(&local_status, 0x00, sizeof(S));
-		aos_queue_free_msg(status_queue, status);
-	}
-}
-template<class T, class S> template<int (*O)(aos_resource_entity *, aos_resource *)> inline bool AsyncAction<T, S>::ResourceOp(uint16_t resource){
-	CheckStop();
-	if(resource_entity == NULL){
-		fprintf(stderr, "no started AsyncAction detected in this process\n");
-		return false;
-	}
-	switch(O(resource_entity, aos_resource_get(resource))){
-		case 0:
-			break;
-		case 1:
-			return false;
-		case -1:
-			throw resourceexception();
-	}
-	return true;
-}
-template<class T, class S> void AsyncAction<T, S>::RequestResource(uint16_t resource){
-	if(ResourceOp<aos_resource_request>(resource)){
-		resources[resource] = 1;
-	}else{
-		throw resourceexception(); // if we can't get a resource, we just want to stop
-	}
-}
-template<class T, class S> bool AsyncAction<T, S>::TryRequestResource(uint16_t resource){
-	if(ResourceOp<aos_resource_request>(resource)){
-		resources[resource] = 1;
-		return true;
-	}else{
-		return false;
-	}
-}
-template<class T, class S> void AsyncAction<T, S>::ReleaseResource(uint16_t resource){
-	if(ResourceOp<aos_resource_release>(resource)){
-		if(resources.erase(resource) != 1)
-			fprintf(stderr, "warning: value for resource %d wasn't 1\n", resource);
-	}
-}
-
-#if 0
-// from gcc's (used 4.6.2) libjava/include/i386-signal.h
-/* We use kernel_sigaction here because we're calling the kernel
-   directly rather than via glibc.  The sigaction structure that the
-   syscall uses is a different shape from the one in userland and not
-   visible to us in a header file so we define it here.  */
-extern "C" 
-{
-  struct kernel_sigaction 
-  {
-    void (*k_sa_sigaction)(int,siginfo_t *,void *);
-    unsigned long k_sa_flags;
-    void (*k_sa_restorer) (void);
-    sigset_t k_sa_mask;
-  };
-}
-#define RESTORE(name, syscall) RESTORE2 (name, syscall)
-#define RESTORE2(name, syscall)			\
-asm						\
-  (						\
-   ".text\n"					\
-   ".byte 0  # Yes, this really is necessary\n" \
-   "	.align 16\n"				\
-   "__" #name ":\n"				\
-   "	movl $" #syscall ", %eax\n"		\
-   "	int  $0x80"				\
-   );
-/* The return code for realtime-signals.  */
-RESTORE (restore_rt, __NR_rt_sigreturn)
-void restore_rt (void) asm ("__restore_rt")
-  __attribute__ ((visibility ("hidden")));
-#define INIT_SIGNAL(signal, sigaction)				\
-do								\
-  {								\
-    struct kernel_sigaction act;				\
-    act.k_sa_sigaction = sigaction;				\
-    sigemptyset (&act.k_sa_mask);				\
-    act.k_sa_flags = SA_SIGINFO|0x4000000;			\
-    act.k_sa_restorer = restore_rt;				\
-    syscall (SYS_rt_sigaction, signal, &act, NULL, _NSIG / 8);	\
-  }								\
-while (0)  
-/* Unblock a signal.  Unless we do this, the signal may only be sent
-   once.  */
-static void 
-unblock_signal (int signum __attribute__ ((__unused__)))
-{
-  sigset_t sigs;
-
-  sigemptyset (&sigs);
-  sigaddset (&sigs, signum);
-  sigprocmask (SIG_UNBLOCK, &sigs, NULL);
-}
-#endif
-
-template<class T, class S> void AsyncAction<T, S>::sig_action(int signum, siginfo_t *, void *){
-  // TODO really shouldn't be using stdio in here (check before changing)
-	/*unblock_signal(signum);
-	// MAKE_THROW_FRAME(exception)
-	std::exception *exception = new std::exception;
-	throw exception;*/
-	fprintf(stderr, "received signal %d\n", signum);
-	if(signum == STOP_SIGNAL)
-		interrupt |= 0x01;
-	else if(signum == RESOURCE_KILL_SIGNAL)
-		interrupt |= 0x02;
-	else if(signum == SIGINT || signum == SIGTERM)
-		interrupt |= 0x04;
-	else
-		fprintf(stderr, "unknown signal %d\n", signum);
-}
-template<class T, class S> int AsyncAction<T, S>::Run(uint8_t priority) {
-	interrupt = 0;
-	struct sigaction sigact;
-	sigact.sa_sigaction = sig_action;
-	sigact.sa_flags = 0;
-	sigaction(STOP_SIGNAL, &sigact, NULL);
-	sigaction(RESOURCE_KILL_SIGNAL, &sigact, NULL);
-	sigaction(SIGINT, &sigact, NULL);
-	sigaction(SIGTERM, &sigact, NULL); // kill from the command line default
-
-	if(resource_entity != NULL){
-		fprintf(stderr, "resource_entity isn't already null, which means that this is the second Run being called in this process or something (which isn't allowed...)\n");
-		return -1;
-	}
-	resource_entity = aos_resource_entity_create(priority);
-
-	async_action_status<S> *status = (async_action_status<S> *)aos_queue_get_msg(status_queue);
-	if(status == NULL)
-		return -1;
-	//memset(status + offsetof(aync_action_status<S>, status->status), 0x00, sizeof(S));
-	status->count = 1;
-	status->done_status = 0;
-	local_done_status = 0;
-	local_pid = getpid();
-	fprintf(stderr, "local_pid=%d STOP_SIGNAL is currently %d\n", local_pid, STOP_SIGNAL);
-	status->pid = local_pid;
-	status->resource_entity = resource_entity;
-	// put the initial status in
-	if(aos_queue_write_msg(status_queue, status, OVERRIDE) < 0){
-		aos_queue_free_msg(status_queue, status);
-		return -1;
-	}
-	
-	// clear out any pending start messages
-	async_action_start<T> *start = (async_action_start<T> *)aos_queue_read_msg(start_queue, NON_BLOCK);
-	aos_queue_free_msg(start_queue, start);
-
-	OnStart();
-
-	T args;
-	uint16_t current_count;
-	while(true){
-		interrupt = 0;
-		// wait for a new start message
-		start = (async_action_start<T> *)aos_queue_read_msg(start_queue, PEEK);
-		if(start == NULL){
-			if(interrupt & 0x04)
-				break;
-			continue;
-		}
-		memcpy(&args, &start->args, sizeof(T));
-		current_count = start->count;
-		if(start->parent == NULL){ // Start isn't getting called from a process with an AsyncAction implementation running in it
-			start->parent = aos_resource_entity_root_get();
-		}
-		aos_resource_entity_set_parent(resource_entity, start->parent);
-		aos_queue_free_msg(start_queue, start);
-		status = (async_action_status<S> *)aos_queue_get_msg(status_queue);
-		if(status == NULL){
-			fprintf(stderr, "%s: %d: could not get a status message to write initial status to\n", __FILE__, __LINE__);
-			continue;
-		}
-		status->done_status = local_done_status = 0;
-		status->pid = local_pid;
-		status->count = current_count;
-		status->resource_entity = resource_entity;
-		if(aos_queue_write_msg(status_queue, status, OVERRIDE) < 0)
-			aos_queue_free_msg(status_queue, status);
-
-		try {
-			DoAction(args);
-		} catch (stopexception &e) {
-			fprintf(stderr, "caught stopexception\n");
-		} catch (resourceexception &e) {
-			fprintf(stderr, "caught resourceexception\n");
-		} catch (...) {
-			fprintf(stderr, "caught another exception... (bad news)\n");
-		}
-
-		start = (async_action_start<T> *)aos_queue_read_msg(start_queue, NON_BLOCK);
-		if(start == NULL){
-			fprintf(stderr, "somebody else consumed the start message (at %s: %d)\n", __FILE__, __LINE__);
-		} else {
-			aos_queue_free_msg(start_queue, start);
-		}
-
-		status = (async_action_status<S> *)aos_queue_get_msg(status_queue);
-		if(status == NULL){
-			fprintf(stderr, "couldn't get a message to write that we're finished in to %s: %d\n", __FILE__, __LINE__);
-			continue;
-		}
-		memcpy(&status->status, &local_status, sizeof(S));
-		status->done_status = local_done_status | 0x02;
-		status->pid = local_pid;
-		status->count = current_count;
-		status->resource_entity = resource_entity;
-		if(aos_queue_write_msg(status_queue, status, OVERRIDE) < 0)
-			aos_queue_free_msg(status_queue, status);
-
-		std::map<uint16_t, uint8_t>::iterator it;
-		for(it = resources.begin(); it != resources.end(); ++it){
-			ReleaseResource(it->first);
-		}
-		if(!resources.empty()){
-			fprintf(stderr, "resources isn't empty after releasing everything in it. clearing it\n");
-			resources.clear();
-		}
-
-		if(interrupt & 0x04)
-			break;
-	}
-	OnEnd();
-	return 0;
-}
-
-template<class T, class S> void AsyncAction<T, S>::Sleep(double seconds){
-	timespec ts;
-	clock_gettime(CLOCK_MONOTONIC, &ts);
-	ts.tv_sec += (time_t)floor(seconds);
-	ts.tv_nsec += (long)((seconds - floor(seconds)) * 1000000000);
-	if(ts.tv_nsec > 1000000000){
-		ts.tv_nsec -= 1000000000;
-		ts.tv_sec += 1;
-	}
-	int rv;
-	do {
-		CheckStop();
-		rv = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL);
-	} while(rv);
-}
-
-template<class T, class S> void AsyncAction<T, S>::DoAction(__attribute__((unused)) T &args){
-	fprintf(stderr, "this (at %s: %d) should never get run\n", __FILE__, __LINE__);
-	*((int *)NULL) = 0;
-}
-
-} // namespace aos
-
diff --git a/aos/atom_code/async_action/AsyncAction.h b/aos/atom_code/async_action/AsyncAction.h
deleted file mode 100644
index 31be206..0000000
--- a/aos/atom_code/async_action/AsyncAction.h
+++ /dev/null
@@ -1,155 +0,0 @@
-#ifndef _AOS_ASYNC_ACTION_H_
-#define _AOS_ASYNC_ACTION_H_
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <signal.h>
-
-#include <string>
-#include <map>
-#include <type_traits>
-
-#include "aos/aos_core.h"
-#include "aos/common/type_traits.h"
-
-class AsyncActionTest;
-
-namespace aos {
-	// S is status type T is parameter type
-
-	template<class S> struct async_action_status {
-		S status;
-		uint8_t done_status; // 1 = valid status, 2 = done
-		uint16_t count;
-		pid_t pid;
-		aos_resource_entity *resource_entity;
-	};
-	template<class T> struct async_action_start {
-		T args;
-		uint16_t count;
-		aos_resource_entity *parent;
-	};
-
-	class AsyncActionRunner;
-	class ResourceAction_t;
-
-	class AsyncActionStatics {
-		friend class ResourceAction_t; // a testing AsyncAction that has to mess with resource stuff
-		protected:
-			class stopexception : public std::exception {
-				virtual const char* what() const throw() {
-					return "This exception indicates that the AsyncAction was stopped. This message should never show up anywhere.";
-				}
-				public:
-				stopexception() : std::exception() {}
-			};
-			class resourceexception : public std::exception {
-				virtual const char* what() const throw() {
-					return "This exception indicates that the AsyncAction was stopped due to resource contention. This message should never show up anywhere.";
-				}
-				public:
-				resourceexception() : std::exception() {}
-			};
-
-			// 1 = stop current DoAction
-			// 2 = stop corrent DoAction because of resource issues
-			// 4 = SIGINT pending (nicely close everything down first)
-			static volatile uint8_t interrupt;
-			static const int STOP_SIGNAL;
-			static aos_resource_entity *resource_entity;
-
-			// throw any exceptions indicated by signals
-			static inline void CheckStop(){
-				if(interrupt & (0x01 | 0x04)) {
-					throw stopexception();
-					fprintf(stderr, "the code should never ever get here (%s: %d)\n", __FILE__, __LINE__);
-				}else if(interrupt & 0x02) {
-					throw resourceexception();
-					fprintf(stderr, "the code should never ever get here (%s: %d)\n", __FILE__, __LINE__);
-				}
-			}
-	};
-
-	// S and T have to be structs
-	// T is sTart and S is status
-	// public functions (except for constructor) should be called on this AsyncAction
-	// in processes other than the one Run ing this AsyncAction
-	// vice versa for protected ones
-	template<class T, class S> class AsyncAction : public AsyncActionStatics {
-		static_assert(shm_ok<async_action_start<T>>::value,
-                  "T must go through shared memory");
-		static_assert(shm_ok<async_action_status<S>>::value,
-                  "S must go through shared memory");
-		friend class AsyncActionRunner;
-		friend class ::AsyncActionTest;
-		public:
-		AsyncAction(const std::string name);
-
-		// returns what the count will be throughout this run
-		// return of 0 indicates error (didn't start)
-		uint16_t Start(T &args);
-
-		// -1 for count means use the static one
-		// aka !IsRunning()
-		bool IsDone(int32_t count = -1);
-		// returns which one it joined
-		uint16_t Join(int32_t count = -1);
-		// return is whether there is an actual status or just garbage
-		bool GetStatus(S &status_out, int32_t count = -1) __attribute__ ((warn_unused_result));
-		// waits for a new good status
-		bool GetNextStatus(S &status_out, int32_t count = -1) __attribute__ ((warn_unused_result));
-
-		void Stop(int32_t count = -1);
-		protected:
-		// starts infinite loop that waits for Starts
-		// returns 0 for success, negative for error
-		// gets called by generated code
-		int Run(uint8_t priority);
-
-		virtual void DoAction(T &args);
-		// should only be called from DoAction
-		void PostStatus(S &status_in);
-		void RequestResource(uint16_t resource);
-		// returns whether succeeded
-		bool TryRequestResource(uint16_t resource);
-		void ReleaseResource(uint16_t resource);
-
-		// called at the beginning and end of Run
-		virtual void OnStart() {}
-		virtual void OnEnd() {}
-
-		// this should be the only sleep (or variant thereof) that gets called
-		void Sleep(double seconds);
-		private:
-		aos_queue *status_queue, *start_queue;
-
-		uint16_t local_count;
-		S local_status;
-		uint8_t local_done_status;
-		pid_t local_pid;
-
-		template<int (*O)(aos_resource_entity *, aos_resource *)> bool ResourceOp(uint16_t resource);
-		std::map<uint16_t, uint8_t> resources;
-
-		// for read_msg_index
-		int done_index, status_index;
-		uint16_t next_status_count; // uses it to figure out when to reset status_index
-
-		// return the default if appropriate
-		inline uint16_t GetCount(int32_t in){
-			if(in < 0)
-				return local_count;
-			else
-				return (uint16_t)in;
-		}
-
-		static void sig_action(int, siginfo_t *, void *);
-	};
-
-} // namespace aos
-
-#include "AsyncAction.cpp.inc" // to make the template stuff work
-
-#endif
diff --git a/aos/atom_code/async_action/AsyncActionHandle.h b/aos/atom_code/async_action/AsyncActionHandle.h
deleted file mode 100644
index 8088848..0000000
--- a/aos/atom_code/async_action/AsyncActionHandle.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef __AOS__ASYNC_ACTION_HANDLE_H_
-#define __AOS__ASYNC_ACTION_HANDLE_H_
-
-namespace aos {
-
-	class AsyncActionHandle {
-		public:
-			virtual bool IsDone() = 0;
-			virtual uint16_t Join() = 0;
-			virtual uint16_t Join(int32_t count) = 0;
-			virtual void Stop() = 0;
-			virtual void Stop(int32_t count) = 0;
-	};
-
-} // namespace aos
-
-#endif
diff --git a/aos/atom_code/async_action/AsyncActionRunner.h b/aos/atom_code/async_action/AsyncActionRunner.h
deleted file mode 100644
index 148d13a..0000000
--- a/aos/atom_code/async_action/AsyncActionRunner.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef __AOS_ASYNC_ACTION_RUNNER_H_
-#define __AOS_ASYNC_ACTION_RUNNER_H_
-
-#include "aos/atom_code/async_action/AsyncAction.h"
-
-namespace aos {
-	class AsyncActionRunner {
-		public:
-			template<class T, class S> inline static int Run(AsyncAction<T, S> &action, uint8_t priority) {
-				return action.Run(priority);
-			}
-	};
-}
-
-#endif
diff --git a/aos/atom_code/async_action/AsyncAction_real.cpp b/aos/atom_code/async_action/AsyncAction_real.cpp
deleted file mode 100644
index 9a0be1d..0000000
--- a/aos/atom_code/async_action/AsyncAction_real.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "AsyncAction.h"
-
-using namespace aos;
-
-volatile uint8_t AsyncActionStatics::interrupt = 0;
-
-const int AsyncActionStatics::STOP_SIGNAL = SIGRTMIN + 4;
-
-aos_resource_entity *AsyncActionStatics::resource_entity = NULL;
-
diff --git a/aos/atom_code/async_action/AsyncAction_test.cpp b/aos/atom_code/async_action/AsyncAction_test.cpp
deleted file mode 100644
index bdd4002..0000000
--- a/aos/atom_code/async_action/AsyncAction_test.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-#include "TestAction.h"
-#include "ResourceAction.h"
-extern "C"{
-#include <resource_internal.h>
-}
-
-#include <gtest/gtest.h>
-
-#include "sharedmem_test_setup.h"
-
-using namespace aos;
-
-class AsyncActionTest : public ExecVeTestSetup{
-	protected:
-		virtual void SetUp(){
-			AddProcess("../bin/TestAction");
-			AddProcess("../bin/ResourceAction");
-			//AddProcess("/home/brians/bin/wait_5s.sh");
-			AddProcess("../bin/ResourceActionChild");
-
-			ExecVeTestSetup::SetUp();
-		}
-
-		template<class H, class S, class T> bool HasResource(const uint16_t resource, H &handle){
-			/*bool r = AOS_RESOURCE_STATE_GET_HAS_IT(resource, handle.GetInstance().resource_entity);
-			EXPECT_EQ(r, handle.GetInstance().resources.count(resource)) << "the AsyncAction doesn't know whether it has resource " << resource << " or not";
-			return r;*/
-
-			/*const AsyncAction<S, T> &action = handle.GetInstance();
-			async_action_start<S> *start = (async_action_start<S> *)aos_queue_read_message(action.start_queue, PEEK | NON_BLOCK);
-			ASSERT_NE(NULL, start);
-			bool r = AOS_RESOURCE_STATE_GET_HAS_IT(resource, start->parent);
-			aos_queue_free_msg(action.start_queue, start);
-			return r;*/
-
-			AsyncAction<S, T> &action = (AsyncAction<S, T> &)handle.GetInstance();
-			async_action_status<T> *status = (async_action_status<T> *)aos_queue_read_msg(action.status_queue, PEEK | NON_BLOCK);
-			EXPECT_TRUE(status != NULL) << "if this failed, we're going to segfault next";
-			bool r = AOS_RESOURCE_STATE_GET_HAS_IT(resource, status->resource_entity);
-			aos_queue_free_msg(action.status_queue, status);
-			return r;
-		}
-
-		// tests from the google doc (https://docs.google.com/document/d/1gzRrVcqL2X9VgNQUI5DrvLVVVziIH7c5ZerATVbiS7U/edit?hl=en_US) (referenced by the numbers in the drawing)
-		// up here so they can be called with multiple inputs and checked for correct outputs
-		// return = number of sub-action call it failed at (1 = top level one etc) (0 = succeeded)
-		int GoogleDocTest1(uint8_t in_state){
-			return ResourceAction.Execute(0x01, 0x01, 1, in_state).failed;
-		}
-
-		virtual void TearDown(){
-			TestAction.Free();
-			LeftDrive.Free();
-			ResourceAction.Free();
-			ResourceAction.Free();
-			
-			ExecVeTestSetup::TearDown();
-		}
-};
-
-TEST_F(AsyncActionTest, StartStop){
-	TestAction.Start(5, 3);
-	TestAction.Stop();
-	PercolatePause();
-	EXPECT_TRUE(TestAction.IsDone());
-}
-TEST_F(AsyncActionTest, AlternateName){
-	EXPECT_FALSE(LeftDrive.IsDone());
-}
-
-TEST_F(AsyncActionTest, Join){
-	TestAction.Start(0.1, 3);
-	EXPECT_FALSE(TestAction.IsDone());
-	TestAction.Join();
-	EXPECT_TRUE(TestAction.IsDone());
-}
-TEST_F(AsyncActionTest, JoinAgain){
-	uint16_t instance = TestAction.Start(0.1, 3);
-	TestAction.Join();
-	EXPECT_TRUE(TestAction.IsDone());
-	timespec ts;
-	clock_gettime(CLOCK_MONOTONIC, &ts);
-	TestAction.Join(instance);
-	timespec ts2;
-	clock_gettime(CLOCK_MONOTONIC, &ts2);
-	long diff = ts2.tv_nsec - ts.tv_nsec;
-	diff += (ts2.tv_sec - ts.tv_sec) * 1000000000;
-	EXPECT_LT(diff, 50000);
-}
-TEST_F(AsyncActionTest, Execute){
-	TestAction.Execute(0.06, 3);
-	EXPECT_TRUE(TestAction.IsDone());
-}
-
-TEST_F(AsyncActionTest, Release){
-	TestAction.Start(0.1, -4);
-	while(!TestAction.IsDone()){
-		if(TestAction.GetNextStatus())
-			EXPECT_EQ(TestAction.GetLastStatus().loops > 2, !(HasResource<TestActionHandle, testing_status, testing_args>(test_resource1, TestAction)));
-	}
-}
-TEST_F(AsyncActionTest, ReleaseBad){
-	TestAction.Start(-0.01, 5);
-}
-TEST_F(AsyncActionTest, ImplicitRelease){
-	TestAction.Execute(0.02, 4);
-	EXPECT_FALSE((HasResource<TestActionHandle, testing_status, testing_args>(test_resource1, TestAction)));
-}
-
-//TODO test killing or not based on priority (and inherited priority...)
-
-TEST_F(AsyncActionTest, GoogleDoc111){
-	EXPECT_EQ(3, GoogleDocTest1(3));
-}
-
diff --git a/aos/atom_code/async_action/ResourceAction.act b/aos/atom_code/async_action/ResourceAction.act
deleted file mode 100644
index 46e22fb..0000000
--- a/aos/atom_code/async_action/ResourceAction.act
+++ /dev/null
@@ -1,13 +0,0 @@
-args resource_args {
-	// 1 = request, 2 = release, 4 = child run, 8 = child request, 16 = child release, all others 0
-	uint8_t first;
-	uint8_t second;
-
-	int number; // top level is 1
-
-	uint8_t state_to_set; // first 2 bits are this one, next 2 bits are for parent
-};
-status resource_status {
-	int failed; // 0 means none have failed yet
-};
-priority 100;
diff --git a/aos/atom_code/async_action/ResourceActionChild.act b/aos/atom_code/async_action/ResourceActionChild.act
deleted file mode 100644
index 5e8226a..0000000
--- a/aos/atom_code/async_action/ResourceActionChild.act
+++ /dev/null
@@ -1,8 +0,0 @@
-args resource_child_args{
-	// 1 = request, 2 = release
-	uint8_t actions;
-}
-status resource_child_status{
-	bool success;
-}
-priority 70;
diff --git a/aos/atom_code/async_action/ResourceActionChild_t.cpp b/aos/atom_code/async_action/ResourceActionChild_t.cpp
deleted file mode 100644
index c1a2601..0000000
--- a/aos/atom_code/async_action/ResourceActionChild_t.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "ResourceActionChild.h"
-
-void ResourceActionChild_t::DoAction(uint8_t actions){
-	if(actions & 0x01)
-		if(TryRequestResource(test_resource1)){
-			PostStatus(false);
-			return;
-		}
-	if(actions & 0x02)
-		ReleaseResource(test_resource1);
-	PostStatus(true);
-}
-
diff --git a/aos/atom_code/async_action/ResourceAction_t.cpp b/aos/atom_code/async_action/ResourceAction_t.cpp
deleted file mode 100644
index 99d9c7e..0000000
--- a/aos/atom_code/async_action/ResourceAction_t.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#define AOS_ResourceAction_t_HEADER_FRAG int DoSub(uint8_t slot, int in_number);
-
-#include "ResourceAction.h"
-#include "ResourceActionChild.h"
-extern "C"{
-#include <resource_internal.h>
-}
-
-int ResourceAction_t::DoSub(uint8_t slot, int in_number){
-	if(slot & 0x01)
-		if(TryRequestResource(test_resource1)){
-			PostStatus(in_number + 1);
-			return 0;
-		}
-	if(slot & 0x02)
-		ReleaseResource(test_resource1);
-	if(slot & 0x04){
-		if(!ResourceActionChild.Execute(slot << 3).success){
-			PostStatus(in_number + 2);
-			return 0;
-		}
-	}
-	return in_number + ((slot & (0x01 | 0x02)) ? 1 : 0) + ((slot & 0x04) ? 1 : 0);
-}
-void ResourceAction_t::DoAction(uint8_t first, uint8_t second, int number, uint8_t state_to_set){
-	printf("start of ResourceAction.DoAction\n");
-	AOS_RESOURCE_STATE_SET_ON((AOS_RESOURCE_STATE_WANTS_IT | AOS_RESOURCE_STATE_HAS_PASSED_DOWN) & state_to_set, test_resource1, ::AsyncActionStatics::resource_entity);
-	AOS_RESOURCE_STATE_SET_OFF((AOS_RESOURCE_STATE_WANTS_IT | AOS_RESOURCE_STATE_HAS_PASSED_DOWN) & state_to_set, test_resource1, ::AsyncActionStatics::resource_entity);
-	AOS_RESOURCE_STATE_SET_ON((AOS_RESOURCE_STATE_WANTS_IT | AOS_RESOURCE_STATE_HAS_PASSED_DOWN) & (state_to_set >> 2), test_resource1, aos_resource_entity_root_get());
-	AOS_RESOURCE_STATE_SET_OFF((AOS_RESOURCE_STATE_WANTS_IT | AOS_RESOURCE_STATE_HAS_PASSED_DOWN) & state_to_set >> 2, test_resource1, aos_resource_entity_root_get());
-	printf("set state\n");
-
-	number = DoSub(first, number);
-	printf("did first\n");
-	if(number == 0) // error
-		return;
-	number = DoSub(second, number);
-	printf("did second\n");
-}
-
diff --git a/aos/atom_code/async_action/TestAction.act b/aos/atom_code/async_action/TestAction.act
deleted file mode 100644
index 96c940b..0000000
--- a/aos/atom_code/async_action/TestAction.act
+++ /dev/null
@@ -1,13 +0,0 @@
-args testing_args {
-	double seconds;
-	int loops;
-};
-status testing_status {
-	int loops;
-	double total_seconds;
-};
-async_queue LeftDrive;
-async_queue TestAction;
-//has OnEnd;
-//has OnStart;
-priority 50;
diff --git a/aos/atom_code/async_action/TestAction_t.cpp b/aos/atom_code/async_action/TestAction_t.cpp
deleted file mode 100644
index 1e99529..0000000
--- a/aos/atom_code/async_action/TestAction_t.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "TestAction.h"
-#include <AsyncActionRunner.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-
-//void TestingAction_t::OnStart() {printf("started\n");}
-//void TestingAction_t::OnEnd() {printf("ended\n");}
-void TestAction_t::DoAction(double seconds, int loops) {
-	printf("start of DoAction\n");
-	RequestResource(test_resource1);
-	bool release = loops < 0;
-	if(release)
-		loops *= -1;
-	bool release_bad = seconds < 0;
-	if(release_bad)
-		seconds *= -1;
-	int i;
-	for(i = 0; i < loops; ++i) {
-		Sleep(seconds);
-		printf("posting for loop %d\n", i);
-		PostStatus(i, seconds * i);
-		printf("posted for loop %d\n", i);
-		if(release && i > loops / 2){
-			printf("releasing resource\n");
-			ReleaseResource(test_resource1);
-		}
-		if(release_bad && i > loops / 2){
-			printf("releasing resource which has not been requested\n");
-			ReleaseResource(test_resource2);
-		}
-	}
-	printf("end of DoAction\n");
-}
-
diff --git a/aos/atom_code/async_action/async_action.gyp b/aos/atom_code/async_action/async_action.gyp
deleted file mode 100644
index 5f5bf55..0000000
--- a/aos/atom_code/async_action/async_action.gyp
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'AsyncAction_test',
-      'type': 'executable',
-      'sources': [
-        'AsyncACtion_test.cpp',
-      ],
-      'dependencies': [
-        '<(EXTERNALS):gtest',
-      ],
-  ],
-},
diff --git a/aos/atom_code/atom_code.gyp b/aos/atom_code/atom_code.gyp
new file mode 100644
index 0000000..51dcaec
--- /dev/null
+++ b/aos/atom_code/atom_code.gyp
@@ -0,0 +1,27 @@
+{
+  'targets': [
+    {
+      'target_name': 'init',
+      'type': 'static_library',
+      'sources': [
+        '<(AOS)/atom_code/init.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:shared_mem',
+        '<(AOS)/common/common.gyp:die',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+    },
+    {
+      'target_name': 'configuration',
+      'type': 'static_library',
+      'sources': [
+        'configuration.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/common/common.gyp:once',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+    },
+  ],
+}
diff --git a/aos/atom_code/camera/Buffers.cpp b/aos/atom_code/camera/Buffers.cpp
index 22b7337..d0d20f5 100644
--- a/aos/atom_code/camera/Buffers.cpp
+++ b/aos/atom_code/camera/Buffers.cpp
@@ -1,8 +1,10 @@
-#include "Buffers.h"
-#include "V4L2.h"
+#include "aos/atom_code/camera/Buffers.h"
 
 #include <sys/mman.h>
 
+#include "aos/atom_code/camera/V4L2.h"
+#include "aos/common/logging/logging.h"
+
 namespace aos {
 namespace camera {
 
@@ -13,7 +15,6 @@
 };
 const std::string Buffers::kFDServerName("/tmp/aos_fd_server");
 const std::string Buffers::kQueueName("CameraBufferQueue");
-const aos_type_sig Buffers::kSignature{sizeof(Message), 971, 1};
 
 int Buffers::CreateSocket(int (*bind_connect)(int, const sockaddr *, socklen_t)) {
   union af_unix_sockaddr {
@@ -22,18 +23,15 @@
   } addr;
   const int r = socket(AF_UNIX, SOCK_STREAM, 0);
   if (r == -1) {
-    LOG(ERROR, "socket(AF_UNIX, SOCK_STREAM, 0) failed with %d: %s\n",
+    LOG(FATAL, "socket(AF_UNIX, SOCK_STREAM, 0) failed with %d: %s\n",
         errno, strerror(errno));
-    return -1;
   }
   addr.un.sun_family = AF_UNIX;
   memset(addr.un.sun_path, 0, sizeof(addr.un.sun_path));
   strcpy(addr.un.sun_path, kFDServerName.c_str());
   if (bind_connect(r, &addr.addr, sizeof(addr.un)) == -1) {
-    LOG(ERROR, "bind_connect(=%p)(%d, %p, %zd) failed with %d: %s\n",
+    LOG(FATAL, "bind_connect(=%p)(%d, %p, %zd) failed with %d: %s\n",
         bind_connect, r, &addr.addr, sizeof(addr.un), errno, strerror(errno));
-    close(r); // what are we going to do about an error?
-    return -1;
   }
   return r;
 }
@@ -64,7 +62,7 @@
 
 void Buffers::Release() {
   if (message_ != NULL) {
-    aos_queue_free_msg(queue_, message_);
+    queue_->FreeMessage(message_);
     message_ = NULL;
   }
 }
@@ -75,11 +73,12 @@
   // TODO(brians) make sure the camera reader process hasn't died
   do {
     if (block) {
-      message_ = static_cast<const Message *>(aos_queue_read_msg(queue_, PEEK | BLOCK));
+      message_ = static_cast<const Message *>(queue_->ReadMessage(
+              RawQueue::kPeek | RawQueue::kBlock));
     } else {
       static int index = 0;
-      message_ = static_cast<const Message *>(aos_queue_read_msg_index(queue_, BLOCK,
-                                                                       &index));
+      message_ = static_cast<const Message *>(queue_->ReadMessageIndex(
+              RawQueue::kBlock, &index));
     }
   } while (block && message_ == NULL);
   if (message_ != NULL) {
@@ -135,7 +134,7 @@
 }
 Buffers::Buffers() : server_(CreateSocket(connect)), fd_(FetchFD()), message_(NULL) {
   MMap();
-  queue_ = aos_fetch_queue(kQueueName.c_str(), &kSignature);
+  queue_ = RawQueue::Fetch(kQueueName.c_str(), sizeof(Message), 971, 1);
 }
 
 Buffers::~Buffers() {
@@ -155,6 +154,5 @@
   }
 }
 
-} // namespace camera
-} // namespace aos
-
+}  // namespace camera
+}  // namespace aos
diff --git a/aos/atom_code/camera/Buffers.h b/aos/atom_code/camera/Buffers.h
index 7f1206d..080e9eb 100644
--- a/aos/atom_code/camera/Buffers.h
+++ b/aos/atom_code/camera/Buffers.h
@@ -6,7 +6,7 @@
 
 #include <string>
 
-#include "aos/aos_core.h"
+#include "aos/atom_code/ipc_lib/queue.h"
 #include "aos/common/type_traits.h"
 
 namespace aos {
@@ -53,9 +53,8 @@
   // The current one. Sometimes NULL.
   const Message *message_;
   static const std::string kQueueName;
-  static const aos_type_sig kSignature;
   // NULL for the Reader one.
-  aos_queue *queue_;
+  RawQueue *queue_;
   // Make the actual mmap calls.
   // Called by Buffers() automatically.
   void MMap();
@@ -83,7 +82,7 @@
   void Release();
 
   // How big images are.
-  static const int32_t kWidth = 640, kHeight = 480;
+  static const int32_t kWidth = 320, kHeight = 240;
 };
 
 } // namespace camera
diff --git a/aos/atom_code/camera/HTTPStreamer.cpp b/aos/atom_code/camera/HTTPStreamer.cpp
index ad339a8..5a9a405 100644
--- a/aos/atom_code/camera/HTTPStreamer.cpp
+++ b/aos/atom_code/camera/HTTPStreamer.cpp
@@ -15,9 +15,10 @@
 
 #include <vector>
 
-#include "aos/common/Configuration.h"
-#include "aos/aos_core.h"
+#include "aos/common/network_port.h"
+#include "aos/atom_code/init.h"
 #include "aos/atom_code/camera/Buffers.h"
+#include "aos/common/logging/logging.h"
 
 namespace aos {
 namespace camera {
@@ -224,7 +225,7 @@
             to_write_ = snprintf(scratch_, sizeof(scratch_),
                                 "\r\n--boundarydonotcross\r\n"
                                 "Content-Type: image/jpeg\r\n"
-                                "Content-Length: %"PRId32"\r\n"
+                                "Content-Length: %" PRId32 "\r\n"
                                 "X-Timestamp: %ld.%06ld\r\n"
                                 "\r\n",
                                 size_,
@@ -385,4 +386,9 @@
 }  // namespace camera
 }  // namespace aos
 
-AOS_RUN_NRT(aos::camera::HTTPStreamer)
+int main() {
+  ::aos::InitNRT();
+  ::aos::camera::HTTPStreamer streamer;
+  streamer.Run();
+  ::aos::Cleanup();
+}
diff --git a/aos/atom_code/camera/Reader.cpp b/aos/atom_code/camera/Reader.cpp
index 9cfee2a..125fde1 100644
--- a/aos/atom_code/camera/Reader.cpp
+++ b/aos/atom_code/camera/Reader.cpp
@@ -13,9 +13,11 @@
 #include <string>
 #include <inttypes.h>
 
-#include "aos/aos_core.h"
+#include "aos/atom_code/init.h"
 #include "aos/atom_code/camera/V4L2.h"
 #include "aos/atom_code/camera/Buffers.h"
+#include "aos/common/logging/logging.h"
+#include "aos/atom_code/ipc_lib/queue.h"
 
 #define CLEAR(x) memset(&(x), 0, sizeof(x))
 
@@ -30,8 +32,7 @@
   // the bound socket listening for fd requests
   int server_fd_;
 
-  static const aos_type_sig kRecycleSignature;
-  aos_queue *queue_, *recycle_queue_;
+  RawQueue *queue_, *recycle_queue_;
   // the number of buffers currently queued in v4l2
   uint32_t queued_;
  public:
@@ -51,10 +52,11 @@
               dev_name, errno, strerror(errno));
     }
 
-    queue_ = aos_fetch_queue_recycle(Buffers::kQueueName.c_str(), &Buffers::kSignature,
-                                     &kRecycleSignature, &recycle_queue_);
+    queue_ = RawQueue::Fetch(Buffers::kQueueName.c_str(),
+                          sizeof(Buffers::Message), 971, 1,
+                          1, Buffers::kNumBuffers, &recycle_queue_);
     // read off any existing recycled messages
-    while (aos_queue_read_msg(recycle_queue_, NON_BLOCK) != NULL);
+    while (recycle_queue_->ReadMessage(RawQueue::kNonBlock) != NULL);
     queued_ = 0;
 
     InitServer();
@@ -120,10 +122,11 @@
 
   void QueueBuffer(v4l2_buffer *buf) {
     if (xioctl(fd_, VIDIOC_QBUF, buf) == -1) {
-      LOG(WARNING, "ioctl VIDIOC_QBUF(%d, %p) failed with %d: %s. losing buf #%"PRIu32"\n",
+      LOG(WARNING, "ioctl VIDIOC_QBUF(%d, %p) failed with %d: %s."
+          " losing buf #%" PRIu32 "\n",
           fd_, &buf, errno, strerror(errno), buf->index);
     } else {
-      LOG(DEBUG, "put buf #%"PRIu32" into driver's queue\n", buf->index);
+      LOG(DEBUG, "put buf #%" PRIu32 " into driver's queue\n", buf->index);
       ++queued_;
     }
   }
@@ -138,10 +141,11 @@
       read = static_cast<const Buffers::Message *>(
           // we block waiting for one if we can't dequeue one without leaving
           // the driver <= 2 (to be safe)
-          aos_queue_read_msg(recycle_queue_, (queued_ <= 2) ? BLOCK : NON_BLOCK));
+          recycle_queue_->ReadMessage((queued_ <= 2) ?
+                                      RawQueue::kBlock : RawQueue::kNonBlock));
       if (read != NULL) {
         buf.index = read->index;
-        aos_queue_free_msg(recycle_queue_, read);
+        recycle_queue_->FreeMessage(read);
         QueueBuffer(&buf);
       }
     } while (read != NULL);
@@ -155,15 +159,16 @@
     }
     --queued_;
     if (buf.index >= Buffers::kNumBuffers) {
-      LOG(ERROR, "buf.index (%"PRIu32") is >= kNumBuffers (%u)\n",
+      LOG(ERROR, "buf.index (%" PRIu32 ") is >= kNumBuffers (%u)\n",
           buf.index, Buffers::kNumBuffers);
       return;
     }
 
     Buffers::Message *const msg = static_cast<Buffers::Message *>(
-        aos_queue_get_msg(queue_));
+        queue_->GetMessage());
     if (msg == NULL) {
-      LOG(WARNING, "couldn't get a message to send buf #%"PRIu32" from queue %p."
+      LOG(WARNING,
+          "couldn't get a message to send buf #%" PRIu32 " from queue %p."
           " re-queueing now\n", buf.index, queue_);
       QueueBuffer(&buf);
       return;
@@ -172,13 +177,14 @@
     msg->bytesused = buf.bytesused;
     memcpy(&msg->timestamp, &buf.timestamp, sizeof(msg->timestamp));
     msg->sequence = buf.sequence;
-    if (aos_queue_write_msg_free(queue_, msg, OVERRIDE) == -1) {
-      LOG(WARNING, "sending message %p with buf #%"PRIu32" to queue %p failed."
+    if (!queue_->WriteMessage(msg, RawQueue::kOverride)) {
+      LOG(WARNING,
+          "sending message %p with buf #%" PRIu32 " to queue %p failed."
           " re-queueing now\n", msg, buf.index, queue_);
       QueueBuffer(&buf);
       return;
     } else {
-      LOG(DEBUG, "sent message off to queue %p with buffer #%"PRIu32"\n",
+      LOG(DEBUG, "sent message off to queue %p with buffer #%" PRIu32 "\n",
           queue_, buf.index);
     }
   }
@@ -203,6 +209,36 @@
     }
   }
 
+  // Sets one of the camera's user-control values.
+  // Prints the old and new values.
+  // Just prints a message if the camera doesn't support this control or value.
+  bool SetCameraControl(uint32_t id, const char *name, int value) {
+    struct v4l2_control getArg = {id, 0U};
+    int r = xioctl(fd_, VIDIOC_G_CTRL, &getArg);
+    if (r == 0) {
+      if (getArg.value == value) {
+        printf("Camera control %s was already %d\n", name, getArg.value);
+        return true;
+      }
+    } else if (errno == EINVAL) {
+      printf("Camera control %s is invalid\n", name);
+      errno = 0;
+      return false;
+    }
+
+    struct v4l2_control setArg = {id, value};
+    r = xioctl(fd_, VIDIOC_S_CTRL, &setArg);
+    if (r == 0) {
+      printf("Set camera control %s from %d to %d\n", name, getArg.value, value);
+      return true;
+    }
+
+    printf("Couldn't set camera control %s to %d: %s (errno %d)\n",
+        name, value, strerror(errno), errno);
+    errno = 0;
+    return false;
+  }
+
   void Init() {
     v4l2_capability cap;
     if (xioctl(fd_, VIDIOC_QUERYCAP, &cap) == -1) {
@@ -270,6 +306,24 @@
     if (fmt.fmt.pix.sizeimage < min)
       fmt.fmt.pix.sizeimage = min;
 
+    if (!SetCameraControl(V4L2_CID_EXPOSURE_AUTO,
+                          "V4L2_CID_EXPOSURE_AUTO", V4L2_EXPOSURE_MANUAL)) {
+      LOG(FATAL, "Failed to set exposure\n");
+    }
+
+    if (!SetCameraControl(V4L2_CID_EXPOSURE_ABSOLUTE,
+                          "V4L2_CID_EXPOSURE_ABSOLUTE", 65)) {
+      LOG(FATAL, "Failed to set exposure\n");
+    }
+
+    if (!SetCameraControl(V4L2_CID_BRIGHTNESS, "V4L2_CID_BRIGHTNESS", 128)) {
+      LOG(FATAL, "Failed to set up camera\n");
+    }
+
+    if (!SetCameraControl(V4L2_CID_GAIN, "V4L2_CID_GAIN", 0)) {
+      LOG(FATAL, "Failed to set up camera\n");
+    }
+
 #if 0
     // set framerate
     struct v4l2_streamparm *setfps;
@@ -337,6 +391,7 @@
       }
 
       if (FD_ISSET(fd_, &fds)) {
+        LOG(DEBUG, "Got a frame\n");
         ReadFrame();
       }
       if (FD_ISSET(server_fd_, &fds)) {
@@ -352,11 +407,13 @@
   }
 };
 const char *const Reader::dev_name = "/dev/video0";
-const aos_type_sig Reader::kRecycleSignature{
-  sizeof(Buffers::Message), 1, Buffers::kNumBuffers};
 
 } // namespace camera
 } // namespace aos
 
-AOS_RUN_NRT(aos::camera::Reader)
-
+int main() {
+  ::aos::InitNRT();
+  ::aos::camera::Reader reader;
+  reader.Run();
+  ::aos::Cleanup();
+}
diff --git a/aos/atom_code/camera/camera.gyp b/aos/atom_code/camera/camera.gyp
index e94a6ac..f1743be 100644
--- a/aos/atom_code/camera/camera.gyp
+++ b/aos/atom_code/camera/camera.gyp
@@ -7,18 +7,14 @@
         'jni.cpp',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
         '<(AOS)/common/network/network.gyp:socket_so',
         '<(AOS)/common/common.gyp:timing_so',
-        '<(AOS)/atom_code/messages/messages.gyp:messages_so',
         'private_aos_camera_jar',
         '<(EXTERNALS):libjpeg',
       ],
       'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
         '<(AOS)/common/network/network.gyp:socket_so',
         '<(AOS)/common/common.gyp:timing_so',
-        '<(AOS)/atom_code/messages/messages.gyp:messages_so',
         'private_aos_camera_jar',
       ],
     },
@@ -43,13 +39,29 @@
       'hard_dependency': 1,
     },
     {
+      'target_name': 'buffers',
+      'type': 'static_library',
+      'sources': [
+        'Buffers.cpp',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
+      ],
+    },
+    {
       'target_name': 'CameraHTTPStreamer',
       'type': 'executable',
       'sources': [
         'HTTPStreamer.cpp',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        'buffers',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/build/aos.gyp:logging',
       ],
     },
     {
@@ -59,7 +71,10 @@
         'Reader.cpp',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        'buffers',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
       ],
     },
   ],
diff --git a/aos/atom_code/camera/jni.cpp b/aos/atom_code/camera/jni.cpp
index 7b7eafa..ad5177a 100644
--- a/aos/atom_code/camera/jni.cpp
+++ b/aos/atom_code/camera/jni.cpp
@@ -3,6 +3,8 @@
 #include "jni/aos_Natives.h"
 #include "aos/atom_code/camera/Buffers.h"
 #include "aos/externals/libjpeg/include/jpeglib.h"
+#include "aos/common/logging/logging_impl.h"
+#include "aos/atom_code/init.h"
 
 using aos::camera::Buffers;
 
@@ -248,8 +250,8 @@
   } else {
     level = DEBUG;
   }
-  // can't use Get/ReleaseStringCritical because log_do might block waiting to
-  // put its message into the queue
+  // Can't use Get/ReleaseStringCritical because log_do might block waiting to
+  // put its message into the queue.
   const char *const message_chars = env->GetStringUTFChars(message, NULL);
   if (message_chars == NULL) return;
   log_do(level, "%s\n", message_chars);
diff --git a/aos/atom_code/configuration.cc b/aos/atom_code/configuration.cc
new file mode 100644
index 0000000..2d6dab8
--- /dev/null
+++ b/aos/atom_code/configuration.cc
@@ -0,0 +1,104 @@
+#include "aos/atom_code/configuration.h"
+
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <ifaddrs.h>
+#include <unistd.h>
+
+#include "aos/common/logging/logging.h"
+#include "aos/common/unique_malloc_ptr.h"
+#include "aos/common/once.h"
+
+namespace aos {
+namespace configuration {
+namespace {
+
+// Including the terminating '\0'.
+const size_t kMaxAddrLength = 18;
+
+const char *const kAtomNetInterface = "eth0";
+const in_addr *DoGetOwnIPAddress() {
+  ifaddrs *addrs;
+  if (getifaddrs(&addrs) != 0) {
+    LOG(FATAL, "getifaddrs(%p) failed with %d: %s\n", &addrs,
+        errno, strerror(errno));
+  }
+  // Smart pointers don't work very well for iterating through a linked list,
+  // but it does do a very nice job of making sure that addrs gets freed.
+  unique_c_ptr<ifaddrs, freeifaddrs> addrs_deleter(addrs);
+
+  for (; addrs != NULL; addrs = addrs->ifa_next) {
+    if (addrs->ifa_addr->sa_family == AF_INET) {
+      if (strcmp(kAtomNetInterface, addrs->ifa_name) == 0) {
+        static const in_addr r =
+            reinterpret_cast<sockaddr_in *>(__builtin_assume_aligned(
+                addrs->ifa_addr, alignof(sockaddr_in)))->sin_addr;
+        return &r;
+      }
+    }
+  }
+  LOG(FATAL, "couldn't find an AF_INET interface named \"%s\"\n",
+      kAtomNetInterface);
+}
+
+const char *DoGetRootDirectory() {
+  ssize_t size = 0;
+  char *r = NULL;
+  while (true) {
+    if (r != NULL) delete r;
+    size += 256;
+    r = new char[size];
+
+    ssize_t ret = readlink("/proc/self/exe", r, size);
+    if (ret < 0) {
+      if (ret != -1) {
+        LOG(WARNING, "it returned %zd, not -1\n", ret);
+      }
+      LOG(FATAL, "readlink(\"/proc/self/exe\", %p, %zu) failed with %d: %s\n",
+          r, size, errno, strerror(errno));
+    }
+    if (ret < size) {
+      void *last_slash = memrchr(r, '/', size);
+      if (last_slash == NULL) {
+        r[ret] = '\0';
+        LOG(FATAL, "couldn't find a '/' in \"%s\"\n", r);
+      }
+      *static_cast<char *>(last_slash) = '\0';
+      LOG(INFO, "got a root dir of \"%s\"\n", r);
+      return r;
+    }
+  }
+}
+
+const char *DoGetLoggingDirectory() {
+  static const char kSuffix[] = "/../../tmp/robot_logs";
+  const char *root = GetRootDirectory();
+  char *r = new char[strlen(root) + sizeof(kSuffix)];
+  strcpy(r, root);
+  strcat(r, kSuffix);
+  return r;
+}
+
+}  // namespace
+
+const char *GetRootDirectory() {
+  static aos::Once<const char> once(DoGetRootDirectory);
+  return once.Get();
+}
+
+const char *GetLoggingDirectory() {
+  static aos::Once<const char> once(DoGetLoggingDirectory);
+  return once.Get();
+}
+
+const in_addr &GetOwnIPAddress() {
+  static aos::Once<const in_addr> once(DoGetOwnIPAddress);
+  return *once.Get();
+}
+
+}  // namespace configuration
+}  // namespace aos
diff --git a/aos/atom_code/configuration.h b/aos/atom_code/configuration.h
new file mode 100644
index 0000000..a3917cc
--- /dev/null
+++ b/aos/atom_code/configuration.h
@@ -0,0 +1,31 @@
+#ifndef AOS_ATOM_CODE_CONFIGURATION_H_
+#define AOS_ATOM_CODE_CONFIGURATION_H_
+
+#include <stdint.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+namespace aos {
+
+// Holds global configuration data. All of the functions are safe to call
+// from wherever.
+namespace configuration {
+
+// Returns "our" IP address.
+const in_addr &GetOwnIPAddress();
+
+// Returns the "root directory" for this run. Under linux, this is the
+// directory where the executable is located (from /proc/self/exe)
+// The return value will always be to a static string, so no freeing is
+// necessary.
+const char *GetRootDirectory();
+// Returns the directory where logs get written. Relative to GetRootDirectory().
+// The return value will always be to a static string, so no freeing is
+// necessary.
+const char *GetLoggingDirectory();
+
+}  // namespace configuration
+}  // namespace aos
+
+#endif  // AOS_ATOM_CODE_CONFIGURATION_H_
diff --git a/aos/atom_code/core/BinaryLogReader.cpp b/aos/atom_code/core/BinaryLogReader.cpp
index b673c26..3e96cc5 100644
--- a/aos/atom_code/core/BinaryLogReader.cpp
+++ b/aos/atom_code/core/BinaryLogReader.cpp
@@ -11,16 +11,20 @@
 
 #include <map>
 
-#include "aos/aos_core.h"
+#include "aos/atom_code/logging/atom_logging.h"
 #include "aos/atom_code/core/LogFileCommon.h"
-#include "aos/common/Configuration.h"
+#include "aos/atom_code/init.h"
+#include "aos/atom_code/configuration.h"
 
-static const char *const kCRIOName = "CRIO";
+namespace aos {
+namespace logging {
+namespace atom {
+namespace {
 
-int main() {
-  aos::InitNRT();
+int BinaryLogReaderMain() {
+  InitNRT();
 
-  const char *folder = aos::configuration::GetLoggingDirectory();
+  const char *folder = configuration::GetLoggingDirectory();
   if (access(folder, R_OK | W_OK) == -1) {
     LOG(FATAL, "folder '%s' does not exist. please create it\n", folder);
   }
@@ -28,19 +32,24 @@
 
   const time_t t = time(NULL);
   char *tmp;
-  if (asprintf(&tmp, "%s/aos_log-%jd", folder, static_cast<uintmax_t>(t)) == -1) {
-    fprintf(stderr, "BinaryLogReader: couldn't create final name because of %d (%s)."
+  if (asprintf(&tmp, "%s/aos_log-%jd", folder, static_cast<uintmax_t>(t)) ==
+      -1) {
+    fprintf(stderr,
+            "BinaryLogReader: couldn't create final name because of %d (%s)."
             " exiting\n", errno, strerror(errno));
     return EXIT_FAILURE;
   }
   char *tmp2;
   if (asprintf(&tmp2, "%s/aos_log-current", folder) == -1) {
-    fprintf(stderr, "BinaryLogReader: couldn't create symlink name because of %d (%s)."
+    fprintf(stderr,
+            "BinaryLogReader: couldn't create symlink name because of %d (%s)."
             " not creating current symlink\n", errno, strerror(errno));
   } else {
     if (unlink(tmp2) == -1 && (errno != EROFS && errno != ENOENT)) {
-      fprintf(stderr, "BinaryLogReader: warning: unlink('%s') failed because of %d (%s)\n",
-          tmp2, errno, strerror(errno));
+      fprintf(stderr,
+              "BinaryLogReader: warning: unlink('%s') failed"
+              " because of %d (%s)\n",
+              tmp2, errno, strerror(errno));
     }
     if (symlink(tmp, tmp2) == -1) {
       fprintf(stderr, "BinaryLogReader: warning: symlink('%s', '%s') failed"
@@ -52,11 +61,12 @@
                 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
   free(tmp);
   if (fd == -1) {
-    fprintf(stderr, "BinaryLogReader: couldn't open file '%s' because of %d (%s)."
+    fprintf(stderr,
+            "BinaryLogReader: couldn't open file '%s' because of %d (%s)."
             " exiting\n", tmp, errno, strerror(errno));
     return EXIT_FAILURE;
   }
-  aos::LogFileAccessor writer(fd, true);
+  LogFileAccessor writer(fd, true);
 
   struct timespec timespec;
   time_t last_sec = 0;
@@ -68,47 +78,39 @@
       writer.Sync();
     }
 
-    const log_message *const msg = log_read_next();
+    const LogMessage *const msg = ReadNext();
     if (msg == NULL) continue;
-    const log_crio_message *const crio_msg = reinterpret_cast<const log_crio_message *>(
-        msg);
 
-    size_t name_size, message_size;
-    if (msg->source == -1) {
-      name_size = strlen(kCRIOName);
-      message_size = strlen(crio_msg->message);
-    } else {
-      name_size = strlen(msg->name);
-      message_size = strlen(msg->message);
-    }
-    // add on size for terminating '\0'
-    name_size += 1;
-    message_size += 1;
+    // add 1 for terminating '\0'
+    size_t name_size = strlen(msg->name) + 1;
+    size_t message_size = strlen(msg->message) + 1;
 
-    aos::LogFileMessageHeader *const output = writer.GetWritePosition(
-        sizeof(aos::LogFileMessageHeader) + name_size + message_size);
+    LogFileMessageHeader *const output = writer.GetWritePosition(
+        sizeof(LogFileMessageHeader) + name_size + message_size);
     char *output_strings = reinterpret_cast<char *>(output) + sizeof(*output);
     output->name_size = name_size;
     output->message_size = message_size;
     output->source = msg->source;
-    if (msg->source == -1) {
-      output->level = crio_msg->level;
-      // TODO(brians) figure out what time to put in
-      output->sequence = crio_msg->sequence;
-      memcpy(output_strings, kCRIOName, name_size);
-      memcpy(output_strings + name_size, crio_msg->message, message_size);
-    } else {
-      output->level = msg->level;
-      output->time_sec = msg->time.tv_sec;
-      output->time_nsec = msg->time.tv_nsec;
-      output->sequence = msg->sequence;
-      memcpy(output_strings, msg->name, name_size);
-      memcpy(output_strings + name_size, msg->message, message_size);
-    }
-    condition_set(&output->marker);
+    output->level = msg->level;
+    output->time_sec = msg->seconds;
+    output->time_nsec = msg->nseconds;
+    output->sequence = msg->sequence;
+    memcpy(output_strings, msg->name, name_size);
+    memcpy(output_strings + name_size, msg->message, message_size);
+    futex_set(&output->marker);
 
-    log_free_message(msg);
+    logging::atom::Free(msg);
   }
 
-  aos::Cleanup();
+  Cleanup();
+  return 0;
+}
+
+}  // namespace
+}  // namespace atom
+}  // namespace logging
+}  // namespace aos
+
+int main() {
+  return ::aos::logging::atom::BinaryLogReaderMain();
 }
diff --git a/aos/atom_code/core/CRIOLogReader.cpp b/aos/atom_code/core/CRIOLogReader.cpp
index f32e21d..9c4dbd4 100644
--- a/aos/atom_code/core/CRIOLogReader.cpp
+++ b/aos/atom_code/core/CRIOLogReader.cpp
@@ -8,44 +8,55 @@
 #include <fcntl.h>
 #include <arpa/inet.h>
 #include <errno.h>
+#include <string.h>
 
 #include <map>
 
-#include "aos/aos_core.h"
-#include "aos/common/Configuration.h"
+#include "aos/common/logging/logging_impl.h"
+#include "aos/atom_code/logging/atom_logging.h"
 #include "aos/common/byteorder.h"
+#include "aos/atom_code/init.h"
+#include "aos/common/network_port.h"
+
+namespace aos {
+namespace logging {
+namespace atom {
+namespace {
 
 struct log_buffer {
-  log_crio_message msg;
+  LogMessage *msg;
   size_t used;
 
-  log_buffer() {
+  log_buffer() : msg(NULL) {
     Clear();
   }
   void Clear() {
+    logging::atom::Free(msg);
+    msg = logging::atom::Get();
     used = 0;
   }
-  // returns whether msg is now complete
+
+  // Returns whether msg is now complete.
   bool ReceiveFrom(int sock) {
-    const ssize_t ret = recv(sock, reinterpret_cast<uint8_t *>(&msg) + used,
-                             sizeof(msg) - used, 0);
+    const ssize_t ret = recv(sock, reinterpret_cast<uint8_t *>(msg) + used,
+                             sizeof(*msg) - used, 0);
     if (ret == -1) {
       LOG(ERROR, "recv(%d, %p, %d) failed because of %d: %s\n",
-          sock, reinterpret_cast<uint8_t *>(&msg) + used, sizeof(msg) - used,
+          sock, reinterpret_cast<uint8_t *>(msg) + used, sizeof(*msg) - used,
           errno, strerror(errno));
       return false;
     } else {
       used += ret;
-      if (used > sizeof(msg)) {
-        LOG(WARNING, "used(%zd) is > sizeof(msg)(%zd)\n", used, sizeof(msg));
+      if (used > sizeof(*msg)) {
+        LOG(WARNING, "used(%zd) is > sizeof(*msg)(%zd)\n", used, sizeof(*msg));
       }
-      return used >= sizeof(msg);
+      return used >= sizeof(*msg);
     }
   }
 };
 
-int main() {
-  aos::InitNRT();
+int CRIOLogReaderMain() {
+  InitNRT();
 
   const int sock = socket(AF_INET, SOCK_STREAM, 0);
   if (sock == -1) {
@@ -59,11 +70,11 @@
   } bind_sockaddr;
   memset(&bind_sockaddr, 0, sizeof(bind_sockaddr));
   bind_sockaddr.in.sin_family = AF_INET;
-  bind_sockaddr.in.sin_port = htons(static_cast<uint16_t>(aos::NetworkPort::kLogs));
+  bind_sockaddr.in.sin_port = htons(static_cast<uint16_t>(NetworkPort::kLogs));
   bind_sockaddr.in.sin_addr.s_addr = htonl(INADDR_ANY);
   if (bind(sock, &bind_sockaddr.addr, sizeof(bind_sockaddr.addr)) == -1) {
-    LOG(ERROR, "bind(%d, %p) failed because of %d: %s\n", sock, &bind_sockaddr.addr,
-        errno, strerror(errno));
+    LOG(ERROR, "bind(%d, %p) failed because of %d: %s\n", sock,
+        &bind_sockaddr.addr, errno, strerror(errno));
     return EXIT_FAILURE;
   }
   if (listen(sock, 10) == -1) {
@@ -109,21 +120,35 @@
             "because of %d: %s\n",
             sock, SOCK_NONBLOCK, errno, strerror(errno));
       } else {
-        socks[new_sock]; // creates using value's default constructor
+        socks[new_sock];  // creates using value's default constructor
       }
     }
 
     for (auto it = socks.begin(); it != socks.end(); ++it) {
       if (FD_ISSET(it->first, &read_fds)) {
         if (it->second.ReceiveFrom(it->first)) {
-          it->second.msg.identifier = -1;
-          it->second.msg.time = aos::ntoh(it->second.msg.time);
-          log_crio_message_send(it->second.msg);
+          it->second.msg->source = ntoh(it->second.msg->source);
+          it->second.msg->sequence = ntoh(it->second.msg->sequence);
+          it->second.msg->level = ntoh(it->second.msg->level);
+          it->second.msg->seconds = ntoh(it->second.msg->seconds);
+          it->second.msg->nseconds = ntoh(it->second.msg->nseconds);
+
+          logging::atom::Write(it->second.msg);
+          it->second.msg = NULL;
           it->second.Clear();
         }
       }
     }
   }
 
-  aos::Cleanup();
+  Cleanup();
+}
+
+}  // namespace
+}  // namespace atom
+}  // namespace logging
+}  // namespace aos
+
+int main() {
+  return ::aos::logging::atom::CRIOLogReaderMain();
 }
diff --git a/aos/atom_code/core/LogDisplayer.cpp b/aos/atom_code/core/LogDisplayer.cpp
index 9dee08f..cd664f9 100644
--- a/aos/atom_code/core/LogDisplayer.cpp
+++ b/aos/atom_code/core/LogDisplayer.cpp
@@ -8,7 +8,7 @@
 #include <errno.h>
 
 #include "aos/atom_code/core/LogFileCommon.h"
-#include "aos/aos_core.h"
+#include "aos/common/logging/logging_impl.h"
 
 namespace {
 
@@ -28,6 +28,7 @@
     "  -s, --skip NUMBER     skip NUMBER matching logs\n"
     "  // -m, --max NUMBER     only display up to NUMBER logs\n"
     "  // -o, --format FORMAT  use FORMAT to display log entries\n"
+    "  -h, --help            display this help and exit\n"
     "\n"
     "LEVEL must be DEBUG, INFO, WARNING, ERROR, or FATAL.\n"
     "  It defaults to INFO.\n"
@@ -81,7 +82,7 @@
         filter_name = optarg;
         break;
       case 'l':
-        filter_level = str_log(optarg);
+        filter_level = ::aos::logging::str_log(optarg);
         if (filter_level == LOG_UNKNOWN) {
           fprintf(stderr, "LogDisplayer: unknown log level '%s'\n", optarg);
           exit(EXIT_FAILURE);
@@ -115,13 +116,14 @@
       case '?':
         break;
       default:
-        fprintf(stderr, "LogDisplayer: in a bad spot (%s: %d)\n", __FILE__, __LINE__);
+        fprintf(stderr, "LogDisplayer: in a bad spot (%s: %d)\n",
+                __FILE__, __LINE__);
         abort();
     }
   }
 
   fprintf(stderr, "displaying down to level %s from file '%s'\n",
-          log_str(filter_level), filename);
+          ::aos::logging::log_str(filter_level), filename);
   if (optind < argc) {
     fprintf(stderr, "non-option ARGV-elements: ");
     while (optind < argc) {
@@ -135,23 +137,34 @@
             filename, strerror(errno));
     exit(EXIT_FAILURE);
   }
-  aos::LogFileAccessor accessor(fd, false);
+  ::aos::logging::LogFileAccessor accessor(fd, false);
   if (!start_at_beginning) {
     accessor.MoveToEnd();
   }
-  const aos::LogFileMessageHeader *msg;
+  const ::aos::logging::LogFileMessageHeader *msg;
+  ::aos::logging::LogMessage log_message;
   do {
     msg = accessor.ReadNextMessage(follow);
     if (msg == NULL) continue;
-    if (log_gt_important(filter_level, msg->level)) continue;
+    if (::aos::logging::log_gt_important(filter_level, msg->level)) continue;
     if (filter_name != NULL &&
-        strcmp(filter_name, reinterpret_cast<const char *>(msg) + sizeof(*msg)) != 0) {
+        strcmp(filter_name,
+               reinterpret_cast<const char *>(msg) + sizeof(*msg)) != 0) {
       continue;
     }
-    printf("%s(%"PRId32")(%03"PRId8"): %s at %010"PRIu64"s%09"PRIu64"ns: %s",
-           reinterpret_cast<const char *>(msg) + sizeof(*msg), msg->source,
-           msg->sequence, log_str(msg->level), msg->time_sec, msg->time_nsec,
-           reinterpret_cast<const char *>(msg) + sizeof(*msg) + msg->name_size);
+
+    log_message.source = msg->source;
+    log_message.sequence = msg->sequence;
+    log_message.level = msg->level;
+    log_message.seconds = msg->time_sec;
+    log_message.nseconds = msg->time_nsec;
+    strncpy(log_message.name,
+            reinterpret_cast<const char *>(msg) + sizeof(*msg),
+            sizeof(log_message.name));
+    strncpy(log_message.message,
+            reinterpret_cast<const char *>(msg) + sizeof(*msg) +
+            msg->name_size,
+            sizeof(log_message.message));
+    ::aos::logging::internal::PrintMessage(stdout, log_message);
   } while (msg != NULL);
 }
-
diff --git a/aos/atom_code/core/LogFileCommon.h b/aos/atom_code/core/LogFileCommon.h
index 235c55b..8c1bd7b 100644
--- a/aos/atom_code/core/LogFileCommon.h
+++ b/aos/atom_code/core/LogFileCommon.h
@@ -11,43 +11,46 @@
 
 #include <algorithm>
 
-#include "aos/aos_core.h"
+#include "aos/common/logging/logging_impl.h"
 
 namespace aos {
+namespace logging {
 
 // File format: {
 //   LogFileMessageHeader header;
-//   char *name; // of the process that wrote the message
+//   char *name;  // of the process that wrote the message
 //   char *message;
 // } not crossing kPageSize boundaries into the file.
 //
-// Field sizes designed to fit the various values from log_message even on
+// Field sizes designed to fit the various values from LogMessage even on
 // other machines (hopefully) because they're baked into the files.
+//
+// A lot of the fields don't have comments because they're the same as the
+// identically named fields in LogMessage.
 struct __attribute__((aligned)) LogFileMessageHeader {
-  // gets condition_set once this one has been written
+  // gets futex_set once this one has been written
   // for readers keeping up with a live writer
   //
   // gets initialized to 0 by ftruncate
   // 
   // there will be something here after the last log on a "page" set to 2
-  // (by the condition_set) to indicate that the next log is on the next page
+  // (by the futex_set) to indicate that the next log is on the next page
   mutex marker;
   static_assert(sizeof(marker) == 4, "mutex changed size!");
   log_level level;
   static_assert(sizeof(level) == 1, "log_level changed size!");
 
-  uint64_t time_sec;
-  static_assert(sizeof(time_sec) >= sizeof(log_message::time.tv_sec), "tv_sec won't fit");
-  uint64_t time_nsec;
-  static_assert(sizeof(time_nsec) >= sizeof(log_message::time.tv_nsec),
+  uint32_t time_sec;
+  static_assert(sizeof(time_sec) >= sizeof(LogMessage::seconds),
+                "tv_sec won't fit");
+  uint32_t time_nsec;
+  static_assert(sizeof(time_nsec) >= sizeof(LogMessage::nseconds),
                 "tv_nsec won't fit");
 
-  int32_t source; // pid or -1 for crio
-  static_assert(sizeof(source) >= sizeof(log_message::source), "PIDs won't fit");
-  uint8_t sequence;
-  static_assert(sizeof(sequence) == sizeof(log_crio_message::sequence),
-                "something changed");
-  static_assert(sizeof(sequence) == sizeof(log_message::sequence),
+  int32_t source;
+  static_assert(sizeof(source) >= sizeof(LogMessage::source), "PIDs won't fit");
+  uint16_t sequence;
+  static_assert(sizeof(sequence) == sizeof(LogMessage::sequence),
                 "something changed");
 
   // both including the terminating '\0'
@@ -129,15 +132,18 @@
         sizeof(mutex) > kPageSize) {
       char *const temp = current_;
       MapNextPage();
-      if (condition_set_value(reinterpret_cast<mutex *>(&temp[position_]), 2) != 0) {
-        fprintf(stderr, "LogFileCommon: condition_set_value(%p, 2) failed with %d: %s."
-                " readers will hang\n", &temp[position_], errno, strerror(errno));
+      if (futex_set_value(static_cast<mutex *>(static_cast<void *>(
+                      &temp[position_])), 2) == -1) {
+        fprintf(stderr,
+                "LogFileCommon: futex_set_value(%p, 2) failed with %d: %s."
+                " readers will hang\n",
+                &temp[position_], errno, strerror(errno));
       }
       Unmap(temp);
       position_ = 0;
     }
-    LogFileMessageHeader *const r = reinterpret_cast<LogFileMessageHeader *>(
-        &current_[position_]);
+    LogFileMessageHeader *const r = static_cast<LogFileMessageHeader *>(
+        static_cast<void *>(&current_[position_]));
     position_ += message_size;
     // keep it aligned for next time
     position_ += kAlignment - (position_ % kAlignment);
@@ -147,15 +153,16 @@
   const LogFileMessageHeader *ReadNextMessage(bool wait) {
     LogFileMessageHeader *r;
     do {
-      r = reinterpret_cast<LogFileMessageHeader *>(&current_[position_]);
+      r = static_cast<LogFileMessageHeader *>(
+          static_cast<void *>(&current_[position_]));
       if (wait) {
-        if (condition_wait(&r->marker) != 0) continue;
+        if (futex_wait(&r->marker) != 0) continue;
       }
       if (r->marker == 2) {
         Unmap(current_);
         MapNextPage();
         position_ = 0;
-        r = reinterpret_cast<LogFileMessageHeader *>(current_);
+        r = static_cast<LogFileMessageHeader *>(static_cast<void *>(current_));
       }
     } while (wait && r->marker == 0);
     if (r->marker == 0) {
@@ -186,7 +193,7 @@
   }
 };
 
-};
+}  // namespace logging
+}  // namespace aos
 
 #endif
-
diff --git a/aos/atom_code/core/LogStreamer.cpp b/aos/atom_code/core/LogStreamer.cpp
index ceec18d..20c5987 100644
--- a/aos/atom_code/core/LogStreamer.cpp
+++ b/aos/atom_code/core/LogStreamer.cpp
@@ -10,35 +10,44 @@
 #include <fcntl.h>
 #include <inttypes.h>
 
-#include "aos/aos_core.h"
+#include "aos/atom_code/logging/atom_logging.h"
 #include "aos/atom_code/core/LogFileCommon.h"
+#include "aos/atom_code/init.h"
+#include "aos/atom_code/ipc_lib/queue.h"
+#include "aos/common/logging/logging_impl.h"
+#include "aos/common/time.h"
 
-static const char *const kCRIOName = "CRIO";
+namespace aos {
+namespace logging {
+namespace atom {
+namespace {
 
-int main() {
-  aos::InitNRT();
+int LogStreamerMain() {
+  InitNRT();
 
-  const time_t t = time(NULL);
-  printf("starting at %jd----------------------------------\n", static_cast<uintmax_t>(t));
+  const time::Time now = time::Time::Now();
+  printf("starting at %" PRId32 "s%" PRId32 "ns-----------------------------\n",
+         now.sec(), now.nsec());
 
   int index = 0;
   while (true) {
-    const log_message *const msg = log_read_next2(BLOCK, &index);
+    const LogMessage *const msg = ReadNext(RawQueue::kBlock, &index);
     if (msg == NULL) continue;
-    const log_crio_message *const crio_msg = reinterpret_cast<const log_crio_message *>(
-        msg);
 
-    if (msg->source == -1) {
-      printf("CRIO(%03"PRId8"): %s at %f: %s", crio_msg->sequence,
-             log_str(crio_msg->level), crio_msg->time, crio_msg->message);
-    } else {
-      printf("%s(%"PRId32")(%03"PRId8"): %s at %010jus%09luns: %s",
-             msg->name, msg->source, msg->sequence, log_str(msg->level),
-             static_cast<uintmax_t>(msg->time.tv_sec), msg->time.tv_nsec, msg->message);
-    }
+    internal::PrintMessage(stdout, *msg);
 
-    log_free_message(msg);
+    logging::atom::Free(msg);
   }
 
-  aos::Cleanup();
+  Cleanup();
+  return 0;
+}
+
+}  // namespace
+}  // namespace atom
+}  // namespace logging
+}  // namespace aos
+
+int main() {
+  return ::aos::logging::atom::LogStreamerMain();
 }
diff --git a/aos/atom_code/core/core.cc b/aos/atom_code/core/core.cc
index b34169b..2921e46 100644
--- a/aos/atom_code/core/core.cc
+++ b/aos/atom_code/core/core.cc
@@ -1,15 +1,26 @@
-// This is the core scheduling system
-//
-// Purposes: All shared memory gets allocated here.
-//
-
+#include <sys/select.h>
+#include <stdlib.h>
 #include <stdio.h>
-#include <string.h>
 #include <unistd.h>
-#include "aos/aos_core.h"
+#include <sys/types.h>
 
-int main() {
+#include <string>
+
+#include "aos/atom_code/init.h"
+
+// Initializes shared memory. This is the only file that will create the shared
+// memory file if it doesn't already exist (and set everything up).
+
+int main(int argc, char **argv) {
   aos::InitCreate();
+
+  if (argc > 1) {
+    if (system((std::string("touch '") + argv[1] + "'").c_str()) != 0) {
+      fprintf(stderr, "`touch '%s'` failed\n", argv[1]);
+      exit(EXIT_FAILURE);
+    }
+  }
+
   select(0, NULL, NULL, NULL, NULL);  // wait forever
   aos::Cleanup();
 }
diff --git a/aos/atom_code/core/core.gyp b/aos/atom_code/core/core.gyp
index 04d3cc8..1aaebfb 100644
--- a/aos/atom_code/core/core.gyp
+++ b/aos/atom_code/core/core.gyp
@@ -7,7 +7,7 @@
         'core.cc',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/atom_code/atom_code.gyp:init',
       ],
     },
     {
@@ -17,7 +17,9 @@
         'BinaryLogReader.cpp',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/atom_code/atom_code.gyp:configuration',
       ],
     },
     {
@@ -27,7 +29,10 @@
         'LogStreamer.cpp',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/common/common.gyp:time',
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
       ],
     },
     {
@@ -37,7 +42,8 @@
         'LogDisplayer.cpp',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/atom_code/atom_code.gyp:init',
       ],
     },
     {
@@ -47,7 +53,8 @@
         'CRIOLogReader.cpp',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/atom_code/atom_code.gyp:init',
       ],
     },
   ],
diff --git a/aos/atom_code/init.cc b/aos/atom_code/init.cc
index 4776261..033a206 100644
--- a/aos/atom_code/init.cc
+++ b/aos/atom_code/init.cc
@@ -12,17 +12,17 @@
 #include <stdlib.h>
 #include <stdint.h>
 
-#include "aos/aos_core.h"
 #include "aos/common/die.h"
+#include "aos/atom_code/logging/atom_logging.h"
+#include "aos/atom_code/ipc_lib/shared_mem.h"
 
 namespace aos {
 
 namespace {
 
-void SetSoftRLimit(int resource, rlim64_t soft) {
-  // If we're root, then we don't need to change the soft limits because none of
-  // the ones we care about get checked for root.
-  if (getuid() != 0) {
+void SetSoftRLimit(int resource, rlim64_t soft, bool set_for_root) {
+  bool am_root = getuid() == 0;
+  if (set_for_root || !am_root) {
     struct rlimit64 rlim;
     if (getrlimit64(resource, &rlim) == -1) {
       Die("%s-init: getrlimit64(%d) failed with %d (%s)\n",
@@ -30,9 +30,9 @@
     }
     rlim.rlim_cur = soft;
     if (setrlimit64(resource, &rlim) == -1) {
-      Die("%s-init: setrlimit64(%d, {cur=%jd,max=%jd})"
+      Die("%s-init: setrlimit64(%d, {cur=%ju,max=%ju})"
           " failed with %d (%s)\n", program_invocation_short_name,
-          resource, (intmax_t)rlim.rlim_cur, (intmax_t)rlim.rlim_max,
+          resource, (uintmax_t)rlim.rlim_cur, (uintmax_t)rlim.rlim_max,
           errno, strerror(errno));
     }
   }
@@ -42,7 +42,10 @@
 // non-realtime initialization sequences. May be called twice.
 void InitStart() {
   // Allow locking as much as we want into RAM.
-  SetSoftRLimit(RLIMIT_MEMLOCK, RLIM_INFINITY);
+  SetSoftRLimit(RLIMIT_MEMLOCK, RLIM_INFINITY, false);
+
+  // Do create core files of unlimited size.
+  SetSoftRLimit(RLIMIT_CORE, RLIM_INFINITY, true);
 }
 
 int LockAllMemory() {
@@ -69,10 +72,7 @@
     Die("%s-init: creating shared memory reference failed\n",
         program_invocation_short_name);
   }
-  if (log_init(program_invocation_short_name) != 0) {
-    Die("%s-init: initializing logging failed\n",
-        program_invocation_short_name);
-  }
+  logging::atom::Register();
 }
 
 const char *const kNoRealtimeEnvironmentVariable = "AOS_NO_REALTIME";
@@ -81,16 +81,16 @@
 
 void InitNRT() { DoInitNRT(aos_core_create::reference); }
 void InitCreate() { DoInitNRT(aos_core_create::create); }
-void Init() {
+void Init(int relative_priority) {
   if (getenv(kNoRealtimeEnvironmentVariable) == NULL) {  // if nobody set it
     LockAllMemory();
     // Only let rt processes run for 1 second straight.
-    SetSoftRLimit(RLIMIT_RTTIME, 1000000);
+    SetSoftRLimit(RLIMIT_RTTIME, 1000000, true);
     // Allow rt processes up to priority 40.
-    SetSoftRLimit(RLIMIT_RTPRIO, 40);
+    SetSoftRLimit(RLIMIT_RTPRIO, 40, false);
     // Set our process to priority 40.
     struct sched_param param;
-    param.sched_priority = 40;
+    param.sched_priority = 30 + relative_priority;
     if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
       Die("%s-init: setting SCHED_FIFO failed with %d (%s)\n",
           program_invocation_short_name, errno, strerror(errno));
diff --git a/aos/atom_code/init.h b/aos/atom_code/init.h
index ffb7afc..b35a3b8 100644
--- a/aos/atom_code/init.h
+++ b/aos/atom_code/init.h
@@ -6,7 +6,9 @@
 // Does the non-realtime parts of the initialization process.
 void InitNRT();
 // Initializes everything, including the realtime stuff.
-void Init();
+// relative_priority adjusts the priority of this process relative to all of the
+// other ones (positive for higher priority).
+void Init(int relative_priority = 0);
 // Same as InitNRT, except will remove an existing shared memory file and create
 // a new one.
 void InitCreate();
diff --git a/aos/atom_code/input/FRCComm.h b/aos/atom_code/input/FRCComm.h
deleted file mode 100644
index 3d2f4c0..0000000
--- a/aos/atom_code/input/FRCComm.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*************************************************************
- * 					NOTICE
- * 
- * 	These are the only externally exposed functions to the
- *   NetworkCommunication library
- * 
- * This is an implementation of FRC Spec for Comm Protocol
- * Revision 4.5, June 30, 2008
- *
- * Copyright (c) National Instruments 2008.  All Rights Reserved.
- * 
- *************************************************************/
-
-#ifndef __FRC_COMM_H__
-#define __FRC_COMM_H__
-
-#include <stdint.h>
-
-typedef uint64_t UINT64;
-typedef uint32_t UINT32;
-typedef uint16_t UINT16;
-typedef uint8_t  UINT8;
-typedef int8_t  INT8;
-
-struct FRCCommonControlData{
-	UINT16 packetIndex;
-	union {
-		UINT8 control;
-		struct {
-			/*the order of these are flipped on the fit pc side to make it work*/
-			UINT8 fpgaChkSum :1;
-			UINT8 cRIOChkSum :1;
-			UINT8 resync : 1;
-			UINT8 fmsAttached:1;
-			UINT8 autonomous : 1;
-			UINT8 enabled : 1;
-			UINT8 notEStop : 1;
-			UINT8 reset : 1;
-		};
-	};
-	UINT8 dsDigitalIn;
-	UINT16 teamID;
-
-	char dsID_Alliance;
-	char dsID_Position;
-
-	union {
-		INT8 stick0Axes[6];
-		struct {
-			INT8 stick0Axis1;
-			INT8 stick0Axis2;
-			INT8 stick0Axis3;
-			INT8 stick0Axis4;
-			INT8 stick0Axis5;
-			INT8 stick0Axis6;
-		};
-	};
-	UINT16 stick0Buttons;		// Left-most 4 bits are unused
-
-	union {
-		INT8 stick1Axes[6];
-		struct {
-			INT8 stick1Axis1;
-			INT8 stick1Axis2;
-			INT8 stick1Axis3;
-			INT8 stick1Axis4;
-			INT8 stick1Axis5;
-			INT8 stick1Axis6;
-		};
-	};
-	UINT16 stick1Buttons;		// Left-most 4 bits are unused
-
-	union {
-		INT8 stick2Axes[6];
-		struct {
-			INT8 stick2Axis1;
-			INT8 stick2Axis2;
-			INT8 stick2Axis3;
-			INT8 stick2Axis4;
-			INT8 stick2Axis5;
-			INT8 stick2Axis6;
-		};
-	};
-	UINT16 stick2Buttons;		// Left-most 4 bits are unused
-
-	union {
-		INT8 stick3Axes[6];
-		struct {
-			INT8 stick3Axis1;
-			INT8 stick3Axis2;
-			INT8 stick3Axis3;
-			INT8 stick3Axis4;
-			INT8 stick3Axis5;
-			INT8 stick3Axis6;
-		};
-	};
-	UINT16 stick3Buttons;		// Left-most 4 bits are unused
-
-	//Analog inputs are 10 bit right-justified
-	UINT16 analog1;
-	UINT16 analog2;
-	UINT16 analog3;
-	UINT16 analog4;
-
-	UINT64 cRIOChecksum;
-	UINT32 FPGAChecksum0;
-	UINT32 FPGAChecksum1;
-	UINT32 FPGAChecksum2;
-	UINT32 FPGAChecksum3;
-
-	char versionData[8];
-};
-
-
-#endif
diff --git a/aos/atom_code/input/JoystickInput.cpp b/aos/atom_code/input/JoystickInput.cpp
deleted file mode 100644
index 6aeca4b..0000000
--- a/aos/atom_code/input/JoystickInput.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#include "aos/atom_code/input/JoystickInput.h"
-
-#include "aos/aos_core.h"
-#include "aos/common/Configuration.h"
-#include "aos/common/network/ReceiveSocket.h"
-#include "aos/common/messages/RobotState.q.h"
-
-namespace aos {
-
-void JoystickInput::SetupButtons() {
-  for (int i = 0; i < 4; ++i) {
-    old_buttons[i] = buttons[i];
-  }
-  buttons[0] = control_data_.stick0Buttons;
-  buttons[1] = control_data_.stick1Buttons;
-  buttons[2] = control_data_.stick2Buttons;
-  buttons[3] = control_data_.stick3Buttons;
-
-  buttons[0] |= (control_data_.enabled << (ENABLED - 9)) |
-      (control_data_.autonomous << (AUTONOMOUS - 9)) |
-      (control_data_.fmsAttached << (FMS_ATTACHED - 9));
-
-  for (int j = 0; j < 4; ++j) {
-    for (int k = 1; k <= 12; ++k) {
-      if (PosEdge(j, k)) {
-        LOG(INFO, "PosEdge(%d, %d)\n", j, k);
-      }
-      if (NegEdge(j, k)) {
-        LOG(INFO, "NegEdge(%d, %d)\n", j, k);
-      }
-    }
-  }
-  if (PosEdge(0, ENABLED)) LOG(INFO, "PosEdge(ENABLED)\n");
-  if (NegEdge(0, ENABLED)) LOG(INFO, "NegEdge(ENABLED)\n");
-  if (PosEdge(0, AUTONOMOUS)) LOG(INFO, "PosEdge(AUTONOMOUS)\n");
-  if (NegEdge(0, AUTONOMOUS)) LOG(INFO, "NegEdge(AUTONOMOUS)\n");
-  if (PosEdge(0, FMS_ATTACHED)) LOG(INFO, "PosEdge(FMS_ATTACHED)\n");
-  if (NegEdge(0, FMS_ATTACHED)) LOG(INFO, "NegEdge(FMS_ATTACHED)\n");
-}
-
-void JoystickInput::Run() {
-  ReceiveSocket sock(NetworkPort::kDS);
-  while (true) {
-    if (sock.Recv(&control_data_, sizeof(control_data_)) == -1) {
-      LOG(WARNING, "socket receive failed\n");
-      continue;
-    }
-    SetupButtons();
-    if (!robot_state.MakeWithBuilder().enabled(Pressed(0, ENABLED)).
-        autonomous(Pressed(0, AUTONOMOUS)).
-        team_id(ntohs(control_data_.teamID)).Send()) {
-			LOG(WARNING, "sending robot_state failed\n");
-		}
-		if (robot_state.FetchLatest()) {
-    	char state[1024];
-    	robot_state->Print(state, sizeof(state));
-    	LOG(DEBUG, "robot_state={%s}\n", state);
-		} else {
-			LOG(WARNING, "fetching robot_state failed\n");
-		}
-    RunIteration();
-  }
-}
-
-}  // namespace aos
-
diff --git a/aos/atom_code/input/JoystickInput.h b/aos/atom_code/input/JoystickInput.h
deleted file mode 100644
index de5de04..0000000
--- a/aos/atom_code/input/JoystickInput.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef AOS_INPUT_JOYSTICK_INPUT_H_
-#define AOS_INPUT_JOYSTICK_INPUT_H_
-
-#include "FRCComm.h"
-
-namespace aos {
-
-// Class for implementing atom code that reads the joystick values from the
-// cRIO.
-// Designed for a subclass that implements RunIteration to be instantiated and
-// Runed.
-class JoystickInput {
- private:
-  uint16_t buttons[4], old_buttons[4];
-  inline uint16_t MASK(int button) {
-    return 1 << ((button > 8) ? (button - 9) : (button + 7));
-  }
-  void SetupButtons();
- protected:
-  FRCCommonControlData control_data_;
-
-  // Constants that retrieve data when used with joystick 0.
-  static const int ENABLED = 13;
-  static const int AUTONOMOUS = 14;
-  static const int FMS_ATTACHED = 15;
-  bool Pressed(int stick, int button) {
-	  return buttons[stick] & MASK(button);
-  }
-  bool PosEdge(int stick, int button) {
-	  return !(old_buttons[stick] & MASK(button)) && (buttons[stick] & MASK(button));
-  }
-  bool NegEdge(int stick, int button) {
-	  return (old_buttons[stick] & MASK(button)) && !(buttons[stick] & MASK(button));
-  }
-
-  virtual void RunIteration() = 0;
- public:
-  // Enters an infinite loop that reads values and calls RunIteration.
-  void Run();
-};
-
-} // namespace aos
-
-#endif
-
diff --git a/aos/atom_code/input/input.gyp b/aos/atom_code/input/input.gyp
index e77fc47..8aba065 100644
--- a/aos/atom_code/input/input.gyp
+++ b/aos/atom_code/input/input.gyp
@@ -1,14 +1,21 @@
 {
   'targets': [
     {
-      'target_name': 'joystick',
+      'target_name': 'joystick_input',
       'type': 'static_library',
       'sources': [
-         'JoystickInput.cpp'
+        'joystick_input.cc',
       ],
       'dependencies': [
+        '<(AOS)/common/input/input.gyp:driver_station_data',
         '<(AOS)/common/messages/messages.gyp:aos_queues',
-      ]
+        '<(AOS)/common/network/network.gyp:socket',
+        '<(EXTERNALS):WPILib-NetworkRobotValues',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/input/input.gyp:driver_station_data',
+      ],
     },
   ],
 }
diff --git a/aos/atom_code/input/joystick_input.cc b/aos/atom_code/input/joystick_input.cc
new file mode 100644
index 0000000..97b2c95
--- /dev/null
+++ b/aos/atom_code/input/joystick_input.cc
@@ -0,0 +1,92 @@
+#include "aos/atom_code/input/joystick_input.h"
+
+#include <string.h>
+
+#include "aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.h"
+
+#include "aos/common/network_port.h"
+#include "aos/common/network/ReceiveSocket.h"
+#include "aos/common/messages/RobotState.q.h"
+#include "aos/common/logging/logging.h"
+
+namespace aos {
+namespace input {
+
+void JoystickInput::Run() {
+  ReceiveSocket sock(NetworkPort::kDS);
+
+  NetworkRobotJoysticks joysticks;
+  char buffer[sizeof(joysticks) + ::buffers::kOverhead];
+  driver_station::Data data;
+
+  while (true) {
+    int received = sock.Receive(buffer, sizeof(buffer));
+    if (received == -1) {
+      LOG(WARNING, "socket receive failed with %d: %s\n",
+          errno, strerror(errno));
+      continue;
+    }
+
+    if (!joysticks.DeserializeFrom(buffer, received)) {
+      LOG(WARNING, "deserializing data from %zd bytes failed\n", received);
+      continue;
+    }
+
+    if (!robot_state.MakeWithBuilder()
+        .enabled(joysticks.control.enabled())
+        .autonomous(joysticks.control.autonomous())
+        .team_id(joysticks.team_number)
+        .Send()) {
+			LOG(WARNING, "sending robot_state failed\n");
+		} else {
+      LOG(DEBUG, "sent robot_state{%s, %s, %hu}\n",
+          joysticks.control.enabled() ? "enabled" : "disabled",
+          joysticks.control.autonomous() ? "auto" : "not auto",
+          joysticks.team_number);
+    }
+
+    data.Update(joysticks);
+
+    {
+      using driver_station::JoystickFeature;
+      using driver_station::ButtonLocation;
+      for (int joystick = 1; joystick <= JoystickFeature::kJoysticks;
+           ++joystick) {
+        for (int button = 1; button <= ButtonLocation::kButtons; ++button) {
+          ButtonLocation location(joystick, button);
+          if (data.PosEdge(location)) {
+            LOG(INFO, "PosEdge(%d, %d)\n", joystick, button);
+          }
+          if (data.NegEdge(location)) {
+            LOG(INFO, "NegEdge(%d, %d)\n", joystick, button);
+          }
+        }
+      }
+
+      using driver_station::ControlBit;
+      if (data.PosEdge(ControlBit::kFmsAttached)) {
+        LOG(INFO, "PosEdge(kFmsAttached)\n");
+      }
+      if (data.NegEdge(ControlBit::kFmsAttached)) {
+        LOG(INFO, "NegEdge(kFmsAttached)\n");
+      }
+      if (data.PosEdge(ControlBit::kAutonomous)) {
+        LOG(INFO, "PosEdge(kAutonomous)\n");
+      }
+      if (data.NegEdge(ControlBit::kAutonomous)) {
+        LOG(INFO, "NegEdge(kAutonomous)\n");
+      }
+      if (data.PosEdge(ControlBit::kEnabled)) {
+        LOG(INFO, "PosEdge(kEnabled)\n");
+      }
+      if (data.NegEdge(ControlBit::kEnabled)) {
+        LOG(INFO, "NegEdge(kEnabled)\n");
+      }
+    }
+
+    RunIteration(data);
+  }
+}
+
+}  // namespace input
+}  // namespace aos
diff --git a/aos/atom_code/input/joystick_input.h b/aos/atom_code/input/joystick_input.h
new file mode 100644
index 0000000..de0ed9e
--- /dev/null
+++ b/aos/atom_code/input/joystick_input.h
@@ -0,0 +1,26 @@
+#ifndef AOS_ATOM_CODE_INPUT_JOYSTICKS_INPUT_H_
+#define AOS_ATOM_CODE_INPUT_JOYSTICKS_INPUT_H_
+
+#include "aos/common/input/driver_station_data.h"
+
+namespace aos {
+namespace input {
+
+// A class for handling joystick packet values.
+// It will call RunIteration each time a new packet is received.
+//
+// This class automatically handles updating ::aos::robot_state and logging (at
+// INFO) button edges.
+class JoystickInput {
+ public:
+  void Run();
+
+ private:
+  // Subclasses should do whatever they want with data here.
+  virtual void RunIteration(const driver_station::Data &data) = 0;
+};
+
+}  // namespace input
+}  // namespace aos
+
+#endif  // AOS_ATOM_CODE_INPUT_JOYSTICKS_INPUT_H_
diff --git a/aos/atom_code/ipc_lib/aos_sync.c b/aos/atom_code/ipc_lib/aos_sync.c
index a9a4779..18e65a7 100644
--- a/aos/atom_code/ipc_lib/aos_sync.c
+++ b/aos/atom_code/ipc_lib/aos_sync.c
@@ -1,135 +1,203 @@
+#include "aos/atom_code/ipc_lib/aos_sync.h"
+
 #include <stdio.h>
 #include <linux/futex.h>
 #include <unistd.h>
 #include <sys/syscall.h>
 #include <errno.h>
-#include "aos_sync.h"
-#include "cmpxchg.h"
 #include <stdint.h>
 #include <limits.h>
 #include <string.h>
+#include <inttypes.h>
+
+// TODO(brians): Inline these in the new PI version.
+#define cmpxchg(ptr, o, n) __sync_val_compare_and_swap(ptr, o, n)
+static inline uint32_t xchg(mutex *pointer, uint32_t value) {
+  uint32_t result;
+  __atomic_exchange(pointer, &value, &result, __ATOMIC_SEQ_CST);
+  return result;
+}
 
 // this code is based on something that appears to be based on <http://www.akkadia.org/drepper/futex.pdf>, which also has a lot of useful information
 // should probably use <http://lxr.linux.no/linux+v2.6.34/Documentation/robust-futexes.txt> once it becomes available
-// <http://locklessinc.com/articles/futex_cheat_sheet/> and <http://locklessinc.com/articles/mutex_cv_futex/> are useful
+//   (sys_set_robust_list appears to be the function name)
+// <http://locklessinc.com/articles/futex_cheat_sheet/> and
+//   <http://locklessinc.com/articles/mutex_cv_futex/> are useful
 // <http://lwn.net/Articles/360699/> has a nice overview of futexes in late 2009 (fairly recent compared to everything else...)
 // can't use PRIVATE futex operations because they use the pid (or something) as part of the hash
 //
+// Remember that EAGAIN and EWOUDBLOCK are the same! (ie if you get EAGAIN from
+// FUTEX_WAIT, the docs call it EWOULDBLOCK...)
+//
 // Values for a mutex:
 // 0 = unlocked
 // 1 = locked, not contended
 // 2 = locked, probably contended
-// Values for a condition:
+// Values for a "futex":
 // 0 = unset
 // 1 = set
 
-static inline int sys_futex(mutex *addr1, int op, int val1, const struct timespec *timeout,
-		void *addr2, int val3) {
-	return syscall(SYS_futex, addr1, op, val1, timeout, addr2, val3);
+static inline int sys_futex(mutex *addr1, int op, int val1,
+    const struct timespec *timeout, void *addr2, int val3) {
+  return syscall(SYS_futex, addr1, op, val1, timeout, addr2, val3);
+}
+static inline int sys_futex_requeue(mutex *addr1, int op, int num_wake,
+    int num_requeue, mutex *m) {
+  return syscall(SYS_futex, addr1, op, num_wake, num_requeue, m);
+}
+static inline int sys_futex_op(mutex *addr1, int op, int num_waiters1,
+    int num_waiters2, mutex *addr2, int op_args_etc) {
+  return syscall(SYS_futex, addr1, op, num_waiters1,
+      num_waiters2, addr2, op_args_etc);
 }
 
 static inline int mutex_get(mutex *m, uint8_t signals_fail, const
-		struct timespec *timeout) {
-	int c;
-	c = cmpxchg(m, 0, 1);
-	if (!c) return 0;
-	/* The lock is now contended */
-	if (c == 1) c = xchg(m, 2);
-	while (c) {
-		/* Wait in the kernel */
-		//printf("sync here %d\n", __LINE__);
-		if (sys_futex(m, FUTEX_WAIT, 2, timeout, NULL, 0) == -1) {
-			if (signals_fail && errno == EINTR) {
-				return 1;
-			}
-			if (timeout != NULL && errno == ETIMEDOUT) {
-				return 2;
-			}
-		}
-		//printf("sync here %d\n", __LINE__);
-		c = xchg(m, 2);
-	}
-	return 0;
+                            struct timespec *timeout) {
+  int c;
+  c = cmpxchg(m, 0, 1);
+  if (!c) return 0;
+  /* The lock is now contended */
+  if (c == 1) c = xchg(m, 2);
+  while (c) {
+    /* Wait in the kernel */
+    //printf("sync here %d\n", __LINE__);
+    if (sys_futex(m, FUTEX_WAIT, 2, timeout, NULL, 0) == -1) {
+      if (signals_fail && errno == EINTR) {
+        return 1;
+      }
+      if (timeout != NULL && errno == ETIMEDOUT) {
+        return 2;
+      }
+    }
+    //printf("sync here %d\n", __LINE__);
+    c = xchg(m, 2);
+  }
+  return 0;
 }
 int mutex_lock(mutex *m) {
-	return mutex_get(m, 1, NULL);
+  return mutex_get(m, 1, NULL);
 }
 int mutex_lock_timeout(mutex *m, const struct timespec *timeout) {
-	return mutex_get(m, 1, timeout);
+  return mutex_get(m, 1, timeout);
 }
 int mutex_grab(mutex *m) {
-	return mutex_get(m, 0, NULL);
+  return mutex_get(m, 0, NULL);
 }
 
-int mutex_unlock(mutex *m) {
-	/* Unlock, and if not contended then exit. */
-	//printf("mutex_unlock(%p) => %d \n",m,*m);
-	switch (xchg(m, 0)) {
-		case 0:
-			fprintf(stderr, "sync: multiple unlock of %p. aborting\n", m);
-			printf("see stderr\n");
-			abort();
-		case 1:
-			//printf("mutex_unlock return(%p) => %d \n",m,*m);
-			return 0;
-		case 2:
-			if (sys_futex(m, FUTEX_WAKE, 1, NULL, NULL, 0) == -1) {
-				fprintf(stderr, "sync: waking 1 from %p failed with %d: %s\n",
-						m, errno, strerror(errno));
-				return -1;
-			} else {
-				return 0;
-			}
-		default:
-			fprintf(stderr, "sync: got a garbage value from mutex %p. aborting\n",
-					m);
-			printf("see stderr\n");
-			abort();
-	}
+void mutex_unlock(mutex *m) {
+  /* Unlock, and if not contended then exit. */
+  //printf("mutex_unlock(%p) => %d \n",m,*m);
+  switch (xchg(m, 0)) {
+    case 0:
+      fprintf(stderr, "sync: multiple unlock of %p. aborting\n", m);
+      printf("see stderr\n");
+      abort();
+    case 1:
+      //printf("mutex_unlock return(%p) => %d \n",m,*m);
+      break;
+    case 2:
+      if (sys_futex(m, FUTEX_WAKE, 1, NULL, NULL, 0) == -1) {
+        fprintf(stderr, "sync: waking 1 from %p failed with %d: %s\n",
+            m, errno, strerror(errno));
+        printf("see stderr\n");
+        abort();
+      } else {
+        break;
+      }
+    default:
+      fprintf(stderr, "sync: got a garbage value from mutex %p. aborting\n",
+          m);
+      printf("see stderr\n");
+      abort();
+  }
 }
 int mutex_trylock(mutex *m) {
-	/* Try to take the lock, if is currently unlocked */
-	unsigned c = cmpxchg(m, 0, 1);
-	if (!c) return 0;
-	return 1;
+  /* Try to take the lock, if is currently unlocked */
+  unsigned c = cmpxchg(m, 0, 1);
+  if (!c) return 0;
+  return 1;
 }
 
-int condition_wait(mutex *m) {
-	if (*m) {
-		return 0;
-	}
-	if (sys_futex(m, FUTEX_WAIT, 0, NULL, NULL, 0) == -1) {
-		if (errno == EINTR) {
-			return 1;
-		} else if (errno != EWOULDBLOCK) {
-			return -1;
-		}
-	}
-	return 0;
+int futex_wait(mutex *m) {
+  if (*m) {
+    return 0;
+  }
+  if (sys_futex(m, FUTEX_WAIT, 0, NULL, NULL, 0) == -1) {
+    if (errno == EINTR) {
+      return 1;
+    } else if (errno != EWOULDBLOCK) {
+      return -1;
+    }
+  }
+  return 0;
 }
-int condition_wait_force(mutex *m) {
-	while (1) {
-		if (sys_futex(m, FUTEX_WAIT, *m, NULL, NULL, 0) == -1) {
-			if (errno != EWOULDBLOCK) { // if it was an actual problem
-				if (errno == EINTR) {
-					return 1;
-				} else {
-					return -1;
-				}
-			}
-		} else {
-			return 0;
-		}
-	}
+int futex_set_value(mutex *m, mutex value) {
+  xchg(m, value);
+  return sys_futex(m, FUTEX_WAKE, INT_MAX, NULL, NULL, 0);
 }
-inline int condition_set_value(mutex *m, mutex value) {
-	xchg(m, value);
-	return sys_futex(m, FUTEX_WAKE, INT_MAX, NULL, NULL, 0);
+int futex_set(mutex *m) {
+  return futex_set_value(m, 1);
 }
-int condition_set(mutex *m) {
-	return condition_set_value(m, 1);
-}
-int condition_unset(mutex *m) {
-	return !xchg(m, 0);
+int futex_unset(mutex *m) {
+  return !xchg(m, 0);
 }
 
+void condition_wait(mutex *c, mutex *m) {
+  const mutex wait_start = *c;
+
+  mutex_unlock(m);
+
+  while (1) {
+    if (sys_futex(c, FUTEX_WAIT, wait_start, NULL, NULL, 0) == -1) {
+      // If it failed for some reason other than somebody else doing a wake
+      // before we actually made it to sleep.
+      if (__builtin_expect(*c == wait_start, 0)) {
+        // Try again if it was because of a signal.
+        if (errno == EINTR) continue;
+        fprintf(stderr, "FUTEX_WAIT(%p, %"PRIu32", NULL, NULL, 0) failed"
+                " with %d: %s\n",
+                c, wait_start, errno, strerror(errno));
+        printf("see stderr\n");
+        abort();
+      }
+    }
+    // Simplified mutex_lock that always leaves it
+    // contended in case anybody else got requeued.
+    while (xchg(m, 2) != 0) {
+      if (sys_futex(m, FUTEX_WAIT, 2, NULL, NULL, 0) == -1) {
+        // Try again if it was because of a signal or somebody else unlocked it
+        // before we went to sleep.
+        if (errno == EINTR || errno == EWOULDBLOCK) continue;
+        fprintf(stderr, "sync: FUTEX_WAIT(%p, 2, NULL, NULL, 0)"
+                " failed with %d: %s\n",
+                m, errno, strerror(errno));
+        printf("see stderr\n");
+        abort();
+      }
+    }
+    return;
+  }
+}
+
+void condition_signal(mutex *c) {
+  __sync_fetch_and_add(c, 1);
+  if (sys_futex(c, FUTEX_WAKE, 1, NULL, NULL, 0) == -1) {
+    fprintf(stderr, "sync: FUTEX_WAKE(%p, 1, NULL, NULL, 0)"
+        " failed with %d: %s\n",
+        c, errno, strerror(errno));
+    printf("see stderr\n");
+    abort();
+  }
+}
+
+void condition_broadcast(mutex *c, mutex *m) {
+  __sync_fetch_and_add(c, 1);
+  // Wake 1 waiter and requeue the rest.
+  if (sys_futex_requeue(c, FUTEX_REQUEUE, 1, INT_MAX, m) == -1) {
+    fprintf(stderr, "sync: FUTEX_REQUEUE(%p, 1, INT_MAX, %p, 0)"
+        " failed with %d: %s\n",
+        c, m, errno, strerror(errno));
+    printf("see stderr\n");
+    abort();
+  }
+}
diff --git a/aos/atom_code/ipc_lib/aos_sync.h b/aos/atom_code/ipc_lib/aos_sync.h
index 3c66264..6d4bf55 100644
--- a/aos/atom_code/ipc_lib/aos_sync.h
+++ b/aos/atom_code/ipc_lib/aos_sync.h
@@ -1,5 +1,5 @@
-#ifndef AOS_IPC_LIB_SYNC_H_
-#define AOS_IPC_LIB_SYNC_H_
+#ifndef AOS_ATOM_CODE_IPC_LIB_SYNC_H_
+#define AOS_ATOM_CODE_IPC_LIB_SYNC_H_
 
 #include <stdlib.h>
 #include <signal.h>
@@ -14,50 +14,83 @@
 // and <http://www.valgrind.org/docs/manual/drd-manual.html#drd-manual.clientreqs>
 // list the interesting ones
 
-// Have to align structs containing it to to sizeof(int).
+// Have to align structs containing it to sizeof(int).
 // Valid initial values for use with mutex_ functions are 0 (unlocked) and 1 (locked).
-// Valid initial values for use with condition_ functions are 0 (unset) and 1 (set).
+// Valid initial values for use with futex_ functions are 0 (unset) and 1 (set).
+// No initialization is necessary for use as c with the condition_ functions.
 // The value should not be changed after multiple processes have started
 // accessing an instance except through the functions declared in this file.
 typedef volatile uint32_t mutex __attribute__((aligned(sizeof(int))));
 
 // All return -1 for other error (which will be in errno from futex(2)).
+//
+// There is no priority inversion protection.
+// TODO(brians) look at using
+// <http://www.kernel.org/doc/Documentation/pi-futex.txt>
 
 // Returns 1 if interrupted by a signal.
+//
+// One of the highest priority processes blocked on a given mutex will be the
+// one to lock it when it is unlocked.
 int mutex_lock(mutex *m) __attribute__((warn_unused_result));
 // Returns 2 if it timed out or 1 if interrupted by a signal.
 int mutex_lock_timeout(mutex *m, const struct timespec *timeout)
   __attribute__((warn_unused_result));
 // Ignores signals. Can not fail.
 int mutex_grab(mutex *m);
-// Returns 1 for multiple unlocking and -1 if something bad happened and
-// whoever's waiting didn't get woken up.
-int mutex_unlock(mutex *m);
+// abort(2)s for multiple unlocking.
+void mutex_unlock(mutex *m);
 // Returns 0 when successful in locking the mutex and 1 if somebody else has it
 // locked.
 int mutex_trylock(mutex *m) __attribute__((warn_unused_result));
 
-// The condition_ functions are similar to the mutex_ ones but different.
+// The futex_ functions are similar to the mutex_ ones but different.
 // They are designed for signalling when something happens (possibly to
 // multiple listeners). A mutex manipulated with them can only be set or unset.
+//
+// They are different from the condition_ functions in that they do NOT work
+// correctly as standard condition variables. While it is possible to keep
+// track of the "condition" using the value part of the futex_* functions, the
+// obvious implementation has basically the same race condition that condition
+// variables are designed to prevent between somebody else grabbing the mutex
+// and changing whether it's set or not and the futex_ function changing the
+// futex's value.
 
-// Wait for the condition to be set. Will return immediately if it's already set.
-// Returns 0 if successful or it was already set, 1 if interrupted by a signal, or -1.
-int condition_wait(mutex *m) __attribute__((warn_unused_result));
-// Will wait for the next condition_set, even if the condition is already set.
-// Returns 0 if successful, 1 if interrupted by a signal, or -1.
-int condition_wait_force(mutex *m) __attribute__((warn_unused_result));
-// Set the condition and wake up anybody waiting on it.
+// Wait for the futex to be set. Will return immediately if it's already set.
+// Returns 0 if successful or it was already set, 1 if interrupted by a signal,
+// or -1.
+int futex_wait(mutex *m) __attribute__((warn_unused_result));
+// Set the futex and wake up anybody waiting on it.
 // Returns the number that were woken or -1.
-int condition_set(mutex *m);
+//
+// This will always wake up all waiters at the same time and set the value to 1.
+int futex_set(mutex *m);
 // Same as above except lets something other than 1 be used as the final value.
-int condition_set_value(mutex *m, mutex value);
-// Unsets the condition.
+int futex_set_value(mutex *m, mutex value);
+// Unsets the futex (sets the value to 0).
 // Returns 0 if it was set before and 1 if it wasn't.
-int condition_unset(mutex *m);
+// Can not fail.
+int futex_unset(mutex *m);
+
+// The condition_ functions implement condition variable support. The API is
+// similar to the pthreads api and works the same way. The same m argument must
+// be passed in for all calls to all of the condition_ functions with a given c.
+
+// Wait for the condition variable to be signalled. m will be unlocked
+// atomically with actually starting to wait. m is guaranteed to be locked when
+// this function returns.
+// NOTE: The relocking of m is not atomic with stopping the actual wait and
+// other process(es) may lock (+unlock) the mutex first.
+void condition_wait(mutex *c, mutex *m);
+// If any other processes are condition_waiting on c, wake 1 of them. Does not
+// require m to be locked.
+void condition_signal(mutex *c);
+// Wakes all processes that are condition_waiting on c. Does not require m to be
+// locked.
+void condition_broadcast(mutex *c, mutex *m);
 
 #ifdef __cplusplus
 }
 #endif  // __cplusplus
 
-#endif
+#endif  // AOS_ATOM_CODE_IPC_LIB_SYNC_H_
diff --git a/aos/atom_code/ipc_lib/binheap.c b/aos/atom_code/ipc_lib/binheap.c
deleted file mode 100644
index 8eb024d..0000000
--- a/aos/atom_code/ipc_lib/binheap.c
+++ /dev/null
@@ -1,125 +0,0 @@
-#include "binheap.h"
-#include <stdlib.h>
-#include <stdio.h>
-
-#ifndef TESTING_ASSERT
-#define TESTING_ASSERT(...)
-#endif
-#define Error(x) TESTING_ASSERT(0, x)
-
-#define MinData (0)
-
-void Initialize( int Elements, PriorityQueue H )
-{
-	H->Capacity = Elements - 1;
-	H->Size = 0;
-	H->Elements[ 0 ] = MinData;
-}
-
-int Insert( ElementType X, PriorityQueue H )
-{
-	int i;
-
-	if( IsFull( H ) )
-	{
-		return -1;
-	}
-
-	for( i = ++H->Size; H->Elements[ i / 2 ] > X; i /= 2 )
-		H->Elements[ i ] = H->Elements[ i / 2 ];
-	H->Elements[ i ] = X;
-	return 0;
-}
-
-void Remove( ElementType X, PriorityQueue H )
-{
-	int i, Child, removed = 0;
-	ElementType LastElement;
-
-	for ( i = 1; i <= H->Size; ++i )
-	{
-		if( H->Elements[ i ] == X )
-		{
-			removed = i;
-			break;
-		}
-	}
-	if( removed == 0 )
-	{
-		fprintf(stderr, "could not find element %d to remove. not removing any\n", X);
-		return;
-	}
-
-	LastElement = H->Elements[ H->Size-- ];
-
-	for( i = removed; i * 2 <= H->Size; i = Child )
-	{
-		/* Find smaller child */
-		Child = i * 2;
-		if( Child != H->Size && H->Elements[ Child + 1 ]
-				< H->Elements[ Child ] )
-			Child++;
-
-		/* Percolate one level */
-		if( LastElement > H->Elements[ Child ] )
-			H->Elements[ i ] = H->Elements[ Child ];
-		else
-			break;
-	}
-	H->Elements[ i ] = LastElement;
-}
-
-ElementType DeleteMin( PriorityQueue H )
-{
-	int i, Child;
-	ElementType MinElement, LastElement;
-
-	if( IsEmpty( H ) )
-	{
-		Error( "Priority queue is empty" );
-		return H->Elements[ 0 ];
-	}
-	MinElement = H->Elements[ 1 ];
-	LastElement = H->Elements[ H->Size-- ];
-
-	for( i = 1; i * 2 <= H->Size; i = Child )
-	{
-		/* Find smaller child */
-		Child = i * 2;
-		if( Child != H->Size && H->Elements[ Child + 1 ]
-				< H->Elements[ Child ] )
-			Child++;
-
-		/* Percolate one level */
-		if( LastElement > H->Elements[ Child ] )
-			H->Elements[ i ] = H->Elements[ Child ];
-		else
-			break;
-	}
-	H->Elements[ i ] = LastElement;
-	return MinElement;
-}
-
-ElementType GetMin( PriorityQueue H )
-{
-	if( !IsEmpty( H ) )
-		return H->Elements[ 1 ];
-	Error( "Priority Queue is Empty" );
-	return H->Elements[ 0 ];
-}
-
-int IsEmpty( PriorityQueue H )
-{
-	return H->Size == 0;
-}
-
-int IsFull( PriorityQueue H )
-{
-	return H->Size == H->Capacity;
-}
-
-int GetSize( PriorityQueue H )
-{
-	return H->Size;
-}
-
diff --git a/aos/atom_code/ipc_lib/binheap.h b/aos/atom_code/ipc_lib/binheap.h
deleted file mode 100644
index 8c26f9f..0000000
--- a/aos/atom_code/ipc_lib/binheap.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _BinHeap_H
-#define _BinHeap_H
-
-#include <stdint.h>
-
-typedef uint8_t ElementType;
-struct HeapStruct;
-typedef struct HeapStruct *PriorityQueue;
-
-struct HeapStruct
-{
-	int Capacity;
-	int Size;
-	ElementType *Elements;
-};
-
-// Elements is the number allocated at H->Elements
-void Initialize( int Elements, PriorityQueue H );
-// 0 if successful, -1 if full
-int Insert( ElementType X, PriorityQueue H );
-void Remove( ElementType X, PriorityQueue H );
-ElementType DeleteMin( PriorityQueue H );
-ElementType GetMin( PriorityQueue H );
-int IsEmpty( PriorityQueue H );
-int IsFull( PriorityQueue H );
-int GetSize( PriorityQueue H );
-
-#endif
-
diff --git a/aos/atom_code/ipc_lib/binheap_test.cpp b/aos/atom_code/ipc_lib/binheap_test.cpp
deleted file mode 100644
index 62eecd4..0000000
--- a/aos/atom_code/ipc_lib/binheap_test.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-extern "C" {
-#include "binheap.h"
-}
-
-#include <gtest/gtest.h>
-
-class BinHeapTest : public testing::Test{
-	protected:
-		static const int TEST_ELEMENTS = 57;
-		PriorityQueue queue;
-		virtual void SetUp(){
-			queue = new HeapStruct();
-			queue->Elements = new uint8_t[TEST_ELEMENTS];
-			Initialize(TEST_ELEMENTS, queue);
-		}
-		virtual void TearDown(){
-			delete[] queue->Elements;
-			delete queue;
-		}
-};
-
-std::ostream& operator<< (std::ostream& o, uint8_t c){
-    return o<<(int)c;
-}
-
-testing::AssertionResult Contains(PriorityQueue queue, const uint8_t expected[], size_t length){
-	for(size_t i = 0; i < length; ++i){
-		//printf("expected[%d]=%d\n", i, expected[i]);
-		if(DeleteMin(queue) != expected[i]){
-			return testing::AssertionFailure() << "queue[" << i << "] != " << expected[i];
-		}
-	}
-	if(!IsEmpty(queue))
-		return testing::AssertionFailure() << "queue is longer than " << length;
-	return ::testing::AssertionSuccess();
-}
-
-TEST_F(BinHeapTest, SingleElement){
-	Insert(87, queue);
-	EXPECT_EQ(87, DeleteMin(queue));
-	EXPECT_TRUE(IsEmpty(queue));
-}
-TEST_F(BinHeapTest, MultipleElements){
-	Insert(54, queue);
-	Insert(1, queue);
-	Insert(0, queue);
-	Insert(255, queue);
-	Insert(123, queue);
-	uint8_t expected[] = {0, 1, 54, 123, 255};
-	EXPECT_TRUE(Contains(queue, expected, sizeof(expected)));
-}
-TEST_F(BinHeapTest, Removals){
-	Insert(54, queue);
-	Insert(1, queue);
-	Insert(0, queue);
-	Insert(255, queue);
-	Insert(123, queue);
-	Remove(255, queue);
-	Remove(0, queue);
-	Insert(222, queue);
-	Insert(67, queue);
-	uint8_t expected[] = {1, 54, 67, 123, 222};
-	EXPECT_TRUE(Contains(queue, expected, sizeof(expected)));
-}
-
diff --git a/aos/atom_code/ipc_lib/cmpxchg.h b/aos/atom_code/ipc_lib/cmpxchg.h
deleted file mode 100644
index acb4a3c..0000000
--- a/aos/atom_code/ipc_lib/cmpxchg.h
+++ /dev/null
@@ -1,153 +0,0 @@
-#ifndef __ASM_CMPXCHG_H
-#define __ASM_CMPXCHG_H
-
-#include <stdint.h>
-
-//TODO implement xchg using gcc's atomic builtins (http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html)
-//or maybe http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
-//__atomic_fetch_sub looks promising
-
-#define cmpxchg(ptr, o, n) __sync_val_compare_and_swap(ptr, o, n)
-/*#define xchg(ptr, n) ({typeof(*ptr) r; \
-		do{ \
-			r = *ptr; \
-		}while(!__sync_bool_compare_and_swap(ptr, r, n)); \
-		r; \
-})*/
-
-#  define LOCK "lock;"
-#  define LOCK_PREFIX "lock;"
-
-#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
-
-#define __xg(x) ((volatile long long *)(x))
-
-/*static inline void set_64bit(volatile unsigned long *ptr, unsigned long val)
-{
-	*ptr = val;
-}
-
-#define _set_64bit set_64bit*/
-
-/*
- * Note: no "lock" prefix even on SMP: xchg always implies lock anyway
- * Note 2: xchg has side effect, so that attribute volatile is necessary,
- *	  but generally the primitive is invalid, *ptr is output argument. --ANK
- */
-static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-{
-	switch (size) {
-		case 1:
-			__asm__ __volatile__("xchgb %b0,%1"
-					:"=q" (x)
-					:"m" (*__xg(ptr)), "0" (x)
-					:"memory");
-			break;
-		case 2:
-			__asm__ __volatile__("xchgw %w0,%1"
-					:"=r" (x)
-					:"m" (*__xg(ptr)), "0" (x)
-					:"memory");
-			break;
-		case 4:
-			__asm__ __volatile__("xchgl %k0,%1"
-					:"=r" (x)
-					:"m" (*__xg(ptr)), "0" (x)
-					:"memory");
-			break;
-		case 8:
-			__asm__ __volatile__("xchg %0,%1"
-					:"=r" (x)
-					:"m" (*__xg(ptr)), "0" (x)
-					:"memory");
-			break;
-	}
-	return x;
-}
-
-/*
- * Atomic compare and exchange.  Compare OLD with MEM, if identical,
- * store NEW in MEM.  Return the initial value in MEM.  Success is
- * indicated by comparing RETURN with OLD.
- */
-
-#if 0
-
-#define __HAVE_ARCH_CMPXCHG 1
-
-static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
-		unsigned long new, int size)
-{
-	int32_t prev;
-	switch (size) {
-		case 1:
-			__asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
-				    : "=a"(prev)
-				    : "q"(new), "m"(*__xg(ptr)), "0"(old)
-				    : "memory");
-			return prev;
-		case 2:
-			__asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
-				    : "=a"(prev)
-				    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-				    : "memory");
-			return prev;
-		case 4:
-			__asm__ __volatile__(LOCK_PREFIX "cmpxchgl %k1,%2"
-				    : "=a"(prev)
-				    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-				    : "memory");
-			return prev;
-		case 8:
-			__asm__ __volatile__("lock; cmpxchg %1,%2"
-				    : "=a"(prev)
-				    : "q"(new), "m"(*__xg(ptr)), "0"(old)
-				    : "memory");
-			return prev;
-	}
-	return old;
-}
-
-/*
-static inline unsigned long __cmpxchg_local(volatile void *ptr,
-			unsigned long old, unsigned long new, int size)
-{
-	unsigned long prev;
-	switch (size) {
-	case 1:
-		__asm__ __volatile__("cmpxchgb %b1,%2"
-				     : "=a"(prev)
-				     : "q"(new), "m"(*__xg(ptr)), "0"(old)
-				     : "memory");
-		return prev;
-	case 2:
-		__asm__ __volatile__("cmpxchgw %w1,%2"
-				     : "=a"(prev)
-				     : "r"(new), "m"(*__xg(ptr)), "0"(old)
-				     : "memory");
-		return prev;
-	case 4:
-		__asm__ __volatile__("cmpxchgl %k1,%2"
-				     : "=a"(prev)
-				     : "r"(new), "m"(*__xg(ptr)), "0"(old)
-				     : "memory");
-		return prev;
-	case 8:
-		__asm__ __volatile__("cmpxchgq %1,%2"
-				     : "=a"(prev)
-				     : "r"(new), "m"(*__xg(ptr)), "0"(old)
-				     : "memory");
-		return prev;
-	}
-	return old;
-}*/
-
-#define cmpxchg(ptr,o,n)\
-	((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-					(unsigned long)(n),sizeof(*(ptr))))
-/*#define cmpxchg_local(ptr,o,n)\
-	((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-					(unsigned long)(n),sizeof(*(ptr))))*/
-#endif
-
-#endif
diff --git a/aos/atom_code/ipc_lib/condition.cc b/aos/atom_code/ipc_lib/condition.cc
new file mode 100644
index 0000000..b764026
--- /dev/null
+++ b/aos/atom_code/ipc_lib/condition.cc
@@ -0,0 +1,26 @@
+#include "aos/common/condition.h"
+
+#include <inttypes.h>
+
+#include "aos/common/type_traits.h"
+
+namespace aos {
+
+static_assert(shm_ok<Condition>::value, "Condition should work"
+              " in shared memory");
+
+Condition::Condition(Mutex *m) : impl_(), m_(m) {}
+
+void Condition::Wait() {
+  condition_wait(&impl_, &m_->impl_);
+}
+
+void Condition::Signal() {
+  condition_signal(&impl_);
+}
+
+void Condition::Broadcast() {
+  condition_broadcast(&impl_, &m_->impl_);
+}
+
+}  // namespace aos
diff --git a/aos/atom_code/ipc_lib/core_lib.c b/aos/atom_code/ipc_lib/core_lib.c
index d4988cc..c83dbe4 100644
--- a/aos/atom_code/ipc_lib/core_lib.c
+++ b/aos/atom_code/ipc_lib/core_lib.c
@@ -1,53 +1,44 @@
+#include "aos/atom_code/ipc_lib/core_lib.h"
+
 #include <stdio.h>
 #include <stdlib.h>
-#include "shared_mem.h"
-#include "core_lib.h"
-#include <time.h>
 
-void init_shared_mem_core(aos_shm_core *shm_core) {
-	clock_gettime(CLOCK_REALTIME, &shm_core->identifier);
-	shm_core->queues.alloc_flag = 0;
-	shm_core->msg_alloc_lock = 0;
-	shm_core->queues.queue_list = NULL;
-	shm_core->queues.alloc_lock = 0;
-	aos_resource_entity_root_create();
-	for(int i = 0; i < AOS_RESOURCE_NUM; ++i){
-		aos_resource_init(i);
-	}
-}
+#include "aos/atom_code/ipc_lib/shared_mem.h"
+
 static inline uint8_t aos_8max(uint8_t l, uint8_t r) {
-	return (l > r) ? l : r;
+  return (l > r) ? l : r;
 }
 void *shm_malloc_aligned(size_t length, uint8_t alignment) {
-	// minimum alignments from <http://software.intel.com/en-us/articles/data-alignment-when-migrating-to-64-bit-intel-architecture/>
-	if (length <= 1) {
-		alignment = aos_8max(alignment, 1);
-	} else if (length <= 2) {
-		alignment = aos_8max(alignment, 2);
-	} else if (length <= 4) {
-		alignment = aos_8max(alignment, 4);
-	} else if (length <= 8) {
-		alignment = aos_8max(alignment, 8);
-	} else if (length <= 16) {
-		alignment = aos_8max(alignment, 16);
-	} else {
-		alignment = aos_8max(alignment, (length >= 64) ? 64 : 16);
-	}
+  // minimum alignments from
+  // <http://software.intel.com/en-us/articles/data-alignment-when-migrating-to-64-bit-intel-architecture/>
+  if (length <= 1) {
+    alignment = aos_8max(alignment, 1);
+  } else if (length <= 2) {
+    alignment = aos_8max(alignment, 2);
+  } else if (length <= 4) {
+    alignment = aos_8max(alignment, 4);
+  } else if (length <= 8) {
+    alignment = aos_8max(alignment, 8);
+  } else if (length <= 16) {
+    alignment = aos_8max(alignment, 16);
+  } else {
+    alignment = aos_8max(alignment, (length >= 64) ? 64 : 16);
+  }
 
-	void *msg = NULL;
-	aos_shm_core *shm_core = global_core->mem_struct;
-	mutex_grab(&shm_core->msg_alloc_lock);
-	shm_core->msg_alloc = (uint8_t *)shm_core->msg_alloc - length;
-	const uint8_t align_extra = (uintptr_t)shm_core->msg_alloc % alignment;
-	shm_core->msg_alloc = (uint8_t *)shm_core->msg_alloc - align_extra;
-	msg = shm_core->msg_alloc;
-	if (msg <= global_core->shared_mem) {
-		fprintf(stderr, "core_lib: RAN OUT OF SHARED MEMORY!!!----------------------------------------------------------\n");
-		printf("if you didn't see the stderr output just then, you should\n");
-		abort();
-	}
-	//printf("alloc %p\n", msg);
-	mutex_unlock(&shm_core->msg_alloc_lock);
-	return msg;
+  void *msg = NULL;
+  aos_shm_core *shm_core = global_core->mem_struct;
+  mutex_grab(&shm_core->msg_alloc_lock);
+  shm_core->msg_alloc = (uint8_t *)shm_core->msg_alloc - length;
+  const uint8_t align_extra = (uintptr_t)shm_core->msg_alloc % alignment;
+  shm_core->msg_alloc = (uint8_t *)shm_core->msg_alloc - align_extra;
+  msg = shm_core->msg_alloc;
+  if (msg <= global_core->shared_mem) {
+    fprintf(stderr, "core_lib: RAN OUT OF SHARED MEMORY!!!----------------------------------------------------------\n");
+    printf("if you didn't see the stderr output just then, you should have\n");
+    abort();
+  }
+  //printf("alloc %p\n", msg);
+  mutex_unlock(&shm_core->msg_alloc_lock);
+  return msg;
 }
 
diff --git a/aos/atom_code/ipc_lib/core_lib.h b/aos/atom_code/ipc_lib/core_lib.h
index 1983f7a..5674220 100644
--- a/aos/atom_code/ipc_lib/core_lib.h
+++ b/aos/atom_code/ipc_lib/core_lib.h
@@ -1,49 +1,17 @@
 #ifndef _AOS_CORE_LIB_H_
 #define _AOS_CORE_LIB_H_
 
-// required by resource.h
-// defined in shared_mem.c
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-extern struct aos_core *global_core;
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#include "aos_sync.h"
-#include "queue.h"
 #include <stdint.h>
-#include "resource_core.h"
+
+#include "aos/atom_code/ipc_lib/aos_sync.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif  // __cplusplus
 
-struct aos_queue_list_t;
-typedef struct aos_queue_hash_t {
-	int alloc_flag;
-	mutex alloc_lock;
-	struct aos_queue_list_t *queue_list;
-} aos_queue_hash;
-
-typedef struct aos_shm_core_t {
-  // clock_gettime(CLOCK_REALTIME, &identifier) gets called to identify
-  // this shared memory area
-  struct timespec identifier;
-  // gets 0-initialized at the start (as part of shared memory) and
-  // the owner sets as soon as it finishes setting stuff up
-  mutex creation_condition;
-  mutex msg_alloc_lock;
-  void *msg_alloc;
-  aos_queue_hash queues;
-  aos_resource_list resources;
-} aos_shm_core;
-
-void init_shared_mem_core(aos_shm_core *shm_core);
-
-void *shm_malloc_aligned(size_t length, uint8_t alignment);
-static void *shm_malloc(size_t length);
+void *shm_malloc_aligned(size_t length, uint8_t alignment)
+    __attribute__((alloc_size(1)));
+static void *shm_malloc(size_t length) __attribute__((alloc_size(1)));
 static inline void *shm_malloc(size_t length) {
   return shm_malloc_aligned(length, 0);
 }
diff --git a/aos/atom_code/ipc_lib/ipc_lib.gyp b/aos/atom_code/ipc_lib/ipc_lib.gyp
index 4dd0fa9..f947d5e 100644
--- a/aos/atom_code/ipc_lib/ipc_lib.gyp
+++ b/aos/atom_code/ipc_lib/ipc_lib.gyp
@@ -1,54 +1,81 @@
 {
   'targets': [
     {
-      'target_name': 'ipc_lib',
+      'target_name': 'aos_sync',
       'type': 'static_library',
       'sources': [
         'aos_sync.c',
-        'binheap.c',
+      ],
+    },
+    {
+      'target_name': 'core_lib',
+      'type': 'static_library',
+      'sources': [
         'core_lib.c',
-        'queue.c',
-        'resource.c',
+      ],
+      'dependencies': [
+        'aos_sync',
+        'shared_mem',
+      ],
+      'export_dependent_settings': [
+        'aos_sync',
+      ],
+    },
+    {
+      'target_name': 'shared_mem',
+      'type': 'static_library',
+      'sources': [
         'shared_mem.c',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:aos/ResourceList.h',
+        'aos_sync',
       ],
       'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:aos/ResourceList.h',
+        'aos_sync',
       ],
     },
     {
-      'target_name': 'binheap_test',
-      'type': 'executable',
+      'target_name': 'queue',
+      'type': 'static_library',
       'sources': [
-        'binheap_test.cpp',
+        'queue.cc',
       ],
       'dependencies': [
-        '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/common/common.gyp:condition',
+        '<(AOS)/common/common.gyp:mutex',
+        'core_lib',
+        # TODO(brians): fix this once there's a nice logging interface to use
+        # '<(AOS)/build/aos.gyp:logging',
       ],
     },
     {
-      'target_name': 'resource_test',
+      'target_name': 'raw_queue_test',
       'type': 'executable',
       'sources': [
-        'resource_test.cpp',
+        'queue_test.cc',
       ],
       'dependencies': [
         '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
+        'queue',
+        '<(AOS)/build/aos.gyp:logging',
+        'core_lib',
+        '<(AOS)/common/common.gyp:queue_testutils',
+        '<(AOS)/common/common.gyp:time',
       ],
     },
     {
-      'target_name': 'ipc_queue_test',
+      'target_name': 'ipc_stress_test',
       'type': 'executable',
       'sources': [
-        'queue_test.cpp',
+        'ipc_stress_test.cc',
       ],
       'dependencies': [
         '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/common/common.gyp:time',
+        '<(AOS)/common/common.gyp:queue_testutils',
+        '<(AOS)/common/common.gyp:mutex',
+        'core_lib',
+        '<(AOS)/common/common.gyp:die',
       ],
     },
   ],
diff --git a/aos/atom_code/ipc_lib/ipc_stress_test.cc b/aos/atom_code/ipc_lib/ipc_stress_test.cc
new file mode 100644
index 0000000..38c425f
--- /dev/null
+++ b/aos/atom_code/ipc_lib/ipc_stress_test.cc
@@ -0,0 +1,248 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <libgen.h>
+#include <assert.h>
+
+#include <vector>
+#include <string>
+
+#include "aos/common/time.h"
+#include "aos/common/queue_testutils.h"
+#include "aos/common/type_traits.h"
+#include "aos/common/mutex.h"
+#include "aos/atom_code/ipc_lib/core_lib.h"
+#include "aos/common/die.h"
+
+// This runs all of the IPC-related tests in a bunch of parallel processes for a
+// while and makes sure that they don't fail. It also captures the stdout and
+// stderr output from each test run and only prints it out (not interleaved with
+// the output from any other run) if the test fails.
+//
+// It's written in C++ for performance. We need actual OS-level parallelism for
+// this to work, which means that Ruby's out because it doesn't have good
+// support for doing that. My Python implementation ended up pretty heavily disk
+// IO-bound, which is a bad way to test CPU contention.
+
+namespace aos {
+
+// Each test is represented by the name of the test binary and then any
+// arguments to pass to it.
+// Using --gtest_filter is a bad idea because it seems to result in a lot of
+// swapping which causes everything to be disk-bound (at least for me).
+static const ::std::vector< ::std::vector< ::std::string>> kTests = {
+  {"queue_test"},
+  {"condition_test"},
+  {"mutex_test"},
+  {"raw_queue_test"},
+};
+// These arguments get inserted before any per-test arguments.
+static const ::std::vector< ::std::string> kDefaultArgs = {
+  "--gtest_repeat=30",
+  "--gtest_shuffle",
+};
+
+// How many test processes to run at a time.
+static const int kTesters = 100;
+// How long to test for.
+static constexpr time::Time kTestTime = time::Time::InSeconds(30);
+
+// The structure that gets put into shared memory and then referenced by all of
+// the child processes.
+struct Shared {
+  Shared(const time::Time &stop_time)
+    : stop_time(stop_time), total_iterations(0) {}
+
+  // Synchronizes access to stdout/stderr to avoid interleaving failure
+  // messages.
+  Mutex output_mutex;
+
+  // When to stop.
+  time::Time stop_time;
+
+  // The total number of iterations. Updated by each child as it finishes.
+  int total_iterations;
+  // Sychronizes writes to total_iterations
+  Mutex total_iterations_mutex;
+
+  const char *path;
+};
+static_assert(shm_ok<Shared>::value,
+              "it's going to get shared between forked processes");
+
+// Gets called after each child forks to run a test.
+void __attribute__((noreturn)) DoRunTest(
+    Shared *shared, const ::std::vector< ::std::string> &test, int pipes[2]) {
+  if (close(pipes[0]) == -1) {
+    Die("close(%d) of read end of pipe failed with %d: %s\n",
+        pipes[0], errno, strerror(errno));
+  }
+  if (close(STDIN_FILENO) == -1) {
+    Die("close(STDIN_FILENO(=%d)) failed with %d: %s\n",
+        STDIN_FILENO, errno, strerror(errno));
+  }
+  if (dup2(pipes[1], STDOUT_FILENO) == -1) {
+    Die("dup2(%d, STDOUT_FILENO(=%d)) failed with %d: %s\n",
+        pipes[1], STDOUT_FILENO, errno, strerror(errno));
+  }
+  if (dup2(pipes[1], STDERR_FILENO) == -1) {
+    Die("dup2(%d, STDERR_FILENO(=%d)) failed with %d: %s\n",
+        pipes[1], STDERR_FILENO, errno, strerror(errno));
+  }
+
+  size_t size = test.size();
+  size_t default_size = kDefaultArgs.size();
+  const char **args = new const char *[size + default_size + 1];
+  // The actual executable to run.
+  ::std::string executable;
+  int i = 0;
+  for (const ::std::string &c : test) {
+    if (i == 0) {
+      executable = ::std::string(shared->path) + "/" + c;
+      args[0] = executable.c_str();
+      for (const ::std::string &ci : kDefaultArgs) {
+        args[++i] = ci.c_str();
+      }
+    } else {
+      args[i] = c.c_str();
+    }
+    ++i;
+  }
+  args[size] = NULL;
+  execv(executable.c_str(), const_cast<char *const *>(args));
+  Die("execv(%s, %p) failed with %d: %s\n",
+      executable.c_str(), args, errno, strerror(errno));
+}
+
+void DoRun(Shared *shared) {
+  int iterations = 0;
+  // An iterator pointing to a random one of the tests.
+  auto test = kTests.begin() + (getpid() % kTests.size());
+  int pipes[2];
+  while (time::Time::Now() < shared->stop_time) {
+    if (pipe(pipes) == -1) {
+      Die("pipe(%p) failed with %d: %s\n", &pipes, errno, strerror(errno));
+    }
+    switch (fork()) {
+      case 0:  // in runner
+        DoRunTest(shared, *test, pipes);
+      case -1:
+        Die("fork() failed with %d: %s\n", errno, strerror(errno));
+    }
+
+    if (close(pipes[1]) == -1) {
+      Die("close(%d) of write end of pipe failed with %d: %s\n",
+          pipes[1], errno, strerror(errno));
+    }
+
+    ::std::string output;
+    char buffer[2048];
+    while (true) {
+      ssize_t ret = read(pipes[0], &buffer, sizeof(buffer));
+      if (ret == 0) {  // EOF
+        if (close(pipes[0]) == -1) {
+          Die("close(%d) of pipe at EOF failed with %d: %s\n",
+              pipes[0], errno, strerror(errno));
+        }
+        break;
+      } else if (ret == -1) {
+        Die("read(%d, %p, %zd) failed with %d: %s\n",
+            pipes[0], &buffer, sizeof(buffer), errno, strerror(errno));
+      }
+      output += ::std::string(buffer, ret);
+    }
+
+    int status;
+    while (true) {
+      if (wait(&status) == -1) {
+        if (errno == EINTR) continue;
+        Die("wait(%p) in child failed with %d: %s\n",
+            &status, errno, strerror(errno));
+      } else {
+        break;
+      }
+    }
+    if (WIFEXITED(status)) {
+      if (WEXITSTATUS(status) != 0) {
+        MutexLocker sync(&shared->output_mutex);
+        fprintf(stderr, "Test %s exited with status %d. output:\n",
+                test->at(0).c_str(), WEXITSTATUS(status));
+        fputs(output.c_str(), stderr);
+      }
+    } else if (WIFSIGNALED(status)) {
+      MutexLocker sync(&shared->output_mutex);
+      fprintf(stderr, "Test %s terminated by signal %d: %s.\n",
+              test->at(0).c_str(),
+              WTERMSIG(status), strsignal(WTERMSIG(status)));
+        fputs(output.c_str(), stderr);
+    } else {
+      assert(WIFSTOPPED(status));
+      Die("Test %s was stopped.\n", test->at(0).c_str());
+    }
+
+    ++test;
+    if (test == kTests.end()) test = kTests.begin();
+    ++iterations;
+  }
+  {
+    MutexLocker sync(&shared->total_iterations_mutex);
+    shared->total_iterations += iterations;
+  }
+}
+
+void Run(Shared *shared) {
+  switch (fork()) {
+    case 0:  // in child
+      DoRun(shared);
+      _exit(EXIT_SUCCESS);
+    case -1:
+      Die("fork() of child failed with %d: %s\n", errno, strerror(errno));
+  }
+}
+
+int Main(int argc, char **argv) {
+  assert(argc >= 1);
+
+  ::aos::common::testing::GlobalCoreInstance global_core;
+
+  Shared *shared = static_cast<Shared *>(shm_malloc(sizeof(Shared)));
+  new (shared) Shared(time::Time::Now() + kTestTime);
+
+  char *temp = strdup(argv[0]);
+  shared->path = strdup(dirname(temp));
+  free(temp);
+
+  for (int i = 0; i < kTesters; ++i) {
+    Run(shared);
+  }
+
+  bool error = false;
+  for (int i = 0; i < kTesters; ++i) {
+    int status;
+    if (wait(&status) == -1) {
+      if (errno == EINTR) {
+        --i;
+      } else {
+        Die("wait(%p) failed with %d: %s\n", &status, errno, strerror(errno));
+      }
+    }
+    if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
+      error = true;
+    }
+  }
+
+  printf("Ran a total of %d tests.\n", shared->total_iterations);
+  if (error) {
+    printf("A child had a problem during the test.\n");
+  }
+  return error ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+
+}  // namespace aos
+
+int main(int argc, char **argv) {
+  return ::aos::Main(argc, argv);
+}
diff --git a/aos/atom_code/ipc_lib/mutex.cpp b/aos/atom_code/ipc_lib/mutex.cpp
index d1f0ef2..47fc92a 100644
--- a/aos/atom_code/ipc_lib/mutex.cpp
+++ b/aos/atom_code/ipc_lib/mutex.cpp
@@ -2,9 +2,11 @@
 
 #include <inttypes.h>
 #include <errno.h>
+#include <stdio.h>
+#include <string.h>
 
-#include "aos/aos_core.h"
 #include "aos/common/type_traits.h"
+#include "aos/common/logging/logging.h"
 
 namespace aos {
 
@@ -18,16 +20,13 @@
 
 void Mutex::Lock() {
   if (mutex_grab(&impl_) != 0) {
-    LOG(FATAL, "mutex_grab(%p(=%"PRIu32")) failed because of %d: %s\n",
+    LOG(FATAL, "mutex_grab(%p(=%" PRIu32 ")) failed because of %d: %s\n",
         &impl_, impl_, errno, strerror(errno));
   }
 }
 
 void Mutex::Unlock() {
-  if (mutex_unlock(&impl_) != 0) {
-    LOG(FATAL, "mutex_unlock(%p(=%"PRIu32")) failed because of %d: %s\n",
-        &impl_, impl_, errno, strerror(errno));
-  }
+  mutex_unlock(&impl_);
 }
 
 bool Mutex::TryLock() {
diff --git a/aos/atom_code/ipc_lib/queue.c b/aos/atom_code/ipc_lib/queue.c
deleted file mode 100644
index 5cfd2ac..0000000
--- a/aos/atom_code/ipc_lib/queue.c
+++ /dev/null
@@ -1,510 +0,0 @@
-#include "aos/atom_code/ipc_lib/queue.h"
-#include "aos/atom_code/ipc_lib/queue_internal.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#define READ_DEBUG 0
-#define WRITE_DEBUG 0
-#define REF_DEBUG 0
-
-static inline aos_msg_header *get_header(void *msg) {
-	return (aos_msg_header *)((uint8_t *)msg - sizeof(aos_msg_header));
-}
-static inline aos_queue *aos_core_alloc_queue() {
-	return shm_malloc_aligned(sizeof(aos_queue), sizeof(int));
-}
-static inline void *aos_alloc_msg(aos_msg_pool *pool) {
-	return shm_malloc(pool->msg_length);
-}
-
-// actually free the given message
-static inline int aos_free_msg(aos_msg_pool *pool, void *msg, aos_queue *queue) {
-#if REF_DEBUG
-	if (pool->pool_lock == 0) {
-		//LOG(WARNING, "unprotected\n");
-	}
-#endif
-	aos_msg_header *header = get_header(msg);
-	if (pool->pool[header->index] != header) { // if something's messed up
-		fprintf(stderr, "queue: something is very very wrong with queue %p."
-				" pool->pool(=%p)[header->index(=%d)] != header(=%p)\n",
-				queue, pool->pool, header->index, header);
-		printf("queue: see stderr\n");
-		abort();
-	}
-#if REF_DEBUG
-	printf("ref_free_count: %p\n", msg);
-#endif
-	--pool->used;
-
-	if (queue->recycle != NULL) {
-		void *const new_msg = aos_queue_get_msg(queue->recycle);
-		if (new_msg == NULL) {
-			fprintf(stderr, "queue: couldn't get a message"
-					" for recycle queue %p\n", queue->recycle);
-		} else {
-			// Take a message from recycle_queue and switch its
-			// header with the one being freed, which effectively
-			// switches which queue each message belongs to.
-			aos_msg_header *const new_header = get_header(new_msg);
-			// also switch the messages between the pools
-			pool->pool[header->index] = new_header;
-			if (mutex_lock(&queue->recycle->pool.pool_lock)) {
-				return -1;
-			}
-			queue->recycle->pool.pool[new_header->index] = header;
-			// swap the information in both headers
-			header_swap(header, new_header);
-			// don't unlock the other pool until all of its messages are valid
-			mutex_unlock(&queue->recycle->pool.pool_lock);
-			// use the header for new_msg which is now for this pool
-			header = new_header;
-			if (aos_queue_write_msg_free(queue->recycle,
-						(void *)msg, OVERRIDE) != 0) {
-				printf("queue: warning aos_queue_write_msg("
-						"%p(=queue(=%p)->recycle), %p, OVERRIDE)"
-						" failed\n",
-						queue->recycle, queue, msg);
-			}
-			msg = new_msg;
-		}
-	}
-
-	// where the one we're freeing was
-	int index = header->index;
-	header->index = -1;
-	if (index != pool->used) { // if we're not freeing the one on the end
-		// put the last one where the one we're freeing was
-		header = pool->pool[index] = pool->pool[pool->used];
-		// put the one we're freeing at the end
-		pool->pool[pool->used] = get_header(msg);
-		// update the former last one's index
-		header->index = index;
-	}
-	return 0;
-}
-// TODO(brians) maybe do this with atomic integer instructions so it doesn't have to lock/unlock pool_lock
-static inline int msg_ref_dec(void *msg, aos_msg_pool *pool, aos_queue *queue) {
-	if (msg == NULL) {
-		return 0;
-	}
-
-	int rv = 0;
-	if (mutex_lock(&pool->pool_lock)) {
-		return -1;
-	}
-	aos_msg_header *const header = get_header(msg);
-	header->ref_count --;
-	assert(header->ref_count >= 0);
-#if REF_DEBUG
-	printf("ref_dec_count: %p count=%d\n", msg, header->ref_count);
-#endif
-	if (header->ref_count == 0) {
-		rv = aos_free_msg(pool, msg, queue);
-	}
-	mutex_unlock(&pool->pool_lock);
-	return rv;
-}
-
-static inline int sigcmp(const aos_type_sig *sig1, const aos_type_sig *sig2) {
-	if (sig1->length != sig2->length) {
-		//LOG(DEBUG, "length mismatch 1=%d 2=%d\n", sig1->length, sig2->length);
-		return 0;
-	}
-	if (sig1->queue_length != sig2->queue_length) {
-		//LOG(DEBUG, "queue_length mismatch 1=%d 2=%d\n", sig1->queue_length, sig2->queue_length);
-		return 0;
-	}
-	if (sig1->hash != sig2->hash) {
-		//LOG(DEBUG, "hash mismatch 1=%d 2=%d\n", sig1->hash, sig2->hash);
-		return 0;
-	}
-	//LOG(DEBUG, "signature match\n");
-	return 1;
-}
-static inline aos_queue *aos_create_queue(const aos_type_sig *sig) {
-	aos_queue *const queue = aos_core_alloc_queue();
-	aos_msg_pool *const pool = &queue->pool;
-	pool->mem_length = sig->queue_length + EXTRA_MESSAGES;
-	pool->length = 0;
-	pool->used = 0;
-	pool->msg_length = sig->length + sizeof(aos_msg_header);
-	pool->pool = shm_malloc(sizeof(void *) * pool->mem_length);
-	aos_ring_buf *const buf = &queue->buf;
-	buf->length = sig->queue_length + 1;
-	if (buf->length < 2) { // TODO(brians) when could this happen?
-		buf->length = 2;
-	}
-	buf->data = shm_malloc(buf->length * sizeof(void *));
-	buf->start = 0;
-	buf->end = 0;
-	buf->msgs = 0;
-	buf->writable = 1;
-	buf->readable = 0;
-	buf->buff_lock = 0;
-	pool->pool_lock = 0;
-	queue->recycle = NULL;
-	return queue;
-}
-aos_queue *aos_fetch_queue(const char *name, const aos_type_sig *sig) {
-	//LOG(DEBUG, "Fetching the stupid queue: %s\n", name);
-	mutex_grab(&global_core->mem_struct->queues.alloc_lock);
-	aos_queue_list *list = global_core->mem_struct->queues.queue_list;
-	aos_queue_list *last = NULL;
-	while (list != NULL) {
-		// if we found a matching queue
-		if (strcmp(list->name, name) == 0 && sigcmp(&list->sig, sig)) {
-			mutex_unlock(&global_core->mem_struct->queues.alloc_lock);
-			return list->queue;
-		} else {
-			//LOG(DEBUG, "rejected queue %s strcmp=%d target=%s\n", (*list)->name, strcmp((*list)->name, name), name);
-		}
-		last = list;
-		list = list->next;
-	}
-	list = shm_malloc(sizeof(aos_queue_list));
-	if (last == NULL) {
-		global_core->mem_struct->queues.queue_list = list;
-	} else {
-		last->next = list;
-	}
-	list->sig = *sig;
-	const size_t name_size = strlen(name) + 1;
-	list->name = shm_malloc(name_size);
-	memcpy(list->name, name, name_size);
-	//LOG(INFO, "creating queue{name=%s, sig.length=%zd, sig.hash=%d, sig.queue_length=%d}\n", name, sig->length, sig->hash, sig->queue_length);
-	list->queue = aos_create_queue(sig);
-	//LOG(DEBUG, "Made the stupid queue: %s happy?\n", name);
-	list->next = NULL;
-	mutex_unlock(&global_core->mem_struct->queues.alloc_lock);
-	return list->queue;
-}
-aos_queue *aos_fetch_queue_recycle(const char *name, const aos_type_sig *sig,
-		const aos_type_sig *recycle_sig, aos_queue **recycle) {
-	if (sig->length != recycle_sig->length || sig->hash == recycle_sig->hash) {
-		*recycle = NULL;
-		return NULL;
-	}
-	aos_queue *const r = aos_fetch_queue(name, sig);
-	r->recycle = aos_fetch_queue(name, recycle_sig);
-	if (r == r->recycle) {
-		fprintf(stderr, "queue: r->recycle(=%p) == r(=%p)\n", r->recycle, r);
-		printf("see stderr\n");
-		abort();
-	}
-	*recycle = r->recycle;
-	return r;
-}
-
-int aos_queue_write_msg(aos_queue *queue, void *msg, int opts) {
-#if WRITE_DEBUG
-  printf("queue: write_msg(%p, %p, %d)\n", queue, msg, opts);
-#endif
-  int rv = 0;
-  if (msg == NULL || msg < (void *)global_core->mem_struct ||
-      msg > (void *)((intptr_t)global_core->mem_struct + global_core->size)) {
-    fprintf(stderr, "queue: attempt to write bad message %p to %p. aborting\n",
-            msg, queue);
-    printf("see stderr\n");
-    abort();
-  }
-  aos_ring_buf *const buf = &queue->buf;
-  if (mutex_lock(&buf->buff_lock)) {
-#if WRITE_DEBUG
-    printf("queue: locking buff_lock of %p failed\n", buf);
-#endif
-    return -1;
-  }
-  int new_end = (buf->end + 1) % buf->length;
-  while (new_end == buf->start) {
-    if (opts & NON_BLOCK) {
-#if WRITE_DEBUG
-      printf("queue: not blocking on %p. returning -1\n", queue);
-#endif
-      mutex_unlock(&buf->buff_lock);
-      return -1;
-    } else if (opts & OVERRIDE) {
-#if WRITE_DEBUG
-      printf("queue: overriding on %p\n", queue);
-#endif
-      // avoid leaking the message that we're going to overwrite
-      msg_ref_dec(buf->data[buf->start], &queue->pool, queue);
-      buf->start = (buf->start + 1) % buf->length;
-    } else { // BLOCK
-      mutex_unlock(&buf->buff_lock);
-#if WRITE_DEBUG
-      printf("queue: going to wait for writable(=%p) of %p\n",
-          &buf->writable, queue);
-#endif
-      if (condition_wait(&buf->writable)) {
-#if WRITE_DEBUG
-        printf("queue: waiting for writable(=%p) of %p failed\n",
-            &buf->writable, queue);
-#endif
-        return -1;
-      }
-#if WRITE_DEBUG
-      printf("queue: going to re-lock buff_lock of %p to write\n", queue);
-#endif
-      if (mutex_lock(&buf->buff_lock)) {
-#if WRITE_DEBUG
-        printf("queue: error locking buff_lock of %p\n", queue);
-#endif
-        return -1;
-      }
-    }
-    new_end = (buf->end + 1) % buf->length;
-  }
-  buf->data[buf->end] = msg;
-  ++buf->msgs;
-  buf->end = new_end;
-  mutex_unlock(&buf->buff_lock);
-#if WRITE_DEBUG
-  printf("queue: setting readable(=%p) of %p\n", &buf->readable, queue);
-#endif
-  condition_set(&buf->readable);
-  if (((buf->end + 1) % buf->length) == buf->start) { // if it's now full
-    condition_unset(&buf->writable);
-  }
-#if WRITE_DEBUG
-  printf("queue: write returning %d on queue %p\n", rv, queue);
-#endif
-  return rv;
-}
-
-int aos_queue_free_msg(aos_queue *queue, const void *msg) {
-	// TODO(brians) get rid of this
-	void *msg_temp;
-	memcpy(&msg_temp, &msg, sizeof(msg_temp));
-  	return msg_ref_dec(msg_temp, &queue->pool, queue);
-}
-// Deals with setting/unsetting readable and writable.
-// Should be called after buff_lock has been unlocked.
-// read is whether or not this read call read one off the queue
-static inline void aos_read_msg_common_end(aos_ring_buf *const buf, int read) {
-	if (read) {
-		condition_set(&buf->writable);
-		if (buf->start == buf->end) {
-			condition_unset(&buf->readable);
-		}
-	}
-}
-// Returns with buff_lock locked and a readable message in buf.
-// Returns -1 for error (if it returns -1, buff_lock will be unlocked).
-static inline int aos_queue_read_msg_common(int opts, aos_ring_buf *const buf,
-		aos_queue *const queue, int *index) {
-#if !READ_DEBUG
-	(void)queue;
-#endif
-	if (mutex_lock(&buf->buff_lock)) {
-#if READ_DEBUG
-		printf("queue: couldn't lock buff_lock of %p\n", queue);
-#endif
-		return -1;
-	}
-	while (buf->start == buf->end || ((index != NULL) && buf->msgs <= *index)) {
-		mutex_unlock(&buf->buff_lock);
-		if (opts & NON_BLOCK) {
-#if READ_DEBUG
-			printf("queue: not going to block waiting on %p\n", queue);
-#endif
-			return -1;
-		} else { // BLOCK
-#if READ_DEBUG
-			printf("queue: going to wait for readable(=%p) of %p\n",
-					&buf->readable, queue);
-#endif
-			// wait for a message to become readable
-			if ((index == NULL) ? condition_wait(&buf->readable) :
-					condition_wait_force(&buf->readable)) {
-#if READ_DEBUG
-				printf("queue: waiting for readable(=%p) of %p failed\n",
-						&buf->readable, queue);
-#endif
-				return -1;
-			}
-		}
-#if READ_DEBUG
-		printf("queue: going to re-lock buff_lock of %p to read\n", queue);
-#endif
-		if (mutex_lock(&buf->buff_lock)) {
-#if READ_DEBUG
-			printf("couldn't re-lock buff_lock of %p\n", queue);
-#endif
-			return -1;
-		}
-	}
-#if READ_DEBUG
-	printf("queue: read start=%d end=%d from %p\n", buf->start, buf->end, queue);
-#endif
-	return 0;
-}
-// handles reading with PEEK
-static inline void *read_msg_peek(aos_ring_buf *const buf, int opts, int start) {
-	void *ret;
-	if (opts & FROM_END) {
-		int pos = buf->end - 1;
-		if (pos < 0) { // if it needs to wrap
-			pos = buf->length - 1;
-		}
-#if READ_DEBUG
-		printf("queue: reading from line %d: %d\n", __LINE__, pos);
-#endif
-		ret = buf->data[pos];
-	} else {
-#if READ_DEBUG
-		printf("queue: reading from line %d: %d\n", __LINE__, start);
-#endif
-		ret = buf->data[start];
-	}
-	aos_msg_header *const header = get_header(ret);
-	header->ref_count ++;
-#if REF_DEBUG
-	printf("ref inc count: %p\n", ret);
-#endif
-	return ret;
-}
-const void *aos_queue_read_msg(aos_queue *queue, int opts) {
-#if READ_DEBUG
-	printf("queue: read_msg(%p, %d)\n", queue, opts);
-#endif
-	void *msg = NULL;
-	aos_ring_buf *const buf = &queue->buf;
-	if (aos_queue_read_msg_common(opts, buf, queue, NULL) == -1) {
-#if READ_DEBUG
-		printf("queue: common returned -1 for %p\n", queue);
-#endif
-		return NULL;
-	}
-	if (opts & PEEK) {
-		msg = read_msg_peek(buf, opts, buf->start);
-	} else {
-		if (opts & FROM_END) {
-			while (1) {
-#if READ_DEBUG
-				printf("queue: start of c2 of %p\n", queue);
-#endif
-				// This loop pulls each message out of the buffer.
-				const int pos = buf->start;
-				buf->start = (buf->start + 1) % buf->length;
-				// if this is the last one
-				if (buf->start == buf->end) {
-#if READ_DEBUG
-					printf("queue: reading from c2: %d\n", pos);
-#endif
-					msg = buf->data[pos];
-					break;
-				}
-				// it's not going to be in the queue any more
-				msg_ref_dec(buf->data[pos], &queue->pool, queue);
-			}
-		} else {
-#if READ_DEBUG
-			printf("queue: reading from d2: %d\n", buf->start);
-#endif
-			msg = buf->data[buf->start];
-			buf->start = (buf->start + 1) % buf->length;
-		}
-	}
-	mutex_unlock(&buf->buff_lock);
-	aos_read_msg_common_end(buf, !(opts & PEEK));
-#if READ_DEBUG
-	printf("queue: read returning %p\n", msg);
-#endif
-	return msg;
-}
-const void *aos_queue_read_msg_index(aos_queue *queue, int opts, int *index) {
-#if READ_DEBUG
-	printf("queue: read_msg_index(%p, %d, %p(*=%d))\n", queue, opts, index, *index);
-#endif
-	void *msg = NULL;
-	aos_ring_buf *const buf = &queue->buf;
-	if (aos_queue_read_msg_common(opts, buf, queue, index) == -1) {
-#if READ_DEBUG
-		printf("queue: common returned -1\n");
-#endif
-		return NULL;
-	}
-        // TODO(parker): Handle integer wrap on the index.
-	const int offset = buf->msgs - *index;
-	int my_start = buf->end - offset;
-	if (offset >= buf->length) { // if we're behind the available messages
-		// catch index up to the last available message
-		*index += buf->start - my_start;
-		// and that's the one we're going to read
-		my_start = buf->start;
-	}
-	if (my_start < 0) { // if we want to read off the end of the buffer
-		// unwrap where we're going to read from
-		my_start += buf->length;
-	}
-	if (opts & PEEK) {
-		msg = read_msg_peek(buf, opts, my_start);
-	} else {
-		if (opts & FROM_END) {
-#if READ_DEBUG
-			printf("queue: start of c1 of %p\n", queue);
-#endif
-			int pos = buf->end - 1;
-			if (pos < 0) { // if it wrapped
-				pos = buf->length - 1; // unwrap it
-			}
-#if READ_DEBUG
-			printf("queue: reading from c1: %d\n", pos);
-#endif
-			msg = buf->data[pos];
-			*index = buf->msgs;
-		} else {
-#if READ_DEBUG
-			printf("queue: reading from d1: %d\n", my_start);
-#endif
-			msg = buf->data[my_start];
-			++(*index);
-		}
-		aos_msg_header *const header = get_header(msg);
-		++header->ref_count;
-#if REF_DEBUG
-		printf("ref_inc_count: %p\n", msg);
-#endif
-	}
-	mutex_unlock(&buf->buff_lock);
-	// this function never consumes one off the queue
-	aos_read_msg_common_end(buf, 0);
-	return msg;
-}
-static inline void *aos_pool_get_msg(aos_msg_pool *pool) {
-	if (mutex_lock(&pool->pool_lock)) {
-		return NULL;
-	}
-	void *msg;
-	if (pool->length - pool->used > 0) {
-		msg = pool->pool[pool->used];
-	} else {
-		if (pool->length >= pool->mem_length) {
-			//TODO(brians) log this if it isn't the log queue
-			fprintf(stderr, "queue: overused_pool\n");
-			msg = NULL;
-			goto exit;
-		}
-		msg = pool->pool[pool->length] = aos_alloc_msg(pool);
-		++pool->length;
-	}
-	aos_msg_header *const header = msg;
-	msg = (uint8_t *)msg + sizeof(aos_msg_header);
-	header->ref_count = 1;
-#if REF_DEBUG
-	printf("ref alloc: %p\n", msg);
-#endif
-	header->index = pool->used;
-	++pool->used;
-exit:
-	mutex_unlock(&pool->pool_lock);
-	return msg;
-}
-void *aos_queue_get_msg(aos_queue *queue) {
-	return aos_pool_get_msg(&queue->pool);
-}
-
diff --git a/aos/atom_code/ipc_lib/queue.cc b/aos/atom_code/ipc_lib/queue.cc
new file mode 100644
index 0000000..018f03a
--- /dev/null
+++ b/aos/atom_code/ipc_lib/queue.cc
@@ -0,0 +1,491 @@
+#include "aos/atom_code/ipc_lib/queue.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include <memory>
+
+#include "aos/common/logging/logging.h"
+#include "aos/common/type_traits.h"
+#include "aos/atom_code/ipc_lib/core_lib.h"
+
+namespace aos {
+namespace {
+
+static_assert(shm_ok<RawQueue>::value,
+              "RawQueue instances go into shared memory");
+
+const bool kReadDebug = false;
+const bool kWriteDebug = false;
+const bool kRefDebug = false;
+const bool kFetchDebug = false;
+
+// The number of extra messages the pool associated with each queue will be able
+// to hold (for readers who are slow about freeing them or who leak one when
+// they get killed).
+const int kExtraMessages = 20;
+
+}  // namespace
+
+const int RawQueue::kPeek;
+const int RawQueue::kFromEnd;
+const int RawQueue::kNonBlock;
+const int RawQueue::kBlock;
+const int RawQueue::kOverride;
+
+struct RawQueue::MessageHeader {
+  int ref_count;
+  int index;  // in pool_
+  static MessageHeader *Get(const void *msg) {
+    return reinterpret_cast<MessageHeader *>(__builtin_assume_aligned(
+        static_cast<uint8_t *>(const_cast<void *>(msg)) - sizeof(MessageHeader),
+        alignof(MessageHeader)));
+  }
+  void Swap(MessageHeader *other) {
+    MessageHeader temp;
+    memcpy(&temp, other, sizeof(temp));
+    memcpy(other, this, sizeof(*other));
+    memcpy(this, &temp, sizeof(*this));
+  }
+};
+static_assert(shm_ok<RawQueue::MessageHeader>::value, "the whole point"
+              " is to stick it in shared memory");
+
+struct RawQueue::ReadData {
+  bool writable_start;
+};
+
+// TODO(brians) maybe do this with atomic integer instructions so it doesn't
+//   have to lock/unlock pool_lock_
+void RawQueue::DecrementMessageReferenceCount(const void *msg) {
+  MutexLocker locker(&pool_lock_);
+  MessageHeader *header = MessageHeader::Get(msg);
+  --header->ref_count;
+  assert(header->ref_count >= 0);
+  if (kRefDebug) {
+    printf("ref_dec_count: %p count=%d\n", msg, header->ref_count);
+  }
+  if (header->ref_count == 0) {
+    DoFreeMessage(msg);
+  }
+}
+
+RawQueue::RawQueue(const char *name, size_t length, int hash, int queue_length)
+  : readable_(&data_lock_), writable_(&data_lock_) {
+  const size_t name_size = strlen(name) + 1;
+  char *temp = static_cast<char *>(shm_malloc(name_size));
+  memcpy(temp, name, name_size);
+  name_ = temp;
+  length_ = length;
+  hash_ = hash;
+  queue_length_ = queue_length;
+
+  next_ = NULL;
+  recycle_ = NULL;
+
+  if (kFetchDebug) {
+    printf("initializing name=%s, length=%zd, hash=%d, queue_length=%d\n",
+           name, length, hash, queue_length);
+  }
+
+  data_length_ = queue_length + 1;
+  if (data_length_ < 2) {  // TODO(brians) when could this happen?
+    data_length_ = 2;
+  }
+  data_ = static_cast<void **>(shm_malloc(sizeof(void *) * data_length_));
+  data_start_ = 0;
+  data_end_ = 0;
+  messages_ = 0;
+
+  mem_length_ = queue_length + kExtraMessages;
+  pool_length_ = 0;
+  messages_used_ = 0;
+  msg_length_ = length + sizeof(MessageHeader);
+  pool_ = static_cast<MessageHeader **>(
+      shm_malloc(sizeof(MessageHeader *) * mem_length_));
+
+  if (kFetchDebug) {
+    printf("made queue %s\n", name);
+  }
+}
+RawQueue *RawQueue::Fetch(const char *name, size_t length, int hash,
+                    int queue_length) {
+  if (kFetchDebug) {
+    printf("fetching queue %s\n", name);
+  }
+  if (mutex_lock(&global_core->mem_struct->queues.alloc_lock) != 0) {
+    return NULL;
+  }
+  RawQueue *current = static_cast<RawQueue *>(
+      global_core->mem_struct->queues.queue_list);
+  if (current != NULL) {
+    while (true) {
+      // If we found a matching queue.
+      if (strcmp(current->name_, name) == 0 && current->length_ == length &&
+          current->hash_ == hash && current->queue_length_ == queue_length) {
+        mutex_unlock(&global_core->mem_struct->queues.alloc_lock);
+        return current;
+      } else {
+        if (kFetchDebug) {
+          printf("rejected queue %s strcmp=%d target=%s\n", current->name_,
+                 strcmp(current->name_, name), name);
+        }
+      }
+      // If this is the last one.
+      if (current->next_ == NULL) break;
+      current = current->next_;
+    }
+  }
+
+  RawQueue *r = new (shm_malloc(sizeof(RawQueue)))
+      RawQueue(name, length, hash, queue_length);
+  if (current == NULL) {  // if we don't already have one
+    global_core->mem_struct->queues.queue_list = r;
+  } else {
+    current->next_ = r;
+  }
+
+  mutex_unlock(&global_core->mem_struct->queues.alloc_lock);
+  return r;
+}
+RawQueue *RawQueue::Fetch(const char *name, size_t length, int hash,
+                    int queue_length,
+                    int recycle_hash, int recycle_length, RawQueue **recycle) {
+  RawQueue *r = Fetch(name, length, hash, queue_length);
+  r->recycle_ = Fetch(name, length, recycle_hash, recycle_length);
+  if (r == r->recycle_) {
+    fprintf(stderr, "queue: r->recycle_(=%p) == r(=%p)\n", r->recycle_, r);
+    printf("see stderr\n");
+    r->recycle_ = NULL;
+    abort();
+  }
+  *recycle = r->recycle_;
+  return r;
+}
+
+void RawQueue::DoFreeMessage(const void *msg) {
+  MessageHeader *header = MessageHeader::Get(msg);
+  if (pool_[header->index] != header) {  // if something's messed up
+    fprintf(stderr, "queue: something is very very wrong with queue %p."
+            " pool_(=%p)[header->index(=%d)] != header(=%p)\n",
+            this, pool_, header->index, header);
+    printf("queue: see stderr\n");
+    abort();
+  }
+  if (kRefDebug) {
+    printf("ref free: %p\n", msg);
+  }
+  --messages_used_;
+
+  if (recycle_ != NULL) {
+    void *const new_msg = recycle_->GetMessage();
+    if (new_msg == NULL) {
+      fprintf(stderr, "queue: couldn't get a message"
+              " for recycle queue %p\n", recycle_);
+    } else {
+      // Take a message from recycle_ and switch its
+      // header with the one being freed, which effectively
+      // switches which queue each message belongs to.
+      MessageHeader *const new_header = MessageHeader::Get(new_msg);
+      // Also switch the messages between the pools.
+      pool_[header->index] = new_header;
+      {
+        MutexLocker locker(&recycle_->pool_lock_);
+        recycle_->pool_[new_header->index] = header;
+        // Swap the information in both headers.
+        header->Swap(new_header);
+        // Don't unlock the other pool until all of its messages are valid.
+      }
+      // use the header for new_msg which is now for this pool
+      header = new_header;
+      if (!recycle_->WriteMessage(const_cast<void *>(msg), kOverride)) {
+        fprintf(stderr, "queue: %p->WriteMessage(%p, kOverride) failed."
+                " aborting\n", recycle_, msg);
+        printf("see stderr\n");
+        abort();
+      }
+      msg = new_msg;
+    }
+  }
+
+  // Where the one we're freeing was.
+  int index = header->index;
+  header->index = -1;
+  if (index != messages_used_) {  // if we're not freeing the one on the end
+    // Put the last one where the one we're freeing was.
+    header = pool_[index] = pool_[messages_used_];
+    // Put the one we're freeing at the end.
+    pool_[messages_used_] = MessageHeader::Get(msg);
+    // Update the former last one's index.
+    header->index = index;
+  }
+}
+
+bool RawQueue::WriteMessage(void *msg, int options) {
+  if (kWriteDebug) {
+    printf("queue: %p->WriteMessage(%p, %x)\n", this, msg, options);
+  }
+  if (msg == NULL || msg < reinterpret_cast<void *>(global_core->mem_struct) ||
+      msg > static_cast<void *>((
+              reinterpret_cast<char *>(global_core->mem_struct) +
+              global_core->size))) {
+    fprintf(stderr, "queue: attempt to write bad message %p to %p. aborting\n",
+            msg, this);
+    printf("see stderr\n");
+    abort();
+  }
+  {
+    MutexLocker locker(&data_lock_);
+    bool writable_waited = false;
+
+    int new_end;
+    while (true) {
+      new_end = (data_end_ + 1) % data_length_;
+      // If there is room in the queue right now.
+      if (new_end != data_start_) break;
+      if (options & kNonBlock) {
+        if (kWriteDebug) {
+          printf("queue: not blocking on %p. returning false\n", this);
+        }
+        return false;
+      } else if (options & kOverride) {
+        if (kWriteDebug) {
+          printf("queue: overriding on %p\n", this);
+        }
+        // Avoid leaking the message that we're going to overwrite.
+        DecrementMessageReferenceCount(data_[data_start_]);
+        data_start_ = (data_start_ + 1) % data_length_;
+      } else {  // kBlock
+        if (kWriteDebug) {
+          printf("queue: going to wait for writable_ of %p\n", this);
+        }
+        writable_.Wait();
+        writable_waited = true;
+      }
+    }
+    data_[data_end_] = msg;
+    ++messages_;
+    data_end_ = new_end;
+
+    if (kWriteDebug) {
+      printf("queue: broadcasting to readable_ of %p\n", this);
+    }
+    readable_.Broadcast();
+
+    // If we got a signal on writable_ here and it's still writable, then we
+    // need to signal the next person in line (if any).
+    if (writable_waited && is_writable()) {
+      if (kWriteDebug) {
+        printf("queue: resignalling writable_ of %p\n", this);
+      }
+      writable_.Signal();
+    }
+  }
+  if (kWriteDebug) {
+    printf("queue: write returning true on queue %p\n", this);
+  }
+  return true;
+}
+
+void RawQueue::ReadCommonEnd(ReadData *read_data) {
+  if (is_writable()) {
+    if (kReadDebug) {
+      printf("queue: %ssignalling writable_ of %p\n",
+             read_data->writable_start ? "not " : "", this);
+    }
+    if (!read_data->writable_start) writable_.Signal();
+  }
+}
+bool RawQueue::ReadCommonStart(int options, int *index, ReadData *read_data) {
+  read_data->writable_start = is_writable();
+  while (data_start_ == data_end_ || ((index != NULL) && messages_ <= *index)) {
+    if (options & kNonBlock) {
+      if (kReadDebug) {
+        printf("queue: not going to block waiting on %p\n", this);
+      }
+      return false;
+    } else {  // kBlock
+      if (kReadDebug) {
+        printf("queue: going to wait for readable_ of %p\n", this);
+      }
+      // Wait for a message to become readable.
+      readable_.Wait();
+      if (kReadDebug) {
+        printf("queue: done waiting for readable_ of %p\n", this);
+      }
+    }
+  }
+  if (kReadDebug) {
+    printf("queue: %p->read start=%d end=%d\n", this, data_start_, data_end_);
+  }
+  return true;
+}
+void *RawQueue::ReadPeek(int options, int start) {
+  void *ret;
+  if (options & kFromEnd) {
+    int pos = data_end_ - 1;
+    if (pos < 0) {  // if it needs to wrap
+      pos = data_length_ - 1;
+    }
+    if (kReadDebug) {
+      printf("queue: %p reading from line %d: %d\n", this, __LINE__, pos);
+    }
+    ret = data_[pos];
+  } else {
+    if (kReadDebug) {
+      printf("queue: %p reading from line %d: %d\n", this, __LINE__, start);
+    }
+    ret = data_[start];
+  }
+  MessageHeader *const header = MessageHeader::Get(ret);
+  ++header->ref_count;
+  if (kRefDebug) {
+    printf("ref inc count: %p\n", ret);
+  }
+  return ret;
+}
+const void *RawQueue::ReadMessage(int options) {
+  if (kReadDebug) {
+    printf("queue: %p->ReadMessage(%x)\n", this, options);
+  }
+  void *msg = NULL;
+
+  MutexLocker locker(&data_lock_);
+
+  ReadData read_data;
+  if (!ReadCommonStart(options, NULL, &read_data)) {
+    if (kReadDebug) {
+      printf("queue: %p common returned false\n", this);
+    }
+    return NULL;
+  }
+
+  if (options & kPeek) {
+    msg = ReadPeek(options, data_start_);
+  } else {
+    if (options & kFromEnd) {
+      while (true) {
+        if (kReadDebug) {
+          printf("queue: %p start of c2\n", this);
+        }
+        // This loop pulls each message out of the buffer.
+        const int pos = data_start_;
+        data_start_ = (data_start_ + 1) % data_length_;
+        // If this is the last one.
+        if (data_start_ == data_end_) {
+          if (kReadDebug) {
+            printf("queue: %p reading from c2: %d\n", this, pos);
+          }
+          msg = data_[pos];
+          break;
+        }
+        // This message is not going to be in the queue any more.
+        DecrementMessageReferenceCount(data_[pos]);
+      }
+    } else {
+      if (kReadDebug) {
+        printf("queue: %p reading from d2: %d\n", this, data_start_);
+      }
+      msg = data_[data_start_];
+      // TODO(brians): Doesn't this need to increment the ref count?
+      data_start_ = (data_start_ + 1) % data_length_;
+    }
+  }
+  ReadCommonEnd(&read_data);
+  if (kReadDebug) {
+    printf("queue: %p read returning %p\n", this, msg);
+  }
+  return msg;
+}
+const void *RawQueue::ReadMessageIndex(int options, int *index) {
+  if (kReadDebug) {
+    printf("queue: %p->ReadMessageIndex(%x, %p(*=%d))\n",
+           this, options, index, *index);
+  }
+  void *msg = NULL;
+
+  MutexLocker locker(&data_lock_);
+
+  ReadData read_data;
+  if (!ReadCommonStart(options, index, &read_data)) {
+    if (kReadDebug) {
+      printf("queue: %p common returned false\n", this);
+    }
+    return NULL;
+  }
+
+  // TODO(parker): Handle integer wrap on the index.
+
+  // How many unread messages we have.
+  const int offset = messages_ - *index;
+  // Where we're going to start reading.
+  int my_start = data_end_ - offset;
+  if (my_start < 0) {  // If we want to read off the end of the buffer.
+    // Unwrap it.
+    my_start += data_length_;
+  }
+  if (offset >= data_length_) {  // If we're behind the available messages.
+    // Catch index up to the last available message.
+    *index += data_start_ - my_start;
+    // And that's the one we're going to read.
+    my_start = data_start_;
+  }
+  if (options & kPeek) {
+    msg = ReadPeek(options, my_start);
+  } else {
+    if (options & kFromEnd) {
+      if (kReadDebug) {
+        printf("queue: %p start of c1\n", this);
+      }
+      int pos = data_end_ - 1;
+      if (pos < 0) {  // If it wrapped.
+        pos = data_length_ - 1;  // Unwrap it.
+      }
+      if (kReadDebug) {
+        printf("queue: %p reading from c1: %d\n", this, pos);
+      }
+      msg = data_[pos];
+      *index = messages_;
+    } else {
+      if (kReadDebug) {
+        printf("queue: %p reading from d1: %d\n", this, my_start);
+      }
+      msg = data_[my_start];
+      ++(*index);
+    }
+    MessageHeader *const header = MessageHeader::Get(msg);
+    ++header->ref_count;
+    if (kRefDebug) {
+      printf("ref_inc_count: %p\n", msg);
+    }
+  }
+  ReadCommonEnd(&read_data);
+  return msg;
+}
+
+void *RawQueue::GetMessage() {
+  MutexLocker locker(&pool_lock_);
+  MessageHeader *header;
+  if (pool_length_ - messages_used_ > 0) {
+    header = pool_[messages_used_];
+  } else {
+    if (pool_length_ >= mem_length_) {
+      LOG(FATAL, "overused pool of queue %p\n", this);
+    }
+    header = pool_[pool_length_] =
+        static_cast<MessageHeader *>(shm_malloc(msg_length_));
+    ++pool_length_;
+  }
+  void *msg = reinterpret_cast<uint8_t *>(header) + sizeof(MessageHeader);
+  header->ref_count = 1;
+  if (kRefDebug) {
+    printf("%p ref alloc: %p\n", this, msg);
+  }
+  header->index = messages_used_;
+  ++messages_used_;
+  return msg;
+}
+
+}  // namespace aos
diff --git a/aos/atom_code/ipc_lib/queue.h b/aos/atom_code/ipc_lib/queue.h
index 4c279e1..5158558 100644
--- a/aos/atom_code/ipc_lib/queue.h
+++ b/aos/atom_code/ipc_lib/queue.h
@@ -1,134 +1,171 @@
-#ifndef AOS_IPC_LIB_QUEUE_H_
-#define AOS_IPC_LIB_QUEUE_H_
+#ifndef AOS_ATOM_CODE_IPC_LIB_QUEUE_H_
+#define AOS_ATOM_CODE_IPC_LIB_QUEUE_H_
 
-#include "shared_mem.h"
-#include "aos_sync.h"
+#include "aos/atom_code/ipc_lib/shared_mem.h"
+#include "aos/common/mutex.h"
+#include "aos/common/condition.h"
 
 // TODO(brians) add valgrind client requests to the queue and shared_mem_malloc
 // code to make checking for leaks work better
 // <http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.mempools>
 // describes how
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Queues are the primary way to use shared memory. Basic use consists of
-// initializing an aos_type_sig and then calling aos_fetch_queue on it.
-// This aos_queue* can then be used to get a message and write it or to read a
-// message.
-// Queues (as the name suggests) are a FIFO stack of messages. Each combination
-// of name and aos_type_sig will result in a different queue, which means that
-// if you only recompile some code that uses differently sized messages, it will
-// simply use a different queue than the old code.
-//
 // Any pointers returned from these functions can be safely passed to other
 // processes because they are all shared memory pointers.
 // IMPORTANT: Any message pointer must be passed back in some way
-// (aos_queue_free_msg and aos_queue_write_msg are common ones) or the
+// (FreeMessage and WriteMessage are common ones) or the
 // application will leak shared memory.
-// NOTE: Taking a message from read_msg and then passing it to write_msg might
-// work, but it is not guaranteed to.
+// NOTE: Taking a message from ReadMessage and then passing it to WriteMessage
+// might work, but it is not guaranteed to.
 
-typedef struct aos_type_sig_t {
-	size_t length; // sizeof(message)
-	int hash; // can differentiate multiple otherwise identical queues
-	int queue_length; // how many messages the queue can hold
-} aos_type_sig;
+namespace aos {
 
-// Structures that are opaque to users (defined in queue_internal.h).
-typedef struct aos_queue_list_t aos_queue_list;
-typedef struct aos_queue_t aos_queue;
+// Queues are the primary way to use shared memory. Basic use consists of
+// calling Queue::Fetch and then reading and/or writing messages.
+// Queues (as the name suggests) are a FIFO stack of messages. Each combination
+// of name and type signature will result in a different queue, which means
+// that if you only recompile some code that uses differently sized messages,
+// it will simply use a different queue than the old code.
+class RawQueue {
+ public:
+  // Retrieves (and creates if necessary) a queue. Each combination of name and
+  // signature refers to a completely independent queue.
+  // length is how large each message will be
+  // hash can differentiate multiple otherwise identical queues
+  // queue_length is how many messages the queue will be able to hold
+  static RawQueue *Fetch(const char *name, size_t length, int hash,
+                      int queue_length);
+  // Same as above, except sets up the returned queue so that it will put
+  // messages on *recycle when they are freed (after they have been released by
+  // all other readers/writers and are not in the queue).
+  // recycle_queue_length determines how many freed messages will be kept.
+  // Other code can retrieve the 2 queues separately (the recycle queue will
+  // have the same length and hash as the main one). However, any frees made
+  // using a queue with only (name,length,hash,queue_length) before the
+  // recycle queue has been associated with it will not go on to the recycle
+  // queue.
+  // NOTE: calling this function with the same (name,length,hash,queue_length)
+  // but multiple recycle_queue_lengths will result in each freed message being
+  // put onto an undefined one of the recycle queues.
+  static RawQueue *Fetch(const char *name, size_t length, int hash,
+                      int queue_length,
+                      int recycle_hash, int recycle_queue_length,
+                      RawQueue **recycle);
 
-// Retrieves (and creates if necessary) a queue. Each combination of name and
-// signature refers to a completely independent queue.
-aos_queue *aos_fetch_queue(const char *name, const aos_type_sig *sig);
-// Same as above, except sets up the returned queue so that it will put messages
-// on *recycle (retrieved with recycle_sig) when they are freed (after they have
-// been released by all other readers/writers and are not in the queue).
-// The length of recycle_sig determines how many freed messages will be kept.
-// Other code can retrieve recycle_sig and sig separately. However, any frees
-// made using aos_fetch_queue with only sig before the recycle queue has been
-// associated with it will not go on to the recyce queue.
-// Will return NULL for both queues if sig->length != recycle_sig->length or
-// sig->hash == recycle_sig->hash (just to be safe).
-// NOTE: calling this function with the same sig but multiple recycle_sig s
-// will result in each freed message being put onto an undefined recycle_sig.
-aos_queue *aos_fetch_queue_recycle(const char *name, const aos_type_sig *sig,
-                                   const aos_type_sig *recycle_sig, aos_queue **recycle);
+  // Constants for passing to options arguments.
+  // The non-conflicting ones can be combined with bitwise-or.
 
-// Constants for passing to opts arguments.
-// #defines so that c code can use queues
-// The non-conflicting ones can be combined with bitwise-or.
-// TODO(brians) prefix these?
-//
-// Causes the returned message to be left in the queue.
-// For reading only.
-#define PEEK      0x0001
-// Reads the last message in the queue instead of just the next one.
-// NOTE: This removes all of the messages until the last one from the queue
-// (which means that nobody else will read them). However, PEEK means to not
-// remove any from the queue, including the ones that are skipped.
-// For reading only.
-#define FROM_END  0x0002
-// Causes reads to return NULL and writes to fail instead of waiting.
-// For reading and writing.
-#define NON_BLOCK 0x0004
-// Causes things to block.
-// IMPORTANT: #defined to 0 so that it is the default. This has to stay.
-// For reading and writing.
-#define BLOCK     0x0000
-// Causes writes to overwrite the oldest message in the queue instead of
-// blocking.
-// For writing only.
-#define OVERRIDE  0x0008
+  // Causes the returned message to be left in the queue.
+  // For reading only.
+  static const int kPeek = 0x0001;
+  // Reads the last message in the queue instead of just the next one.
+  // NOTE: This removes all of the messages until the last one from the queue
+  // (which means that nobody else will read them). However, PEEK means to not
+  // remove any from the queue, including the ones that are skipped.
+  // For reading only.
+  static const int kFromEnd = 0x0002;
+  // Causes reads to return NULL and writes to fail instead of waiting.
+  // For reading and writing.
+  static const int kNonBlock = 0x0004;
+  // Causes things to block.
+  // IMPORTANT: Has a value of 0 so that it is the default. This has to stay.
+  // For reading and writing.
+  static const int kBlock = 0x0000;
+  // Causes writes to overwrite the oldest message in the queue instead of
+  // blocking.
+  // For writing only.
+  static const int kOverride = 0x0008;
 
-// Frees a message. Does nothing if msg is NULL.
-int aos_queue_free_msg(aos_queue *queue, const void *msg);
+  // Writes a message into the queue.
+  // This function takes ownership of msg.
+  // NOTE: msg must point to a valid message from this queue
+  // Returns truen on success.
+  bool WriteMessage(void *msg, int options);
 
-// Writes a message into the queue.
-// NOTE: msg must point to at least the length of this queue's worth of valid
-// data to write
-// IMPORTANT: if this returns -1, then the caller must do something with msg
-// (like free it)
-int aos_queue_write_msg(aos_queue *queue, void *msg, int opts);
-// Exactly the same as aos_queue_write_msg, except it automatically frees the
-// message if writing fails.
-static inline int aos_queue_write_msg_free(aos_queue *queue, void *msg, int opts) {
-  const int ret = aos_queue_write_msg(queue, msg, opts);
-  if (ret != 0) {
-    aos_queue_free_msg(queue, msg);
+  // Reads a message out of the queue.
+  // The return value will have at least the length of this queue's worth of
+  // valid data where it's pointing to.
+  // The return value is const because other people might be viewing the same
+  // messsage. Do not cast the const away!
+  // IMPORTANT: The return value (if not NULL) must eventually be passed to
+  // FreeMessage.
+  const void *ReadMessage(int options);
+  // Exactly the same as aos_queue_read_msg, except it will never return the
+  // same message twice with the same index argument. However, it may not
+  // return some messages that pass through the queue.
+  // *index should start as 0. index does not have to be in shared memory, but
+  // it can be
+  const void *ReadMessageIndex(int options, int *index);
+
+  // Retrieves ("allocates") a message that can then be written to the queue.
+  // NOTE: the return value will be completely uninitialized
+  // The return value will have at least the length of this queue's worth of
+  // valid memory where it's pointing to.
+  // Returns NULL for error.
+  // IMPORTANT: The return value (if not NULL) must eventually be passed to
+  // FreeMessage.
+  void *GetMessage();
+
+  // It is ok to call this method with a NULL msg.
+  void FreeMessage(const void *msg) {
+    if (msg != NULL) DecrementMessageReferenceCount(msg);
   }
-  return ret;
-}
 
-// Reads a message out of the queue.
-// The return value will have at least the length of this queue's worth of valid
-// data where it's pointing to.
-// The return value is const because other people might be viewing the same
-// messsage. Do not cast the const away!
-// IMPORTANT: The return value (if not NULL) must eventually be passed to
-// aos_queue_free_msg.
-const void *aos_queue_read_msg(aos_queue *buf, int opts);
-// Exactly the same as aos_queue_read_msg, except it will never return the same
-// message twice with the same index argument. However, it may not return some
-// messages that pass through the queue.
-// *index should start as 0. index does not have to be in shared memory, but it
-// can be
-const void *aos_queue_read_msg_index(aos_queue *queue, int opts, int *index);
+ private:
+  struct MessageHeader;
+  struct ReadData;
 
-// Retrieves ("allocates") a message that can then be written to the queue.
-// NOTE: the return value will be completely uninitialized
-// The return value will have at least the length of this queue's worth of valid
-// data where it's pointing to.
-// Returns NULL for error.
-// IMPORTANT: The return value (if not NULL) must eventually be passed to
-// aos_queue_free_msg.
-void *aos_queue_get_msg(aos_queue *queue);
+  bool is_readable() { return data_end_ != data_start_; }
+  bool is_writable() { return ((data_end_ + 1) % data_length_) != data_start_; }
 
-#ifdef __cplusplus
-}
-#endif
+  // These next 4 allow finding the right one.
+  const char *name_;
+  size_t length_;
+  int hash_;
+  int queue_length_;
+  // The next one in the linked list of queues.
+  RawQueue *next_;
 
-#endif
+  RawQueue *recycle_;
 
+  Mutex data_lock_;  // protects operations on data_ etc
+  // Always gets broadcasted to because different readers might have different
+  // ideas of what "readable" means (ie ones using separated indices).
+  Condition readable_;
+  Condition writable_;
+  int data_length_;  // max length into data + 1
+  int data_start_;  // is an index into data
+  int data_end_;  // is an index into data
+  int messages_;  // that have passed through
+  void **data_;  // array of messages (with headers)
+
+  Mutex pool_lock_;
+  size_t msg_length_;  // sizeof(each message) including the header
+  int mem_length_;  // the max number of messages that will ever be allocated
+  int messages_used_;
+  int pool_length_;  // the number of allocated messages
+  MessageHeader **pool_;  // array of pointers to messages
+
+  // Actually frees the given message.
+  void DoFreeMessage(const void *msg);
+  // Calls DoFreeMessage if appropriate.
+  void DecrementMessageReferenceCount(const void *msg);
+
+  // Should be called with data_lock_ locked.
+  // *read_data will be initialized.
+  // Returns with a readable message in data_ or false.
+  bool ReadCommonStart(int options, int *index, ReadData *read_data);
+  // Deals with setting/unsetting readable_ and writable_.
+  // Should be called after data_lock_ has been unlocked.
+  // read_data should be the same thing that was passed in to ReadCommonStart.
+  void ReadCommonEnd(ReadData *read_data);
+  // Handles reading with kPeek.
+  void *ReadPeek(int options, int start);
+
+  // Gets called by Fetch when necessary (with placement new).
+  RawQueue(const char *name, size_t length, int hash, int queue_length);
+};
+
+}  // namespace aos
+
+#endif  // AOS_ATOM_CODE_IPC_LIB_QUEUE_H_
diff --git a/aos/atom_code/ipc_lib/queue_internal.h b/aos/atom_code/ipc_lib/queue_internal.h
deleted file mode 100644
index e6b23ef..0000000
--- a/aos/atom_code/ipc_lib/queue_internal.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef AOS_IPC_LIB_QUEUE_INTERNAL_H_
-#define AOS_IPC_LIB_QUEUE_INTERNAL_H_
-
-#include "shared_mem.h"
-#include "aos_sync.h"
-
-// Should only be used by queue.c. Contains definitions of the structures
-// it uses.
-
-// The number of extra messages the pool associated with each queue will be able
-// to hold (for readers who are slow about freeing them).
-#define EXTRA_MESSAGES 20
-
-typedef struct aos_msg_header_t {
-	int ref_count;
-	int index; // in the pool
-} aos_msg_header;
-static inline void header_swap(aos_msg_header *l, aos_msg_header *r) {
-  aos_msg_header tmp;
-  tmp.ref_count = l->ref_count;
-  tmp.index = l->index;
-  l->ref_count = r->ref_count;
-  l->index = r->index;
-  r->ref_count = tmp.ref_count;
-  r->index = tmp.index;
-}
-
-struct aos_queue_list_t {
-	char *name;
-	aos_type_sig sig;
-	aos_queue *queue;
-	aos_queue_list *next;
-};
-
-typedef struct aos_ring_buf_t {
-	mutex buff_lock; // the main lock protecting operations on this buffer
-  // conditions
-	mutex writable;
-	mutex readable;
-	int length; // max index into data + 1
-	int start; // is an index into data
-	int end; // is an index into data
-	int msgs; // that have passed through
-	void **data; // array of messages (w/ headers)
-} aos_ring_buf;
-
-typedef struct aos_msg_pool_t {
-	mutex pool_lock;
-	size_t msg_length;
-	int mem_length; // the number of messages
-	int used; // number of messages
-	int length; // number of allocated messages
-	void **pool; // array of messages
-} aos_msg_pool;
-
-struct aos_queue_t {
-	aos_msg_pool pool;
-	aos_ring_buf buf;
-  aos_queue *recycle;
-};
-
-#endif
diff --git a/aos/atom_code/ipc_lib/queue_test.cc b/aos/atom_code/ipc_lib/queue_test.cc
new file mode 100644
index 0000000..9e5f3ae
--- /dev/null
+++ b/aos/atom_code/ipc_lib/queue_test.cc
@@ -0,0 +1,424 @@
+#include "aos/common/queue.h"
+
+#include <unistd.h>
+#include <sys/mman.h>
+#include <inttypes.h>
+
+#include <ostream>
+#include <memory>
+#include <map>
+
+#include "gtest/gtest.h"
+
+#include "aos/atom_code/ipc_lib/core_lib.h"
+#include "aos/common/type_traits.h"
+#include "aos/common/queue_testutils.h"
+#include "aos/common/time.h"
+#include "aos/common/logging/logging.h"
+
+using ::testing::AssertionResult;
+using ::testing::AssertionSuccess;
+using ::testing::AssertionFailure;
+using ::aos::common::testing::GlobalCoreInstance;
+
+namespace aos {
+namespace testing {
+
+class QueueTest : public ::testing::Test {
+ protected:
+  static const size_t kFailureSize = 400;
+  static char *fatal_failure;
+ private:
+  enum class ResultType : uint8_t {
+    NotCalled,
+    Called,
+    Returned,
+  };
+  const std::string ResultTypeString(volatile const ResultType &result) {
+    switch (result) {
+      case ResultType::Returned:
+        return "Returned";
+      case ResultType::Called:
+        return "Called";
+      case ResultType::NotCalled:
+        return "NotCalled";
+      default:
+        return std::string("unknown(" + static_cast<uint8_t>(result)) + ")";
+    }
+  }
+  static_assert(aos::shm_ok<ResultType>::value,
+                "this will get put in shared memory");
+  template<typename T>
+  struct FunctionToCall {
+    FunctionToCall() : result(ResultType::NotCalled) {
+      started.Lock();
+    }
+
+    volatile ResultType result;
+    bool expected;
+    void (*function)(T*, char*);
+    T *arg;
+    volatile char failure[kFailureSize];
+    Mutex started;
+  };
+  template<typename T>
+  static void Hangs_(FunctionToCall<T> *const to_call) {
+    to_call->started.Unlock();
+    to_call->result = ResultType::Called;
+    to_call->function(to_call->arg, const_cast<char *>(to_call->failure));
+    to_call->result = ResultType::Returned;
+  }
+
+  // How long until a function is considered to have hung.
+  static constexpr time::Time kHangTime = time::Time::InSeconds(0.035);
+  // How long to sleep after forking (for debugging).
+  static constexpr time::Time kForkSleep = time::Time::InSeconds(0);
+
+  // Represents a process that has been forked off. The destructor kills the
+  // process and wait(2)s for it.
+  class ForkedProcess {
+   public:
+    ForkedProcess(pid_t pid, mutex *lock) : pid_(pid), lock_(lock) {};
+    ~ForkedProcess() {
+      if (kill(pid_, SIGINT) == -1) {
+        if (errno == ESRCH) {
+          printf("process %jd was already dead\n", static_cast<intmax_t>(pid_));
+        } else {
+          fprintf(stderr, "kill(SIGKILL, %jd) failed with %d: %s\n",
+                  static_cast<intmax_t>(pid_), errno, strerror(errno));
+        }
+        return;
+      }
+      const pid_t ret = wait(NULL);
+      if (ret == -1) {
+        LOG(WARNING, "wait(NULL) failed."
+            " child %jd might still be alive\n",
+            static_cast<intmax_t>(pid_));
+      } else if (ret == 0) {
+        LOG(WARNING, "child %jd wasn't waitable. it might still be alive\n",
+            static_cast<intmax_t>(pid_));
+      } else if (ret != pid_) {
+        LOG(WARNING, "child %d is now confirmed dead"
+            ", but child %jd might still be alive\n",
+            ret, static_cast<intmax_t>(pid_));
+      }
+    }
+
+    enum class JoinResult {
+      Finished, Hung, Error
+    };
+    JoinResult Join(time::Time timeout = kHangTime) {
+      timespec lock_timeout = (kForkSleep + timeout).ToTimespec();
+      switch (mutex_lock_timeout(lock_, &lock_timeout)) {
+        case 2:
+          return JoinResult::Hung;
+        case 0:
+          return JoinResult::Finished;
+        default:
+          return JoinResult::Error;
+      }
+    }
+
+   private:
+    const pid_t pid_;
+    mutex *const lock_;
+  } __attribute__((unused));
+
+  // State for HangsFork and HangsCheck.
+  typedef uint8_t ChildID;
+  static void ReapExitHandler() {
+    for (auto it = children_.begin(); it != children_.end(); ++it) {
+      delete it->second;
+    }
+  }
+  static std::map<ChildID, ForkedProcess *> children_;
+  std::map<ChildID, FunctionToCall<void> *> to_calls_;
+
+  void SetUp() override {
+    ::testing::Test::SetUp();
+    fatal_failure = static_cast<char *>(shm_malloc(sizeof(fatal_failure)));
+    static bool registered = false;
+    if (!registered) {
+      atexit(ReapExitHandler);
+      registered = true;
+    }
+  }
+
+ protected:
+  // function gets called with arg in a forked process.
+  // Leaks shared memory.
+  template<typename T> __attribute__((warn_unused_result))
+  std::unique_ptr<ForkedProcess> ForkExecute(void (*function)(T*), T *arg) {
+    mutex *lock = static_cast<mutex *>(shm_malloc_aligned(
+            sizeof(*lock), sizeof(int)));
+    assert(mutex_lock(lock) == 0);
+    const pid_t pid = fork();
+    switch (pid) {
+      case 0:  // child
+        if (kForkSleep != time::Time(0, 0)) {
+          LOG(INFO, "pid %jd sleeping for %ds%dns\n",
+              static_cast<intmax_t>(getpid()),
+              kForkSleep.sec(), kForkSleep.nsec());
+          time::SleepFor(kForkSleep);
+        }
+        ::aos::common::testing::PreventExit();
+        function(arg);
+        mutex_unlock(lock);
+        exit(EXIT_SUCCESS);
+      case -1:  // parent failure
+        LOG(ERROR, "fork() failed with %d: %s\n", errno, strerror(errno));
+        return std::unique_ptr<ForkedProcess>();
+      default:  // parent
+        return std::unique_ptr<ForkedProcess>(new ForkedProcess(pid, lock));
+    }
+  }
+
+  // Checks whether or not the given function hangs.
+  // expected is whether to return success or failure if the function hangs
+  // NOTE: There are other reasons for it to return a failure than the function
+  // doing the wrong thing.
+  // Leaks shared memory.
+  template<typename T>
+  AssertionResult Hangs(void (*function)(T*, char*), T *arg, bool expected) {
+    AssertionResult fork_result(HangsFork<T>(function, arg, expected, 0));
+    if (!fork_result) {
+      return fork_result;
+    }
+    return HangsCheck(0);
+  }
+  // Starts the first part of Hangs.
+  // Use HangsCheck to get the result.
+  // Returns whether the fork succeeded or not, NOT whether or not the hang
+  // check succeeded.
+  template<typename T>
+  AssertionResult HangsFork(void (*function)(T*, char *), T *arg,
+                            bool expected, ChildID id) {
+    static_assert(aos::shm_ok<FunctionToCall<T>>::value,
+                  "this is going into shared memory");
+    FunctionToCall<T> *const to_call =
+        static_cast<FunctionToCall<T> *>(
+            shm_malloc_aligned(sizeof(*to_call), alignof(FunctionToCall<T>)));
+    new (to_call) FunctionToCall<T>();
+    to_call->function = function;
+    to_call->arg = arg;
+    to_call->expected = expected;
+    to_call->failure[0] = '\0';
+    static_cast<char *>(fatal_failure)[0] = '\0';
+    children_[id] = ForkExecute(Hangs_, to_call).release();
+    if (!children_[id]) return AssertionFailure() << "ForkExecute failed";
+    to_calls_[id] = reinterpret_cast<FunctionToCall<void> *>(to_call);
+    to_call->started.Lock();
+    return AssertionSuccess();
+  }
+  // Checks whether or not a function hung like it was supposed to.
+  // Use HangsFork first.
+  // NOTE: calls to HangsFork and HangsCheck with the same id argument will
+  // correspond, but they do not nest. Also, id 0 is used by Hangs.
+  // Return value is the same as Hangs.
+  AssertionResult HangsCheck(ChildID id) {
+    std::unique_ptr<ForkedProcess> child(children_[id]);
+    children_.erase(id);
+    const ForkedProcess::JoinResult result = child->Join();
+    if (to_calls_[id]->failure[0] != '\0') {
+      return AssertionFailure() << "function says: "
+          << const_cast<char *>(to_calls_[id]->failure);
+    }
+    if (result == ForkedProcess::JoinResult::Finished) {
+      return !to_calls_[id]->expected ? AssertionSuccess() : (AssertionFailure()
+          << "something happened and the the test only got to "
+          << ResultTypeString(to_calls_[id]->result));
+    } else {
+      if (to_calls_[id]->result == ResultType::Called) {
+        return to_calls_[id]->expected ? AssertionSuccess() :
+            AssertionFailure();
+      } else if (result == ForkedProcess::JoinResult::Error) {
+        return AssertionFailure() << "error joining child";
+      } else {
+        abort();
+        return AssertionFailure() << "something weird happened";
+      }
+    }
+  }
+#define EXPECT_HANGS(function, arg) \
+  EXPECT_HANGS_COND(function, arg, true, EXPECT_TRUE)
+#define EXPECT_RETURNS(function, arg) \
+  EXPECT_HANGS_COND(function, arg, false, EXPECT_TRUE)
+#define EXPECT_RETURNS_FAILS(function, arg) \
+  EXPECT_HANGS_COND(function, arg, false, EXPECT_FALSE)
+#define EXPECT_HANGS_COND(function, arg, hangs, cond) do { \
+  cond(Hangs(function, arg, hangs)); \
+  if (fatal_failure[0] != '\0') { \
+    FAIL() << fatal_failure; \
+  } \
+} while (false)
+
+  struct TestMessage {
+    // Some contents because we don't really want to test empty messages.
+    int16_t data;
+  };
+  struct MessageArgs {
+    RawQueue *const queue;
+    int flags;
+    int16_t data;  // -1 means NULL expected
+  };
+  static void WriteTestMessage(MessageArgs *args, char *failure) {
+    TestMessage *msg = static_cast<TestMessage *>(args->queue->GetMessage());
+    if (msg == NULL) {
+      snprintf(fatal_failure, kFailureSize,
+               "couldn't get_msg from %p", args->queue);
+      return;
+    }
+    msg->data = args->data;
+    if (!args->queue->WriteMessage(msg, args->flags)) {
+      snprintf(failure, kFailureSize, "write_msg_free(%p, %p, %d) failed",
+               args->queue, msg, args->flags);
+    }
+  }
+  static void ReadTestMessage(MessageArgs *args, char *failure) {
+    const TestMessage *msg = static_cast<const TestMessage *>(
+        args->queue->ReadMessage(args->flags));
+    if (msg == NULL) {
+      if (args->data != -1) {
+        snprintf(failure, kFailureSize,
+                 "expected data of %" PRId16 " but got NULL message",
+                 args->data);
+      }
+    } else {
+      if (args->data != msg->data) {
+        snprintf(failure, kFailureSize,
+                 "expected data of %" PRId16 " but got %" PRId16 " instead",
+                 args->data, msg->data);
+      }
+      args->queue->FreeMessage(msg);
+    }
+  }
+
+ private:
+  GlobalCoreInstance my_core;
+};
+char *QueueTest::fatal_failure;
+std::map<QueueTest::ChildID, QueueTest::ForkedProcess *> QueueTest::children_;
+constexpr time::Time QueueTest::kHangTime;
+constexpr time::Time QueueTest::kForkSleep;
+
+TEST_F(QueueTest, Reading) {
+  RawQueue *const queue = RawQueue::Fetch("Queue", sizeof(TestMessage), 1, 1);
+  MessageArgs args{queue, 0, -1};
+
+  args.flags = RawQueue::kNonBlock;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = RawQueue::kNonBlock | RawQueue::kPeek;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = 0;
+  EXPECT_HANGS(ReadTestMessage, &args);
+  args.flags = RawQueue::kPeek;
+  EXPECT_HANGS(ReadTestMessage, &args);
+  args.data = 254;
+  args.flags = RawQueue::kBlock;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  args.flags = RawQueue::kPeek;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = RawQueue::kPeek;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = RawQueue::kPeek | RawQueue::kNonBlock;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = 0;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = 0;
+  args.data = -1;
+  EXPECT_HANGS(ReadTestMessage, &args);
+  args.flags = RawQueue::kNonBlock;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = 0;
+  args.data = 971;
+  EXPECT_RETURNS_FAILS(ReadTestMessage, &args);
+}
+TEST_F(QueueTest, Writing) {
+  RawQueue *const queue = RawQueue::Fetch("Queue", sizeof(TestMessage), 1, 1);
+  MessageArgs args{queue, 0, 973};
+
+  args.flags = RawQueue::kBlock;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  args.flags = RawQueue::kBlock;
+  EXPECT_HANGS(WriteTestMessage, &args);
+  args.flags = RawQueue::kNonBlock;
+  EXPECT_RETURNS_FAILS(WriteTestMessage, &args);
+  args.flags = RawQueue::kNonBlock;
+  EXPECT_RETURNS_FAILS(WriteTestMessage, &args);
+  args.flags = RawQueue::kPeek;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.data = 971;
+  args.flags = RawQueue::kOverride;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  args.flags = RawQueue::kOverride;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  args.flags = 0;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = RawQueue::kNonBlock;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  args.flags = 0;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  args.flags = RawQueue::kOverride;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  args.flags = 0;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+}
+
+TEST_F(QueueTest, MultiRead) {
+  RawQueue *const queue = RawQueue::Fetch("Queue", sizeof(TestMessage), 1, 1);
+  MessageArgs args{queue, 0, 1323};
+
+  args.flags = RawQueue::kBlock;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  args.flags = RawQueue::kBlock;
+  ASSERT_TRUE(HangsFork(ReadTestMessage, &args, true, 1));
+  ASSERT_TRUE(HangsFork(ReadTestMessage, &args, true, 2));
+  EXPECT_TRUE(HangsCheck(1) != HangsCheck(2));
+  // TODO(brians) finish this
+}
+
+TEST_F(QueueTest, Recycle) {
+  // TODO(brians) basic test of recycle queue
+  // include all of the ways a message can get into the recycle queue
+  RawQueue *recycle_queue = reinterpret_cast<RawQueue *>(23);
+  RawQueue *const queue = RawQueue::Fetch("Queue", sizeof(TestMessage),
+                                          1, 2, 2, 2, &recycle_queue);
+  ASSERT_NE(reinterpret_cast<RawQueue *>(23), recycle_queue);
+  MessageArgs args{queue, 0, 973}, recycle{recycle_queue, 0, 973};
+
+  args.flags = RawQueue::kBlock;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  EXPECT_HANGS(ReadTestMessage, &recycle);
+  args.data = 254;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  EXPECT_HANGS(ReadTestMessage, &recycle);
+  args.data = 971;
+  args.flags = RawQueue::kOverride;
+  EXPECT_RETURNS(WriteTestMessage, &args);
+  recycle.flags = RawQueue::kBlock;
+  EXPECT_RETURNS(ReadTestMessage, &recycle);
+
+  EXPECT_HANGS(ReadTestMessage, &recycle);
+
+  TestMessage *msg = static_cast<TestMessage *>(queue->GetMessage());
+  ASSERT_TRUE(msg != NULL);
+  msg->data = 341;
+  queue->FreeMessage(msg);
+  recycle.data = 341;
+  EXPECT_RETURNS(ReadTestMessage, &recycle);
+
+  EXPECT_HANGS(ReadTestMessage, &recycle);
+
+  args.data = 254;
+  args.flags = RawQueue::kPeek;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  recycle.flags = RawQueue::kBlock;
+  EXPECT_HANGS(ReadTestMessage, &recycle);
+  args.flags = RawQueue::kBlock;
+  EXPECT_RETURNS(ReadTestMessage, &args);
+  recycle.data = 254;
+  EXPECT_RETURNS(ReadTestMessage, &recycle);
+}
+
+}  // namespace testing
+}  // namespace aos
diff --git a/aos/atom_code/ipc_lib/queue_test.cpp b/aos/atom_code/ipc_lib/queue_test.cpp
deleted file mode 100644
index d4eb700..0000000
--- a/aos/atom_code/ipc_lib/queue_test.cpp
+++ /dev/null
@@ -1,404 +0,0 @@
-#include <unistd.h>
-#include <sys/mman.h>
-#include <inttypes.h>
-
-#include <ostream>
-#include <memory>
-#include <map>
-
-#include "gtest/gtest.h"
-
-#include "aos/aos_core.h"
-#include "aos/atom_code/ipc_lib/sharedmem_test_setup.h"
-#include "aos/common/type_traits.h"
-
-using testing::AssertionResult;
-using testing::AssertionSuccess;
-using testing::AssertionFailure;
-
-// IMPORTANT: Some of the functions that do test predicate functions allocate
-// shared memory (and don't free it).
-class QueueTest : public SharedMemTestSetup {
- protected:
-  static const size_t kFailureSize = 400;
-  static char *fatal_failure;
- private:
-  // This gets registered right after the fork, so it will get run before any
-  // exit handlers that had already been registered.
-  static void ExitExitHandler() {
-    _exit(EXIT_SUCCESS);
-  }
-  enum class ResultType : uint8_t {
-    NotCalled,
-    Called,
-    Returned,
-  };
-  const std::string ResultTypeString(volatile const ResultType &result) {
-    switch (result) {
-      case ResultType::Returned:
-        return "Returned";
-      case ResultType::Called:
-        return "Called";
-      case ResultType::NotCalled:
-        return "NotCalled";
-      default:
-        return std::string("unknown(" + static_cast<uint8_t>(result)) + ")";
-    }
-  }
-  static_assert(aos::shm_ok<ResultType>::value, "this will get put in shared memory");
-  // Gets allocated in shared memory so it has to be volatile.
-  template<typename T> struct FunctionToCall {
-    ResultType result;
-    bool expected;
-    void (*function)(T*, char*);
-    T *arg;
-    volatile char failure[kFailureSize];
-  };
-  template<typename T> static void Hangs_(volatile FunctionToCall<T> *const to_call) {
-    to_call->result = ResultType::Called;
-    to_call->function(to_call->arg, const_cast<char *>(to_call->failure));
-    to_call->result = ResultType::Returned;
-  }
-
-  static const long kMsToNs = 1000000;
-  // The number of ms after which a function is considered to have hung.
-  // Must be < 1000.
-  static const long kHangTime = 10;
-  static const unsigned int kForkSleep = 0; // how many seconds to sleep after forking
-
-  // Represents a process that has been forked off. The destructor kills the
-  // process and wait(2)s for it.
-  class ForkedProcess {
-    const pid_t pid_;
-    mutex *const lock_;
-   public:
-    ForkedProcess(pid_t pid, mutex *lock) : pid_(pid), lock_(lock) {};
-    ~ForkedProcess() {
-      if (kill(pid_, SIGINT) == -1) {
-        if (errno == ESRCH) {
-          printf("process %jd was already dead\n", static_cast<intmax_t>(pid_));
-        } else {
-          fprintf(stderr, "kill(SIGKILL, %jd) failed with %d: %s\n",
-                  static_cast<intmax_t>(pid_), errno, strerror(errno));
-        }
-        return;
-      }
-      const pid_t ret = wait(NULL);
-      if (ret == -1) {
-        fprintf(stderr, "wait(NULL) failed."
-                " child %jd might still be alive\n",
-                static_cast<intmax_t>(pid_));
-      } else if (ret == 0) {
-        fprintf(stderr, "child %jd wasn't waitable. it might still be alive\n",
-                static_cast<intmax_t>(pid_));
-      } else if (ret != pid_) {
-        fprintf(stderr, "child %d is dead, but child %jd might still be alive\n",
-               ret, static_cast<intmax_t>(pid_));
-      }
-    }
-
-    enum class JoinResult {
-      Finished, Hung, Error
-    };
-    JoinResult Join(long timeout = kHangTime) {
-      timespec ts{kForkSleep, timeout * kMsToNs};
-      switch (mutex_lock_timeout(lock_, &ts)) {
-        case 2:
-          return JoinResult::Hung;
-        case 0:
-          return JoinResult::Finished;
-        default:
-          return JoinResult::Error;
-      }
-    }
-  } __attribute__((unused));
-
-  // Member variables for HangsFork and HangsCheck.
-  typedef uint8_t ChildID;
-  static void ReapExitHandler() {
-    for (auto it = children_.begin(); it != children_.end(); ++it) {
-      delete it->second;
-    }
-  }
-  static std::map<ChildID, ForkedProcess *> children_;
-  std::map<ChildID, volatile FunctionToCall<void> *> to_calls_;
-
-  void SetUp() {
-    SharedMemTestSetup::SetUp();
-    fatal_failure = reinterpret_cast<char *>(shm_malloc(sizeof(fatal_failure)));
-    static bool registered = false;
-    if (!registered) {
-      atexit(ReapExitHandler);
-      registered = true;
-    }
-  }
-
- protected:
-  // Function gets called with arg in a forked process.
-  // Leaks shared memory.
-  // the attribute is in the middle to make gcc happy
-  template<typename T> __attribute__((warn_unused_result))
-      std::unique_ptr<ForkedProcess> ForkExecute(void (*function)(T*), T *arg) {
-    mutex *lock = reinterpret_cast<mutex *>(shm_malloc_aligned(
-            sizeof(*lock), sizeof(int)));
-    *lock = 1;
-    const pid_t pid = fork();
-    switch (pid) {
-      case 0: // child
-        if (kForkSleep != 0) {
-          printf("pid %jd sleeping for %u\n", static_cast<intmax_t>(getpid()),
-                 kForkSleep);
-          sleep(kForkSleep);
-        }
-        atexit(ExitExitHandler);
-        function(arg);
-        mutex_unlock(lock);
-        exit(EXIT_SUCCESS);
-      case -1: // parent failure
-        printf("fork() failed with %d: %s\n", errno, strerror(errno));
-        return std::unique_ptr<ForkedProcess>();
-      default: // parent
-        return std::unique_ptr<ForkedProcess>(new ForkedProcess(pid, lock));
-    }
-  }
-
-  // Checks whether or not the given function hangs.
-  // expected is whether to return success or failure if the function hangs
-  // NOTE: There are other reasons for it to return a failure than the function
-  // doing the wrong thing.
-  // Leaks shared memory.
-  template<typename T> AssertionResult Hangs(void (*function)(T*, char*), T *arg,
-                                             bool expected) {
-    AssertionResult fork_result(HangsFork<T>(function, arg, expected, 0));
-    if (!fork_result) {
-      return fork_result;
-    }
-    return HangsCheck(0);
-  }
-  // Starts the first part of Hangs.
-  // Use HangsCheck to get the result.
-  // Returns whether the fork succeeded or not, NOT whether or not the hang
-  // check succeeded.
-  template<typename T> AssertionResult HangsFork(void (*function)(T*, char *), T *arg,
-                                                 bool expected, ChildID id) {
-    static_assert(aos::shm_ok<FunctionToCall<T>>::value,
-                  "this is going into shared memory");
-    volatile FunctionToCall<T> *const to_call = reinterpret_cast<FunctionToCall<T> *>(
-        shm_malloc_aligned(sizeof(*to_call), sizeof(int)));
-    to_call->result = ResultType::NotCalled;
-    to_call->function = function;
-    to_call->arg = arg;
-    to_call->expected = expected;
-    to_call->failure[0] = '\0';
-    static_cast<volatile char *>(fatal_failure)[0] = '\0';
-    children_[id] = ForkExecute(Hangs_, to_call).release();
-    if (!children_[id]) return AssertionFailure() << "ForkExecute failed";
-    to_calls_[id] = reinterpret_cast<volatile FunctionToCall<void> *>(to_call);
-    return AssertionSuccess();
-  }
-  // Checks whether or not a function hung like it was supposed to.
-  // Use HangsFork first.
-  // NOTE: calls to HangsFork and HangsCheck with the same id argument will
-  // correspond, but they do not nest. Also, id 0 is used by Hangs.
-  // Return value is the same as Hangs.
-  AssertionResult HangsCheck(ChildID id) {
-    std::unique_ptr<ForkedProcess> child(children_[id]);
-    children_.erase(id);
-    const ForkedProcess::JoinResult result = child->Join();
-    if (to_calls_[id]->failure[0] != '\0') {
-      return AssertionFailure() << "function says: "
-          << const_cast<char *>(to_calls_[id]->failure);
-    }
-    if (result == ForkedProcess::JoinResult::Finished) {
-      return !to_calls_[id]->expected ? AssertionSuccess() : (AssertionFailure()
-          << "something happened and the the test only got to "
-          << ResultTypeString(to_calls_[id]->result));
-    } else {
-      if (to_calls_[id]->result == ResultType::Called) {
-        return to_calls_[id]->expected ? AssertionSuccess() : AssertionFailure();
-      } else {
-        return AssertionFailure() << "something weird happened";
-      }
-    }
-  }
-#define EXPECT_HANGS(function, arg) \
-  EXPECT_HANGS_COND(function, arg, true, EXPECT_TRUE)
-#define EXPECT_RETURNS(function, arg) \
-  EXPECT_HANGS_COND(function, arg, false, EXPECT_TRUE)
-#define EXPECT_RETURNS_FAILS(function, arg) \
-  EXPECT_HANGS_COND(function, arg, false, EXPECT_FALSE)
-#define EXPECT_HANGS_COND(function, arg, hangs, cond) do { \
-  cond(Hangs(function, arg, hangs)); \
-  if (fatal_failure[0] != '\0') { \
-    FAIL() << fatal_failure; \
-  } \
-} while (false)
-
-  struct TestMessage {
-    int16_t data; // don't really want to test empty messages
-  };
-  struct MessageArgs {
-    aos_queue *const queue;
-    int flags;
-    int16_t data; // -1 means NULL expected
-  };
-  static void WriteTestMessage(MessageArgs *args, char *failure) {
-    TestMessage *msg = reinterpret_cast<TestMessage *>(aos_queue_get_msg(args->queue));
-    if (msg == NULL) {
-      snprintf(fatal_failure, kFailureSize, "couldn't get_msg from %p", args->queue);
-      return;
-    }
-    msg->data = args->data;
-    if (aos_queue_write_msg_free(args->queue, msg, args->flags) == -1) {
-      snprintf(failure, kFailureSize, "write_msg_free(%p, %p, %d) failed",
-               args->queue, msg, args->flags);
-    }
-  }
-  static void ReadTestMessage(MessageArgs *args, char *failure) {
-    const TestMessage *msg = reinterpret_cast<const TestMessage *>(
-        aos_queue_read_msg(args->queue, args->flags));
-    if (msg == NULL) {
-      if (args->data != -1) {
-        snprintf(failure, kFailureSize, "expected data of %"PRId16" but got NULL message",
-                 args->data);
-      }
-    } else {
-      if (args->data != msg->data) {
-        snprintf(failure, kFailureSize,
-                 "expected data of %"PRId16" but got %"PRId16" instead",
-                 args->data, msg->data);
-      }
-      aos_queue_free_msg(args->queue, msg);
-    }
-  }
-};
-char *QueueTest::fatal_failure;
-std::map<QueueTest::ChildID, QueueTest::ForkedProcess *> QueueTest::children_;
-
-TEST_F(QueueTest, Reading) {
-  static const aos_type_sig signature{sizeof(TestMessage), 1, 1};
-  aos_queue *const queue = aos_fetch_queue("Queue", &signature);
-  MessageArgs args{queue, 0, -1};
-
-  EXPECT_EQ(BLOCK, 0);
-  EXPECT_EQ(BLOCK | FROM_END, FROM_END);
-
-  args.flags = NON_BLOCK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = NON_BLOCK | PEEK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = 0;
-  EXPECT_HANGS(ReadTestMessage, &args);
-  args.flags = PEEK;
-  EXPECT_HANGS(ReadTestMessage, &args);
-  args.data = 254;
-  args.flags = BLOCK;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  args.flags = PEEK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = PEEK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = PEEK | NON_BLOCK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = 0;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = 0;
-  args.data = -1;
-  EXPECT_HANGS(ReadTestMessage, &args);
-  args.flags = NON_BLOCK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = 0;
-  args.data = 971;
-  EXPECT_RETURNS_FAILS(ReadTestMessage, &args);
-}
-TEST_F(QueueTest, Writing) {
-  static const aos_type_sig signature{sizeof(TestMessage), 1, 1};
-  aos_queue *const queue = aos_fetch_queue("Queue", &signature);
-  MessageArgs args{queue, 0, 973};
-
-  args.flags = BLOCK;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  args.flags = BLOCK;
-  EXPECT_HANGS(WriteTestMessage, &args);
-  args.flags = NON_BLOCK;
-  EXPECT_RETURNS_FAILS(WriteTestMessage, &args);
-  args.flags = NON_BLOCK;
-  EXPECT_RETURNS_FAILS(WriteTestMessage, &args);
-  args.flags = PEEK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.data = 971;
-  args.flags = OVERRIDE;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  args.flags = OVERRIDE;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  args.flags = 0;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = NON_BLOCK;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  args.flags = 0;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  args.flags = OVERRIDE;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  args.flags = 0;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-}
-
-TEST_F(QueueTest, MultiRead) {
-  static const aos_type_sig signature{sizeof(TestMessage), 1, 1};
-  aos_queue *const queue = aos_fetch_queue("Queue", &signature);
-  MessageArgs args{queue, 0, 1323};
-
-  args.flags = BLOCK;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  args.flags = BLOCK;
-  ASSERT_TRUE(HangsFork(ReadTestMessage, &args, true, 1));
-  ASSERT_TRUE(HangsFork(ReadTestMessage, &args, true, 2));
-  EXPECT_TRUE(HangsCheck(1) != HangsCheck(2));
-  // TODO(brians) finish this
-}
-
-TEST_F(QueueTest, Recycle) {
-  // TODO(brians) basic test of recycle queue
-  // include all of the ways a message can get into the recycle queue
-  static const aos_type_sig signature{sizeof(TestMessage), 1, 2},
-               recycle_signature{sizeof(TestMessage), 2, 2};
-  aos_queue *recycle_queue = reinterpret_cast<aos_queue *>(23);
-  aos_queue *const queue = aos_fetch_queue_recycle("Queue", &signature,
-                                                   &recycle_signature, &recycle_queue);
-  ASSERT_NE(reinterpret_cast<aos_queue *>(23), recycle_queue);
-  MessageArgs args{queue, 0, 973}, recycle{recycle_queue, 0, 973};
-
-  args.flags = BLOCK;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  EXPECT_HANGS(ReadTestMessage, &recycle);
-  args.data = 254;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  EXPECT_HANGS(ReadTestMessage, &recycle);
-  args.data = 971;
-  args.flags = OVERRIDE;
-  EXPECT_RETURNS(WriteTestMessage, &args);
-  recycle.flags = BLOCK;
-  EXPECT_RETURNS(ReadTestMessage, &recycle);
-
-  EXPECT_HANGS(ReadTestMessage, &recycle);
-
-  TestMessage *msg = static_cast<TestMessage *>(aos_queue_get_msg(queue));
-  ASSERT_TRUE(msg != NULL);
-  msg->data = 341;
-  aos_queue_free_msg(queue, msg);
-  recycle.data = 341;
-  EXPECT_RETURNS(ReadTestMessage, &recycle);
-
-  EXPECT_HANGS(ReadTestMessage, &recycle);
-
-  args.data = 254;
-  args.flags = PEEK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  recycle.flags = BLOCK;
-  EXPECT_HANGS(ReadTestMessage, &recycle);
-  args.flags = BLOCK;
-  EXPECT_RETURNS(ReadTestMessage, &args);
-  recycle.data = 254;
-  EXPECT_RETURNS(ReadTestMessage, &recycle);
-}
-
diff --git a/aos/atom_code/ipc_lib/resource.c b/aos/atom_code/ipc_lib/resource.c
deleted file mode 100644
index 472191f..0000000
--- a/aos/atom_code/ipc_lib/resource.c
+++ /dev/null
@@ -1,199 +0,0 @@
-//#define TESTING_ASSERT(...)
-#define TESTING_ASSERT(cond, desc, args...) if(!(cond)){fprintf(stderr, "error: " desc " at " __FILE__ ": %d\n", ##args, __LINE__);}
-#define TESTING_ASSERT_RETURN(cond, desc, args...) TESTING_ASSERT(cond, desc, ##args); if(!(cond)){return 1;}
-// leave TESTING_ASSERT_RETURN (segfaults result otherwise)
-
-#include "resource_internal.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <signal.h>
-#include <string.h>
-#include <errno.h>
-
-int RESOURCE_KILL_SIGNAL;
-
-__attribute__((constructor)) void __constructor(){
-	RESOURCE_KILL_SIGNAL = SIGRTMIN + 5;
-}
-
-void aos_resource_init(uint16_t num){
-	aos_resource *resource = aos_resource_get(num);
-	resource->num = num;
-	resource->resource_mutex = 0;
-	resource->modify = 0;
-	resource->request = 0;
-	resource->kill = 0;
-	resource->owner = 0;
-	resource->priorities = shm_malloc(sizeof(struct HeapStruct) + AOS_RESOURCE_PRIORITY_STACK_LENGTH * sizeof(uint8_t));
-	resource->priorities->Elements = (uint8_t *)((uintptr_t)resource->priorities + sizeof(struct HeapStruct)); // only do 1 shm_malloc (directly above)
-	Initialize(AOS_RESOURCE_PRIORITY_STACK_LENGTH, resource->priorities);
-	AOS_RESOURCE_STATE_SET_ON(AOS_RESOURCE_STATE_WANTS_IT, num, aos_resource_entity_root_get());
-}
-void aos_resource_entity_root_create(){
-	global_core->mem_struct->resources.root = aos_resource_entity_create(0);
-}
-inline aos_resource_entity *aos_resource_entity_root_get(){
-	return global_core->mem_struct->resources.root;
-}
-inline aos_resource *aos_resource_get(uint16_t num){
-	return &global_core->mem_struct->resources.resources[num];
-}
-
-aos_resource_entity *aos_resource_entity_create(uint8_t base_priority){
-	aos_resource_entity *local = shm_malloc(sizeof(aos_resource_entity));
-	memset(local->state, 0x00, sizeof(local->state));
-	local->base_priority = base_priority;
-	local->parent = NULL; // for the root entity
-	return local;
-}
-int aos_resource_entity_set_parent(aos_resource_entity *local, aos_resource_entity *parent){
-	TESTING_ASSERT_RETURN(local != NULL, "do not have a local entity");
-	TESTING_ASSERT_RETURN(parent != local, "can't set parent to self");
-	TESTING_ASSERT_RETURN(parent != NULL, "have to have a parent to set to");
-	local->parent = parent;
-	if(parent->parent == NULL){
-		local->root_action = getpid();
-	}else{
-		local->root_action = parent->root_action;
-	}
-	if(parent->priority > local->base_priority){
-		local->priority = parent->priority;
-	}else{
-		local->priority = local->base_priority;
-	}
-	if(local->state[0] != 0 || memcmp(local->state, local->state + 1, sizeof(local->state) - 1)){ // if it's not all 0s
-		TESTING_ASSERT(0, "local->state isn't all 0s when changing parents (fixing it)");
-		memset(local->state, 0x00, sizeof(local->state));
-	}
-	return 0;
-}
-
-void aos_resource_kill(pid_t action){
-	union sigval sival;
-	sival.sival_int = 0;
-	if(sigqueue(action, RESOURCE_KILL_SIGNAL, sival) < 0){ // if sending the signal failed
-		fprintf(stderr, "sigqueue RESOURCE_KILL_SIGNAL (which is %d) with pid %d failed with errno %d ", RESOURCE_KILL_SIGNAL, action, errno);
-		perror(NULL);
-	}
-}
-int aos_resource_request(aos_resource_entity *local, aos_resource *resource){
-	TESTING_ASSERT_RETURN(local != NULL, "do not have a local entity");
-	
-	if(mutex_lock(&resource->request))
-		return 1;
-	if(mutex_lock(&resource->kill)){
-		mutex_unlock(&resource->request);
-		return 1;
-	}
-	if(mutex_lock(&resource->modify)){
-		mutex_unlock(&resource->kill);
-		mutex_unlock(&resource->request);
-		return 1;
-	}
-
-	aos_resource_entity *c = local;
-	while(c->parent != NULL && !AOS_RESOURCE_STATE_GET_HAS_IT(resource->num, c)){
-		c = c->parent;
-	}
-	TESTING_ASSERT((c->parent == NULL) == (c == aos_resource_entity_root_get()), "found a resource with no parent that isn't the root")
-	if(c->parent == NULL && !AOS_RESOURCE_STATE_GET_WANTS_IT(resource->num, c)){ // if c is the root entity and doesn't want it
-		TESTING_ASSERT(0, "root entity does not want resource %d (will fix it)", resource->num);
-		*((int *)NULL) = 0;
-		AOS_RESOURCE_STATE_SET_ON(AOS_RESOURCE_STATE_WANTS_IT, resource->num, c);
-	}
-	uint8_t locked_resource_mutex = 0;
-	if(AOS_RESOURCE_STATE_GET_HAS_PASSED_DOWN(resource->num, c)){
-		if(c->parent == NULL){
-			if(GetMin(resource->priorities) >= local->priority){
-				mutex_unlock(&resource->modify);
-				aos_resource_kill(resource->owner);
-				if(mutex_lock(&resource->kill)){ // got released by one that got killed (after unlocking resource_mutex)
-					mutex_unlock(&resource->resource_mutex);
-					mutex_unlock(&resource->request);
-					return 1;
-				}
-				if(mutex_lock(&resource->resource_mutex)){ // wait for the other process to release it
-					mutex_unlock(&resource->request);
-					return 1;
-				}
-				locked_resource_mutex = 1;
-				if(mutex_lock(&resource->modify)){
-					mutex_unlock(&resource->request);
-					return 1;
-				}
-			}else{
-				mutex_unlock(&resource->modify);
-				mutex_unlock(&resource->request);
-				return -1;
-			}
-		}else{
-			fprintf(stderr, "PROGRAMMER ERROR!!!!! 2 sub-actions both requested resource %d!!! stopping the root action\n", resource->num);
-			mutex_unlock(&resource->modify);
-			mutex_unlock(&resource->request);
-			return -1;
-		}
-	}
-	AOS_RESOURCE_STATE_SET_ON(AOS_RESOURCE_STATE_WANTS_IT, resource->num, local);
-	aos_resource_entity *c2 = local;
-	do{
-		c2 = c2->parent;
-		TESTING_ASSERT_RETURN(c2 != NULL, "couldn't find the parent that has resource %d", resource->num)
-		AOS_RESOURCE_STATE_SET_ON(AOS_RESOURCE_STATE_HAS_PASSED_DOWN, resource->num, c2);
-	} while(c2 != c);
-	TESTING_ASSERT(c2 == c, "c2 != c");
-	if(c->parent == NULL){ // if you found the root entity
-		resource->owner = local->root_action;
-		if(!locked_resource_mutex){
-			int rv = mutex_trylock(&resource->resource_mutex); // don't deadlock if somebody died or whatever
-			TESTING_ASSERT(rv == 0, "the resource_mutex was already locked when getting %d from the root", resource->num);
-		}
-	}else{
-		TESTING_ASSERT(resource->owner == local->root_action, "my action chain has resource %d, but my chain's root(%d) isn't the owner(%d)", resource->num, local->root_action, resource->owner);
-		TESTING_ASSERT(mutex_trylock(&resource->resource_mutex) != 0, "my action has the resource_mutex for %d, but the resource_mutex wasn't already locked", resource->num);
-	}
-	if(Insert(local->priority, resource->priorities) < 0){
-		fprintf(stderr, "BAD NEWS: ran out of space on the priority heap for resource %d. Increase the size of AOS_RESOURCE_PRIORITY_STACK_LENGTH in resource.h\n", resource->num);
-		mutex_unlock(&resource->modify);
-		mutex_unlock(&resource->request);
-		return -1;
-	}
-	mutex_unlock(&resource->modify);
-	mutex_unlock(&resource->kill);
-	mutex_unlock(&resource->request);
-	return 0;
-}
-
-int aos_resource_release(aos_resource_entity *local, aos_resource *resource){
-	TESTING_ASSERT_RETURN(local != NULL, "do not have a local entity");
-	
-	if(mutex_lock(&resource->modify)){
-		return 1;
-	}
-
-	AOS_RESOURCE_STATE_SET_OFF(AOS_RESOURCE_STATE_WANTS_IT, resource->num, local);
-	if(!AOS_RESOURCE_STATE_GET_HAS_PASSED_DOWN(resource->num, local)){ // if we're actually supposed to go release it
-		aos_resource_entity *c = local;
-		while(c->parent != NULL && !AOS_RESOURCE_STATE_GET_WANTS_IT(resource->num, c)){
-			AOS_RESOURCE_STATE_SET_OFF(AOS_RESOURCE_STATE_HAS_PASSED_DOWN, resource->num, c);
-			c = c->parent;
-		}
-		if(c->parent == NULL && !AOS_RESOURCE_STATE_GET_WANTS_IT(resource->num, c)){ // if c is the root entity and doesn't want it
-			TESTING_ASSERT(0, "root entity does not want resource %d (will fix it)", resource->num);
-			AOS_RESOURCE_STATE_SET_ON(AOS_RESOURCE_STATE_WANTS_IT, resource->num, c);
-		}
-		AOS_RESOURCE_STATE_SET_OFF(AOS_RESOURCE_STATE_HAS_PASSED_DOWN, resource->num, c);
-		Remove(local->priority, resource->priorities);
-		TESTING_ASSERT(local->root_action == resource->owner, "freeing a resource (%d) whose owner(%d) isn't my chain's root(%d)", resource->num, resource->owner, local->root_action);
-		if(c->parent == NULL){ // if you gave it back to the root entity (c)
-			TESTING_ASSERT(IsEmpty(resource->priorities), "priority stack isn't empty (size=%d)", GetSize(resource->priorities));
-			resource->owner = 0;
-			mutex_unlock(&resource->resource_mutex);
-			mutex_unlock(&resource->kill);
-		}
-	} // else has passed it down
-	mutex_unlock(&resource->modify);
-	return 0;
-}
-
diff --git a/aos/atom_code/ipc_lib/resource.h b/aos/atom_code/ipc_lib/resource.h
deleted file mode 100644
index de1de1a..0000000
--- a/aos/atom_code/ipc_lib/resource.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __AOS_RESOURCE_H_
-#define __AOS_RESOURCE_H_
-
-// notes at <https://docs.google.com/document/d/1gzRrVcqL2X9VgNQUI5DrvLVVVziIH7c5ZerATVbiS7U/edit?hl=en_US>
-
-#include <sys/types.h>
-#include "shared_mem.h"
-#include "binheap.h"
-#include "aos_sync.h"
-#include "core_lib.h"
-
-#define AOS_RESOURCE_PRIORITY_STACK_LENGTH 50
-
-extern int RESOURCE_KILL_SIGNAL;
-
-/* Return Values
-   0  = success
-   -1 = you should stop (like if you got killed) (only for request)
-   1  = error
-*/
-int aos_resource_request(aos_resource_entity *local, aos_resource *resource);
-int aos_resource_release(aos_resource_entity *local, aos_resource *resource);
-int aos_resource_entity_set_parent(aos_resource_entity *local, aos_resource_entity *parent);
-aos_resource_entity *aos_resource_entity_create(uint8_t base_priority);
-aos_resource *aos_resource_get(uint16_t num);
-aos_resource_entity *aos_resource_entity_root_get(void);
-
-#endif
diff --git a/aos/atom_code/ipc_lib/resource_core.h b/aos/atom_code/ipc_lib/resource_core.h
deleted file mode 100644
index 27d1af8..0000000
--- a/aos/atom_code/ipc_lib/resource_core.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef AOS_ATOM_CODE_IPC_LIB_RESOURCE_CORE_H_
-#define AOS_ATOM_CODE_IPC_LIB_RESOURCE_CORE_H_
-// this file has to be separate due to #include order dependencies
-
-#include "aos/atom_code/ipc_lib/shared_mem.h"
-#include "aos/atom_code/ipc_lib/binheap.h"
-#include "aos/ResourceList.h"
-
-typedef struct aos_resource_t{
-	mutex resource_mutex; // gets locked whenever resource is taken from root entity and unlocked when its given back
-	mutex modify; // needs to be locked while somebody is requesting or releasing this resource
-	mutex request; // needs to be locked while somebody is requesting this resource (including possibly waiting for somebody else to release it after being killed)
-	mutex kill; // gets locked while somebody is dying for this resource (gets unlocked whenever this resource gets given back to the root entity)
-	pid_t owner;
-	PriorityQueue priorities; // lower number = higher priority
-
-	uint16_t num;
-} aos_resource;
-typedef struct aos_resource_entity_t aos_resource_entity;
-typedef struct aos_resource_list_t {
-	aos_resource resources[AOS_RESOURCE_NUM];
-	aos_resource_entity *root;
-} aos_resource_list;
-void aos_resource_init(uint16_t num);
-void aos_resource_entity_root_create(void);
-
-#endif
-
diff --git a/aos/atom_code/ipc_lib/resource_internal.h b/aos/atom_code/ipc_lib/resource_internal.h
deleted file mode 100644
index eebecf9..0000000
--- a/aos/atom_code/ipc_lib/resource_internal.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef __AOS_RESOURCE_INTERNAL_H_
-#define __AOS_RESOURCE_INTERNAL_H_
-
-#include "resource.h"
-
-#define AOS_RESOURCE_STATES_PER_BYTE 4
-#define AOS_RESOURCE_STATE_SHIFTER(num) ((num % AOS_RESOURCE_STATES_PER_BYTE) * (8 / AOS_RESOURCE_STATES_PER_BYTE))
-#define AOS_RESOURCE_STATE_GET(num, entity) (entity->state[num / AOS_RESOURCE_STATES_PER_BYTE] >> AOS_RESOURCE_STATE_SHIFTER(num))
-#define AOS_RESOURCE_STATE_SET_ON(mask, num, entity) (entity->state[num / AOS_RESOURCE_STATES_PER_BYTE] |= (mask << AOS_RESOURCE_STATE_SHIFTER(num)))
-#define AOS_RESOURCE_STATE_SET_OFF(mask, num, entity) (entity->state[num / AOS_RESOURCE_STATES_PER_BYTE] &= ~(mask << AOS_RESOURCE_STATE_SHIFTER(num)))
-#define AOS_RESOURCE_STATE_GET_HAS_IT(num, entity) (AOS_RESOURCE_STATE_GET_WANTS_IT(num, entity) || AOS_RESOURCE_STATE_GET_HAS_PASSED_DOWN(num, entity))
-#define AOS_RESOURCE_STATE_WANTS_IT 0x01
-#define AOS_RESOURCE_STATE_HAS_PASSED_DOWN 0x02
-#define AOS_RESOURCE_STATE_GET_WANTS_IT(num, entity) (AOS_RESOURCE_STATE_GET(num, entity) & AOS_RESOURCE_STATE_WANTS_IT)
-#define AOS_RESOURCE_STATE_GET_HAS_PASSED_DOWN(num, entity) (AOS_RESOURCE_STATE_GET(num, entity) & AOS_RESOURCE_STATE_HAS_PASSED_DOWN)
-
-struct aos_resource_entity_t{
-	aos_resource_entity *parent;
-	uint8_t state[(AOS_RESOURCE_NUM + (AOS_RESOURCE_STATES_PER_BYTE - 1)) / AOS_RESOURCE_STATES_PER_BYTE];
-	pid_t root_action;
-	uint8_t base_priority, priority;
-};
-
-inline void aos_resource_init(uint16_t num);
-
-#endif
-
diff --git a/aos/atom_code/ipc_lib/resource_list.txt b/aos/atom_code/ipc_lib/resource_list.txt
deleted file mode 100644
index 1aabdca..0000000
--- a/aos/atom_code/ipc_lib/resource_list.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-test_resource1
-test_resource2
-drivetrain_left
-drivetrain_right
diff --git a/aos/atom_code/ipc_lib/resource_test.cpp b/aos/atom_code/ipc_lib/resource_test.cpp
deleted file mode 100644
index 9ce6e06..0000000
--- a/aos/atom_code/ipc_lib/resource_test.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "aos/atom_code/ipc_lib/sharedmem_test_setup.h"
-#include "aos/aos_core.h"
-
-#include <gtest/gtest.h>
-#include <gtest/gtest-spi.h>
-
-class ResourceTest : public SharedMemTestSetup{
-};
-
-TEST_F(ResourceTest, GetResource){
-	aos_resource *first = aos_resource_get(1);
-	AllSharedMemAllocated();
-	aos_resource *second = aos_resource_get(1);
-	EXPECT_EQ(first, second);
-}
-TEST_F(ResourceTest, CheckLocal){
-	EXPECT_EQ(1, aos_resource_request(NULL, aos_resource_get(2)));
-}
-
-TEST_F(ResourceTest, LocalCreate){
-	EXPECT_TRUE(aos_resource_entity_create(56) != NULL);
-}
-TEST_F(ResourceTest, LocalSetParentSelf){
-	aos_resource_entity *local = aos_resource_entity_create(76);
-	ASSERT_TRUE(local != NULL);
-	EXPECT_EQ(1, aos_resource_entity_set_parent(local, local));
-}
-
diff --git a/aos/atom_code/ipc_lib/shared_mem.c b/aos/atom_code/ipc_lib/shared_mem.c
index f631b78..5b1231c 100644
--- a/aos/atom_code/ipc_lib/shared_mem.c
+++ b/aos/atom_code/ipc_lib/shared_mem.c
@@ -1,4 +1,4 @@
-#include "shared_mem.h"
+#include "aos/atom_code/ipc_lib/shared_mem.h"
 
 #include <stdio.h>
 #include <string.h>
@@ -8,11 +8,22 @@
 #include <sys/types.h>
 #include <errno.h>
 
+#include "aos/atom_code/ipc_lib/core_lib.h"
+
 // the path for the shared memory segment. see shm_open(3) for restrictions
 #define AOS_SHM_NAME "/aos_shared_mem"
 // Size of the shared mem segment.
-// set to the maximum number that worked
-#define SIZEOFSHMSEG (4096 * 27813)
+// Set to the maximum number that worked. Any bigger than this and the kernel
+// thinks you should be able to access all of it but it doesn't work with the
+// ARM kernel Brian was using on 2013-12-20.
+#define SIZEOFSHMSEG (4096 * 25074)
+
+void init_shared_mem_core(aos_shm_core *shm_core) {
+  clock_gettime(CLOCK_REALTIME, &shm_core->identifier);
+  shm_core->msg_alloc_lock = 0;
+  shm_core->queues.queue_list = NULL;
+  shm_core->queues.alloc_lock = 0;
+}
 
 ptrdiff_t aos_core_get_mem_usage(void) {
   return global_core->size -
@@ -20,10 +31,10 @@
        (ptrdiff_t)global_core->mem_struct);
 }
 
-struct aos_core global_core_data;
 struct aos_core *global_core = NULL;
 
 int aos_core_create_shared_mem(enum aos_core_create to_create) {
+  static struct aos_core global_core_data;
   global_core = &global_core_data;
   int shm;
 before:
@@ -46,8 +57,8 @@
   }
   if (shm == -1) {
     fprintf(stderr, "shared_mem:"
-        " shm_open(" AOS_SHM_NAME ", O_RDWR [| O_CREAT | O_EXCL, 0|0666)"
-        " failed with %d: %s\n", errno, strerror(errno));
+            " shm_open(" AOS_SHM_NAME ", O_RDWR [| O_CREAT | O_EXCL, 0|0666)"
+            " failed with %d: %s\n", errno, strerror(errno));
     return -1;
   }
   if (global_core->owner) {
@@ -62,8 +73,8 @@
       MAP_SHARED | MAP_FIXED | MAP_LOCKED | MAP_POPULATE, shm, 0);
   if (shm_address == MAP_FAILED) {
     fprintf(stderr, "shared_mem: mmap(%p, 0x%zx, stuff, stuff, %d, 0) failed"
-        " with %d: %s\n",
-        (void *)SHM_START, SIZEOFSHMSEG, shm, errno, strerror(errno));
+            " with %d: %s\n",
+            (void *)SHM_START, SIZEOFSHMSEG, shm, errno, strerror(errno));
     return -1;
   }
   printf("shared_mem: shm at: %p\n", shm_address);
@@ -88,9 +99,9 @@
     init_shared_mem_core(global_core->mem_struct);
   }
   if (global_core->owner) {
-    condition_set(&global_core->mem_struct->creation_condition);
+    futex_set(&global_core->mem_struct->creation_condition);
   } else {
-    if (condition_wait(&global_core->mem_struct->creation_condition) != 0) {
+    if (futex_wait(&global_core->mem_struct->creation_condition) != 0) {
       fprintf(stderr, "waiting on creation_condition failed\n");
       return -1;
     }
@@ -116,4 +127,3 @@
   }
   return 0;
 }
-
diff --git a/aos/atom_code/ipc_lib/shared_mem.h b/aos/atom_code/ipc_lib/shared_mem.h
index b1a2608..c0d21ac 100644
--- a/aos/atom_code/ipc_lib/shared_mem.h
+++ b/aos/atom_code/ipc_lib/shared_mem.h
@@ -1,19 +1,40 @@
 #ifndef _SHARED_MEM_H_
 #define _SHARED_MEM_H_
 
+#include <stddef.h>
+#include <unistd.h>
+#include <time.h>
+
+#include "aos/atom_code/ipc_lib/aos_sync.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#include "core_lib.h"
-#include <stddef.h>
-#include <unistd.h>
+extern struct aos_core *global_core;
 
 // Where the shared memory segment starts in each process's address space.
 // Has to be the same in all of them so that stuff in shared memory
 // can have regular pointers to other stuff in shared memory.
 #define SHM_START 0x20000000
 
+typedef struct aos_queue_global_t {
+  mutex alloc_lock;
+  void *queue_list;  // an aos::Queue* declared in C code
+} aos_queue_global;
+
+typedef struct aos_shm_core_t {
+  // clock_gettime(CLOCK_REALTIME, &identifier) gets called to identify
+  // this shared memory area
+  struct timespec identifier;
+  // gets 0-initialized at the start (as part of shared memory) and
+  // the owner sets as soon as it finishes setting stuff up
+  mutex creation_condition;
+  mutex msg_alloc_lock;
+  void *msg_alloc;
+  aos_queue_global queues;
+} aos_shm_core;
+
 enum aos_core_create {
   create,
   reference
@@ -26,6 +47,8 @@
   aos_shm_core *mem_struct;
 };
 
+void init_shared_mem_core(aos_shm_core *shm_core);
+
 ptrdiff_t aos_core_get_mem_usage(void);
 
 // Takes the specified memory address and uses it as the shared memory.
diff --git a/aos/atom_code/ipc_lib/sharedmem_test_setup.h b/aos/atom_code/ipc_lib/sharedmem_test_setup.h
deleted file mode 100644
index e461c43..0000000
--- a/aos/atom_code/ipc_lib/sharedmem_test_setup.h
+++ /dev/null
@@ -1,147 +0,0 @@
-// defines a fixture (SharedMemTestSetup) that sets up shared memory
-
-extern "C" {
-#include "shared_mem.h"
-  extern struct aos_core *global_core;
-}
-
-#include <signal.h>
-
-#include <gtest/gtest.h>
-#include <sys/types.h>
-
-// TODO(brians) read logs from here
-class SharedMemTestSetup : public testing::Test{
- protected:
-  pid_t core;
-  int start[2];
-  int memcheck[2];
-  static void signal_handler(int){
-     if(aos_core_free_shared_mem()){
-      exit(- 1);
-    }
-    exit(0);
-  }
-  static int get_mem_usage(){
-    return global_core->size - ((uint8_t *)global_core->mem_struct->msg_alloc - (uint8_t *)SHM_START);
-  }
-  bool checking_mem;
-
-  virtual void BeforeLocalShmSetup() {}
-  virtual void SetUp(){
-    ASSERT_EQ(0, pipe(start)) << "couldn't create start pipes";
-    ASSERT_EQ(0, pipe(memcheck)) << "couldn't create memcheck pipes";
-    checking_mem = false;
-    if((core = fork()) == 0){
-      close(start[0]);
-      close(memcheck[1]);
-      struct sigaction act;
-      act.sa_handler = signal_handler;
-      sigaction(SIGINT, &act, NULL);
-      if(aos_core_create_shared_mem(create)){
-        exit(-1);
-      }
-      write_pipe(start[1], "a", 1);
-      int usage = 0;
-      while(1){
-        char buf1;
-        read_pipe(memcheck[0], &buf1, 1);
-        if(usage == 0)
-          usage = get_mem_usage();
-        if(usage == get_mem_usage())
-          buf1 = 1;
-        else
-          buf1 = 0;
-        write_pipe(start[1], &buf1, 1);
-      }
-    }
-    close(start[1]);
-    close(memcheck[0]);
-    ASSERT_NE(-1, core) << "fork failed";
-    char buf;
-    read_pipe(start[0], &buf, 1);
-
-    BeforeLocalShmSetup();
-
-    ASSERT_EQ(0, aos_core_create_shared_mem(reference)) << "couldn't create shared mem reference";
-  }
-  virtual void TearDown(){
-    if(checking_mem){
-      write_pipe(memcheck[1], "a", 1);
-      char buf;
-      read_pipe(start[0], &buf, 1);
-      EXPECT_EQ(1, buf) << "memory got leaked";
-    }
-    EXPECT_EQ(0, aos_core_free_shared_mem()) << "issues freeing shared mem";
-    if(core > 0){
-      kill(core, SIGINT);
-      siginfo_t status;
-      ASSERT_EQ(0, waitid(P_PID, core, &status, WEXITED)) << "waiting for the core to finish failed";
-      EXPECT_EQ(CLD_EXITED, status.si_code) << "core died";
-      EXPECT_EQ(0, status.si_status) << "core exited with an error";
-    }
-  }
-  // if any more shared memory gets allocated after calling this and not freed by the end, it's an error
-  void AllSharedMemAllocated(){
-    checking_mem = true;
-    write_pipe(memcheck[1], "a", 1);
-    char buf;
-    read_pipe(start[0], &buf, 1);
-  }
- private:
-  // Wrapper functions for pipes because they should never have errors.
-  void read_pipe(int fd, void *buf, size_t count) {
-    if (read(fd, buf, count) < 0) abort();
-  }
-  void write_pipe(int fd, const void *buf, size_t count) {
-    if (write(fd, buf, count) < 0) abort();
-  }
-};
-class ExecVeTestSetup : public SharedMemTestSetup {
- protected:
-  std::vector<std::string> files;
-  std::vector<pid_t> pids;
-  virtual void BeforeLocalShmSetup(){
-    std::vector<std::string>::iterator it;
-    pid_t child;
-    for(it = files.begin(); it < files.end(); ++it){
-      if((child = fork()) == 0){
-        char *null = NULL;
-        execve(it->c_str(), &null, &null);
-        ADD_FAILURE() << "execve failed";
-        perror("execve");
-        exit(0);
-      }
-      if(child > 0)
-        pids.push_back(child);
-      else
-        ADD_FAILURE() << "fork failed return=" << child;
-    }
-    usleep(150000);
-  }
-  virtual void TearDown(){
-    std::vector<pid_t>::iterator it;
-    siginfo_t status;
-    for(it = pids.begin(); it < pids.end(); ++it){
-      printf("attempting to SIGINT(%d) %d\n", SIGINT, *it);
-      if(*it > 0){
-        kill(*it, SIGINT);
-        ASSERT_EQ(0, waitid(P_PID, *it, &status, WEXITED)) << "waiting for the AsyncAction(pid=" << *it << ") to finish failed";
-        EXPECT_EQ(CLD_EXITED, status.si_code) << "child died (killed by signal is " << (int)CLD_KILLED << ")";
-        EXPECT_EQ(0, status.si_status) << "child exited with an error";
-      }else{
-        FAIL();
-      }
-    }
-
-    SharedMemTestSetup::TearDown();
-  }
-  // call this _before_ ExecVeTestSetup::SetUp()
-  void AddProcess(const std::string file){
-    files.push_back(file);
-  }
-  void PercolatePause(){
-    usleep(50000);
-  }
-};
-
diff --git a/aos/atom_code/logging/atom_logging.cc b/aos/atom_code/logging/atom_logging.cc
new file mode 100644
index 0000000..854da17
--- /dev/null
+++ b/aos/atom_code/logging/atom_logging.cc
@@ -0,0 +1,142 @@
+#include "aos/atom_code/logging/atom_logging.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <unistd.h>
+#include <limits.h>
+#include <sys/prctl.h>
+
+#include <algorithm>
+
+#include "aos/common/die.h"
+#include "aos/common/logging/logging_impl.h"
+#include "aos/atom_code/thread_local.h"
+#include "aos/atom_code/ipc_lib/queue.h"
+
+namespace aos {
+namespace logging {
+namespace {
+
+using internal::Context;
+
+AOS_THREAD_LOCAL Context *my_context(NULL);
+
+::std::string GetMyName() {
+  // The maximum number of characters that can make up a thread name.
+  // The docs are unclear if it can be 16 characters with no '\0', so we'll be
+  // safe by adding our own where necessary.
+  static const size_t kThreadNameLength = 16;
+
+  ::std::string process_name(program_invocation_short_name);
+
+  char thread_name_array[kThreadNameLength + 1];
+  if (prctl(PR_GET_NAME, thread_name_array) != 0) {
+    Die("prctl(PR_GET_NAME, %p) failed with %d: %s\n",
+        thread_name_array, errno, strerror(errno));
+  }
+  thread_name_array[sizeof(thread_name_array) - 1] = '\0';
+  ::std::string thread_name(thread_name_array);
+
+  // If the first bunch of characters are the same.
+  // We cut off comparing at the shorter of the 2 strings because one or the
+  // other often ends up cut off.
+  if (strncmp(thread_name.c_str(), process_name.c_str(),
+              ::std::min(thread_name.length(), process_name.length())) == 0) {
+    // This thread doesn't have an actual name.
+    return process_name;
+  }
+
+  return process_name + '.' + thread_name;
+}
+
+RawQueue *queue;
+
+}  // namespace
+namespace internal {
+
+Context *Context::Get() {
+  if (my_context == NULL) {
+    my_context = new Context();
+    my_context->name = GetMyName();
+    if (my_context->name.size() + 1 > sizeof(LogMessage::name)) {
+      Die("logging: process/thread name '%s' is too long\n",
+          my_context->name.c_str());
+    }
+    my_context->source = getpid();
+  }
+  return my_context;
+}
+
+void Context::Delete() {
+  delete my_context;
+  my_context = NULL;
+}
+
+}  // namespace internal
+namespace atom {
+namespace {
+
+class AtomQueueLogImplementation : public LogImplementation {
+  virtual void DoLog(log_level level, const char *format, va_list ap) {
+    LogMessage *message = static_cast<LogMessage *>(queue->GetMessage());
+    if (message == NULL) {
+      LOG(FATAL, "queue get message failed\n");
+    }
+
+    internal::FillInMessage(level, format, ap, message);
+
+    Write(message);
+  }
+};
+
+}  // namespace
+
+void Register() {
+  Init();
+
+  queue = RawQueue::Fetch("LoggingQueue", sizeof(LogMessage), 1323, 1500);
+  if (queue == NULL) {
+    Die("logging: couldn't fetch queue\n");
+  }
+
+  AddImplementation(new AtomQueueLogImplementation());
+}
+
+const LogMessage *ReadNext(int flags, int *index) {
+  return static_cast<const LogMessage *>(queue->ReadMessageIndex(flags, index));
+}
+
+const LogMessage *ReadNext() {
+  return ReadNext(RawQueue::kBlock);
+}
+
+const LogMessage *ReadNext(int flags) {
+  const LogMessage *r = NULL;
+  do {
+    r = static_cast<const LogMessage *>(queue->ReadMessage(flags));
+    // not blocking means return a NULL if that's what it gets
+  } while ((flags & RawQueue::kBlock) && r == NULL);
+  return r;
+}
+
+LogMessage *Get() {
+  return static_cast<LogMessage *>(queue->GetMessage());
+}
+
+void Free(const LogMessage *msg) {
+  queue->FreeMessage(msg);
+}
+
+void Write(LogMessage *msg) {
+  if (!queue->WriteMessage(msg, RawQueue::kOverride)) {
+    LOG(FATAL, "writing failed");
+  }
+}
+
+}  // namespace atom
+}  // namespace logging
+}  // namespace aos
diff --git a/aos/atom_code/logging/atom_logging.cpp b/aos/atom_code/logging/atom_logging.cpp
deleted file mode 100644
index e98078b..0000000
--- a/aos/atom_code/logging/atom_logging.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <unistd.h>
-#include <limits.h>
-
-#include <algorithm>
-
-#include "aos/aos_core.h"
-#include "aos/common/die.h"
-
-#define DECL_LEVEL(name, value) const log_level name = value;
-DECL_LEVELS
-#undef DECL_LEVEL
-
-log_level log_min = 0;
-
-static const aos_type_sig message_sig = {sizeof(log_queue_message), 1234, 1500};
-static const char *name;
-static size_t name_size;
-static aos_queue *queue;
-static log_message corked_message;
-static int cork_line_min, cork_line_max;
-bool log_initted = false;
-
-static inline void cork_init() {
-  corked_message.message[0] = '\0'; // make strlen of it 0
-  cork_line_min = INT_MAX;
-  cork_line_max = -1;
-}
-int log_init(const char *name_in){
-  if (log_initted) {
-    return 1;
-  }
-
-  const size_t name_in_len = strlen(name_in);
-  const char *last_slash = static_cast<const char *>(memrchr(name_in,
-                                                                   '/', name_in_len));
-  if (last_slash == NULL) {
-    name_size = name_in_len;
-    last_slash = name_in - 1;
-  } else {
-    name_size = name_in + name_in_len - last_slash;
-  }
-  if (name_size >= sizeof(log_message::name)) {
-    fprintf(stderr, "logging: error: name '%s' (going to use %zu bytes) is too long\n",
-        name_in, name_size);
-    return -1;
-  }
-  char *const tmp = static_cast<char *>(malloc(name_size + 1));
-  if (tmp == NULL) {
-    fprintf(stderr, "logging: error: couldn't malloc(%zd)\n", name_size + 1);
-    return -1;
-  }
-  name = tmp;
-  memcpy(tmp, last_slash + 1, name_size);
-  tmp[name_size] = 0;
-  queue = aos_fetch_queue("LoggingQueue", &message_sig);
-  if (queue == NULL) {
-    fprintf(stderr, "logging: error: couldn't fetch queue\n");
-    return -1;
-  }
-
-  cork_init();
-
-  log_initted = true;
-  return 0;
-}
-void log_uninit() {
-  free(const_cast<char *>(name));
-  name = NULL;
-  name_size = 0;
-  queue = NULL;
-  log_initted = false;
-}
-
-static inline void check_init() {
-	if (!log_initted) {
-		fprintf(stderr, "logging: warning: not initialized in %jd."
-            " initializing using \"<null>\" as name\n", static_cast<intmax_t>(getpid()));
-		log_init("<null>");
-	}
-}
-
-const log_message *log_read_next2(int flags, int *index) {
-  check_init();
-  return static_cast<const log_message *>(aos_queue_read_msg_index(queue, flags, index));
-}
-const log_message *log_read_next1(int flags) {
-	check_init();
-	const log_message *r = NULL;
-	do {
-		r = static_cast<const log_message *>(aos_queue_read_msg(queue, flags));
-	} while ((flags & BLOCK) && r == NULL); // not blocking means return a NULL if that's what it gets
-	return r;
-}
-void log_free_message(const log_message *msg) {
-	check_init();
-	aos_queue_free_msg(queue, msg);
-}
-
-int log_crio_message_send(log_crio_message &to_send) {
-	check_init();
-
-	log_crio_message *msg = static_cast<log_crio_message *>(aos_queue_get_msg(queue));
-	if (msg == NULL) {
-		fprintf(stderr, "logging: error: couldn't get a message to send '%s'\n",
-            to_send.message);
-		return -1;
-	}
-  //*msg = to_send;
-  static_assert(sizeof(to_send) == sizeof(*msg), "something is very wrong here");
-  memcpy(msg, &to_send, sizeof(to_send));
-	if (aos_queue_write_msg(queue, msg, OVERRIDE) < 0) {
-		fprintf(stderr, "logging: error: writing crio message '%s' failed\n", msg->message);
-		aos_queue_free_msg(queue, msg);
-		return -1;
-	}
-
-	return 0;
-}
-
-// Prints format (with ap) into output and correctly deals with the message
-// being too long etc.
-// Returns whether it succeeded or not.
-static inline bool vsprintf_in(char *output, size_t output_size,
-                               const char *format, va_list ap) {
-	static const char *continued = "...\n";
-	const size_t size = output_size - strlen(continued);
-	const int ret = vsnprintf(output, size, format, ap);
-	if (ret < 0) {
-		fprintf(stderr, "logging: error: vsnprintf failed with %d (%s)\n",
-            errno, strerror(errno));
-    return false;
-	} else if (static_cast<uintmax_t>(ret) >= static_cast<uintmax_t>(size)) {
-		// overwrite the NULL at the end of the existing one and
-    // copy in the one on the end of continued
-		memcpy(&output[size - 1], continued, strlen(continued) + 1);
-	}
-  return true;
-}
-static inline bool write_message(log_message *msg, log_level level) {
-	msg->level = level;
-	msg->source = getpid();
-	memcpy(msg->name, name, name_size + 1);
-	if (clock_gettime(CLOCK_REALTIME, &msg->time) == -1) {
-		fprintf(stderr, "logging: warning: couldn't get the current time "
-            "because of %d (%s)\n", errno, strerror(errno));
-		msg->time.tv_sec = 0;
-		msg->time.tv_nsec = 0;
-	}
-
-  static uint8_t local_sequence = -1;
-  msg->sequence = ++local_sequence;
-
-	if (aos_queue_write_msg(queue, msg, OVERRIDE) < 0) {
-		fprintf(stderr, "logging: error: writing message '%s' failed\n", msg->message);
-		aos_queue_free_msg(queue, msg);
-    return false;
-	}
-  return true;
-}
-static inline int vlog_do(log_level level, const char *format, va_list ap) {
-	log_message *msg = static_cast<log_message *>(aos_queue_get_msg(queue));
-	if (msg == NULL) {
-		fprintf(stderr, "logging: error: couldn't get a message to send '%s'\n", format);
-		return -1;
-	}
-
-  if (!vsprintf_in(msg->message, sizeof(msg->message), format, ap)) {
-    return -1;
-  }
-
-  if (!write_message(msg, level)) {
-    return -1;
-  }
-
-  if (level == FATAL) {
-    aos::Die("%s", msg->message);
-  }
-
-	return 0;
-}
-int log_do(log_level level, const char *format, ...) {
-	check_init();
-	va_list ap;
-	va_start(ap, format);
-	const int ret = vlog_do(level, format, ap);
-	va_end(ap);
-  return ret;
-}
-
-static inline int vlog_cork(int line, const char *format, va_list ap) {
-  const size_t message_length = strlen(corked_message.message);
-  if (line > cork_line_max) cork_line_max = line;
-  if (line < cork_line_min) cork_line_min = line;
-  return vsprintf_in(corked_message.message + message_length,
-                     sizeof(corked_message.message) - message_length, format, ap) ? 0 : -1;
-}
-int log_cork(int line, const char *format, ...) {
-  check_init();
-	va_list ap;
-	va_start(ap, format);
-	const int ret = vlog_cork(line, format, ap);
-	va_end(ap);
-  return ret;
-}
-static inline bool log_uncork_helper(char *output, size_t output_size,
-                                     const char *format, ...) {
-  check_init();
-	va_list ap;
-	va_start(ap, format);
-	const bool ret = vsprintf_in(output, output_size, format, ap);
-	va_end(ap);
-  return ret;
-}
-int log_uncork(int line, log_level level, const char *begin_format,
-               const char *format, ...) {
-  check_init();
-	va_list ap;
-	va_start(ap, format);
-	const int ret = vlog_cork(line, format, ap);
-	va_end(ap);
-  if (ret != 0) {
-    return ret;
-  }
-
-	log_message *msg = static_cast<log_message *>(aos_queue_get_msg(queue));
-	if (msg == NULL) {
-		fprintf(stderr, "logging: error: couldn't get a message to send '%s'\n", format);
-    cork_init();
-		return -1;
-  }
-
-  static char new_format[LOG_MESSAGE_LEN];
-  if (!log_uncork_helper(new_format, sizeof(new_format), begin_format,
-                         cork_line_min, cork_line_max)) {
-    cork_init();
-    return -1;
-  }
-  const size_t new_length = strlen(new_format);
-  memcpy(msg->message, new_format, new_length);
-  memcpy(msg->message + new_length, corked_message.message,
-          std::min(strlen(corked_message.message) + 1,
-              sizeof(msg->message) - new_length));
-  // in case corked_message.message was too long, it'll still be NULL-terminated
-  msg->message[sizeof(msg->message) - 1] = '\0';
-  cork_init();
-
-  if (!write_message(msg, level)) {
-    return -1;
-  }
-
-  return 0;
-}
-
diff --git a/aos/atom_code/logging/atom_logging.h b/aos/atom_code/logging/atom_logging.h
index 6211e22..45f2a07 100644
--- a/aos/atom_code/logging/atom_logging.h
+++ b/aos/atom_code/logging/atom_logging.h
@@ -1,109 +1,30 @@
 #ifndef AOS_ATOM_CODE_LOGGING_LOGGING_H_
 #define AOS_ATOM_CODE_LOGGING_LOGGING_H_
 
-// IWYU pragma: private, include "aos/common/logging/logging.h"
+#include "aos/common/logging/logging_impl.h"
 
-#ifndef AOS_COMMON_LOGGING_LOGGING_H_
-#error This file may only be #included through common/logging/logging.h!!!
-#endif
+namespace aos {
+namespace logging {
+namespace atom {
 
-#include "aos/aos_core.h"
+// Calls AddImplementation to register the usual atom logging implementation
+// which sends the messages through a queue. This implementation relies on
+// another process(es) to read the log messages that it puts into the queue.
+// It gets called by aos::Init*.
+void Register();
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+// Fairly simple wrappers around the raw queue calls.
 
-int log_init(const char *name);
-// WARNING: THIS LEAKS MEMORY AND SHARED MEMORY
-void log_uninit(void);
+// This one never returns NULL if flags contains BLOCK.
+const LogMessage *ReadNext(int flags);
+const LogMessage *ReadNext(int flags, int *index);
+const LogMessage *ReadNext();
+LogMessage *Get();
+void Free(const LogMessage *msg);
+void Write(LogMessage *msg);
 
-extern log_level log_min;
-
-// The basic structure that goes into the shared memory queue.
-// It is packed so the pid_t at the front is at the same location as
-// the one in log_crio_message.
-typedef struct log_message_t_ {
-	pid_t source;
-	log_level level;
-	char message[LOG_MESSAGE_LEN];
-	char name[40];
-	struct timespec time;
-  uint8_t sequence; // per process
-} __attribute__((packed)) log_message;
-
-#ifdef __cplusplus
-#define LOG_BOOL bool
-#else
-#define LOG_BOOL uint8_t
-#endif
-extern LOG_BOOL log_initted;
-#undef LOG_BOOL
-
-// Unless explicitly stated otherwise, format must always be a string constant
-// and args are printf-style arguments for format.
-// The validitiy of format and args together will be checked at compile time
-// using a gcc function attribute.
-
-// Logs the specified thing.
-#define LOG(level, format, args...) do { \
-	if (level >= log_min) { \
-		log_do(level, LOG_SOURCENAME ": " STRINGIFY(__LINE__) ": " format, ##args); \
-	} \
-} while (0)
-// Allows "bottling up" multiple log fragments which can then all be logged in
-// one message with LOG_UNCORK.
-// format does not have to be a constant
-#define LOG_CORK(format, args...) do { \
-  log_cork(__LINE__, format, ##args); \
-} while (0)
-// Actually logs all of the saved up log fragments (including format and args on
-// the end).
-#define LOG_UNCORK(level, format, args...) do { \
-  log_uncork(__LINE__, level, LOG_SOURCENAME ": %d-%d: ", format, ##args); \
-} while (0)
-// Makes a normal logging call if possible or just prints it out on stderr.
-#define LOG_IFINIT(level, format, args...) do{ \
-	if(log_initted) { \
-		LOG(level, format, args); \
-	} else { \
-		fprintf(stderr, "%s-noinit: " format, log_str(level), ##args); \
-	} \
-}while(0)
-
-// All functions return 0 for success and - for error.
-
-// Actually implements the basic logging call.
-// Does not check that level is valid.
-// TODO(brians): Fix this so it works with clang.
-int log_do(log_level level, const char *format, ...)
-  __attribute__((format(gnu_printf, 2, 3)));
-
-// TODO(brians): Fix this so it works with clang.
-int log_cork(int line, const char *format, ...)
-  __attribute__((format(gnu_printf, 2, 3)));
-// Implements the uncork logging call.
-// IMPORTANT: begin_format must have 2 %d formats as its only 2 format specifiers
-// which will get passed the minimum and maximum line numbers that have been
-// corked into this call.
-// TODO(brians): Fix this so it works with clang.
-int log_uncork(int line, log_level level, const char *begin_format,
-               const char *format, ...)
-  __attribute__((format(gnu_printf, 4, 5)));
-
-const log_message *log_read_next1(int flags);
-const log_message *log_read_next2(int flags, int *index);
-inline const log_message *log_read_next(void) { return log_read_next1(BLOCK); }
-void log_free_message(const log_message *msg);
-
-// The structure that is actually in the shared memory queue.
-union log_queue_message {
-  log_message atom;
-  log_crio_message crio;
-};
-
-#ifdef __cplusplus
-}
-#endif
+}  // namespace atom
+}  // namespace logging
+}  // namespace aos
 
 #endif
-
diff --git a/aos/atom_code/logging/atom_logging_test.cpp b/aos/atom_code/logging/atom_logging_test.cpp
deleted file mode 100644
index a97d1e9..0000000
--- a/aos/atom_code/logging/atom_logging_test.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-#include <string>
-
-#include "gtest/gtest.h"
-
-#include "aos/aos_core.h"
-#include "aos/atom_code/ipc_lib/sharedmem_test_setup.h"
-#include "aos/common/control_loop/Timing.h"
-#include "aos/common/inttypes.h"
-#include "aos/common/time.h"
-
-using ::aos::time::Time;
-using ::testing::AssertionResult;
-using ::testing::AssertionSuccess;
-using ::testing::AssertionFailure;
-
-namespace aos {
-namespace testing {
-
-static const std::string kLoggingName = "LoggingTestName";
-
-class LoggingTest : public SharedMemTestSetup {
-  virtual void SetUp() {
-    SharedMemTestSetup::SetUp();
-    ASSERT_EQ(0, log_init(kLoggingName.c_str()));
-  }
-  virtual void TearDown() {
-    log_uninit();
-    SharedMemTestSetup::TearDown();
-  }
-
- public:
-  AssertionResult WasAnythingLogged() {
-    const log_message *msg = log_read_next1(NON_BLOCK);
-    if (msg != NULL) {
-      char bad_msg[LOG_MESSAGE_LEN];
-      memcpy(bad_msg, msg->message, sizeof(bad_msg));
-      log_free_message(msg);
-      return AssertionSuccess() << "read message '" << bad_msg << "'";
-    }
-    return AssertionFailure();
-  }
-  AssertionResult WasLogged(log_level level, const std::string value) {
-    const log_message *msg = NULL;
-    char bad_msg[LOG_MESSAGE_LEN];
-    bad_msg[0] = '\0';
-    const pid_t owner = getpid();
-    while (true) {
-      if (msg != NULL) {
-        static_assert(sizeof(bad_msg) == sizeof(msg->message),
-                      "something is wrong");
-        if (bad_msg[0] != '\0') {
-          printf("read bad message: %s", bad_msg);
-        }
-        memcpy(bad_msg, msg->message, sizeof(bad_msg));
-        log_free_message(msg);
-        msg = NULL;
-      }
-      msg = log_read_next1(NON_BLOCK);
-      if (msg == NULL) {
-        return AssertionFailure() << "last message read was '" << bad_msg << "'"
-            " instead of '" << value << "'";
-      }
-      if (msg->source != owner) continue;
-      if (msg->level != level) continue;
-      if (strcmp(msg->name, kLoggingName.c_str()) != 0) continue;
-      if (strcmp(msg->message + strlen(msg->message) - value.length(),
-                 value.c_str()) != 0) continue;
-
-      // if it's gotten this far, then the message is correct
-      log_free_message(msg);
-      return AssertionSuccess();
-    }
-  }
-};
-typedef LoggingTest LoggingDeathTest;
-
-// Tests both basic logging functionality and that the test setup works
-// correctly.
-TEST_F(LoggingTest, Basic) {
-  EXPECT_FALSE(WasAnythingLogged());
-  LOG(INFO, "test log 1\n");
-  EXPECT_TRUE(WasLogged(INFO, "test log 1\n"));
-  LOG(INFO, "test log 1.5\n");
-  // there's a subtle typo on purpose...
-  EXPECT_FALSE(WasLogged(INFO, "test log 15\n"));
-  LOG(ERROR, "test log 2=%d\n", 55);
-  EXPECT_TRUE(WasLogged(ERROR, "test log 2=55\n"));
-  LOG(ERROR, "test log 3\n");
-  EXPECT_FALSE(WasLogged(WARNING, "test log 3\n"));
-  LOG(WARNING, "test log 4\n");
-  EXPECT_TRUE(WasAnythingLogged());
-}
-TEST_F(LoggingTest, Cork) {
-  static const int begin_line = __LINE__;
-  LOG_CORK("first part ");
-  LOG_CORK("second part (=%d) ", 19);
-  EXPECT_FALSE(WasAnythingLogged());
-  LOG_CORK("third part ");
-  static const int end_line = __LINE__;
-  LOG_UNCORK(WARNING, "last part %d\n", 5);
-  char *expected;
-  ASSERT_GT(asprintf(&expected, "atom_logging_test.cpp: %d-%d: "
-                        "first part second part (=19) third part last part 5\n",
-                        begin_line + 1, end_line + 1), 0);
-  EXPECT_TRUE(WasLogged(WARNING, std::string(expected)));
-}
-
-TEST_F(LoggingDeathTest, Fatal) {
-  ASSERT_EXIT(LOG(FATAL, "this should crash it\n"),
-              ::testing::KilledBySignal(SIGABRT),
-              "this should crash it");
-}
-
-TEST_F(LoggingTest, PrintfDirectives) {
-  LOG(INFO, "test log %%1 %%d\n");
-  EXPECT_TRUE(WasLogged(INFO, "test log %1 %d\n"));
-  LOG_DYNAMIC(WARNING, "test log %%2 %%f\n");
-  EXPECT_TRUE(WasLogged(WARNING, "test log %2 %f\n"));
-  LOG_CORK("log 3 part %%1 %%d ");
-  LOG_UNCORK(DEBUG, "log 3 part %%2 %%f\n");
-  EXPECT_TRUE(WasLogged(DEBUG, "log 3 part %1 %d log 3 part %2 %f\n"));
-}
-
-// For writing only.
-TEST_F(LoggingTest, Timing) {
-  static const long kTimingCycles = 5000;
-  Time start = Time::Now();
-  for (long i = 0; i < kTimingCycles; ++i) {
-    LOG(INFO, "a\n");
-  }
-  Time elapsed = Time::Now() - start;
-
-  printf("short message took %"PRId64" nsec for %ld\n", elapsed.ToNSec(),
-      kTimingCycles);
-
-  start = Time::Now();
-  for (long i = 0; i < kTimingCycles; ++i) {
-    LOG(INFO, "something longer than just \"a\" to log to test timing\n");
-  }
-  elapsed = Time::Now() - start;
-  printf("long message took %"PRId64" nsec for %ld\n", elapsed.ToNSec(),
-      kTimingCycles);
-}
-
-}  // namespace testing
-}  // namespace aos
diff --git a/aos/atom_code/logging/logging.gyp b/aos/atom_code/logging/logging.gyp
index 5d29da8..dfb189c 100644
--- a/aos/atom_code/logging/logging.gyp
+++ b/aos/atom_code/logging/logging.gyp
@@ -1,15 +1,4 @@
 {
   'targets': [
-    {
-      'target_name': 'atom_logging_test',
-      'type': 'executable',
-      'sources': [
-        'atom_logging_test.cpp',
-      ],
-      'dependencies': [
-        '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
-      ],
-    },
   ],
 }
diff --git a/aos/atom_code/messages/DriverStationDisplay.cpp b/aos/atom_code/messages/DriverStationDisplay.cpp
deleted file mode 100644
index e48a1eb..0000000
--- a/aos/atom_code/messages/DriverStationDisplay.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "DriverStationDisplay.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-
-using namespace aos;
-
-static const aos_type_sig signature = {sizeof(DriverStationDisplay), 1234, 10};
-aos_queue *DriverStationDisplay::queue = NULL;
-void DriverStationDisplay::GetQueue() {
-  if (queue == NULL) {
-    queue = aos_fetch_queue("DriverStationDisplay", &signature);
-  }
-}
-
-void DriverStationDisplay::Send(int line, const char *fmt, ...) {
-  GetQueue();
-  DriverStationDisplay *msg = static_cast<DriverStationDisplay *>(
-      aos_queue_get_msg(queue));
-  if (msg == NULL) {
-    LOG(WARNING, "could not get message to send '%s' to the DS queue\n", fmt);
-    return;
-  }
-  msg->line = static_cast<uint8_t>(line);
-
-  va_list ap;
-  va_start(ap, fmt);
-  int ret = vsnprintf(msg->data, sizeof(msg->data), fmt, ap);
-  va_end(ap);
-  if (ret < 0) {
-    LOG(WARNING, "could not format '%s' with arguments\n", fmt);
-    aos_queue_free_msg(queue, msg);
-    return;
-  } else if (static_cast<uintmax_t>(ret) >=
-             static_cast<uintmax_t>(sizeof(msg->data))) {
-    LOG(WARNING, "format '%s' ended up longer than the max size (%zd)\n",
-        fmt, sizeof(msg->data));
-  }
-  
-  if (aos_queue_write_msg(queue, msg, NON_BLOCK) < 0) {
-    LOG(ERROR, "writing '%s' (line %hhd) failed\n", msg->data, msg->line);
-    aos_queue_free_msg(queue, msg);
-  }
-}
-
-const DriverStationDisplay *DriverStationDisplay::GetNext() {
-  GetQueue();
-  return static_cast<const DriverStationDisplay *>(aos_queue_read_msg(queue, NON_BLOCK));
-}
-void DriverStationDisplay::Free(const DriverStationDisplay *msg) {
-  GetQueue();
-  aos_queue_free_msg(queue, msg);
-}
-
diff --git a/aos/atom_code/messages/DriverStationDisplay.h b/aos/atom_code/messages/DriverStationDisplay.h
deleted file mode 100644
index 9ce3712..0000000
--- a/aos/atom_code/messages/DriverStationDisplay.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef AOS_ATOM_CODE_MESSAGES_DRIVER_STATION_DISPLAY_H_
-#define AOS_ATOM_CODE_MESSAGES_DRIVER_STATION_DISPLAY_H_
-
-#include <stdint.h>
-#include <string.h>
-
-#include "aos/aos_core.h"
-#include "aos/common/type_traits.h"
-
-namespace aos {
-const size_t kLineLength = 21;
-
-struct DriverStationDisplay {
-  static void Send(int line, const char *fmt, ...)
-      __attribute__((format(printf, 2, 3)));
-  static const DriverStationDisplay *GetNext(); // returns NULL if there are no more
-  static void Free(const DriverStationDisplay *msg);
-
-  uint8_t line;
-  char data[kLineLength + 1];
-
- private:
-  static void GetQueue();
-  static aos_queue *queue;
-};
-static_assert(shm_ok<DriverStationDisplay>::value,
-              "DriverStationDisplay will go through shared memory");
-} // namespace aos
-
-#endif
-
diff --git a/aos/atom_code/messages/messages.gyp b/aos/atom_code/messages/messages.gyp
deleted file mode 100644
index ddbe9ec..0000000
--- a/aos/atom_code/messages/messages.gyp
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'messages_so',
-      'type': 'shared_library',
-      'variables': {'no_rsync': 1},
-      'sources': [
-        'DriverStationDisplay.cpp',
-      ],
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
-      ],
-      'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
-      ],
-      'direct_dependent_settings': {
-        'variables': {
-          'jni_libs': [
-            'messages_so',
-          ],
-        },
-      },
-    },
-    {
-      'target_name': 'messages',
-      'type': 'static_library',
-      'sources': [
-        'DriverStationDisplay.cpp',
-      ],
-      'dependencies': [
-        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:ipc_lib'
-      ],
-      'export_dependent_settings': [
-        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:ipc_lib'
-      ],
-    },
-  ],
-}
diff --git a/aos/atom_code/output/HTTPServer.cpp b/aos/atom_code/output/HTTPServer.cpp
index 88e3c6f..9a3b359 100644
--- a/aos/atom_code/output/HTTPServer.cpp
+++ b/aos/atom_code/output/HTTPServer.cpp
@@ -4,12 +4,12 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <string.h>
 
 #include <memory>
 
 #include "event2/event.h"
 
-#include "aos/aos_core.h"
 #include "aos/common/scoped_fd.h"
 #include "aos/common/unique_malloc_ptr.h"
 
@@ -25,7 +25,7 @@
     LOG(FATAL, "couldn't create an evhttp\n");
   }
   if (evhttp_bind_socket(http_, "0.0.0.0", port) != 0) {
-    LOG(FATAL, "evhttp_bind_socket(%p, \"0.0.0.0\", %"PRIu16") failed\n",
+    LOG(FATAL, "evhttp_bind_socket(%p, \"0.0.0.0\", %" PRIu16 ") failed\n",
         http_, port);
   }
   evhttp_set_gencb(http_, StaticServeFile, this);
diff --git a/aos/atom_code/output/MotorOutput.cpp b/aos/atom_code/output/MotorOutput.cpp
deleted file mode 100644
index ecbdf8b..0000000
--- a/aos/atom_code/output/MotorOutput.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#include "aos/atom_code/output/MotorOutput.h"
-
-#include <math.h>
-
-#include "aos/common/Configuration.h"
-#include "aos/aos_core.h"
-#include "aos/common/byteorder.h"
-#include "aos/common/control_loop/Timing.h"
-#include "aos/atom_code/messages/DriverStationDisplay.h"
-
-namespace aos {
-
-MotorOutput::MotorOutput() : sock(NetworkPort::kMotors,
-          configuration::GetIPAddress(configuration::NetworkDevice::kCRIO)) {}
-
-void MotorOutput::Run() {
-  while (true) {
-    time::PhasedLoopXMS(5, 1000);
-    RunIteration();
-
-    // doesn't matter if multiple instances end up running this loop at the same
-    // time because the queue handles the race conditions
-    while (true) {
-      const aos::DriverStationDisplay *line = aos::DriverStationDisplay::GetNext();
-      if (line != NULL) {
-        AddDSLine(line->line, line->data);
-        LOG(DEBUG, "got a line %hhd that said '%s'\n", line->line, line->data);
-        aos::DriverStationDisplay::Free(line);
-      } else {
-        break;
-      }
-    }
-
-    if (sock.SendHoldMsg() == -1) {
-      LOG(WARNING, "sending outputs failed\n");
-      continue;
-    } else {
-      LOG(DEBUG, "sent outputs\n");
-    }
-  }
-}
-
-int MotorOutput::AddMotor(char type, uint8_t num, float value) {
-  if (sock.hold_msg_len_ + 4 > sock.MAX_MSG) {
-    return -1;
-  }
-  sock.hold_msg_[sock.hold_msg_len_ ++] = type;
-  sock.hold_msg_[sock.hold_msg_len_ ++] = num;
-  to_network(&value, &sock.hold_msg_[sock.hold_msg_len_]);
-  sock.hold_msg_len_ += 4;
-  return 0;
-}
-int MotorOutput::AddSolenoid(uint8_t port, bool on) {
-  if (sock.hold_msg_len_ + 3 > sock.MAX_MSG) {
-    return -1;
-  }
-  sock.hold_msg_[sock.hold_msg_len_ ++] = 's';
-  sock.hold_msg_[sock.hold_msg_len_ ++] = port;
-  sock.hold_msg_[sock.hold_msg_len_ ++] = on ? 1 : 0;
-  return 0;
-}
-
-int MotorOutput::AddDSLine(uint8_t line, const char *data) {
-  size_t data_len = strlen(data); // doesn't include terminating NULL
-  if (sock.hold_msg_len_ + 3 + data_len > sock.MAX_MSG) {
-    return -1;
-  }
-
-  sock.hold_msg_[sock.hold_msg_len_ ++] = 'd';
-  sock.hold_msg_[sock.hold_msg_len_ ++] = line;
-  sock.hold_msg_[sock.hold_msg_len_ ++] = data_len;
-  memcpy(&sock.hold_msg_[sock.hold_msg_len_], data, data_len);
-  sock.hold_msg_len_ += data_len;
-  return 0;
-}
-
-} // namespace aos
-
diff --git a/aos/atom_code/output/MotorOutput.h b/aos/atom_code/output/MotorOutput.h
deleted file mode 100644
index 925139a..0000000
--- a/aos/atom_code/output/MotorOutput.h
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef AOS_ATOM_CODE_OUTPUT_MOTOR_OUTPUT_H_
-#define AOS_ATOM_CODE_OUTPUT_MOTOR_OUTPUT_H_
-
-#include <stdint.h>
-#include <string.h>
-#include <algorithm>
-#include <string>
-
-#include "aos/common/network/SendSocket.h"
-#include "aos/common/byteorder.h"
-#include "aos/common/type_traits.h"
-
-namespace aos {
-
-class MotorOutput {
- public:
-  MotorOutput();
-  void Run();
-
-  // Constants for the first argument of AddMotor.
-  static const char VICTOR = 'v';
-  static const char TALON = 't';
-
- protected:
-  // num is 1-indexed
-  int AddMotor(char type, uint8_t num, float value);
-  int AddSolenoid(uint8_t num, bool on);
-  int AddDSLine(uint8_t line, const char *data);
-  // loop_queuegroup is expected to be a control loop queue group.
-  // This function will fetch the latest goal and serve it.
-  template <class T>
-  int AddControlLoopGoal(T *loop_queuegroup);
-
-  virtual void RunIteration() = 0;
-
- private:
-  SendSocket sock;
-};
-
-template <class T>
-int MotorOutput::AddControlLoopGoal(T *loop_queuegroup) {
-  typedef typename std::remove_reference<
-      decltype(*(loop_queuegroup->goal.MakeMessage().get()))>::type GoalType;
-  // TODO(aschuh): This assumes a static serialized message size.
-  const uint16_t size = GoalType::Size();
-  if (sock.hold_msg_len_ + 4 + 1 + size > sock.MAX_MSG) {
-    return -1;
-  }
-
-  const bool zero = !loop_queuegroup->goal.FetchLatest();
-
-  sock.hold_msg_[sock.hold_msg_len_ ++] = 'g';
-  const uint32_t hash = loop_queuegroup->hash();
-
-  // Place the loop hash at the front.
-  to_network(&hash, &sock.hold_msg_[sock.hold_msg_len_]);
-  sock.hold_msg_len_ += 4;
-
-  if (zero) {
-    GoalType zero_message;
-    zero_message.Zero();
-    zero_message.Serialize(&sock.hold_msg_[sock.hold_msg_len_]);
-    sock.hold_msg_len_ += size;
-    return -1;
-  } else {
-    loop_queuegroup->goal->Serialize(&sock.hold_msg_[sock.hold_msg_len_]);
-    sock.hold_msg_len_ += size;
-    return 0;
-  }
-}
-
-}  // namespace aos
-
-#endif
diff --git a/aos/atom_code/output/ctemplate_cache.cc b/aos/atom_code/output/ctemplate_cache.cc
index a73e4ad..02c7b2f 100644
--- a/aos/atom_code/output/ctemplate_cache.cc
+++ b/aos/atom_code/output/ctemplate_cache.cc
@@ -1,6 +1,6 @@
 #include "aos/atom_code/output/ctemplate_cache.h"
 
-#include "aos/common/Configuration.h"
+#include "aos/atom_code/configuration.h"
 #include "aos/common/once.h"
 
 namespace aos {
diff --git a/aos/atom_code/output/evhttp_ctemplate_emitter.cc b/aos/atom_code/output/evhttp_ctemplate_emitter.cc
index ed2a83f..9c3ac17 100644
--- a/aos/atom_code/output/evhttp_ctemplate_emitter.cc
+++ b/aos/atom_code/output/evhttp_ctemplate_emitter.cc
@@ -1,6 +1,6 @@
 #include "aos/atom_code/output/evhttp_ctemplate_emitter.h"
 
-#include "aos/aos_core.h"
+#include "aos/common/logging/logging.h"
 
 namespace aos {
 namespace http {
diff --git a/aos/atom_code/output/motor_output.cc b/aos/atom_code/output/motor_output.cc
new file mode 100644
index 0000000..48acc38
--- /dev/null
+++ b/aos/atom_code/output/motor_output.cc
@@ -0,0 +1,97 @@
+#include "aos/atom_code/output/motor_output.h"
+
+#include <math.h>
+
+#include "aos/common/control_loop/Timing.h"
+#include "aos/common/logging/logging.h"
+#include "aos/common/network_port.h"
+
+namespace aos {
+
+// 255 = 2.5ms, 0 = 0.5ms (or something close to that)
+// got 211->210 as first transition that made a speed difference and 53->54 on
+//   the other side
+// going 2 to each side to make sure we get the full range
+const MotorOutput::MotorControllerBounds MotorOutput::kTalonBounds
+    {213, 135, 132, 129, 50};
+
+uint8_t MotorOutput::MotorControllerBounds::Map(double value) const {
+  if (value == 0.0) return kCenter;
+  if (value > 12.0) return Map(12.0);
+  if (value < -12.0) return Map(-12.0);
+  uint8_t r;
+  if (value > 0.0) {
+    r = static_cast<uint8_t>(kDeadbandMax + (value * (kMax - kDeadbandMax)) +
+                             0.5);
+  } else {
+    r = static_cast<uint8_t>(kDeadbandMin + (value * (kDeadbandMin - kMin)) +
+                             0.5);
+  }
+  if (r < kMin) return kMin;
+  if (r > kMax) return kMax;
+  return r;
+}
+
+MotorOutput::MotorOutput()
+  : socket_(NetworkPort::kMotors, ::aos::NetworkAddress::kCRIO) {
+}
+
+void MotorOutput::Run() {
+  while (true) {
+    time::PhasedLoopXMS(5, 1000);
+
+    values_.digital_module = -1;
+    // 0 means output disabled.
+    memset(&values_.pwm_outputs, 0x00, sizeof(values_.pwm_outputs));
+    values_.digital_output_enables = 0;
+    values_.digital_output_values = 0;
+    values_.pressure_switch_channel = 0;
+    values_.compressor_channel = 0;
+    values_.solenoid_module = -1;
+    values_.solenoid_values = 0;
+
+    RunIteration();
+
+    char buffer[sizeof(values_) + ::buffers::kOverhead];
+    ssize_t size = values_.SerializeTo(buffer, sizeof(buffer));
+    if (size <= 0) {
+      LOG(WARNING, "serializing outputs failed\n");
+      continue;
+    }
+    if (socket_.Send(buffer, size) != size) {
+      LOG(WARNING, "sending outputs failed\n");
+      continue;
+    } else {
+      LOG(DEBUG, "sent outputs\n");
+    }
+  }
+}
+
+void MotorOutput::SetSolenoid(uint8_t channel, bool set) {
+  if (set) {
+    values_.solenoid_values |= 1 << (channel - 1);
+  } else {
+    values_.solenoid_values &= ~(1 << (channel - 1));
+  }
+}
+
+void MotorOutput::SetPWMOutput(uint8_t channel, double value,
+                               const MotorControllerBounds &bounds) {
+  values_.pwm_outputs[channel - 1] = bounds.Map(value);
+}
+
+void MotorOutput::DisablePWMOutput(uint8_t channel) {
+  values_.pwm_outputs[channel - 1] = 0;
+}
+
+void MotorOutput::SetDigitalOutput(uint8_t channel, bool value) {
+  const uint8_t shift_amount = 15 - channel;
+  values_.digital_output_enables |= 1 << shift_amount;
+  if (value) {
+    values_.digital_output_values |= 1 << shift_amount;
+  } else {
+    values_.digital_output_values &= ~(1 << shift_amount);
+  }
+}
+
+}  // namespace aos
diff --git a/aos/atom_code/output/motor_output.h b/aos/atom_code/output/motor_output.h
new file mode 100644
index 0000000..8828f14
--- /dev/null
+++ b/aos/atom_code/output/motor_output.h
@@ -0,0 +1,68 @@
+#ifndef AOS_ATOM_CODE_OUTPUT_MOTOR_OUTPUT_H_
+#define AOS_ATOM_CODE_OUTPUT_MOTOR_OUTPUT_H_
+
+#include <stdint.h>
+#include <string.h>
+#include <algorithm>
+#include <string>
+
+#include "aos/common/network/SendSocket.h"
+#include "aos/common/byteorder.h"
+#include "aos/common/type_traits.h"
+#include "aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.h"
+
+namespace aos {
+
+// A class for sending output values to a cRIO.
+// values_ gets completely reset each time through, so RunIteration() needs to
+// set everything each time.
+class MotorOutput {
+ public:
+  MotorOutput();
+  void Run();
+
+  // A container for holding the constants that WPILib uses for each type of
+  // motor controller to map floating point values to 1-byte PWM values to
+  // actually use.
+  struct MotorControllerBounds {
+    // What 1.0 maps to.
+    const uint8_t kMax;
+    // The smallest value to map a positive speed to.
+    const uint8_t kDeadbandMax;
+    // What 0.0 maps to.
+    const uint8_t kCenter;
+    // The biggest value to map a negative speed to.
+    const uint8_t kDeadbandMin;
+    // What -1.0 maps to.
+    const uint8_t kMin;
+
+    // Applies the mapping.
+    uint8_t Map(double value) const;
+  };
+
+ protected:
+  // Brian got the values here by trying values with hardware on 11/23/12.
+  static const MotorControllerBounds kTalonBounds;
+
+  // Helper methods for filling out values_.
+  // All channels are the 1-indexed numbers that usually go into WPILib.
+  void SetSolenoid(uint8_t channel, bool set);
+  void SetPWMOutput(uint8_t channel, double value,
+                    const MotorControllerBounds &bounds);
+  void DisablePWMOutput(uint8_t channel);
+  void SetDigitalOutput(uint8_t channel, bool value);
+
+  // The data that's going to get sent over.
+  // Gets reset (everything set so that it won't do anything) each time through.
+  NetworkRobotMotors values_;
+
+ private:
+  // Subclasses need to actually fill out values_ here.
+  virtual void RunIteration() = 0;
+
+  SendSocket socket_;
+};
+
+}  // namespace aos
+
+#endif
diff --git a/aos/atom_code/output/motor_output_test.cc b/aos/atom_code/output/motor_output_test.cc
new file mode 100644
index 0000000..1e8d5fb
--- /dev/null
+++ b/aos/atom_code/output/motor_output_test.cc
@@ -0,0 +1,21 @@
+#include "gtest/gtest.h"
+
+#include "aos/atom_code/output/motor_output.h"
+
+namespace aos {
+namespace testing {
+
+TEST(MotorControllerBoundsTest, Limits) {
+  MotorOutput::MotorControllerBounds test_bounds
+      {200, 135, 128, 126, 110};
+  EXPECT_EQ(test_bounds.Map(1.0), test_bounds.kMax);
+  EXPECT_EQ(test_bounds.Map(-1.0), test_bounds.kMin);
+  EXPECT_EQ(test_bounds.Map(0.0), test_bounds.kCenter);
+  EXPECT_EQ(test_bounds.Map(0.55), 171);
+  EXPECT_EQ(test_bounds.Map(0.5), 168);
+  EXPECT_EQ(test_bounds.Map(0.45), 164);
+  EXPECT_EQ(test_bounds.Map(-0.5), 118);
+}
+
+}  // namespace testing
+}  // namespace aos
diff --git a/aos/atom_code/output/output.gyp b/aos/atom_code/output/output.gyp
index d41fe7d..8f0e47d 100644
--- a/aos/atom_code/output/output.gyp
+++ b/aos/atom_code/output/output.gyp
@@ -9,13 +9,13 @@
         'ctemplate_cache.cc',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
         '<(EXTERNALS):libevent',
         '<(EXTERNALS):ctemplate',
         '<(AOS)/common/common.gyp:once',
+        '<(AOS)/common/common.gyp:scoped_fd',
+        '<(AOS)/build/aos.gyp:logging',
       ],
       'export_dependent_settings': [
-# Our headers #include headers from both of these.
         '<(EXTERNALS):libevent',
         '<(EXTERNALS):ctemplate',
       ],
@@ -24,13 +24,28 @@
       'target_name': 'motor_output',
       'type': 'static_library',
       'sources': [
-        'MotorOutput.cpp',
+        'motor_output.cc',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/common/network/network.gyp:socket',
+        '<(AOS)/common/common.gyp:timing',
+        '<(EXTERNALS):WPILib-NetworkRobotValues',
+        '<(AOS)/build/aos.gyp:logging',
       ],
       'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/common/network/network.gyp:socket',
+        '<(EXTERNALS):WPILib-NetworkRobotValues',
+      ],
+    },
+    {
+      'target_name': 'motor_output_test',
+      'type': 'executable',
+      'sources': [
+        'motor_output_test.cc',
+      ],
+      'dependencies': [
+        'motor_output',
+        '<(EXTERNALS):gtest',
       ],
     },
   ],
diff --git a/aos/atom_code/queue-tmpl.h b/aos/atom_code/queue-tmpl.h
index 3a8eea8..15b8608 100644
--- a/aos/atom_code/queue-tmpl.h
+++ b/aos/atom_code/queue-tmpl.h
@@ -5,7 +5,7 @@
   assert(msg_ != NULL);
   msg_->SetTimeToNow();
   assert(queue_ != NULL);
-  bool return_value = aos_queue_write_msg_free(queue_, msg_, OVERRIDE) == 0;
+  bool return_value = queue_->WriteMessage(msg_, RawQueue::kOverride);
   msg_ = NULL;
   return return_value;
 }
@@ -15,7 +15,7 @@
   assert(msg_ != NULL);
   msg_->SetTimeToNow();
   assert(queue_ != NULL);
-  bool return_value = aos_queue_write_msg_free(queue_, msg_, BLOCK) == 0;
+  bool return_value = queue_->WriteMessage(msg_, RawQueue::kBlock);
   msg_ = NULL;
   return return_value;
 }
@@ -23,7 +23,7 @@
 template <class T>
 void ScopedMessagePtr<T>::reset(T *msg) {
   if (queue_ != NULL && msg_ != NULL) {
-    aos_queue_free_msg(queue_, msg_);
+    queue_->FreeMessage(msg_);
   }
   msg_ = msg;
 }
@@ -81,13 +81,12 @@
     assert(msg_ != NULL);
     assert(queue_ != NULL);
     msg_->SetTimeToNow();
-    T *shm_msg = static_cast<T *>(aos_queue_get_msg(queue_));
+    T *shm_msg = static_cast<T *>(queue_->GetMessage());
     if (shm_msg == NULL) {
       return false;
     }
     *shm_msg = *msg_;
-    bool return_value =
-        aos_queue_write_msg_free(queue_, shm_msg, OVERRIDE) == 0;
+    bool return_value = queue_->WriteMessage(shm_msg, RawQueue::kOverride);
     reset();
     return return_value;
   }
@@ -100,12 +99,12 @@
     assert(msg_ != NULL);
     assert(queue_ != NULL);
     msg_->SetTimeToNow();
-    T *shm_msg = static_cast<T *>(aos_queue_get_msg(queue_));
+    T *shm_msg = static_cast<T *>(queue_->GetMessage());
     if (shm_msg == NULL) {
       return false;
     }
     *shm_msg = *msg_;
-    bool return_value = aos_queue_write_msg_free(queue_, shm_msg, BLOCK) == 0;
+    bool return_value = queue_->WriteMessage(shm_msg, RawQueue::kBlock);
     reset();
     return return_value;
   }
@@ -145,7 +144,7 @@
   friend class aos::SafeMessageBuilder<T>;
 
   // Only Queue should be able to build a message pointer.
-  SafeScopedMessagePtr(aos_queue *queue)
+  SafeScopedMessagePtr(RawQueue *queue)
       : queue_(queue), msg_(new T()) {}
 
   // Sets the pointer to msg, freeing the old value if it was there.
@@ -159,10 +158,10 @@
   }
 
   // Sets the queue that owns this message.
-  void set_queue(aos_queue *queue) { queue_ = queue; }
+  void set_queue(RawQueue *queue) { queue_ = queue; }
 
   // The queue that the message is a part of.
-  aos_queue *queue_;
+  RawQueue *queue_;
   // The message or NULL.
   T *msg_;
 };
@@ -170,22 +169,30 @@
 template <class T>
 void Queue<T>::Init() {
   if (queue_ == NULL) {
-    // Signature of the message.
-    aos_type_sig kQueueSignature{sizeof(T), T::kHash, T::kQueueLength};
-
-    queue_ = aos_fetch_queue(queue_name_, &kQueueSignature);
+    queue_ = RawQueue::Fetch(queue_name_, sizeof(T),
+                             static_cast<int>(T::kHash),
+                             T::kQueueLength);
     queue_msg_.set_queue(queue_);
   }
 }
 
 template <class T>
+void Queue<T>::Clear() {
+  if (queue_ != NULL) {
+    queue_msg_.reset();
+    queue_ = NULL;
+    queue_msg_.set_queue(NULL);
+  }
+}
+
+template <class T>
 bool Queue<T>::FetchNext() {
   Init();
-  // TODO(aschuh): Use aos_queue_read_msg_index so that multiple readers
+  // TODO(aschuh): Use RawQueue::ReadMessageIndex so that multiple readers
   // reading don't randomly get only part of the messages.
   // Document here the tradoffs that are part of each method.
-  const T *msg = static_cast<const T *>(aos_queue_read_msg(queue_,
-        NON_BLOCK));
+  const T *msg = static_cast<const T *>(
+      queue_->ReadMessage(RawQueue::kNonBlock));
   // Only update the internal pointer if we got a new message.
   if (msg != NULL) {
     queue_msg_.reset(msg);
@@ -196,7 +203,7 @@
 template <class T>
 bool Queue<T>::FetchNextBlocking() {
   Init();
-  const T *msg = static_cast<const T *>(aos_queue_read_msg(queue_, BLOCK));
+  const T *msg = static_cast<const T *>(queue_->ReadMessage(RawQueue::kBlock));
   queue_msg_.reset(msg);
   assert (msg != NULL);
   return true;
@@ -205,16 +212,16 @@
 template <class T>
 bool Queue<T>::FetchLatest() {
   Init();
-  const T *msg = static_cast<const T *>(aos_queue_read_msg(queue_,
-        FROM_END | NON_BLOCK | PEEK));
+  const T *msg = static_cast<const T *>(queue_->ReadMessage(
+          RawQueue::kFromEnd | RawQueue::kNonBlock | RawQueue::kPeek));
   // Only update the internal pointer if we got a new message.
   if (msg != NULL && msg != queue_msg_.get()) {
     queue_msg_.reset(msg);
     return true;
   }
-  // The message has to get freed if we didn't use it (and aos_queue_free_msg is
-  // ok to call on NULL).
-  aos_queue_free_msg(queue_, msg);
+  // The message has to get freed if we didn't use it (and RawQueue::FreeMessage
+  // is ok to call on NULL).
+  queue_->FreeMessage(msg);
   return false;
 }
 
@@ -234,7 +241,7 @@
 
 template <class T>
 T *Queue<T>::MakeRawMessage() {
-  T *ret = static_cast<T *>(aos_queue_get_msg(queue_));
+  T *ret = static_cast<T *>(queue_->GetMessage());
   assert(ret != NULL);
   return ret;
 }
diff --git a/aos/atom_code/starter/netconsole.cc b/aos/atom_code/starter/netconsole.cc
new file mode 100644
index 0000000..258afd8
--- /dev/null
+++ b/aos/atom_code/starter/netconsole.cc
@@ -0,0 +1,209 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <sys/stat.h>
+#include <assert.h>
+
+#include "aos/common/logging/logging_impl.h"
+#include "aos/common/util.h"
+#include "aos/atom_code/configuration.h"
+
+namespace aos {
+namespace {
+
+struct FDsToCopy {
+  const int input;
+  const int output;
+
+  const struct sockaddr_in *const interface_address;
+};
+
+void *FDCopyThread(void *to_copy_in) {
+  FDsToCopy *to_copy = static_cast<FDsToCopy *>(to_copy_in);
+
+  char buffer[32768];
+  ssize_t position = 0;
+  while (true) {
+    assert(position >= 0);
+    assert(position <= static_cast<ssize_t>(sizeof(buffer)));
+    if (position != sizeof(buffer)) {
+      ssize_t read_bytes;
+      bool good_data = true;
+      if (to_copy->interface_address != NULL) {
+        char control_buffer[0x100];
+        struct msghdr header;
+        memset(static_cast<void *>(&header), 0, sizeof(header));
+        header.msg_control = control_buffer;
+        header.msg_controllen = sizeof(control_buffer);
+        struct iovec iovecs[1];
+        iovecs[0].iov_base = buffer + position;
+        iovecs[0].iov_len = position - sizeof(buffer);
+        header.msg_iov = iovecs;
+        header.msg_iovlen = sizeof(iovecs) / sizeof(iovecs[0]);
+        read_bytes = recvmsg(to_copy->input, &header, 0);
+        if (read_bytes != -1) {
+          for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(&header);
+               cmsg != NULL;
+               cmsg = CMSG_NXTHDR(&header, cmsg)) {
+            if (cmsg->cmsg_level == IPPROTO_IP &&
+                cmsg->cmsg_type == IP_PKTINFO) {
+              unsigned char *data = CMSG_DATA(cmsg);
+              struct in_pktinfo *pktinfo;
+              memcpy(&pktinfo, &data, sizeof(void *));
+              good_data = pktinfo->ipi_spec_dst.s_addr ==
+                  to_copy->interface_address->sin_addr.s_addr;
+            }
+          }
+        }
+      } else {
+        read_bytes = read(to_copy->input,
+                          buffer + position, position - sizeof(buffer));
+      }
+      if (read_bytes == -1) {
+        if (errno != EINTR) {
+          LOG(FATAL, "read(%d, %p, %zd) failed with %d: %s\n",
+              to_copy->input, buffer + position, position - sizeof(buffer),
+              errno, strerror(errno));
+        }
+      } else if (read_bytes == 0 && to_copy->interface_address == NULL) {
+        // read(2) says that this means EOF
+        return NULL;
+      }
+      if (good_data) {
+        position += read_bytes;
+      }
+    }
+
+    assert(position >= 0);
+    assert(position <= static_cast<ssize_t>(sizeof(buffer)));
+    if (position > 0) {
+      ssize_t sent_bytes = write(to_copy->output, buffer, position);
+      if (sent_bytes == -1) {
+        if (errno != EINTR) {
+          LOG(FATAL, "write(%d, %p, %zd) failed with %d: %s\n",
+              to_copy->output, buffer, position, errno, strerror(errno));
+        }
+      } else if (sent_bytes != 0) {
+        if (sent_bytes == position) {
+          position = 0;
+        } else {
+          memmove(buffer, buffer + sent_bytes, position - sent_bytes);
+          position -= sent_bytes;
+        }
+      }
+    }
+  }
+}
+
+int NetconsoleMain(int argc, char **argv) {
+  logging::Init();
+
+  int input, output;
+  if (argc > 1) {
+    output = open(argv[1], O_APPEND | O_CREAT | O_WRONLY | O_TRUNC, 0666);
+    if (output == -1) {
+      if (errno == EACCES || errno == ELOOP || errno == ENOSPC ||
+          errno == ENOTDIR || errno == EROFS || errno == ETXTBSY) {
+        fprintf(stderr, "Opening output file '%s' failed because of %s.\n",
+                argv[1], strerror(errno));
+        exit(EXIT_FAILURE);
+      }
+      LOG(FATAL, "open('%s', stuff, 0644) failed with %d: %s\n", argv[1],
+          errno, strerror(errno));
+    }
+    fprintf(stderr, "Writing output to '%s'.\n", argv[1]);
+    input = -1;
+    fprintf(stderr, "Not taking any input.\n");
+  } else {
+    output = STDOUT_FILENO;
+    fprintf(stderr, "Writing output to stdout.\n");
+    input = STDIN_FILENO;
+    fprintf(stderr, "Reading stdin.\n");
+  }
+
+  int on = 1;
+
+  int from_crio = socket(AF_INET, SOCK_DGRAM, 0);
+  if (from_crio == -1) {
+    LOG(FATAL, "socket(AF_INET, SOCK_DGRAM, 0) failed with %d: %s\n",
+        errno, strerror(errno));
+  }
+  if (setsockopt(from_crio, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
+    LOG(FATAL, "SOL_SOCKET::SO_REUSEADDR=%d(%d) failed with %d: %s\n",
+        on, from_crio, errno, strerror(errno));
+  }
+  if (setsockopt(from_crio, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) == -1) {
+    LOG(FATAL, "SOL_SOCKET::SO_BROADCAST=%d(%d) failed with %d: %s\n",
+        on, from_crio, errno, strerror(errno));
+  }
+  if (setsockopt(from_crio, IPPROTO_IP, IP_PKTINFO, &on, sizeof(on)) == -1) {
+    LOG(FATAL, "IPROTO_IP::IP_PKTINFO=%d(%d) failed with %d: %s\n",
+        on, from_crio, errno, strerror(errno));
+  }
+  union {
+    struct sockaddr_in in;
+    struct sockaddr addr;
+  } address;
+  address.in.sin_family = AF_INET;
+  address.in.sin_port = htons(6666);
+  address.in.sin_addr.s_addr = INADDR_ANY;
+  if (bind(from_crio, &address.addr, sizeof(address)) == -1) {
+    LOG(FATAL, "bind(%d, %p, %zu) failed with %d: %s\n",
+        from_crio, &address.addr, sizeof(address), errno, strerror(errno));
+  }
+
+  pthread_t input_thread, output_thread;
+
+  address.in.sin_addr = ::aos::configuration::GetOwnIPAddress();
+  ::aos::util::SetLastSegment(&address.in.sin_addr, NetworkAddress::kCRIO);
+  fprintf(stderr, "Using cRIO IP %s.\n",
+          inet_ntoa(address.in.sin_addr));
+
+  if (input != -1) {
+    int to_crio = socket(AF_INET, SOCK_DGRAM, 0);
+    if (to_crio == -1) {
+      LOG(FATAL, "socket(AF_INET, SOCK_DGRAM, 0) failed with %d: %s\n",
+          errno, strerror(errno));
+    }
+    if (setsockopt(to_crio, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
+      LOG(FATAL, "SOL_SOCKET::SO_REUSEADDR=%d(%d) failed with %d: %s\n",
+          on, to_crio, errno, strerror(errno));
+    }
+    address.in.sin_port = htons(6668);
+    if (connect(to_crio, &address.addr, sizeof(address)) == -1) {
+      LOG(FATAL, "connect(%d, %p, %zu) failed with %d: %s\n",
+          to_crio, &address.addr, sizeof(address), errno, strerror(errno));
+    }
+    FDsToCopy input_fds{input, to_crio, NULL};
+    if (pthread_create(&input_thread, NULL, FDCopyThread, &input_fds) == -1) {
+      LOG(FATAL, "pthread_create(%p, NULL, %p, %p) failed with %d: %s\n",
+          &input_thread, FDCopyThread, &input_fds, errno, strerror(errno));
+    }
+  }
+
+  address.in.sin_addr = ::aos::configuration::GetOwnIPAddress();
+  FDsToCopy output_fds{from_crio, output, &address.in};
+  if (pthread_create(&output_thread, NULL, FDCopyThread, &output_fds) == -1) {
+    LOG(FATAL, "pthread_create(%p, NULL, %p, %p) failed with %d: %s\n",
+        &output_thread, FDCopyThread, &output_fds, errno, strerror(errno));
+  }
+
+  // input_thread will finish when stdin gets an EOF
+  if (pthread_join((input == -1) ? output_thread : input_thread, NULL) == -1) {
+    LOG(FATAL, "pthread_join(a_thread, NULL) failed with %d: %s\n",
+        errno, strerror(errno));
+  }
+  exit(EXIT_SUCCESS);
+}
+
+}  // namespace
+}  // namespace aos
+
+int main(int argc, char **argv) {
+  return ::aos::NetconsoleMain(argc, argv);
+}
diff --git a/aos/atom_code/starter/starter.cc b/aos/atom_code/starter/starter.cc
new file mode 100644
index 0000000..bef4e73
--- /dev/null
+++ b/aos/atom_code/starter/starter.cc
@@ -0,0 +1,786 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/inotify.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <assert.h>
+#include <signal.h>
+#include <stdint.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <inttypes.h>
+
+#include <map>
+#include <functional>
+#include <deque>
+#include <fstream>
+#include <queue>
+#include <list>
+#include <string>
+#include <vector>
+#include <memory>
+
+#include <event2/event.h>
+
+#include "aos/common/logging/logging.h"
+#include "aos/common/logging/logging_impl.h"
+#include "aos/atom_code/init.h"
+#include "aos/common/unique_malloc_ptr.h"
+#include "aos/common/time.h"
+#include "aos/common/once.h"
+
+// This is the main piece of code that starts all of the rest of the code and
+// restarts it when the binaries are modified.
+//
+// Throughout, the code is not terribly concerned with thread safety because
+// there is only 1 thread. It does some setup and then lets inotify run things
+// when appropriate.
+//
+// NOTE: This program should never exit nicely. It catches all nice attempts to
+// exit, forwards them to all of the children that it has started, waits for
+// them to exit nicely, and then SIGKILLs anybody left (which will always
+// include itself).
+
+using ::std::unique_ptr;
+
+namespace aos {
+namespace starter {
+
+// TODO(brians): split out the c++ libevent wrapper stuff into its own file(s)
+class EventBaseDeleter {
+ public:
+  void operator()(event_base *base) {
+    if (base == NULL) return;
+    event_base_free(base);
+  }
+};
+typedef unique_ptr<event_base, EventBaseDeleter> EventBaseUniquePtr;
+EventBaseUniquePtr libevent_base;
+
+class EventDeleter {
+ public:
+  void operator()(event *evt) {
+    if (evt == NULL) return;
+    if (event_del(evt) != 0) {
+      LOG(WARNING, "event_del(%p) failed\n", evt);
+    }
+  }
+};
+typedef unique_ptr<event, EventDeleter> EventUniquePtr;
+
+// Watches a file path for modifications. Once created, keeps watching until
+// destroyed or RemoveWatch() is called.
+// TODO(brians): split this out into its own file + tests
+class FileWatch {
+ public:
+  // Will call callback(value) when filename is modified.
+  // If value is NULL, then a pointer to this object will be passed instead.
+  //
+  // Watching for file creations is slightly different. To do that, pass true
+  // as create, the directory where the file will be created for filename, and
+  // the name of the file (without directory name) for check_filename.
+  FileWatch(std::string filename,
+            std::function<void(void *)> callback,
+            void *value,
+            bool create = false,
+            std::string check_filename = "")
+      : filename_(filename),
+        callback_(callback),
+        value_(value),
+        create_(create),
+        check_filename_(check_filename),
+        watch_(-1) {
+    init_once.Get();
+
+    CreateWatch();
+  }
+  // Cleans up everything.
+  ~FileWatch() {
+    if (watch_ != -1) {
+      RemoveWatch();
+    }
+  }
+
+  // After calling this method, this object won't really be doing much of
+  // anything besides possibly running its callback or something.
+  void RemoveWatch() {
+    assert(watch_ != -1);
+
+    if (inotify_rm_watch(notify_fd, watch_) == -1) {
+      LOG(WARNING, "inotify_rm_watch(%d, %d) failed with %d: %s\n",
+          notify_fd, watch_, errno, strerror(errno));
+    }
+
+    RemoveWatchFromMap();
+  }
+
+ private:
+  // Performs the static initialization. Called by init_once from the
+  // constructor.
+  static void *Init() {
+    notify_fd = inotify_init1(IN_CLOEXEC);
+    EventUniquePtr notify_event(event_new(libevent_base.get(), notify_fd,
+                                          EV_READ | EV_PERSIST,
+                                          FileWatch::INotifyReadable, NULL));
+    event_add(notify_event.release(), NULL);
+    return NULL;
+  }
+
+  void RemoveWatchFromMap() {
+    if (watchers[watch_] != this) {
+      LOG(WARNING, "watcher for %s (%p) didn't find itself in the map\n",
+          filename_.c_str(), this);
+    } else {
+      watchers.erase(watch_);
+    }
+    LOG(DEBUG, "removed watch ID %d\n", watch_);
+    watch_ = -1;
+  }
+
+  void CreateWatch() {
+    assert(watch_ == -1);
+    watch_ = inotify_add_watch(notify_fd, filename_.c_str(),
+                               create_ ? IN_CREATE : (IN_ATTRIB |
+                                                     IN_MODIFY |
+                                                     IN_DELETE_SELF |
+                                                     IN_MOVE_SELF));
+    if (watch_ == -1) {
+      LOG(FATAL, "inotify_add_watch(%d, %s,"
+          " %s ? IN_CREATE : (IN_ATTRIB | IN_MODIFY)) failed with %d: %s\n",
+          notify_fd, filename_.c_str(), create_ ? "true" : "false",
+          errno, strerror(errno));
+    }
+    watchers[watch_] = this;
+    LOG(DEBUG, "watch for %s is %d\n", filename_.c_str(), watch_);
+  }
+
+  // This gets set up as the callback for EV_READ on the inotify file
+  // descriptor. It calls FileNotified on the appropriate instance.
+  static void INotifyReadable(int /*fd*/, short /*events*/, void *) {
+    unsigned int to_read;
+    // Use FIONREAD to figure out how many bytes there are to read.
+    if (ioctl(notify_fd, FIONREAD, &to_read) < 0) {
+      LOG(FATAL, "FIONREAD(%d, %p) failed with %d: %s\n",
+          notify_fd, &to_read, errno, strerror(errno));
+    }
+    inotify_event *notifyevt = static_cast<inotify_event *>(malloc(to_read));
+    const char *end = reinterpret_cast<char *>(notifyevt) + to_read;
+    aos::unique_c_ptr<inotify_event> freer(notifyevt);
+
+    ssize_t ret = read(notify_fd, notifyevt, to_read);
+    if (ret < 0) {
+      LOG(FATAL, "read(%d, %p, %u) failed with %d: %s\n",
+          notify_fd, notifyevt, to_read, errno, strerror(errno));
+    }
+    if (static_cast<size_t>(ret) != to_read) {
+      LOG(ERROR, "read(%d, %p, %u) returned %zd instead of %u\n",
+          notify_fd, notifyevt, to_read, ret, to_read);
+      return;
+    }
+
+    // Keep looping through until we get to the end because inotify does return
+    // multiple events at once.
+    while (reinterpret_cast<char *>(notifyevt) < end) {
+      if (watchers.count(notifyevt->wd) != 1) {
+        LOG(WARNING, "couldn't find whose watch ID %d is\n", notifyevt->wd);
+      } else {
+        LOG(DEBUG, "mask=%" PRIu32 "\n", notifyevt->mask);
+        // If it was something that means the file got deleted.
+        if (notifyevt->mask & (IN_MOVE_SELF | IN_DELETE_SELF | IN_IGNORED)) {
+          watchers[notifyevt->wd]->WatchDeleted();
+        } else {
+          watchers[notifyevt->wd]->FileNotified((notifyevt->len > 0) ?
+                                                notifyevt->name : NULL);
+        }
+      }
+
+      notifyevt = reinterpret_cast<inotify_event *>(
+          __builtin_assume_aligned(reinterpret_cast<char *>(notifyevt) +
+                                       sizeof(*notifyevt) + notifyevt->len,
+                                   alignof(notifyevt)));
+    }
+  }
+
+  // INotifyReadable calls this method whenever the watch for our file gets
+  // removed somehow.
+  void WatchDeleted() {
+    LOG(DEBUG, "watch for %s deleted\n", filename_.c_str());
+    RemoveWatchFromMap();
+    CreateWatch();
+  }
+
+  // INotifyReadable calls this method whenever the watch for our file triggers.
+  void FileNotified(const char *filename) {
+    assert(watch_ != -1);
+    LOG(DEBUG, "got a notification for %s\n", filename_.c_str());
+
+    if (!check_filename_.empty()) {
+      if (filename == NULL) {
+        return;
+      }
+      if (std::string(filename) != check_filename_) {
+        return;
+      }
+    }
+
+    callback_((value_ == NULL) ? this : value_);
+  }
+
+  // To make sure that Init gets called exactly once.
+  static ::aos::Once<void> init_once;
+
+  const std::string filename_;
+  const std::function<void(void *)> callback_;
+  void *const value_;
+  const bool create_;
+  std::string check_filename_;
+
+  // The watch descriptor or -1 if we don't have one any more.
+  int watch_;
+
+  // Map from watch IDs to instances of this class.
+  // <https://patchwork.kernel.org/patch/73192/> ("inotify: do not reuse watch
+  // descriptors") says they won't get reused, but that shouldn't be counted on
+  // because we might have a modified/different version/whatever kernel.
+  static std::map<int, FileWatch *> watchers;
+  // The inotify(7) file descriptor.
+  static int notify_fd;
+
+  DISALLOW_COPY_AND_ASSIGN(FileWatch);
+};
+::aos::Once<void> FileWatch::init_once(FileWatch::Init);
+std::map<int, FileWatch *> FileWatch::watchers;
+int FileWatch::notify_fd;
+
+// Runs the given command and returns its first line of output (not including
+// the \n). LOG(FATAL)s if the command has an exit status other than 0 or does
+// not print out an entire line.
+std::string RunCommand(std::string command) {
+  // popen(3) might fail and not set it.
+  errno = 0;
+  FILE *pipe = popen(command.c_str(), "r");
+  if (pipe == NULL) {
+    LOG(FATAL, "popen(\"%s\", \"r\") failed with %d: %s\n",
+        command.c_str(), errno, strerror(errno));
+  }
+
+  // result_size is how many bytes result is currently allocated to.
+  size_t result_size = 128, read = 0;
+  unique_c_ptr<char> result(static_cast<char *>(malloc(result_size)));
+  while (true) {
+    // If we filled up the buffer, then realloc(3) it bigger.
+    if (read == result_size) {
+      result_size *= 2;
+      void *new_result = realloc(result.get(), result_size);
+      if (new_result == NULL) {
+        LOG(FATAL, "realloc(%p, %zd) failed because of %d: %s\n",
+            result.get(), result_size, errno, strerror(errno));
+      } else {
+        result.release();
+        result = unique_c_ptr<char>(static_cast<char *>(new_result));
+      }
+    }
+
+    size_t ret = fread(result.get() + read, 1, result_size - read, pipe);
+    // If the read didn't fill up the whole buffer, check to see if it was
+    // because of an error.
+    if (ret < result_size - read) {
+      if (ferror(pipe)) {
+        LOG(FATAL, "couldn't finish reading output of \"%s\"\n",
+            command.c_str());
+      }
+    }
+    read += ret;
+    if (read > 0 && result.get()[read - 1] == '\n') {
+      break;
+    }
+
+    if (feof(pipe)) {
+      LOG(FATAL, "`%s` failed. didn't print a whole line\n", command.c_str());
+    }
+  }
+
+  // Get rid of the first \n and anything after it.
+  *strchrnul(result.get(), '\n') = '\0';
+
+  int child_status = pclose(pipe);
+  if (child_status == -1) {
+    LOG(FATAL, "pclose(%p) failed with %d: %s\n", pipe,
+        errno, strerror(errno));
+  }
+
+  if (child_status != 0) {
+    LOG(FATAL, "`%s` failed. return %d\n", command.c_str(), child_status);
+  }
+
+  return std::string(result.get());
+}
+
+// Will call callback(arg) after time.
+void Timeout(time::Time time, void (*callback)(int, short, void *), void *arg) {
+  EventUniquePtr timeout(evtimer_new(libevent_base.get(), callback, arg));
+  struct timeval time_timeval = time.ToTimeval();
+  evtimer_add(timeout.release(), &time_timeval);
+}
+
+// Represents a child process. It will take care of restarting itself etc.
+class Child {
+ public:
+  // command is the (space-separated) command to run and its arguments.
+  Child(const std::string &command) : pid_(-1),
+        restart_timeout_(
+            evtimer_new(libevent_base.get(), StaticDoRestart, this)),
+        stat_at_start_valid_(false) {
+    const char *start, *end;
+    start = command.c_str();
+    while (true) {
+      end = strchrnul(start, ' ');
+      args_.push_back(std::string(start, end - start));
+      start = end + 1;
+      if (*end == '\0') {
+        break;
+      }
+    }
+
+    original_binary_ = RunCommand("which " + args_[0]);
+    binary_ = original_binary_ + ".stm";
+
+    watcher_ = unique_ptr<FileWatch>(
+        new FileWatch(original_binary_, StaticFileModified, this));
+
+    Start();
+  }
+
+  pid_t pid() { return pid_; }
+
+  // This gets called whenever the actual process dies and should (probably) be
+  // restarted.
+  void ProcessDied() {
+    pid_ = -1;
+    restarts_.push(time::Time::Now());
+    if (restarts_.size() > kMaxRestartsNumber) {
+      time::Time oldest = restarts_.front();
+      restarts_.pop();
+      if ((time::Time::Now() - oldest) <= kMaxRestartsTime) {
+        LOG(WARNING, "process %s getting restarted too often\n", name());
+        Timeout(kResumeWait, StaticStart, this);
+        return;
+      }
+    }
+    Start();
+  }
+
+  // Returns a name for logging purposes.
+  const char *name() {
+    return args_[0].c_str();
+  }
+
+ private:
+  struct CheckDiedStatus {
+    Child *self;
+    pid_t old_pid;
+  };
+
+  // How long to wait for a child to die nicely.
+  static constexpr time::Time kProcessDieTime = time::Time::InSeconds(0.75);
+
+  // How long to wait after the file is modified to restart it.
+  // This is important because some programs like modifying the binaries by
+  // writing them in little bits, which results in attempting to start partial
+  // binaries without this.
+  static constexpr time::Time kRestartWaitTime = time::Time::InSeconds(1.5);
+
+  // Only kMaxRestartsNumber restarts will be allowed in kMaxRestartsTime.
+  static constexpr time::Time kMaxRestartsTime = time::Time::InSeconds(4);
+  static const size_t kMaxRestartsNumber = 3;
+  // How long to wait if it gets restarted too many times.
+  static constexpr time::Time kResumeWait = time::Time::InSeconds(5);
+
+  static void StaticFileModified(void *self) {
+    static_cast<Child *>(self)->FileModified();
+  }
+
+  void FileModified() {
+    LOG(DEBUG, "file for %s modified\n", name());
+    struct timeval restart_time_timeval = kRestartWaitTime.ToTimeval();
+    // This will reset the timeout again if it hasn't run yet.
+    if (evtimer_add(restart_timeout_.get(), &restart_time_timeval) != 0) {
+      LOG(FATAL, "evtimer_add(%p, %p) failed\n",
+          restart_timeout_.get(), &restart_time_timeval);
+    }
+  }
+
+  static void StaticDoRestart(int, short, void *self) {
+    static_cast<Child *>(self)->DoRestart();
+  }
+
+  // Called after somebody else has finished modifying the file.
+  void DoRestart() {
+    if (stat_at_start_valid_) {
+      struct stat current_stat;
+      if (stat(original_binary_.c_str(), &current_stat) == -1) {
+        LOG(FATAL, "stat(%s, %p) failed with %d: %s\n",
+            original_binary_.c_str(), &current_stat, errno, strerror(errno));
+      }
+      if (current_stat.st_mtime == stat_at_start_.st_mtime) {
+        LOG(DEBUG, "ignoring trigger for %s because mtime didn't change\n",
+            name());
+        return;
+      }
+    }
+
+    if (pid_ != -1) {
+      LOG(DEBUG, "sending SIGTERM to child %d to restart it\n", pid_);
+      if (kill(pid_, SIGTERM) == -1) {
+        LOG(WARNING, "kill(%d, SIGTERM) failed with %d: %s\n",
+            pid_, errno, strerror(errno));
+      }
+      CheckDiedStatus *status = new CheckDiedStatus();
+      status->self = this;
+      status->old_pid = pid_;
+      Timeout(kProcessDieTime, StaticCheckDied, status);
+    } else {
+      LOG(WARNING, "%s restart attempted but not running\n", name());
+    }
+  }
+
+  static void StaticCheckDied(int, short, void *status_in) {
+    CheckDiedStatus *status = static_cast<CheckDiedStatus *>(status_in);
+    status->self->CheckDied(status->old_pid);
+    delete status;
+  }
+
+  // Checks to see if the child using the PID old_pid is still running.
+  void CheckDied(pid_t old_pid) {
+    if (pid_ == old_pid) {
+      LOG(WARNING, "child %d refused to die\n", old_pid);
+      if (kill(old_pid, SIGKILL) == -1) {
+        LOG(WARNING, "kill(%d, SIGKILL) failed with %d: %s\n",
+            old_pid, errno, strerror(errno));
+      }
+    }
+  }
+
+  static void StaticStart(int, short, void *self) {
+    static_cast<Child *>(self)->Start();
+  }
+
+  // Actually starts the child.
+  void Start() {
+    if (pid_ != -1) {
+      LOG(WARNING, "calling Start() but already have child %d running\n",
+          pid_);
+      if (kill(pid_, SIGKILL) == -1) {
+        LOG(WARNING, "kill(%d, SIGKILL) failed with %d: %s\n",
+            pid_, errno, strerror(errno));
+        return;
+      }
+      pid_ = -1;
+    }
+
+    // Remove the name that we run from (ie from a previous execution) and then
+    // hard link the real filename to it.
+    if (unlink(binary_.c_str()) != 0 && errno != ENOENT) {
+      LOG(FATAL, "removing %s failed because of %d: %s\n",
+          binary_.c_str(), errno, strerror(errno));
+    }
+    if (link(original_binary_.c_str(), binary_.c_str()) != 0) {
+      LOG(FATAL, "link('%s', '%s') failed because of %d: %s\n",
+          original_binary_.c_str(), binary_.c_str(), errno, strerror(errno));
+    }
+
+    if (stat(original_binary_.c_str(), &stat_at_start_) == -1) {
+      LOG(FATAL, "stat(%s, %p) failed with %d: %s\n",
+          original_binary_.c_str(), &stat_at_start_, errno, strerror(errno));
+    }
+    stat_at_start_valid_ = true;
+
+    if ((pid_ = fork()) == 0) {
+      ssize_t args_size = args_.size();
+      const char **argv = new const char *[args_size + 1];
+      for (int i = 0; i < args_size; ++i) {
+        argv[i] = args_[i].c_str();
+      }
+      argv[args_size] = NULL;
+      // The const_cast is safe because no code that might care if it gets
+      // modified can run afterwards.
+      execv(binary_.c_str(), const_cast<char **>(argv));
+      LOG(FATAL, "execv(%s, %p) failed with %d: %s\n",
+          binary_.c_str(), argv, errno, strerror(errno));
+      _exit(EXIT_FAILURE);
+    }
+    if (pid_ == -1) {
+      LOG(FATAL, "forking to run \"%s\" failed with %d: %s\n",
+          binary_.c_str(), errno, strerror(errno));
+    }
+    LOG(DEBUG, "started \"%s\" successfully\n", binary_.c_str());
+  }
+
+  // A history of the times that this process has been restarted.
+  std::queue<time::Time, std::list<time::Time>> restarts_;
+
+  // The currently running child's PID or NULL.
+  pid_t pid_;
+
+  // All of the arguments (including the name of the binary).
+  std::deque<std::string> args_;
+
+  // The name of the real binary that we were told to run.
+  std::string original_binary_;
+  // The name of the file that we're actually running.
+  std::string binary_;
+
+  // Watches original_binary_.
+  unique_ptr<FileWatch> watcher_;
+
+  // An event that restarts after kRestartWaitTime.
+  EventUniquePtr restart_timeout_;
+
+  // Captured from the original file when we most recently started a new child
+  // process. Used to see if it actually changes or not.
+  struct stat stat_at_start_;
+  bool stat_at_start_valid_;
+
+  DISALLOW_COPY_AND_ASSIGN(Child);
+};
+
+constexpr time::Time Child::kProcessDieTime;
+constexpr time::Time Child::kRestartWaitTime;
+constexpr time::Time Child::kMaxRestartsTime;
+constexpr time::Time Child::kResumeWait;
+
+// This is where all of the Child instances except core live.
+std::vector<unique_ptr<Child>> children;
+// A global place to hold on to which child is core.
+unique_ptr<Child> core;
+
+// Kills off the entire process group (including ourself).
+void KillChildren(bool try_nice) {
+  if (try_nice) {
+    static const int kNiceStopSignal = SIGTERM;
+    static const time::Time kNiceWaitTime = time::Time::InSeconds(1);
+
+    // Make sure that we don't just nicely stop ourself...
+    sigset_t mask;
+    sigemptyset(&mask);
+    sigaddset(&mask, kNiceStopSignal);
+    sigprocmask(SIG_BLOCK, &mask, NULL);
+
+    kill(-getpid(), kNiceStopSignal);
+
+    fflush(NULL);
+    time::SleepFor(kNiceWaitTime);
+  }
+
+  // Send SIGKILL to our whole process group, which will forcibly terminate any
+  // of them that are still running (us for sure, maybe more too).
+  kill(-getpid(), SIGKILL);
+}
+
+void ExitHandler() {
+  KillChildren(true);
+}
+
+void KillChildrenSignalHandler(int signum) {
+  // If we get SIGSEGV or some other random signal who knows what's happening
+  // and we should just kill everybody immediately.
+  // This is a list of all of the signals that mean some form of "nicely stop".
+  KillChildren(signum == SIGHUP || signum == SIGINT || signum == SIGQUIT ||
+               signum == SIGABRT || signum == SIGPIPE || signum == SIGTERM ||
+               signum == SIGXCPU);
+}
+
+// Returns the currently running child with PID pid or an empty unique_ptr.
+const unique_ptr<Child> &FindChild(pid_t pid) {
+  for (auto it = children.begin(); it != children.end(); ++it) {
+    if (pid == (*it)->pid()) {
+      return *it;
+    }
+  }
+
+  if (pid == core->pid()) {
+    return core;
+  }
+
+  static const unique_ptr<Child> kNothing;
+  return kNothing;
+}
+
+// Gets set up as a libevent handler for SIGCHLD.
+// Handles calling Child::ProcessDied() on the appropriate one.
+void SigCHLDReceived(int /*fd*/, short /*events*/, void *) {
+  // In a while loop in case we miss any SIGCHLDs.
+  while (true) {
+    siginfo_t infop;
+    infop.si_pid = 0;
+    if (waitid(P_ALL, 0, &infop, WEXITED | WSTOPPED | WNOHANG) != 0) {
+      LOG(WARNING, "waitid failed with %d: %s", errno, strerror(errno));
+      continue;
+    }
+    // If there are no more child process deaths to process.
+    if (infop.si_pid == 0) {
+      return;
+    }
+
+    pid_t pid = infop.si_pid;
+    int status = infop.si_status;
+    const unique_ptr<Child> &child = FindChild(pid);
+    if (child) {
+      switch (infop.si_code) {
+        case CLD_EXITED:
+          LOG(WARNING, "child %d (%s) exited with status %d\n",
+              pid, child->name(), status);
+          break;
+        case CLD_DUMPED:
+          LOG(INFO, "child %d actually dumped core. "
+              "falling through to killed by signal case\n", pid);
+        case CLD_KILLED:
+          // If somebody (possibly us) sent it SIGTERM that means that they just
+          // want it to stop, so it stopping isn't a WARNING.
+          LOG((status == SIGTERM) ? DEBUG : WARNING,
+              "child %d (%s) was killed by signal %d (%s)\n",
+              pid, child->name(), status,
+              strsignal(status));
+          break;
+        case CLD_STOPPED:
+          LOG(WARNING, "child %d (%s) was stopped by signal %d "
+              "(giving it a SIGCONT(%d))\n",
+              pid, child->name(), status, SIGCONT);
+          kill(pid, SIGCONT);
+          continue;
+        default:
+          LOG(WARNING, "something happened to child %d (%s) (killing it)\n",
+              pid, child->name());
+          kill(pid, SIGKILL);
+          continue;
+      }
+    } else {
+      LOG(WARNING, "couldn't find a Child for pid %d\n", pid);
+      return;
+    }
+
+    if (child == core) {
+      LOG(FATAL, "core died\n");
+    }
+    child->ProcessDied();
+  }
+}
+
+// This is used for communicating the name of the file to read processes to
+// start from main to Run.
+const char *child_list_file;
+
+void Run(void *watch);
+void Main() {
+  logging::Init();
+  // TODO(brians): tell logging that using the root logger from here until we
+  // bring up shm is ok
+
+  if (setpgid(0 /*self*/, 0 /*make PGID the same as PID*/) != 0) {
+    LOG(FATAL, "setpgid(0, 0) failed with %d: %s\n", errno, strerror(errno));
+  }
+
+  // Make sure that we kill all children when we exit.
+  atexit(ExitHandler);
+  // Do it on some signals too (ones that we otherwise tend to receive and then
+  // leave all of our children going).
+  signal(SIGHUP, KillChildrenSignalHandler);
+  signal(SIGINT, KillChildrenSignalHandler);
+  signal(SIGQUIT, KillChildrenSignalHandler);
+  signal(SIGILL, KillChildrenSignalHandler);
+  signal(SIGABRT, KillChildrenSignalHandler);
+  signal(SIGFPE, KillChildrenSignalHandler);
+  signal(SIGSEGV, KillChildrenSignalHandler);
+  signal(SIGPIPE, KillChildrenSignalHandler);
+  signal(SIGTERM, KillChildrenSignalHandler);
+  signal(SIGBUS, KillChildrenSignalHandler);
+  signal(SIGXCPU, KillChildrenSignalHandler);
+  
+  libevent_base = EventBaseUniquePtr(event_base_new());
+
+  std::string core_touch_file = "/tmp/starter.";
+  core_touch_file += std::to_string(static_cast<intmax_t>(getpid()));
+  core_touch_file += ".core_touch_file";
+  if (system(("touch '" + core_touch_file + "'").c_str()) != 0) {
+    LOG(FATAL, "running `touch '%s'` failed\n", core_touch_file.c_str());
+  }
+  FileWatch core_touch_file_watch(core_touch_file, Run, NULL);
+  core = unique_ptr<Child>(
+      new Child("core " + core_touch_file));
+
+  FILE *pid_file = fopen("/tmp/starter.pid", "w");
+  if (pid_file == NULL) {
+    LOG(FATAL, "fopen(\"/tmp/starter.pid\", \"w\") failed with %d: %s\n",
+        errno, strerror(errno));
+  } else {
+    if (fprintf(pid_file, "%d", core->pid()) == -1) {
+      LOG(WARNING, "fprintf(%p, \"%%d\", %d) failed with %d: %s\n",
+          pid_file, core->pid(), errno, strerror(errno));
+    }
+    fclose(pid_file);
+  }
+
+  LOG(INFO, "waiting for %s to appear\n", core_touch_file.c_str());
+
+  event_base_dispatch(libevent_base.get());
+  LOG(FATAL, "event_base_dispatch(%p) returned\n", libevent_base.get());
+}
+
+// This is the callback for when core creates the file indicating that it has
+// started.
+void Run(void *watch) {
+  // Make it so it doesn't keep on seeing random changes in /tmp.
+  static_cast<FileWatch *>(watch)->RemoveWatch();
+
+  // It's safe now because core is up.
+  aos::InitNRT();
+
+  std::ifstream list_file(child_list_file);
+  
+  while (true) {
+    std::string child_name;
+    getline(list_file, child_name);
+    if ((list_file.rdstate() & std::ios_base::eofbit) != 0) {
+      break;
+    }
+    if (list_file.rdstate() != 0) {
+      LOG(FATAL, "reading input file %s failed\n", child_list_file);
+    }
+    children.push_back(unique_ptr<Child>(new Child(child_name)));
+  }
+
+  EventUniquePtr sigchld(event_new(libevent_base.get(), SIGCHLD,
+                                   EV_SIGNAL | EV_PERSIST,
+                                   SigCHLDReceived, NULL));
+  event_add(sigchld.release(), NULL);
+}
+
+const char *kArgsHelp = "[OPTION]... START_LIST\n"
+    "Start all of the robot code binaries in START_LIST.\n"
+    "\n"
+    "START_LIST is the file to read binaries (looked up on PATH) to run.\n"
+    "  --help        display this help and exit\n";
+void PrintHelp() {
+  fprintf(stderr, "Usage: %s %s", program_invocation_name, kArgsHelp);
+}
+
+}  // namespace starter
+}  // namespace aos
+
+int main(int argc, char *argv[]) {
+  if (argc != 2) {
+    aos::starter::PrintHelp();
+    exit(EXIT_FAILURE);
+  }
+  if (strcmp(argv[1], "--help") == 0) {
+    aos::starter::PrintHelp();
+    exit(EXIT_SUCCESS);
+  }
+
+  aos::starter::child_list_file = argv[1];
+
+  aos::starter::Main();
+}
diff --git a/aos/atom_code/starter/starter.cpp b/aos/atom_code/starter/starter.cpp
deleted file mode 100644
index 0cfddd5..0000000
--- a/aos/atom_code/starter/starter.cpp
+++ /dev/null
@@ -1,354 +0,0 @@
-#include "aos/atom_code/starter/starter.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/signalfd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/inotify.h>
-#include <sys/stat.h>
-
-#include "aos/aos_core.h"
-
-void niceexit(int status);
-
-pid_t start(const char *cmd, uint8_t times) {
-  char *which_cmd, *which_cmd_stm;
-  if (asprintf(&which_cmd, "which %s", cmd) == -1) {
-    LOG_IFINIT(ERROR, "creating \"which %s\" failed with %d: %s\n",
-               cmd, errno, strerror(errno));
-    niceexit(EXIT_FAILURE);
-  }
-  if (asprintf(&which_cmd_stm, "which %s.stm", cmd) == -1) {
-    LOG_IFINIT(ERROR, "creating \"which %s.stm\" failed with %d: %s\n",
-               cmd, errno, strerror(errno));
-    niceexit(EXIT_FAILURE);
-  }
-  FILE *which = popen(which_cmd, "r");
-  char exe[CMDLEN + 5], orig_exe[CMDLEN];
-  size_t ret;
-  if ((ret = fread(orig_exe, 1, sizeof(orig_exe), which)) == CMDLEN) {
-    LOG_IFINIT(ERROR, "`which %s` was too long. not starting '%s'\n", cmd, cmd);
-    return 0;
-  }
-  orig_exe[ret] = '\0';
-  if (pclose(which) == -1) {
-    LOG_IFINIT(WARNING, "pclose failed with %d: %s\n", errno, strerror(errno));
-  }
-  free(which_cmd);
-  if (strlen(orig_exe) == 0) { // which returned nothing; check if stm exists
-    LOG_IFINIT(INFO, "%s didn't exist. trying %s.stm\n", cmd, cmd);
-    FILE *which_stm = popen(which_cmd_stm, "r");
-    if ((ret = fread(orig_exe, 1, sizeof(orig_exe), which_stm)) == CMDLEN) {
-      LOG_IFINIT(ERROR, "`which %s.stm` was too long. not starting %s\n", cmd, cmd);
-      return 0;
-    }
-    orig_exe[ret] = '\0';
-    if (pclose(which) == -1) {
-      LOG_IFINIT(WARNING, "pclose failed with %d: %s\n", errno, strerror(errno));
-    }
-  }
-  if (strlen(orig_exe) == 0) {
-    LOG_IFINIT(WARNING, "couldn't find file '%s[.stm]'. not going to start it\n",
-               cmd);
-    return 0;
-  }
-  if (orig_exe[strlen(orig_exe) - 1] != '\n') {
-    LOG_IFINIT(WARNING, "no \\n on the end of `which %s[.stm]` output ('%s')\n",
-               cmd, orig_exe);
-  } else {
-    orig_exe[strlen(orig_exe) - 1] = '\0'; // get rid of the \n
-  }
-  strncpy(exe, orig_exe, CMDLEN);
-
-  strcat(exe, ".stm");
-  struct stat st;
-  errno = 0;
-  if (stat(orig_exe, &st) != 0 && errno != ENOENT) {
-    LOG_IFINIT(ERROR, "killing everything because stat('%s') failed with %d: %s\n",
-               orig_exe, errno, strerror(errno));
-    niceexit(EXIT_FAILURE);
-  } else if (errno == ENOENT) {
-    LOG_IFINIT(WARNING, "binary '%s' doesn't exist. not starting it\n", orig_exe);
-    return 0;
-  }
-  struct stat st2;
-  // if we can confirm it's already 0 size
-  bool orig_zero = stat(orig_exe, &st2) == 0 && st2.st_size == 0;
-  if (!orig_zero) {
-    // if it failed and it wasn't because it was missing
-    if (unlink(exe) != 0 && (errno != EROFS && errno != ENOENT)) {
-      LOG_IFINIT(ERROR,
-                 "killing everything because unlink('%s') failed with %d: %s\n",
-                 exe, errno, strerror(errno));
-      niceexit(EXIT_FAILURE);
-    }
-    if (link(orig_exe, exe) != 0) {
-      LOG_IFINIT(ERROR,
-                 "killing everything because link('%s', '%s') failed with %d: %s\n",
-                 orig_exe, exe, errno, strerror(errno));
-      niceexit(EXIT_FAILURE);
-    }
-  }
-  if (errno == EEXIST) {
-    LOG_IFINIT(INFO, "exe ('%s') already existed\n", exe);
-  }
-
-  pid_t child;
-  if ((child = fork()) == 0) {
-    execlp(exe, orig_exe, static_cast<char *>(NULL));
-    LOG_IFINIT(ERROR,
-               "killing everything because execlp('%s', '%s', NULL) "
-               "failed with %d: %s\n",
-               exe, cmd, errno, strerror(errno));
-    _exit(EXIT_FAILURE); // don't niceexit or anything because this is the child!!
-  }
-  if (child == -1) {
-    LOG_IFINIT(WARNING, "fork on '%s' failed with %d: %s",
-               cmd, errno, strerror(errno));
-    if (times < 100) {
-      return start(cmd, times + 1);
-    } else {
-      LOG_IFINIT(ERROR, "tried to start '%s' too many times. giving up\n", cmd);
-      return 0;
-    }
-  } else {
-    children[child] = cmd;
-    files[child] = orig_exe;
-    int ret = inotify_add_watch(notifyfd, orig_exe, IN_ATTRIB | IN_MODIFY);
-    if (ret < 0) {
-      LOG_IFINIT(WARNING, "inotify_add_watch('%s') failed: "
-                 "not going to watch for changes to it because of %d: %s\n",
-                 orig_exe, errno, strerror(errno));
-    } else {
-      watches[ret] = child;
-      mtimes[ret] = st2.st_mtime;
-    }
-    return child;
-  }
-}
-
-static bool exited = false;
-void exit_handler() {
-  if(exited) {
-    return;
-  } else {
-    exited = true;
-  }
-  fputs("starter: killing all children for exit\n", stdout);
-  for (auto it = children.begin(); it != children.end(); ++it) {
-    printf("starter: killing child %d ('%s') for exit\n", it->first, it->second);
-    kill(it->first, SIGKILL);
-  }
-  if (sigfd != 0) {
-    close(sigfd);
-  }
-  if (notifyfd != 0) {
-    close(notifyfd);
-  }
-}
-void niceexit(int status) {
-  printf("starter: niceexit(%d) EXIT_SUCCESS=%d EXIT_FAILURE=%d\n",
-         status, EXIT_SUCCESS, EXIT_FAILURE);
-  exit_handler();
-  exit(status);
-}
-
-int main(int argc, char *argv[]) {
-  if (argc < 2) {
-    fputs("starter: error: need an argument specifying what file to use\n", stderr);
-    niceexit(EXIT_FAILURE);
-  } else if(argc > 2) {
-    fputs("starter: warning: too many arguments\n", stderr);
-  }
-
-  atexit(exit_handler);
-
-  notifyfd = inotify_init1(IN_NONBLOCK);
-
-  pid_t core = start("core", 0);
-  if (core == 0) {
-    fputs("starter: error: core didn't exist\n", stderr);
-    niceexit(EXIT_FAILURE);
-  }
-  fprintf(stderr, "starter: info: core's pid is %jd\n", static_cast<intmax_t>(core));
-  FILE *pid_file = fopen("/tmp/starter.pid", "w");
-  if (pid_file == NULL) {
-    perror("fopen(/tmp/starter.pid)");
-  } else {
-    if (fprintf(pid_file, "%d", core) == -1) {
-      fprintf(stderr, "starter: error: fprintf(pid_file, core(=%d)) failed "
-              "with %d: %s",
-              core, errno, strerror(errno));
-    }
-    fclose(pid_file);
-  }
-  sleep(1);
-  if (kill(core, 0) != 0) {
-    fprintf(stderr, "starter: couldn't kill(%jd(=core), 0) because of %d: %s\n",
-            static_cast<intmax_t>(core), errno, strerror(errno));
-    niceexit(EXIT_FAILURE);
-  }
-  fputs("starter: before init\n", stdout);
-  aos::InitNRT();
-  fputs("starter: after init\n", stdout);
-
-  FILE *list = fopen(argv[1], "re");
-  char line[CMDLEN + 1];
-  char *line_copy;
-  uint8_t too_long = 0;
-  while (fgets(line, sizeof(line), list) != NULL) {
-    if (line[strlen(line) - 1] != '\n') {
-      LOG(WARNING, "command segment '%s' is too long. "
-          "increase the size of the line char[] above " __FILE__ ": %d\n",
-          line, __LINE__);
-      too_long = 1;
-      continue;
-    }
-    if (too_long) {
-      too_long = 0;
-      LOG(WARNING, "\tgot last chunk of too long line: '%s'\n", line);
-      continue; // don't try running the last little chunk
-    }
-    line[strlen(line) - 1] = '\0'; // get rid of the \n
-    line_copy = new char[strlen(line) + 1];
-    memcpy(line_copy, line, strlen(line) + 1);
-    fprintf(stderr, "starter: info: going to start \"%s\"\n", line_copy);
-    start(line_copy, 0);
-  }
-  fclose(list);
-  LOG(INFO, "started everything\n");
-
-  sigset_t mask;
-  sigemptyset (&mask);
-  sigaddset (&mask, SIGCHLD);
-  sigprocmask (SIG_BLOCK, &mask, NULL);
-  sigfd = signalfd (-1, &mask, O_NONBLOCK);
-
-  fd_set readfds;
-  FD_ZERO(&readfds);
-  siginfo_t infop;
-  signalfd_siginfo fdsi;
-  inotify_event notifyevt;
-  int ret;
-  while (1) {
-    FD_SET(sigfd, &readfds);
-    FD_SET(notifyfd, &readfds);
-    timeval timeout;
-    timeout.tv_sec = restarts.empty() ? 2 : 0;
-    timeout.tv_usec = 100000;
-    ret = select (FD_SETSIZE, &readfds, NULL, NULL, &timeout);
-
-    if (ret == 0) { // timeout
-      auto it = restarts.begin();
-      // WARNING because the message about it dying will be
-      for (; it != restarts.end(); it++) {
-        LOG(WARNING, "restarting process %d ('%s') by giving it a SIGKILL(%d)\n",
-            *it, children[*it], SIGKILL);
-        kill(*it, SIGKILL);
-      }
-      restarts.clear();
-    }
-
-    if (FD_ISSET(notifyfd, &readfds)) {
-      if ((ret = read(notifyfd, &notifyevt, sizeof(notifyevt))) ==
-          sizeof(notifyevt)) {
-        if (watches.count(notifyevt.wd)) {
-          struct stat st;
-          if (!children.count(watches[notifyevt.wd]) ||
-              stat(files[watches[notifyevt.wd]], &st) == 0) {
-            if (mtimes[notifyevt.wd] == st.st_mtime) {
-              LOG(DEBUG, "ignoring trigger of watch id %d (file '%s')"
-                  " because mtime didn't change\n",
-                  notifyevt.wd, files[watches[notifyevt.wd]]);
-            } else if (children.count(watches[notifyevt.wd])) {
-              LOG(DEBUG, "adding process %d to the restart list\n",
-                  watches[notifyevt.wd]);
-              restarts.insert(watches[notifyevt.wd]);
-            } else {
-              LOG(DEBUG, "children doesn't have entry for PID %d\n",
-                  watches[notifyevt.wd]);
-            }
-          } else {
-            LOG(ERROR, "stat('%s') failed with %d: %s\n",
-                files[watches[notifyevt.wd]], errno, strerror(errno));
-          }
-        } else {
-          LOG(WARNING, "no PID for watch id %d\n", notifyevt.wd);
-        }
-      } else {
-        if (ret == -1) {
-          LOG(WARNING, "read(notifyfd) failed with %d: %s", errno, strerror(errno));
-        } else {
-          LOG(WARNING, "couldn't get a whole inotify_event(%d) (only got %d)\n",
-              sizeof(notifyevt), ret);
-        }
-      }
-    }
-
-    if (FD_ISSET(sigfd, &readfds)) {
-      while(read (sigfd, &fdsi, sizeof fdsi) > 0);
-    }
-    while (1) {
-      infop.si_pid = 0;
-      if (waitid(P_ALL, 0, &infop, WEXITED | WSTOPPED | WNOHANG) == 0) {
-        if (infop.si_pid == 0) {
-          goto after_loop; // no more child process changes pending
-        }
-        switch (infop.si_code) {
-          case CLD_EXITED:
-            LOG(WARNING, "child %d (%s) exited with status %d\n",
-                infop.si_pid, children[infop.si_pid], infop.si_status);
-            break;
-          case CLD_DUMPED:
-            LOG(INFO, "child %d actually dumped core. "
-                "falling through to killed by signal case\n", infop.si_pid);
-          case CLD_KILLED:
-            LOG(WARNING, "child %d (%s) was killed by signal %d (%s)\n",
-                infop.si_pid, children[infop.si_pid], infop.si_status,
-                strsignal(infop.si_status));
-            break;
-          case CLD_STOPPED:
-            LOG(WARNING, "child %d (%s) was stopped by signal %d "
-                "(giving it a SIGCONT(%d))\n",
-                infop.si_pid, children[infop.si_pid], infop.si_status, SIGCONT);
-            kill(infop.si_pid, SIGCONT);
-            continue;
-          default:
-            LOG(WARNING, "something happened to child %d (%s) (killing it)\n",
-                infop.si_pid, children[infop.si_pid]);
-            kill(infop.si_pid, SIGKILL);
-            continue;
-        }
-        if (infop.si_pid == core) {
-          fprintf(stderr, "starter: si_code=%d CLD_EXITED=%d CLD_DUMPED=%d "
-                  "CLD_KILLED=%d CLD_STOPPED=%d si_status=%d (sig '%s')\n",
-                  infop.si_code, CLD_EXITED, CLD_DUMPED, CLD_KILLED,
-                  CLD_STOPPED, infop.si_status, strsignal(infop.si_status));
-          // core has died. logging is down too
-          fputs("starter: error: core died. exiting\n", stderr);
-          niceexit(EXIT_FAILURE);
-        }
-
-        /*// remove all of the watches assigned to the pid that just died
-        for (auto it = watches.begin(); it != watches.end(); ++it) {
-          if (it->second == infop.si_pid) {
-            watches_to_ignore.insert(it->first);
-          }
-        }
-        for (auto it = watches_to_ignore.begin();
-             it != watches_to_ignore.end(); ++it) {
-          LOG(DEBUG, "watch id %d was on PID %d\n", *it, infop.si_pid);
-          watches.erase(*it);
-        }*/
-
-        start(children[infop.si_pid], 0);
-        LOG(DEBUG, "erasing %d from children\n", infop.si_pid);
-        children.erase(infop.si_pid);
-      } else {
-        LOG(WARNING, "waitid failed with %d: %s", errno, strerror(errno));
-      }
-    }
-after_loop: ;
-  }
-}
diff --git a/aos/atom_code/starter/starter.gyp b/aos/atom_code/starter/starter.gyp
index 44e4b08..f494993 100644
--- a/aos/atom_code/starter/starter.gyp
+++ b/aos/atom_code/starter/starter.gyp
@@ -1,13 +1,29 @@
 {
   'targets': [
     {
+      'target_name': 'netconsole',
+      'type': 'executable',
+      'sources': [
+        'netconsole.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/atom_code/atom_code.gyp:configuration',
+        '<(AOS)/common/common.gyp:util',
+      ],
+    },
+    {
       'target_name': 'starter_exe',
       'type': 'executable',
       'sources': [
-        'starter.cpp',
+        'starter.cc',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(EXTERNALS):libevent',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/common/common.gyp:once',
+        '<(AOS)/common/common.gyp:time',
       ],
       'copies': [
         {
diff --git a/aos/atom_code/starter/starter.h b/aos/atom_code/starter/starter.h
deleted file mode 100644
index 16bbe01..0000000
--- a/aos/atom_code/starter/starter.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __AOS_STARTER_H_
-#define __AOS_STARTER_H_
-
-#include <map>
-#include <sys/types.h>
-#include <signal.h>
-#include <stdint.h>
-#include <string>
-#include <errno.h>
-#include <string.h>
-#include <sys/wait.h>
-#include <set>
-
-using namespace std;
-
-map<pid_t, const char *> children;
-map<pid_t, const char *> files; // the names of the actual files
-map<int, pid_t> watches;
-set<pid_t> restarts;
-map<int, time_t> mtimes;
-
-int sigfd = 0;
-int notifyfd = 0;
-
-const size_t CMDLEN = 5000;
-
-#endif
-
diff --git a/aos/atom_code/starter/starter.sh b/aos/atom_code/starter/starter.sh
index 103180e..33906c3 100755
--- a/aos/atom_code/starter/starter.sh
+++ b/aos/atom_code/starter/starter.sh
@@ -1,7 +1,9 @@
 #!/bin/bash
 
+echo '/home/driver/tmp/robot_logs/%e-%s-%p-%t.coredump' > /proc/sys/kernel/core_pattern
+
 #echo $$ > /var/run/`basename $0`.pid IT FORKS AFTER THIS!!!!
-insmod /home/driver/robot_code/bin/aos_module.ko
+#insmod /home/driver/robot_code/bin/aos_module.ko
 #chrt -p 45 `pidof sshd`
 chrt -o 0 bash -c "export PATH=$PATH:/home/driver/robot_code/bin; starter_loop.sh $*" &
 #chrt -o 0 bash -c "while true; do cd /home/driver/mjpg-streamer2; ./server.sh; sleep 5; done" &
@@ -15,3 +17,4 @@
 #DUMPCAP_STDOUT_FILE=$(date "/home/driver/tmp/robot_logs/stdout_dumpcap.%F_%H-%M-%S")
 #chrt -o 0 bash -c "dumpcap -i eth0 -w ${DUMPCAP_LOG_FILE} -f 'not port 8080 and not net 10.9.71.13' > ${DUMPCAP_STDOUT_FILE}" &
 
+chrt -o 0 bash -c 'while true; /home/driver/robot_code/bin/netconsole /home/driver/tmp/robot_logs/netconsole-`date +%s`; done' &
diff --git a/aos/atom_code/starter/starter_loop.sh b/aos/atom_code/starter/starter_loop.sh
index b4e1d5c..83d34cc 100755
--- a/aos/atom_code/starter/starter_loop.sh
+++ b/aos/atom_code/starter/starter_loop.sh
@@ -4,4 +4,3 @@
 	starter_exe $* 1>/tmp/starter${i}_stdout 2>/tmp/starter${i}_stderr
 	sleep 2
 done
-
diff --git a/aos/atom_code/thread_local.h b/aos/atom_code/thread_local.h
new file mode 100644
index 0000000..9563a87
--- /dev/null
+++ b/aos/atom_code/thread_local.h
@@ -0,0 +1,13 @@
+#ifndef AOS_ATOM_CODE_THREAD_LOCAL_H_
+#define AOS_ATOM_CODE_THREAD_LOCAL_H_
+
+// The storage class to use when declaring thread-local variables. This provides
+// a single place to change it if/when we want to switch to something standard.
+//
+// Example: AOS_THREAD_LOCAL void *bla;  // at namespace (aka global) scope
+//
+// C++11 has thread_local, but it's not clear whether Clang supports that as of
+// 12/18/12.
+#define AOS_THREAD_LOCAL __thread
+
+#endif  // AOS_ATOM_CODE_THREAD_LOCAL_H_
diff --git a/aos/build/act_builder.rb b/aos/build/act_builder.rb
deleted file mode 100644
index d98549c..0000000
--- a/aos/build/act_builder.rb
+++ /dev/null
@@ -1,242 +0,0 @@
-require File.dirname(__FILE__) + "/parser.rb"
-
-module Contents
-	class HasEntry < SimpleField
-	end
-	class Priority < SimpleField
-		def initialize
-			super :is_number
-		end
-	end
-
-	class OutputFile
-		def fillin_initials
-			@args_struct = nil	# string
-			@status_struct = nil 	# string
-			@action_name = nil	# string
-			@actions = []
-			@has = []
-		end
-		def fillin_defaults
-			@action_name = @base unless @action_name
-			@actions.push @action_name if @actions.empty?
-			@args_struct.add_hidden_field 'timespec', 'set_time'
-			@status_struct.add_hidden_field 'timespec', 'set_time'
-		end
-		def parse_token token, tokenizer
-			case token
-			when 'args'
-				throw :syntax_error, '"args" redefined' if @args_struct
-				@args_struct = Struct.parse tokenizer
-			when 'status'
-				throw :syntax_error, '"status" redefined' if @status_struct
-				@status_struct = Struct.parse tokenizer
-			when 'action_name'
-				throw :syntax_error, '"action_name" redefined' if @action_name
-				@action_name = NameField.parse tokenizer
-			when 'async_queue'
-				@actions.push(NameField.parse tokenizer)
-			when 'has'
-				@has.push(HasEntry.parse tokenizer)
-			when 'priority'
-				throw :syntax_error, '"priority" redefined' if @priority
-				@priority = Priority.parse tokenizer
-			else
-				throw :syntax_error, "unsupported field \"#{token}\""
-			end
-		end
-		def check_format tokenizer
-			tokenizer.item_missing("args") unless @args_struct
-			tokenizer.item_missing("status") unless @status_struct
-			tokenizer.item_missing("priority") unless @priority
-		end
-
-		def superclass
-			"aos::AsyncAction<#{@args_struct.name}, #{@status_struct.name}>"
-		end
-		def impl_class
-			@action_name + '_t'
-		end
-		def handle_class
-			@action_name + 'Handle'
-		end
-		def write_header
-			f = File.open(filename('h'), "w+")
-			f.puts <<END
-#ifndef AOS_GENERATED_ASYNC_ACTION_#{impl_class}_H_
-#define AOS_GENERATED_ASYNC_ACTION_#{impl_class}_H_
-// This file is autogenerated.
-// Edit #{@filename} to change its contents.
-
-#include "aos/common/messages/QueueHolder.h"
-#include "aos/atom_code/async_action/AsyncAction.h"
-#include "aos/atom_code/async_action/AsyncActionHandle.h"
-
-namespace #{$namespace} {
-#{@args_struct.writer}
-#{@status_struct.writer}
-	class #{impl_class} : public #{superclass} {
-		virtual void DoAction(#{@args_struct.name} &args __attribute__((unused))){
-			DoAction(#{@args_struct.params_from 'args'});
-		}
-		void DoAction(#{@args_struct.params});
-#{@has.grep('OnStart').empty? ? '' : "virtual void OnStart();"}
-#{@has.grep('OnEnd').empty? ? '' : "virtual void OnEnd();"}
-		using #{superclass}::PostStatus;
-		inline void PostStatus(#{@status_struct.params}){
-			#{@status_struct.copy_params_into 'new_stat'}
-			PostStatus(new_stat);
-		}
-		public:
-		#{impl_class}(const std::string name) : #{superclass}(name) {}
-#ifdef AOS_#{impl_class}_HEADER_FRAG
-		AOS_#{impl_class}_HEADER_FRAG
-#endif
-	};
-
-	class #{handle_class} : public aos::AsyncActionHandle {
-		friend class ::AsyncActionTest;
-		private:
-			const std::string name;
-			#{superclass} *instance;
-			#{superclass} &GetInstance(){
-				if(instance == NULL){
-					instance = new #{superclass}(name);
-				}
-				return *instance;
-			}
-			#{@status_struct.name} temp_status;
-			void Free(){
-				if(instance != NULL){
-					delete instance;
-					instance = NULL;
-				}
-			}
-		public:
-			inline uint16_t Start(#{@args_struct.name} &args){
-				return GetInstance().Start(args);
-			}
-			inline uint16_t Start(#{@args_struct.params}){
-				#{@args_struct.copy_params_into 'args_struct'}
-				return Start(args_struct);
-			}
-			inline void Execute(#{@args_struct.name} &args){
-				GetInstance().Join(GetInstance().Start(args));
-			}
-			inline bool Execute(#{@args_struct.params}){
-				#{@args_struct.copy_params_into 'args_struct'}
-				Execute(args_struct);
-				return GetStatus();
-			}
-			inline bool IsDone(){
-				return GetInstance().IsDone();
-			}
-			inline bool IsDone(int32_t count){
-				return GetInstance().IsDone(count);
-			}
-			inline uint16_t Join(){
-				return GetInstance().Join();
-			}
-			inline uint16_t Join(int32_t count){
-				return GetInstance().Join(count);
-			}
-			inline bool GetStatus(#{@status_struct.name} &status_out) __attribute__ ((warn_unused_result)){
-				return GetInstance().GetStatus(status_out);
-			}
-			inline bool GetStatus(#{@status_struct.name} &status_out, int32_t count) __attribute__ ((warn_unused_result)){
-				return GetInstance().GetStatus(status_out, count);
-			}
-			inline bool GetStatus() __attribute__ ((warn_unused_result)){
-				return GetInstance().GetStatus(temp_status);
-			}
-			inline bool GetStatus(int32_t count) __attribute__ ((warn_unused_result)){
-				return GetInstance().GetStatus(temp_status, count);
-			}
-			inline bool GetNextStatus(#{@status_struct.name} &status_out) __attribute__ ((warn_unused_result)){
-				return GetInstance().GetNextStatus(status_out);
-			}
-			inline bool GetNextStatus(#{@status_struct.name} &status_out, int32_t count) __attribute__ ((warn_unused_result)){
-				return GetInstance().GetNextStatus(status_out, count);
-			}
-			inline bool GetNextStatus() __attribute__ ((warn_unused_result)){
-				return GetInstance().GetNextStatus(temp_status);
-			}
-			inline bool GetNextStatus(int32_t count) __attribute__ ((warn_unused_result)){
-				return GetInstance().GetNextStatus(temp_status, count);
-			}
-			inline const #{@status_struct.name} &GetLastStatus(){
-				return temp_status;
-			}
-			inline void Stop(){
-				GetInstance().Stop();
-			}
-			inline void Stop(int32_t count){
-				GetInstance().Stop(count);
-			}
-
-			#{handle_class}(const std::string name) : name(name), instance(NULL) {}
-	};
-#{(@actions.collect do |a|
-<<END2
-	extern #{handle_class} #{a};
-END2
-end).join('')}
-
-} // namespace #{$namespace}
-
-#endif
-END
-			f.close
-		end
-		def write_cpp
-			f = File.open(filename('cc'), "w+")
-f.puts <<END
-// This file is autogenerated.
-// Edit #{@filename} to change its contents.
-
-#include "#{filename 'h'}"
-
-namespace #{$namespace} {
-
-#{(@actions.collect do |a|
-<<END2
-#{handle_class} #{a}("#{a}");
-END2
-end).join("\n")}
-
-} // namespace #{$namespace}
-END
-			f.close
-		end
-		def write_main
-			f = File.open(filename('main'), "w+")
-f.puts <<END
-// This file is autogenerated.
-// Edit #{@filename} to change its contents.
-
-#include "#{filename 'h'}"
-#include "aos/atom_code/async_action/AsyncActionRunner.h"
-#include <string>
-#include <cstring>
-#include <iostream>
-
-int main(int argc, char **argv) {
-	aos::Init();
-
-	std::string name = "#{@action_name}";
-	if(argc > 1)
-		name = std::string(argv[1]);
-	#{$namespace}::#{impl_class} action(name);
-	int rv = aos::AsyncActionRunner::Run(action, #{@priority});
-
-	aos::Cleanup();
-	return rv;
-}
-END
-			f.close
-		end
-	end
-end
-
-write_file_out
-
diff --git a/aos/build/aos.gyp b/aos/build/aos.gyp
index b6bd3ee..c91ab43 100644
--- a/aos/build/aos.gyp
+++ b/aos/build/aos.gyp
@@ -4,52 +4,31 @@
 # Shared libraries don't seem to be supported by the powerpc-wrs-vxworks
 # tools and gyp doesn't like a static_library that depends on static_librarys.
 {
-  'variables': {
-    'conditions': [
-      ['OS=="crio"', {
-          'libaos_source_files': [
-            '<!@(find <(AOS)/crio/controls <(AOS)/crio/messages <(AOS)/crio/motor_server <(AOS)/crio/shared_libs -name *.c -or -name *.cpp -or -name *.cc)',
-            '<(AOS)/crio/Talon.cpp',
-            '<(AOS)/common/die.cc',
-          ],
-        }, {
-          'libaos_source_files': [
-            '<(AOS)/atom_code/camera/Buffers.cpp',
-            '<(AOS)/atom_code/async_action/AsyncAction_real.cpp',
-            '<(AOS)/atom_code/init.cc',
-            '<(AOS)/atom_code/ipc_lib/mutex.cpp',
-            '<(AOS)/common/die.cc',
-          ],
-        }
-      ],
-    ],
-  },
   'targets': [
     {
       'target_name': 'logging',
       'type': 'static_library',
+      'sources': [
+        '<(AOS)/common/logging/logging_impl.cc',
+      ],
       'conditions': [
-        ['OS=="crio"', {
+        ['OS=="atom"', {
           'sources': [
-            '<(AOS)/crio/logging/crio_logging.cpp',
+            '<(AOS)/atom_code/logging/atom_logging.cc',
           ],
           'dependencies': [
-            '<(EXTERNALS):WPILib',
-          ]
-        }, {
-          'sources': [
-            '<(AOS)/atom_code/logging/atom_logging.cpp'
-          ],
-          'dependencies': [
-            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:ipc_lib',
+            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
           ],
           'export_dependent_settings': [
-            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:ipc_lib',
+            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
           ]
         }],
       ],
       'dependencies': [
         '<(AOS)/common/common.gyp:time',
+        '<(AOS)/common/common.gyp:once',
+        '<(AOS)/common/common.gyp:mutex',
+        '<(AOS)/common/common.gyp:die',
       ],
     },
     {
@@ -68,89 +47,5 @@
       ],
       'includes': ['../build/swig.gypi'],
     },
-    {
-      'target_name': 'libaos',
-      'type': 'static_library',
-      'sources': ['<@(libaos_source_files)'],
-      'sources/': [['exclude', '_test\.c[cp]*$']],
-      'dependencies': [
-        '<(AOS)/common/messages/messages.gyp:aos_queues',
-        'logging',
-        '<(EXTERNALS):WPILib',
-      ],
-      'export_dependent_settings': [
-        '<(AOS)/common/messages/messages.gyp:aos_queues',
-        '<(EXTERNALS):WPILib',
-      ],
-      'conditions': [
-        ['OS=="atom"', {
-          'dependencies': [
-            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:ipc_lib',
-          ],
-        }]
-      ],
-    },
-    {
-      'target_name': 'aos_shared_lib',
-      'type': 'shared_library',
-      'sources': ['<@(libaos_source_files)'],
-      'sources/': [['exclude', '_test\.c[cp]*$']],
-      'variables': {'no_rsync': 1},
-      'dependencies': [
-        '<(AOS)/common/messages/messages.gyp:queues_so',
-        '<(AOS)/common/common.gyp:queues',
-        'aos_swig',
-        '<(EXTERNALS):WPILib',
-      ],
-      'export_dependent_settings': [
-        '<(AOS)/common/messages/messages.gyp:queues_so',
-        '<(EXTERNALS):WPILib',
-        'aos_swig',
-      ],
-      'direct_dependent_settings': {
-        'variables': {
-          'jni_libs': [
-            'aos_shared_lib',
-          ],
-        },
-      },
-    },
-    {
-# A target that has all the same dependencies as libaos and aos_shared_lib
-#   without any queues so that the queues can get the necessary headers without
-#   creating circular dependencies.
-      'target_name': 'aos_internal_nolib',
-      'type': 'none',
-      'dependencies': [
-        'aos/ResourceList.h',
-        '<(EXTERNALS):WPILib',
-      ],
-      'export_dependent_settings': [
-        'aos/ResourceList.h',
-        '<(EXTERNALS):WPILib',
-      ],
-    },
-    {
-      'target_name': 'aos/ResourceList.h',
-      'type': 'static_library',
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(SHARED_INTERMEDIATE_DIR)/ResourceList',
-        ],
-      },
-      'hard_dependency': 1,
-      'actions': [
-        {
-          'variables': {
-            'script': '<(AOS)/build/gen_resource_list.rb'
-          },
-          'action_name': 'gen_aos_ResourceList_h',
-          'inputs': ['<(script)'],
-          'outputs': ['<(SHARED_INTERMEDIATE_DIR)/ResourceList/aos/ResourceList.h'],
-          'message': 'Generating',
-          'action': ['ruby', '<(script)', '<(SHARED_INTERMEDIATE_DIR)/ResourceList/aos',],
-        },
-      ],
-    },
   ],
 }
diff --git a/aos/build/aos.gypi b/aos/build/aos.gypi
index 08bf975..0f7d4b6 100644
--- a/aos/build/aos.gypi
+++ b/aos/build/aos.gypi
@@ -23,17 +23,17 @@
   'conditions': [
     ['OS=="crio"', {
         'make_global_settings': [
-          ['CC', '<!(which powerpc-wrs-vxworks-gcc)'],
-          ['CXX', '<!(which powerpc-wrs-vxworks-g++)'],
-          ['LD', '<!(readlink -f <(AOS)/build/crio_link_out)'],
-          #['LD', 'powerpc-wrs-vxworks-ld'],
-          #['AR', '<!(which powerpc-wrs-vxworks-ar)'],
-          #['NM', '<!(which powerpc-wrs-vxworks-nm)'],
+          ['CC', '<!(readlink -f <(AOS)/build/crio_cc)'],
+          ['CXX', '<!(readlink -f <(AOS)/build/crio_cxx)'],
         ],
         'variables': {
           'aos_target': 'static_library',
         },
       }, {
+        'make_global_settings': [
+          ['CC', '<!(which arm-linux-gnueabihf-gcc-4.7)'],
+          ['CXX', '<!(which arm-linux-gnueabihf-g++-4.7)'],
+        ],
         'variables': {
           'aos_target': 'executable',
         },
@@ -44,6 +44,8 @@
     'defines': [
       '__STDC_FORMAT_MACROS',
       '_FORTIFY_SOURCE=2',
+      '__STDC_CONSTANT_MACROS',
+      '__STDC_LIMIT_MACROS',
     ],
     'ldflags': [
       '-pipe',
@@ -63,29 +65,27 @@
       '-Wsign-compare',
       '-Wformat=2',
       '-Werror',
+
+      '-ggdb3',
     ],
     'cflags_c': [
       '-std=gnu99',
     ],
-    'cflags_cc': [
-      '-std=gnu++0x',
-    ],
     'include_dirs': [
       '<(DEPTH)',
     ],
     'conditions': [
       ['DEBUG=="yes"', {
           'cflags': [
-            '-ggdb3',
             '-O0',
           ],
-          'ldflags': [
-            '-O3',
-          ],
         }, {
           'cflags': [
             '-O3',
           ],
+          'ldflags': [
+            '-O3',
+          ],
           'conditions': [['OS=="crio"', {
               'cflags': [
                 '-fstrength-reduce',
@@ -94,13 +94,10 @@
               ],
             }, {
               'cflags': [
-                # core2 says the same stuff as atom in the gcc docs but is supported by 4.4.5
-                '-march=core2',
-                '-mtune=generic',
-                '-msse3',
-                '-mfpmath=sse',
+                '-mcpu=cortex-a8',
+                '-mfpu=neon',
 
-                '-fstack-protector',
+                '-fstack-protector-all',
               ],
             }
           ]],
@@ -118,21 +115,26 @@
             ],
           ],
           'ldflags': [
-            '-mcpu=603',
+            '-mcpu=603e',
             '-mstrict-align',
             '-mlongcall',
           ],
           'cflags': [
-            '-mcpu=603',
+            # The Freescale MPC5200B (cRIO-FRC) and MPC5125 (cRIO-FRC II) both
+            # have MPC603e cores according to Freescale docs.
+            '-mcpu=603e',
             '-mstrict-align',
             '-mlongcall',
-            '-isystem', '<(aos_abs)/externals/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/lib/gcc/powerpc-wrs-vxworks/3.4.4/include/',
-            '-isystem', '<(aos_abs)/externals/gccdist/WindRiver/vxworks-6.3/target/h/',
-            '-isystem', '<(aos_abs)/externals/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/include/c++/3.4.4/',
-            '-isystem', '<(aos_abs)/externals/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/include/c++/3.4.4/powerpc-wrs-vxworks/',
+            '-isystem', '<(aos_abs)/../output/downloaded/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/lib/gcc/powerpc-wrs-vxworks/3.4.4/include/',
+            '-isystem', '<(aos_abs)/../output/downloaded/gccdist/WindRiver/vxworks-6.3/target/h/',
+            '-isystem', '<(aos_abs)/../output/downloaded/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/include/c++/3.4.4/',
+            '-isystem', '<(aos_abs)/../output/downloaded/gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/include/c++/3.4.4/powerpc-wrs-vxworks/',
             '-isystem', '<(WIND_BASE)/target/h',
             '-isystem', '<(WIND_BASE)/target/h/wrn/coreip',
           ],
+          'cflags_cc': [
+            '-std=gnu++0x',
+          ],
           'defines': [
             'CPU=PPC603',
             'TOOL_FAMILY=gnu',
@@ -171,17 +173,23 @@
           ],
           'ldflags': [
             '-pthread',
-            '-m32',
-          ],
-          'library_dirs': [
-            '/usr/lib32',
           ],
           'cflags': [
             '-pthread',
-            '-m32',
+
+            '-Wunused-local-typedefs',
+
+            # Give macro stack traces when they blow up.
+            # TODO(brians): Re-enable this once they fix the bug where it
+            # sometimes doesn't show you the top-most (aka most useful)
+            # line of code.
+            #'-ftrack-macro-expansion',
+          ],
+          'cflags_cc': [
+            '-std=gnu++11',
           ],
           'defines': [
-            '_LARGEFILE64_SOURCE',
+            '_FILE_OFFSET_BITS=64',
           ],
           'libraries': [
             '-lm',
diff --git a/aos/build/aos_all.gyp b/aos/build/aos_all.gyp
index 68439e3..0629be5 100644
--- a/aos/build/aos_all.gyp
+++ b/aos/build/aos_all.gyp
@@ -13,15 +13,16 @@
         '../atom_code/camera/camera.gyp:CameraHTTPStreamer',
         '../atom_code/camera/camera.gyp:CameraReader',
         '../atom_code/core/core.gyp:*',
-        #'../atom_code/async_action:*', # TODO(brians) fix this broken test
-        '../atom_code/ipc_lib/ipc_lib.gyp:*',
-        '../atom_code/starter/starter.gyp:*',
-        '../crio/crio.gyp:unsafe_queue_test',
+        '../atom_code/ipc_lib/ipc_lib.gyp:raw_queue_test',
+        '../atom_code/ipc_lib/ipc_lib.gyp:ipc_stress_test',
+        '../atom_code/starter/starter.gyp:starter_exe',
+        '../atom_code/starter/starter.gyp:netconsole',
         '../common/common.gyp:queue_test',
-        #'../common/messages/messages.gyp:*', # TODO(brians) did this test ever exist?
-        '../atom_code/logging/logging.gyp:*',
         '../common/common.gyp:die_test',
         '../common/util/util.gyp:trapezoid_profile_test',
+        '../common/util/util.gyp:wrapping_counter_test',
+        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:cows_test',
+        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:packet_finder_test',
         'Common',
       ],
     },
@@ -29,7 +30,6 @@
       'target_name': 'Crio',
       'type': 'none',
       'dependencies': [
-        '../crio/googletest/googletest.gyp:*',
         'Common',
       ],
     },
@@ -43,7 +43,9 @@
         '<(AOS)/common/common.gyp:type_traits_test',
         '<(AOS)/common/common.gyp:time_test',
         '<(AOS)/common/common.gyp:mutex_test',
+        '<(AOS)/common/common.gyp:condition_test',
         '<(AOS)/common/common.gyp:once_test',
+        '<(AOS)/common/logging/logging.gyp:logging_impl_test',
       ],
     },
   ],
diff --git a/aos/build/build.sh b/aos/build/build.sh
index 60be0dd..4b36e7e 100755
--- a/aos/build/build.sh
+++ b/aos/build/build.sh
@@ -1,50 +1,56 @@
-#!/bin/bash -e
+#!/bin/bash
 #set -x
 
+set -e
+
 # This file should be called to build the code.
-# Usage: build.sh platform main_file.gyp debug [action]
+# Usage: build.sh platform main_file.gyp debug [action]...
 
 PLATFORM=$1
 GYP_MAIN=$2
 DEBUG=$3
 ACTION=$4
 
+shift 3
+shift || true # We might not have a 4th argument if ACTION is empty.
+
 export WIND_BASE=${WIND_BASE:-"/usr/local/powerpc-wrs-vxworks/wind_base"}
 
-[ ${PLATFORM} == "crio" -o ${PLATFORM} == "atom" ] || ( echo Platform "(${PLATFORM})" must be '"crio" or "atom"'. ; exit 1 )
-[ ${DEBUG} == "yes" -o ${DEBUG} == "no" ] || ( echo Debug "(${DEBUG})" must be '"yes" or "no"'. ; exit 1 )
+[ "${PLATFORM}" == "crio" -o "${PLATFORM}" == "atom" ] || ( echo Platform "(${PLATFORM})" must be '"crio" or "atom"'. ; exit 1 )
+[ "${DEBUG}" == "yes" -o "${DEBUG}" == "no" ] || ( echo Debug "(${DEBUG})" must be '"yes" or "no"'. ; exit 1 )
 
 AOS=`dirname $0`/..
-NINJA_DIR=${AOS}/externals/ninja
-NINJA=${NINJA_DIR}/ninja
-# From chromium@154360:trunk/src/DEPS.
-GYP_REVISION=1488
-GYP_DIR=${AOS}/externals/gyp-${GYP_REVISION}
-GYP=${GYP_DIR}/gyp
 
-OUTDIR=${AOS}/../out_${PLATFORM}
-BUILD_NINJA=${OUTDIR}/Default/build.ninja
+OUTDIR=${AOS}/../output/${PLATFORM}
+BUILD_NINJA=${OUTDIR}/build.ninja
 
-[ -d ${NINJA_DIR} ] || git clone --branch release https://github.com/martine/ninja.git ${NINJA_DIR}
-[ -x ${NINJA} ] || ${NINJA_DIR}/bootstrap.py
-[ -d ${GYP_DIR} ] || ( svn co http://gyp.googlecode.com/svn/trunk -r ${GYP_REVISION} ${GYP_DIR} && patch -p1 -d ${GYP_DIR} < ${AOS}/externals/gyp.patch )
 ${AOS}/build/download_externals.sh
+. $(dirname $0)/tools_config
 
 # The exciting quoting is so that it ends up with -DWHATEVER='"'`a command`'"'.
 # The '"' at either end is so that it creates a string constant when expanded
 #   in the C/C++ code.
 COMMONFLAGS='-DLOG_SOURCENAME='"'\"'"'`basename $in`'"'\"' "
-if [ ${PLATFORM} == crio ]; then
-  COMMONFLAGS+='-DAOS_INITNAME=aos_init_function_`readlink -f $out | sed \"s/[\/.]/_/g\"` '
-fi
 
 if [[ "${ACTION}" != "clean" && ( ! -d ${OUTDIR} || -n \
   			"`find ${AOS}/.. -newer ${BUILD_NINJA} \( -name '*.gyp' -or -name '*.gypi' \)`" ) ]]; then
-  ${GYP} \
-    --check --depth=${AOS}/.. --no-circular-check -f ninja \
-    -I${AOS}/build/aos.gypi -Goutput_dir=out_${PLATFORM} \
-    -DOS=${PLATFORM} -DWIND_BASE=${WIND_BASE} -DDEBUG=${DEBUG} \
-    ${GYP_MAIN}
+  # This is a gyp "file" that we pipe into gyp so that it will put the output
+  # in a directory named what we want where we want it.
+  GYP_INCLUDE=$(cat <<END
+{
+  'target_defaults': {
+    'configurations': {
+	  '${PLATFORM}': {}
+    }
+  }
+}
+END
+)
+  echo "${GYP_INCLUDE}" | ${GYP} \
+      --check --depth=${AOS}/.. --no-circular-check -f ninja \
+      -I${AOS}/build/aos.gypi -I/dev/stdin -Goutput_dir=output \
+      -DOS=${PLATFORM} -DWIND_BASE=${WIND_BASE} -DDEBUG=${DEBUG} \
+      ${GYP_MAIN}
   # Have to substitute "command = $compiler" so that it doesn't try to
   #   substitute them in the linker commands, where it doesn't work.
   sed -i "s:command = \$cc:\\0 ${COMMONFLAGS}:g ; \
@@ -56,26 +62,35 @@
 fi
 
 if [ "${ACTION}" == "clean" ]; then
-  rm -r ${OUTDIR}
+  rm -r ${OUTDIR} || true
 else
-  if [ "${ACTION}" != "deploy" -a "${ACTION}" != "tests" ]; then
-					GYP_ACTION=${ACTION}
-	else
-					GYP_ACTION=
-	fi
-  ${NINJA} -C ${OUTDIR}/Default ${GYP_ACTION}
-  case ${ACTION} in
-    deploy)
-      [ ${PLATFORM} == atom ] && \
-        rsync --progress -t -r --rsync-path=/home/driver/bin/rsync \
-        ${OUTDIR}/Default/outputs/* \
+  if [ "${ACTION}" != "deploy" -a "${ACTION}" != "tests" -a "${ACTION}" != "redeploy" ]; then
+    NINJA_ACTION=${ACTION}
+  else
+    NINJA_ACTION=
+  fi
+  ${NINJA} -C ${OUTDIR} ${NINJA_ACTION} "$@"
+  if [[ ${ACTION} == deploy || ${ACTION} == redeploy ]]; then
+    [ ${PLATFORM} == atom ] && \
+      rsync --progress -c -r \
+        ${OUTDIR}/outputs/* \
         driver@`${AOS}/build/get_ip fitpc`:/home/driver/robot_code/bin
-      [ ${PLATFORM} == crio ] && \
-        ncftpput `${AOS}/build/get_ip robot` / \
-        ${OUTDIR}/Default/lib/FRC_UserProgram.out
-      ;;
-    tests)
-      find ${OUTDIR}/Default/tests -executable -exec {} \;
-      ;;
-  esac
+	  ssh driver@`${AOS}/build/get_ip fitpc` "sync; sync; sync"
+    [ ${PLATFORM} == crio ] && \
+      ncftpput `${AOS}/build/get_ip robot` / \
+      ${OUTDIR}/lib/FRC_UserProgram.out
+  fi
+  if [[ ${ACTION} == redeploy ]]; then
+    if [[ ${PLATFORM} != crio ]]; then
+      echo "Platform ${PLATFORM} does not support redeploy." 1>&2
+      exit 1
+    fi
+    ${OUTDIR}/../out_atom/outputs/netconsole <<"END"
+unld "FRC_UserProgram.out"
+ld < FRC_UserProgram.out
+END
+  fi
+  if [[ ${ACTION} == tests ]]; then
+    find ${OUTDIR}/tests -executable -exec {} \;
+  fi
 fi
diff --git a/aos/build/create_aos_ctdt.sh b/aos/build/create_aos_ctdt.sh
deleted file mode 100755
index 63c927c..0000000
--- a/aos/build/create_aos_ctdt.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-echo '#include "aos/crio/aos_ctdt.h"'
-calls=''
-for symbol in `cat - | awk '{ print $NF }' | grep '^aos_init_function_'`; do
-	echo "void $symbol();"
-	calls="$calls$symbol();\n"
-done
-echo 'void aos_call_init_functions() {'
-echo -e $calls
-echo '}'
-
diff --git a/aos/build/crio_cc b/aos/build/crio_cc
new file mode 100755
index 0000000..442d3fe
--- /dev/null
+++ b/aos/build/crio_cc
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# This is a helper script that gets called as a replacement for gcc. It just
+# passes all arguments on unless it is being called as a shared linker.
+
+[ $1 != '-shared' ] && exec powerpc-wrs-vxworks-gcc "$@"
+exec $(dirname $0)/crio_link_out "$@"
diff --git a/aos/build/crio_cxx b/aos/build/crio_cxx
new file mode 100755
index 0000000..ea68e58
--- /dev/null
+++ b/aos/build/crio_cxx
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# This is a helper script that gets called as a replacement for g++. It just
+# passes all arguments on unless it is being called as a shared linker.
+
+[ $1 != '-shared' ] && exec powerpc-wrs-vxworks-g++ "$@"
+exec $(dirname $0)/crio_link_out "$@"
diff --git a/aos/build/crio_link_out b/aos/build/crio_link_out
index eef549b..0630341 100755
--- a/aos/build/crio_link_out
+++ b/aos/build/crio_link_out
@@ -1,7 +1,11 @@
-#!/bin/bash -e
+#!/bin/bash
+#set -x
 
-# This is a helper script that compiles .out files for the cRIO. It is designed
-# to be called as a replacement for g++ being used as a linker.
+set -e
+
+# This is a helper script that compiles .out files for the cRIO. It gets called
+# by the gcc and g++ wrapper scripts if they detect that the tool is being used
+# as a shared linker.
 
 # All the flags except -shared.
 INPUTS_FLAGS=`echo "$@" | sed 's/-shared//g'`
@@ -9,7 +13,6 @@
 OUTPUT=`echo ${INPUTS_FLAGS} | awk \
   'BEGIN { RS=" " }; output { print ; output = 0 }; /-o/ { output = 1 }'`
 # All arguments that don't start with a - and aren't ${OUTPUT}.
-#INPUTS=`echo ${INPUTS_FLAGS} | sed "s:-[^ ]*::g; s:${OUTPUT}::g;"`
 INPUTS=`echo ${INPUTS_FLAGS} | awk \
   'BEGIN { RS=" " }; /-Wl,--no-whole-archive/ { output = 0 }; \
   output { print }; \
@@ -17,10 +20,8 @@
 TEMPDIR=`dirname ${OUTPUT}`
 AOS=`dirname $0`/..
 powerpc-wrs-vxworks-nm ${INPUTS} | \
-  tclsh ${WIND_BASE}/host/resource/hutils/tcl/munch.tcl -c ppc > ${TEMPDIR}/ctdt.c
+  tclsh ${WIND_BASE}/host/resource/hutils/tcl/munch.tcl -c ppc > \
+    ${TEMPDIR}/ctdt.c
 powerpc-wrs-vxworks-gcc -I${AOS}/.. -c ${TEMPDIR}/ctdt.c -o ${TEMPDIR}/ctdt.o
-powerpc-wrs-vxworks-nm ${INPUTS} | \
-  ${AOS}/build/create_aos_ctdt.sh > ${TEMPDIR}/aos_ctdt.c
-powerpc-wrs-vxworks-gcc -I${AOS}/.. -c ${TEMPDIR}/aos_ctdt.c -o ${TEMPDIR}/aos_ctdt.o
-powerpc-wrs-vxworks-g++ ${INPUTS_FLAGS} ${TEMPDIR}/ctdt.o ${TEMPDIR}/aos_ctdt.o
+powerpc-wrs-vxworks-g++ ${INPUTS_FLAGS} ${TEMPDIR}/ctdt.o
 ln -f ${OUTPUT} `echo ${OUTPUT} | sed 's/lib\([A-Za-z0-9_]*\)\.so$/\1.out/'`
diff --git a/aos/build/download_externals.sh b/aos/build/download_externals.sh
index ef843e1..adc0297 100755
--- a/aos/build/download_externals.sh
+++ b/aos/build/download_externals.sh
@@ -1,7 +1,33 @@
-#!/bin/bash -e
+#!/bin/bash
 
-AOS=`dirname $0`/..
-EXTERNALS=${AOS}/externals
+set -e
+
+AOS=$(readlink -f $(dirname $0)/..)
+. $(dirname $0)/tools_config
+COMPILED=${EXTERNALS}/../compiled-arm
+
+CROSS_COMPILE=arm-linux-gnueabihf-
+
+export CC=${CROSS_COMPILE}gcc-4.7
+export CXX=${CROSS_COMPILE}g++-4.7
+export CFLAGS="-mcpu=cortex-a8 -mfpu=neon"
+export CXXFLAGS="-mcpu=cortex-a8 -mfpu=neon"
+export OBJDUMP=${CROSS_COMPLIE}objdump
+# Flags that should get passed to all configure scripts.
+# Some of them need to set LDFLAGS separately to work around stupid configure
+# scripts, so we can't just set that here.
+CONFIGURE_FLAGS="--host=arm-linux-gnueabihf CC=${CC} CXX=${CXX} CFLAGS=\"${CFLAGS}\" CXXFLAGS=\"${CXXFLAGS}\" OBJDUMP=${OBJDUMP}"
+
+TMPDIR=/tmp/$$-aos-tmpdir
+mkdir -p ${EXTERNALS}
+mkdir -p ${COMPILED}
+
+# get and build ninja
+[ -d ${NINJA_DIR} ] || git clone --branch ${NINJA_RELEASE} https://github.com/martine/ninja.git ${NINJA_DIR}
+[ -x ${NINJA} ] || env -i "PATH=$PATH" ${NINJA_DIR}/bootstrap.py
+
+# get gyp
+[ -d ${GYP_DIR} ] || ( svn co http://gyp.googlecode.com/svn/trunk -r ${GYP_REVISION} ${GYP_DIR} && patch -p1 -d ${GYP_DIR} < ${AOS}/externals/gyp.patch )
 
 # get gccdist
 GCCDIST=${EXTERNALS}/gccdist
@@ -9,7 +35,7 @@
 [ -d ${GCCDIST} ] || ( cd ${EXTERNALS} && unzip -q ${GCCDIST}.zip )
 
 # get eigen
-EIGEN_VERSION=3.0.5
+EIGEN_VERSION=3.1.3
 EIGEN_DIR=${EXTERNALS}/eigen-${EIGEN_VERSION}
 [ -f ${EIGEN_DIR}.tar.bz2 ] || wget http://bitbucket.org/eigen/eigen/get/${EIGEN_VERSION}.tar.bz2 -O ${EIGEN_DIR}.tar.bz2
 [ -d ${EIGEN_DIR} ] || ( mkdir ${EIGEN_DIR} && tar --strip-components=1 -C ${EIGEN_DIR} -xf ${EIGEN_DIR}.tar.bz2 )
@@ -28,35 +54,115 @@
 
 # get and build libjpeg
 LIBJPEG_VERSION=8d
-LIBJPEG_DIR=${EXTERNALS}/jpeg-${LIBJPEG_VERSION}
+LIBJPEG_DIR=${COMPILED}/jpeg-${LIBJPEG_VERSION}
 # NOTE: this directory ends up in #include names
-LIBJPEG_PREFIX=${EXTERNALS}/libjpeg
+LIBJPEG_PREFIX=${COMPILED}/libjpeg
 LIBJPEG_LIB=${LIBJPEG_PREFIX}/lib/libjpeg.a
 LIBJPEG_TAR=${EXTERNALS}/jpegsrc.v${LIBJPEG_VERSION}.tar.gz
 [ -f ${LIBJPEG_TAR} ] || wget http://www.ijg.org/files/jpegsrc.v${LIBJPEG_VERSION}.tar.gz -O ${LIBJPEG_TAR}
 [ -d ${LIBJPEG_DIR} ] || ( mkdir ${LIBJPEG_DIR} && tar --strip-components=1 -C ${LIBJPEG_DIR} -xf ${LIBJPEG_TAR} )
-[ -f ${LIBJPEG_LIB} ] || env -i PATH="${PATH}" bash -c "cd ${LIBJPEG_DIR} && CFLAGS='-m32' ./configure --disable-shared --prefix=`readlink -f ${LIBJPEG_PREFIX}` && make && make install"
+[ -f ${LIBJPEG_LIB} ] || bash -c \
+	"cd ${LIBJPEG_DIR} && ./configure --disable-shared \
+	${CONFIGURE_FLAGS} --prefix=`readlink -f ${LIBJPEG_PREFIX}` \
+	&& make && make install"
 
 # get gtest
 GTEST_VERSION=1.6.0
-GTEST_DIR=${EXTERNALS}/gtest-${GTEST_VERSION}-p1
+GTEST_DIR=${EXTERNALS}/gtest-${GTEST_VERSION}
 GTEST_ZIP=${EXTERNALS}/gtest-${GTEST_VERSION}.zip
-TMPDIR=/tmp/$$-aos-tmpdir
 [ -f ${GTEST_ZIP} ] || wget http://googletest.googlecode.com/files/gtest-${GTEST_VERSION}.zip -O ${GTEST_ZIP}
-[ -d ${GTEST_DIR} ] || ( unzip ${GTEST_ZIP} -d ${TMPDIR} && mv ${TMPDIR}/gtest-${GTEST_VERSION} ${GTEST_DIR} && cd ${GTEST_DIR} && patch -p1 < ../gtest.patch )
+[ -d ${GTEST_DIR} ] || ( unzip ${GTEST_ZIP} -d ${TMPDIR} && mv ${TMPDIR}/gtest-${GTEST_VERSION} ${GTEST_DIR} && cd ${GTEST_DIR} && patch -p1 < ${AOS}/externals/gtest.patch )
 
 # get and build ctemplate
-CTEMPLATE_VERSION=2.2
-CTEMPLATE_DIR=${EXTERNALS}/ctemplate-${CTEMPLATE_VERSION}
+# This is the next revision after the 2.2 release and it only adds spaces to
+# make gcc 4.7 with --std=c++11 happy (user-defined string literals...).
+CTEMPLATE_VERSION=129
+CTEMPLATE_TAR=${EXTERNALS}/ctemplate-${CTEMPLATE_VERSION}.tar.gz
+CTEMPLATE_DIR=${COMPILED}/ctemplate-${CTEMPLATE_VERSION}
 CTEMPLATE_PREFIX=${CTEMPLATE_DIR}-prefix
 CTEMPLATE_LIB=${CTEMPLATE_PREFIX}/lib/libctemplate.a
-CTEMPLATE_URL=http://ctemplate.googlecode.com/files
-CTEMPLATE_URL=${CTEMPLATE_URL}/ctemplate-${CTEMPLATE_VERSION}.tar.gz
-[ -f ${CTEMPLATE_DIR}.tar.gz ] || \
-	wget ${CTEMPLATE_URL} -O ${CTEMPLATE_DIR}.tar.gz
-[ -d ${CTEMPLATE_DIR} ] || ( mkdir ${CTEMPLATE_DIR} && tar \
-	--strip-components=1 -C ${CTEMPLATE_DIR} -xf ${CTEMPLATE_DIR}.tar.gz )
-[ -f ${CTEMPLATE_LIB} ] || env -i PATH="${PATH}" \
-	CFLAGS='-m32' CXXFLAGS='-m32' LDFLAGS='-m32' \
-	bash -c "cd ${CTEMPLATE_DIR} && ./configure --disable-shared \
-	--prefix=`readlink -f ${CTEMPLATE_PREFIX}` && make && make install"
+CTEMPLATE_URL=http://ctemplate.googlecode.com
+if [[ "${CTEMPLATE_VERSION}" =~ /\./ ]]; then
+	CTEMPLATE_URL=${CTEMPLATE_URL}/files/ctemplate-${CTEMPLATE_VERSION}.tar.gz
+	[ -f ${CTEMPLATE_TAR} ] || \
+		wget ${CTEMPLATE_URL} -O ${CTEMPLATE_TAR}
+	[ -d ${CTEMPLATE_DIR} ] || ( mkdir ${CTEMPLATE_DIR} && tar \
+		--strip-components=1 -C ${CTEMPLATE_DIR} -xf ${CTEMPLATE_TAR} )
+else
+	CTEMPLATE_URL=${CTEMPLATE_URL}/svn/trunk
+	[ -d ${CTEMPLATE_DIR} ] || \
+		svn checkout ${CTEMPLATE_URL} -r ${CTEMPLATE_VERSION} ${CTEMPLATE_DIR}
+fi
+[ -f ${CTEMPLATE_LIB} ] || bash -c "cd ${CTEMPLATE_DIR} && \
+	./configure --disable-shared \
+	${CONFIGURE_FLAGS} --prefix=`readlink -f ${CTEMPLATE_PREFIX}` \
+	&& make && make install"
+
+# get and build gflags
+GFLAGS_VERSION=2.0
+GFLAGS_TAR=${EXTERNALS}/gflags-${GFLAGS_VERSION}.tar.gz
+GFLAGS_DIR=${COMPILED}/gflags-${GFLAGS_VERSION}
+GFLAGS_PREFIX=${GFLAGS_DIR}-prefix
+GFLAGS_LIB=${GFLAGS_PREFIX}/lib/libgflags.a
+GFLAGS_URL=https://gflags.googlecode.com/files/gflags-${GFLAGS_VERSION}.tar.gz
+[ -f ${GFLAGS_TAR} ] || wget ${GFLAGS_URL} -O ${GFLAGS_TAR}
+[ -d ${GFLAGS_DIR} ] || ( mkdir ${GFLAGS_DIR} && tar \
+  --strip-components=1 -C ${GFLAGS_DIR} -xf ${GFLAGS_TAR} )
+[ -f ${GFLAGS_LIB} ] || bash -c "cd ${GFLAGS_DIR} && ./configure \
+  ${CONFIGURE_FLAGS} --prefix=`readlink -f ${GFLAGS_PREFIX}` \
+  && make && make install"
+
+# get the LLVM Compiler-RT source
+COMPILER_RT_TAG=RELEASE_32/final
+COMPILER_RT_VERSION=`echo ${COMPILER_RT_TAG} | sed s:/:_:`
+COMPILER_RT_DIR=${EXTERNALS}/compiler-rt-${COMPILER_RT_VERSION}
+COMPILER_RT_URL=http://llvm.org/svn/llvm-project/compiler-rt/tags/${COMPILER_RT_TAG}
+[ -d ${COMPILER_RT_DIR} ] || svn checkout ${COMPILER_RT_URL} ${COMPILER_RT_DIR}
+
+# get and build libevent
+LIBEVENT_VERSION=2.0.21
+LIBEVENT_TAR=${EXTERNALS}/libevent-${LIBEVENT_VERSION}.tar.gz
+LIBEVENT_DIR=${COMPILED}/libevent-${LIBEVENT_VERSION}
+LIBEVENT_PREFIX=${LIBEVENT_DIR}-prefix
+LIBEVENT_LIB=${LIBEVENT_PREFIX}/lib/libevent.a
+LIBEVENT_URL=https://github.com/downloads/libevent/libevent
+LIBEVENT_URL=${LIBEVENT_URL}/libevent-${LIBEVENT_VERSION}-stable.tar.gz
+[ -f ${LIBEVENT_TAR} ] || wget ${LIBEVENT_URL} -O ${LIBEVENT_TAR}
+[ -d ${LIBEVENT_DIR} ] || ( mkdir ${LIBEVENT_DIR} && tar \
+  --strip-components=1 -C ${LIBEVENT_DIR} -xf ${LIBEVENT_TAR} )
+[ -f ${LIBEVENT_LIB} ] || bash -c "cd ${LIBEVENT_DIR} && ./configure \
+	${CONFIGURE_FLAGS} --prefix=`readlink -f ${LIBEVENT_PREFIX}` \
+	&& make && make install"
+
+# get and build gmp
+GMP_VERSION=5.1.3
+GMP_TAR=${EXTERNALS}/gmp-${GMP_VERSION}.tar.lz
+GMP_DIR=${COMPILED}/gmp-${GMP_VERSION}
+GMP_PREFIX=${GMP_DIR}-prefix
+GMP_LIB=${GMP_PREFIX}/lib/libgmp.a
+GMP_URL=ftp://ftp.gmplib.org/pub/gmp/gmp-${GMP_VERSION}.tar.lz
+[ -f ${GMP_TAR} ] || wget ${GMP_URL} -O ${GMP_TAR}
+[ -d ${GMP_DIR} ] || ( mkdir ${GMP_DIR} && tar \
+	--strip-components=1 -C ${GMP_DIR} -xf ${GMP_TAR} )
+[ -f ${GMP_LIB} ] || bash -c "cd ${GMP_DIR} && ./configure \
+	${CONFIGURE_FLAGS} --prefix=$(readlink -f ${GMP_PREFIX}) \
+	&& make && make install"
+
+# get and build libcdd
+LIBCDD_VERSION=094g
+LIBCDD_TAR=${EXTERNALS}/libcdd-${LIBCDD_VERSION}.tar.gz
+LIBCDD_DIR=${COMPILED}/libcdd-${LIBCDD_VERSION}
+LIBCDD_PREFIX=${LIBCDD_DIR}-prefix
+LIBCDD_LIB=${LIBCDD_PREFIX}/lib/libcdd.a
+LIBCDD_URL=ftp://ftp.ifor.math.ethz.ch/pub/fukuda/cdd/cddlib-${LIBCDD_VERSION}.tar.gz
+[ -f ${LIBCDD_TAR} ] || \
+        wget ${LIBCDD_URL} -O ${LIBCDD_TAR}
+[ -d ${LIBCDD_DIR} ] || ( mkdir ${LIBCDD_DIR} && tar \
+        --strip-components=1 -C ${LIBCDD_DIR} -xf ${LIBCDD_TAR} )
+[ -f ${LIBCDD_LIB} ] || LDFLAGS=-L${GMP_PREFIX}/lib \
+	bash -c "cd ${LIBCDD_DIR} && ./configure \
+	--disable-shared ${CONFIGURE_FLAGS} \
+	--prefix=$(readlink -f ${LIBCDD_PREFIX}) \
+	&& make gmpdir=${GMP_PREFIX} && make install"
+
+rm -rf ${TMPDIR}
diff --git a/aos/build/externals.gyp b/aos/build/externals.gyp
index 796fdeb..695fc9f 100644
--- a/aos/build/externals.gyp
+++ b/aos/build/externals.gyp
@@ -2,32 +2,62 @@
 # download_externals.sh makes sure that all of them have been downloaded.
 {
   'variables': {
-    'externals': '<(AOS)/externals',
-    'externals_abs': '<!(readlink -f ../externals)',
+    'externals': '<(AOS)/../output/downloaded',
+    'externals_abs': '<!(readlink -f ../../output/downloaded)',
+    'compiled': '<(externals)/../compiled-arm',
+    'compiled_abs': '<(externals_abs)/../compiled-arm',
 
 # These versions have to be kept in sync with the ones in download_externals.sh.
-    'eigen_version': '3.0.5',
-    'gtest_version': '1.6.0-p1',
+    'eigen_version': '3.1.3',
+    'gtest_version': '1.6.0',
     'onejar_version': '0.97',
-    'ctemplate_version': '2.2',
+    'ctemplate_version': '129',
+    'gflags_version': '2.0',
+    'compiler_rt_version': 'RELEASE_32_final',
+    'libevent_version': '2.0.21',
+    'libcdd_version': '094g',
   },
   'targets': [
     {
-# does nothing when OS!="crio"
       'target_name': 'WPILib',
-      'type': 'none',
-      'conditions': [['OS=="crio"', {
-            'direct_dependent_settings': {
-              'cflags': [
-                '-isystem', '<(aos_abs)/externals/WPILib',
-              ],
-              'link_settings': {
-                'libraries': [
-                  '<(aos_abs)/externals/WPILib/WPILib.a',
-                ],
-              },
-            },
-        }]],
+      'type': 'static_library',
+      'sources': [
+        '<!@(find <(AOS)/externals/WPILib/WPILib/ -name *.cpp)',
+      ],
+      'cflags!': [
+        '-Werror',
+        '-ggdb3',
+        '-O0'
+      ],
+      'cflags': [
+        '-ggdb1',
+        '-O3'
+      ],
+      'include_dirs': [
+        '<(AOS)/externals/WPILib',
+        '<(AOS)/externals/WPILib/WPILib',
+      ],
+      'direct_dependent_settings': {
+        'cflags': [
+          '-isystem', '<(AOS)/externals/WPILib',
+          '-isystem', '<(AOS)/externals/WPILib/WPILib',
+        ],
+      },
+    },
+    {
+      'target_name': 'WPILib-NetworkRobotValues',
+      'type': 'static_library',
+      'sources': [
+        '<(AOS)/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.cpp'
+      ],
+      'include_dirs': [
+        '<(AOS)/externals/WPILib',
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [
+          '<(AOS)/externals/WPILib',
+        ],
+      },
     },
     {
       'target_name': 'onejar',
@@ -59,25 +89,42 @@
       },
     },
     {
-# TODO(brians) convert this to downloading + building
+      'target_name': 'opencv',
+      'type': 'none',
+      'link_settings': {
+        'libraries': [
+          '-lopencv_core',
+          '-lopencv_imgproc',
+        ],
+      },
+    },
+    {
       'target_name': 'libevent',
       'type': 'none',
       'link_settings': {
-        'libraries': ['-levent'],
+        'libraries': ['<(compiled_abs)/libevent-<(libevent_version)-prefix/lib/libevent.a'],
+      },
+      'direct_dependent_settings': {
+        'include_dirs': ['<(compiled)/libevent-<(libevent_version)-prefix/include'],
       },
     },
     {
       'target_name': 'eigen',
       'type': 'none',
       'direct_dependent_settings': {
-        'include_dirs': ['<(externals)/eigen-<(eigen_version)'],
+        'cflags': [
+          '-isystem', '<(externals)/eigen-<(eigen_version)'
+        ],
       },
     },
     {
       'target_name': 'libjpeg',
       'type': 'none',
       'direct_dependent_settings': {
-        'libraries': ['<(externals_abs)/libjpeg/lib/libjpeg.a'],
+        'libraries': ['<(compiled_abs)/libjpeg/lib/libjpeg.a'],
+        'cflags': [
+          '-isystem', '<(compiled)',
+        ],
       },
     },
     {
@@ -138,11 +185,34 @@
       'target_name': 'ctemplate',
       'type': 'none',
       'link_settings': {
-        'libraries': ['<(externals)/ctemplate-<(ctemplate_version)-prefix/lib/libctemplate.a'],
+        'libraries': ['<(compiled_abs)/ctemplate-<(ctemplate_version)-prefix/lib/libctemplate.a'],
       },
       'direct_dependent_settings': {
-        'include_dirs': ['<(externals)/ctemplate-<(ctemplate_version)-prefix/include'],
+        'include_dirs': ['<(compiled)/ctemplate-<(ctemplate_version)-prefix/include'],
       },
     },
+    {
+      'target_name': 'gflags',
+      'type': 'none',
+      'link_settings': {
+        'libraries': ['<(compiled_abs)/gflags-<(gflags_version)-prefix/lib/libgflags.a'],
+      },
+      'direct_dependent_settings': {
+        'include_dirs': ['<(compiled)/gflags-<(gflags_version)-prefix/include'],
+      },
+    },
+    {
+      'target_name': 'libcdd',
+      'type': 'none',
+      'link_settings': {
+        'libraries': ['<(compiled_abs)/libcdd-<(libcdd_version)-prefix/lib/libcdd.a'],
+      },
+      'direct_dependent_settings': {
+        'include_dirs': ['<(compiled_abs)/'],
+      },
+    },
+  ],
+  'includes': [
+    'libgcc-additions/libgcc-additions.gypi',
   ],
 }
diff --git a/aos/build/gen_resource_list.rb b/aos/build/gen_resource_list.rb
deleted file mode 100644
index 259b438..0000000
--- a/aos/build/gen_resource_list.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-outpath = ARGV.shift
-
-outputh = File.new(outpath + '/ResourceList.h', 'w+')
-
-File.open(File.dirname(__FILE__) + '/../atom_code/ipc_lib/resource_list.txt') do |f|
-	outputh.puts <<END
-#ifndef __AOS_RESOURCE_LIST_H_
-#define __AOS_RESOURCE_LIST_H_
-// This file is autogenerated.
-// Edit #{File.expand_path f.path} to change its contents.
-
-#include <stdint.h>
-
-#ifdef __cplusplus // for the c code that just wants to know how long it should be
-namespace aos {
-END
-
-	i = 0
-	f.readlines.each do |l|
-		l = l.chomp
-		outputh.puts "static const uint16_t #{l}(#{i});"
-		i += 1
-	end
-	outputh.puts <<END
-} // namespace aos
-#endif
-
-#define AOS_RESOURCE_NUM #{i}
-
-#endif
-
-END
-end
-
-outputh.close
-
diff --git a/aos/build/libgcc-additions/README b/aos/build/libgcc-additions/README
new file mode 100644
index 0000000..6a9a665
--- /dev/null
+++ b/aos/build/libgcc-additions/README
@@ -0,0 +1,26 @@
+This directory contains the stuff necessary to deal with the fact that the
+  libgcc.a from the old GCC that the cRIO has doesn't have all of the functions
+  that newer GCCs expect from it.
+
+[extra functions necessary for 4.5.2]
+I generated this diff with `powerpc-wrs-vxworks-nm \
+  gccdist/WindRiver/gnu/3.4.4-vxworks-6.3/x86-win32/lib/gcc/powerpc-wrs-vxworks/3.4.4/libgcc.a \
+  | fgrep '000 T' | awk ' { print $NF }'` (and using the same command with the
+  gccdist.a from the 4.5.2 GCC.
+  I then gave the outputs from both of those to diff and edited out by hand the
+  functions that just moved.
+__powisf2
+__powidf2
+__mulsc3
+__muldc3
+__divsc3
+__divdc3
+__bswapsi2
+__bswapdi2
+__floatundisf
+__floatundidf
+__eprintf
+
+eprintf looks like it's not needed.
+Compiler-RT thinks that bswapsi2 and bswapdi2 are only needed on arm, so it
+  only has arm assembly for them.
diff --git a/aos/build/libgcc-additions/_bswapdi2.o b/aos/build/libgcc-additions/_bswapdi2.o
new file mode 100644
index 0000000..8bc6f56
--- /dev/null
+++ b/aos/build/libgcc-additions/_bswapdi2.o
Binary files differ
diff --git a/aos/build/libgcc-additions/_bswapsi2.o b/aos/build/libgcc-additions/_bswapsi2.o
new file mode 100644
index 0000000..4700ad8
--- /dev/null
+++ b/aos/build/libgcc-additions/_bswapsi2.o
Binary files differ
diff --git a/aos/build/libgcc-additions/libgcc-additions.gypi b/aos/build/libgcc-additions/libgcc-additions.gypi
new file mode 100644
index 0000000..afa81f6
--- /dev/null
+++ b/aos/build/libgcc-additions/libgcc-additions.gypi
@@ -0,0 +1,35 @@
+{
+  'targets': [
+    {
+      'target_name': 'libgcc-4.5.2',
+      'type': 'static_library',
+      'variables': {
+        'compiler-rt': '<(externals)/compiler-rt-<(compiler_rt_version)',
+      },
+      'include_dirs': [
+        '<(compiler-rt)/lib',
+      ],
+      'defines': [
+        '_YUGA_BIG_ENDIAN=1',
+        '_YUGA_LITTLE_ENDIAN=0',
+        'UINT64_C(c)=c##ULL',
+      ],
+      'sources': [
+        '<(compiler-rt)/lib/powisf2.c',
+        '<(compiler-rt)/lib/powidf2.c',
+        '<(compiler-rt)/lib/mulsc3.c',
+        '<(compiler-rt)/lib/muldc3.c',
+        '<(compiler-rt)/lib/divsc3.c',
+        '<(compiler-rt)/lib/divdc3.c',
+        #'<(compiler-rt)/lib/bswapsi2.c',
+        '_bswapsi2.o',
+        #'<(compiler-rt)/lib/bswapdi2.c',
+        '_bswapdi2.o',
+        '<(compiler-rt)/lib/floatundisf.c',
+        '<(compiler-rt)/lib/floatundidf.c',
+
+        'libm.c',
+      ],
+    },
+  ],
+}
diff --git a/aos/build/libgcc-additions/libm.c b/aos/build/libgcc-additions/libm.c
new file mode 100644
index 0000000..ce04ce5
--- /dev/null
+++ b/aos/build/libgcc-additions/libm.c
@@ -0,0 +1,47 @@
+// Some of the Compiler-RT implementations we use want to use functions from
+// libm. However, GCC provides builtins for them, so they don't need to show up
+// in <math.h> Unfortunately, those GCC builtins seem to (sometimes, at least)
+// just emit calls to the functions themselves, so we have our own
+// implementations here. They might not be as fast as they could be, but they
+// are correct as far as I can tell.
+
+#include <stdint.h>
+
+double fmax(double a, double b) {
+  if (__builtin_isnan(a)) return b;
+  if (__builtin_isnan(b)) return a;
+  if (a > b) return a;
+  return b;
+}
+float fmaxf(float a, float b) {
+  if (__builtin_isnan(a)) return b;
+  if (__builtin_isnan(b)) return a;
+  if (a > b) return a;
+  return b;
+}
+
+double scalbn(double x, int exp) {
+  return x * (2 << exp);
+}
+float scalbnf(float x, int exp) {
+  return x * (2 << exp);
+}
+
+float logbf(float x) {
+  union {
+    float f;
+    int32_t d;
+  } converter;
+  converter.f = x;
+  int32_t ix = converter.d & 0x7fffffff;
+  int32_t rix;
+
+  if (ix == 0) {
+    return (float)-1.0 / __builtin_fabsf(x);
+  } else if (ix >= 0x7f800000) {
+    return x * x;
+  } else if (__builtin_expect((rix = ix >> 23) == 0, 0)) {
+    rix -= __builtin_clz(ix) - 9;
+  }
+  return (float)(rix - 127);
+}
diff --git a/aos/build/parser.rb b/aos/build/parser.rb
deleted file mode 100644
index 6163129..0000000
--- a/aos/build/parser.rb
+++ /dev/null
@@ -1,556 +0,0 @@
-require 'digest'
-require 'fileutils'
-
-def javaify name
-	name = name.dup
-	name.gsub! /(\w)_(\w)/ do
-		$1 + $2.upcase
-	end
-	name.gsub /^\w/ do |char|
-		char.downcase
-	end
-end
-
-module Contents
-	class SyntaxError < Exception
-	end
-	class Tokenizer
-		def initialize file
-			@file = file
-			@token = ""
-			@lineno = 0
-		end
-		def filename
-			@file.path
-		end
-		def pop_char
-			if char = @hold_char
-				@hold_char = nil
-				return char
-			end
-			return @file.read(1)
-		end
-		def unpop_char char
-			@hold_char = char
-		end
-		def clear_comment
-			@hold_char = nil
-			@file.gets
-			@lineno += 1
-		end
-		def syntax_error error
-			filename = File.basename(@file.path)
-			line = @lineno + 1
-			raise SyntaxError, error + "\n from #{line} of #{filename}", caller
-		end
-		def item_missing item
-			syntax_error "expected \"#{item}\"! you missing something!?"
-		end
-		def peek_token
-			@peek_token = next_token
-		end
-		def next_token
-			if token = @peek_token
-				@peek_token = nil
-				return token
-			end
-			token = @token
-			while char = pop_char
-				if char == "\n"
-					@lineno += 1
-				end
-				if char == "/"
-					if pop_char == "/"
-						clear_comment
-					else
-						syntax_error("unexpected #{char.inspect}")
-					end
-				elsif char =~ /[\s\r\n]/
-					if token.length > 0
-						@token = ""
-						return token
-					end
-				elsif char =~ /[;\{\}]/
-					if token.length > 0
-						unpop_char char
-						@token = ""
-						return token
-					end
-					return(char)
-				elsif token.length > 0 && char =~ /[\w:]/
-					token += char
-				elsif char =~ /[a-zA-Z0-9]/
-					token = char
-				else
-					syntax_error("unexpected #{char.inspect}")
-				end
-			end
-		rescue EOFError
-		end
-		def self.is_string token
-			token =~ /[a-zA-Z]\w*/
-		end
-		def self.is_number token
-			token =~ /[0-9]*/
-		end
-	end
-
-	class Struct
-		class StructField
-			def initialize
-				@members = [] # array of strings
-			end
-			def parse tokenizer
-				while true
-					token = tokenizer.next_token
-					if Tokenizer.is_string(token)
-						@members.push token
-					elsif token == ";" || token == "\n"
-						if @members.length > 0
-							return @members
-						else
-							return nil
-						end
-					else
-						tokenizer.syntax_error("expected member name in struct!")
-					end
-				end
-			end
-			def self.parse *args
-				self.new.parse *args
-			end
-			def use members
-				members
-			end
-			def self.use *args
-				self.new.use *args
-			end
-			def to_s
-				@members.join " "
-			end
-		end
-
-		def parse tokenizer, parse_name = true
-			if parse_name
-				token = tokenizer.next_token
-				if Tokenizer.is_string(token)
-					@name_raw = token
-				else
-					tokenizer.syntax_error("expected struct name!")
-				end
-			else
-				@name_raw = nil
-				@name_data = tokenizer.filename
-			end
-			token = tokenizer.next_token
-			tokenizer.syntax_error("expected '{', got '#{token}'") if(token != "{")
-			while token != "}"
-				token = tokenizer.peek_token
-				if token != "}"
-					field = StructField.parse(tokenizer)
-					@fields.push(field) if(field)
-				end
-			end
-			if tokenizer.next_token == "}"
-				return self
-			else
-				tokenizer.syntax_error("wahh; call parker. #{__LINE__}")
-			end
-		end
-		def self.parse *args
-			self.new.parse *args
-		end
-
-		def use fields, name_data
-			@name_raw = nil
-			@name_data = name_data
-			fields.each do |field|
-				@fields.push(StructField.use field.split(' '))
-			end
-			self
-		end
-		def self.use *args
-			self.new.use *args
-		end
-
-		def name
-			@name_raw || gen_name
-		end
-		def gen_name
-			unless @generated_name
-				@generated_name = 'a' + Digest::SHA1.hexdigest(@fields.join('') + $namespace + @name_data)
-			end
-			@generated_name
-		end
-
-		def initialize
-			@fields = [] # array of arrays of strings
-			@hidden_fields = []
-		end
-		def upcase_name
-			name.gsub(/^[a-z]|_[a-z]/) do |v|
-				v[-1].chr.upcase
-			end
-		end
-		def join_fields array
-			(array.collect { |a|
-				"  #{a.join(" ")};"
-			}).join("\n")
-		end
-		def fields
-			join_fields @fields
-		end
-		def hidden_fields
-			join_fields @hidden_fields
-		end
-		def add_hidden_field k, v
-			@hidden_fields.push [k, v]
-		end
-		def params
-			(@fields.collect do |a|
-				a.join(" ")
-			end).join(', ')
-		end
-		def copy_params_into varname, decl = true
-			(decl ? "#{name} #{varname};\n" : '') + (@fields.collect do |a|
-				"#{varname}.#{a[-1]} = #{a[-1]};"
-			end).join("\n")
-		end
-		def params_from name
-			(@fields.collect do |a|
-				name + '.' + a[-1]
-			end).join(', ')
-		end
-		def builder_name aos_namespace = true, this_namespace = true
-			(aos_namespace ? "aos::" : '') + "QueueBuilder<#{this_namespace ? $namespace + '::' : ''}#{name}>"
-		end
-		def java_builder
-			name + 'Builder'
-		end
-		def builder_defs name
-			(@fields.collect do |field|
-				"  inline #{name} &#{field[-1]}" +
-				"(#{field[0...-1].join(" ")} in) " +
-				"{ holder_.View().#{field[-1]} = in; return *this; }"
-			end).join "\n"
-		end
-		def swig_builder_defs name
-			(@fields.collect do |field|
-				"  %rename(#{javaify field[-1]}) #{field[-1]};\n" +
-				"  #{name} &#{field[-1]}" +
-				"(#{field[0...-1].join(" ")} #{field[-1]});"
-			end).join "\n"
-		end
-		def zero name
-			(@fields.collect do |field|
-				"    new (&#{name}.#{field[-1]}) #{field[0...-1].join ' '}();"
-			end).join("\n")
-		end
-		def size
-			(@fields.collect do |field|
-				"sizeof(#{$namespace}::#{name}::#{field[-1]})"
-			end.push('0')).join(' + ')
-		end
-		def get_format(field)
-			case(field[0...-1])
-			when ['int']
-				r = '%d'
-			when ['float'], ['double']
-				r = '%f'
-			when ['bool']
-				r = '%s'
-			when ['uint8_t']
-				r = '%hhu'
-			when ['uint16_t']
-				r = '%d'
-			when ['struct', 'timespec']
-				r = '%jdsec,%ldnsec'
-			else
-				return 'generator_error'
-			end
-			return field[-1] + ': ' + r
-		end
-		def to_printf(name, field)
-			case(field[0...-1])
-			when ['bool']
-				return name + '.' + field[-1] + ' ? "true" : "false"'
-			when ['uint16_t']
-				return "static_cast<int>(#{name}.#{field[-1]})"
-			when ['struct', 'timespec']
-				return "#{name}.#{field[-1]}.tv_sec, #{name}.#{field[-1]}.tv_nsec"
-			else
-				return name + '.' + field[-1]
-			end
-		end
-		def netop name, buffer
-			offset = '0'
-			(@fields.collect do |field|
-				# block |var_pointer, output_pointer|
-				val = yield "&#{name}.#{field[-1]}", "&#{buffer}[#{offset}]"
-				offset += " + sizeof(#{name}.#{field[-1]})"
-				'    ' + val
-			end).join("\n") + "\n    " +
-				"static_assert(#{offset} == #{size}, \"code generator issues\");"
-		end
-		def hton name, output
-			netop(name, output) do |var, output|
-				"to_network(#{var}, #{output});"
-			end
-		end
-		def ntoh input, name
-			netop(name, input) do |var, input|
-				"to_host(#{input}, #{var});"
-			end
-		end
-		def swig_writer
-			<<END
-struct #{name} {
-#{(@fields.collect { |a|
-	"  %rename(#{javaify a[-1]}) #{a[-1]};"
-}).join("\n")}
-#{self.fields}
-  %extend {
-    const char *toString() {
-      return aos::TypeOperator<#{$namespace}::#{name}>::Print(*$self);
-    }
-  }
- private:
-  #{name}();
-};
-} // namespace #{$namespace}
-namespace aos {
-%typemap(jstype) #{builder_name false}& "#{java_builder}"
-%typemap(javaout) #{builder_name false}& {
-    $jnicall;
-    return this;
-  }
-template <> class #{builder_name false} {
- private:
-  #{builder_name false}();
- public:
-  inline bool Send();
-  %rename(#{javaify 'Send'}) Send;
-#{swig_builder_defs builder_name(false)}
-};
-%template(#{java_builder}) #{builder_name false};
-%typemap(javaout) #{builder_name false}& {
-    return new #{java_builder}($jnicall, false);
-  }
-} // namespace aos
-namespace #{$namespace} {
-END
-		end
-		def writer
-			<<END
-struct #{name} {
-#{self.fields}
-#{self.hidden_fields}
-};
-} // namespace #{$namespace}
-namespace aos {
-template <> class TypeOperator<#{$namespace}::#{name}> {
- public:
-  static void Zero(#{$namespace}::#{name} &inst) {
-    (void)inst;
-#{zero 'inst'}
-  }
-  static void NToH(const char *input, #{$namespace}::#{name} &inst) {
-    (void)input;
-    (void)inst;
-#{ntoh 'input', 'inst'}
-  }
-  static void HToN(const #{$namespace}::#{name} &inst, char *output) {
-    (void)inst;
-    (void)output;
-#{hton 'inst', 'output'}
-  }
-  static inline size_t Size() { return #{size}; }
-  static const char *Print(const #{$namespace}::#{name} &inst) {
-#{@fields.empty? ? <<EMPTYEND : <<NOTEMPTYEND}
-    (void)inst;
-    return "";
-EMPTYEND
-    static char buf[1024];
-    if (snprintf(buf, sizeof(buf), "#{@fields.collect do |field|
-	    get_format(field)
-    end.join(', ')}", #{@fields.collect do |field|
-	    to_printf('inst', field)
-    end.join(', ')}) >= static_cast<ssize_t>(sizeof(buf))) {
-      LOG(WARNING, "#{name}'s buffer was too small\\n");
-      buf[sizeof(buf) - 1] = '\\0';
-    }
-    return buf;
-NOTEMPTYEND
-  }
-};
-template <> class #{builder_name false} {
- private:
-  aos::QueueHolder<#{$namespace}::#{name}> &holder_;
- public:
-  #{builder_name false}(aos::QueueHolder<#{$namespace}::#{name}> &holder) : holder_(holder) {}
-  inline bool Send() { return holder_.Send(); }
-  inline const char *Print() const { return holder_.Print(); }
-#{builder_defs builder_name(false)}
-};
-} // namespace aos
-namespace #{$namespace} {
-END
-		end
-		def to_s
-			return <<END
-#{name}: #{(@fields.collect {|n| n.join(" ") }).join("\n\t")}
-END
-		end
-	end
-
-	class SimpleField
-		def initialize check_function = :is_string
-			@check_function = check_function
-			@name = nil
-		end
-		def parse tokenizer
-			token = tokenizer.next_token
-			if Tokenizer.__send__ @check_function, token
-				@name = token
-			else
-				tokenizer.syntax_error('expected value!')
-			end
-			if tokenizer.next_token == ';'
-				@name
-			else
-				tokenizer.syntax_error('expected ";"!')
-			end
-		end
-		def self.parse tokenizer
-			self.new.parse tokenizer
-		end
-	end
-	class NameField < SimpleField
-	end
-
-	class OutputFile
-		def initialize namespace, filename, topdir, outpath
-			@namespace = namespace
-			$namespace = namespace
-			@base = filename.gsub(/\.\w*$/, "").gsub(/^.*\//, '')
-      @topdir = topdir
-			@filebase = outpath + @base
-			@filename = filename
-      FileUtils.mkdir_p(outpath)
-
-			fillin_initials if respond_to? :fillin_initials
-			parse filename
-			fillin_defaults if respond_to? :fillin_defaults
-			self
-		rescue SyntaxError => e
-			puts e
-			exit 1
-		end
-		def filename type
-			case type
-			when 'h'
-				@filebase + '.q.h'
-			when 'cc'
-				@filebase + '.q.cc'
-			when 'main'
-				@filebase + '_main.cc'
-			when 'swig'
-				@filebase + '.swg'
-      when 'java_dir'
-        @filebase + '_java/'
-      when 'java_wrap'
-        @filebase + '_java_wrap.cc'
-			else
-				throw SyntaxError, "unknown filetype '#{type}'"
-			end
-		end
-		def parse filename
-			file = File.open filename
-			tokenizer = Tokenizer.new file
-			while token = tokenizer.next_token
-				if !token || token.gsub('\s', '').empty?
-				elsif token == ';'
-				else
-					error = catch :syntax_error do
-						case token
-						when 'namespace'
-							$namespace = NameField.parse tokenizer
-						else
-							parse_token token, tokenizer
-						end
-						nil
-					end
-					if error
-						tokenizer.syntax_error error.to_s
-						raise error
-					end
-				end
-			end
-
-			check_format tokenizer
-		end
-    def call_swig
-      output_dir = filename('java_dir') + $namespace
-      FileUtils.mkdir_p(output_dir)
-      if (!system('swig', '-c++', '-Wall', '-Wextra', '-java',
-                  '-package', $namespace, "-I#{@topdir}",
-                  '-o', filename('java_wrap'),
-                  '-outdir', output_dir, filename('swig')))
-        exit $?.to_i
-      end
-    end
-
-		def queue_holder_accessors suffix, var, type, force_timing = nil
-<<END
-  inline bool Get#{suffix}(#{force_timing ? '' : 'bool check_time'}) aos_check_rv { return #{var}.Get(#{force_timing || 'check_time'}); }
-  inline #{type} &View#{suffix}() { return #{var}.View(); }
-  inline void Clear#{suffix}() { #{var}.Clear(); }
-  inline bool Send#{suffix}() { return #{var}.Send(); }
-  inline const char *Print#{suffix}() { return #{var}.Print(); }
-  inline aos::QueueBuilder<#{type}> &#{suffix || 'Builder'}() { return #{var}.Builder(); }
-END
-		end
-		def queue_holder_accessors_swig suffix, var, type, force_timing = nil
-<<END
-  %rename(#{javaify "Get#{suffix}"}) Get#{suffix};
-  bool Get#{suffix}(#{force_timing ? '' : 'bool check_time'});
-  %rename(#{javaify "View#{suffix}"}) View#{suffix};
-  #{type} &View#{suffix}();
-  %rename(#{javaify "Clear#{suffix}"}) Clear#{suffix};
-  void Clear#{suffix}();
-  %rename(#{javaify "Send#{suffix}"}) Send#{suffix};
-  bool Send#{suffix}();
-  %rename(#{javaify suffix || 'Builder'}) #{suffix || 'Builder'};
-  aos::QueueBuilder<#{type}> &#{suffix || 'Builder'}();
-END
-		end
-	end
-end
-
-def write_file_out
-	if ARGV.length < 3
-		puts 'Error: at least 3 arguments required!!!'
-		exit 1
-	end
-	file = Contents::OutputFile.new ARGV.shift,
-		File.expand_path(ARGV.shift),
-    ARGV.shift,
-		File.expand_path(ARGV.shift) + '/'
-	while !ARGV.empty?
-		case type = ARGV.shift
-		when 'cpp'
-			file.write_cpp
-		when 'header'
-			file.write_header
-		when 'main'
-			file.write_main
-		when 'swig'
-			file.write_swig
-      file.call_swig
-		else
-			puts "Error: unknown output type '#{type}'"
-			exit 1
-		end
-	end
-end
-
diff --git a/aos/build/queues.gypi b/aos/build/queues.gypi
index 30fe7cd..0c5da50 100644
--- a/aos/build/queues.gypi
+++ b/aos/build/queues.gypi
@@ -116,8 +116,5 @@
       'gen_srcdir_parents': ['<(out_dir)'],
     },
   },
-  'dependencies': [
-    '<(AOS)/build/aos.gyp:aos_internal_nolib',
-  ],
   'hard_dependency': 1,
 }
diff --git a/aos/build/queues/objects/queue.rb b/aos/build/queues/objects/queue.rb
index 5693486..e993eb9 100644
--- a/aos/build/queues/objects/queue.rb
+++ b/aos/build/queues/objects/queue.rb
@@ -38,14 +38,14 @@
                        "float" => "%f",
                        "char" => "%c",
                        "double" => "%f",
-                       "uint8_t" => "%\"PRIu8\"",
-                       "uint16_t" => "%\"PRIu16\"",
-                       "uint32_t" => "%\"PRIu32\"",
-                       "uint64_t" => "%\"PRIu64\"",
-                       "int8_t" => "%\"PRId8\"",
-                       "int16_t" => "%\"PRId16\"",
-                       "int32_t" => "%\"PRId32\"",
-                       "int64_t" => "%\"PRId64\""}
+                       "uint8_t" => "%\" PRIu8 \"",
+                       "uint16_t" => "%\" PRIu16 \"",
+                       "uint32_t" => "%\" PRIu32 \"",
+                       "uint64_t" => "%\" PRIu64 \"",
+                       "int8_t" => "%\" PRId8 \"",
+                       "int16_t" => "%\" PRId16 \"",
+                       "int32_t" => "%\" PRId32 \"",
+                       "int64_t" => "%\" PRId64 \""}
         def toPrintFormat()
 		if(format = PrintFormat[@type])
 			return format;
diff --git a/aos/build/queues/output/message_dec.rb b/aos/build/queues/output/message_dec.rb
index 0e957be..3b89149 100644
--- a/aos/build/queues/output/message_dec.rb
+++ b/aos/build/queues/output/message_dec.rb
@@ -1,4 +1,9 @@
-require "sha1"
+begin
+  require "sha1"
+rescue LoadError
+  require "digest/sha1"
+end
+
 class Target::MessageDec < Target::Node
 	attr_accessor :name,:loc,:parent,:msg_hash
 	def initialize(name)
@@ -30,7 +35,7 @@
 			format += ", "
 			format += elem.toPrintFormat()
 			if (elem.type == 'bool')
-				args.push("#{elem.name} ? 't' : 'f'")
+				args.push("#{elem.name} ? 'T' : 'f'")
 			else
 				args.push(elem.name)
 			end
@@ -118,7 +123,7 @@
 		ts = (@members.collect { |elem|
 			elem.type + " " + elem.name
 		}).join(";")
-		self.msg_hash = "0x#{SHA1.hexdigest(ts)[-8..-1]}"
+		self.msg_hash = "0x#{Digest::SHA1.hexdigest(ts)[-8..-1]}"
 		type_class.add_member("enum {kQueueLength = 1234, kHash = #{self.msg_hash}}")
 		@members.each do |elem|
 			type_class.add_member(elem.create_usage(cpp_tree))
@@ -156,13 +161,13 @@
 		cons_ifdef_statement = CPP::PreprocessorIf.new(cons, unsafe_cons)
 		cons_ifdef_statement.name = "!defined(__VXWORKS__) && !defined(__TEST_VXWORKS__)"
 		template.add_member(:private,cons_ifdef_statement)
-		cons.args << "aos_queue *queue"
+		cons.args << "RawQueue *queue"
 		cons.args << "#{t} *msg"
 		unsafe_cons.args << "#{t} *msg"
 		cons.add_cons("msg_ptr_","queue","msg")
 		unsafe_cons.add_cons("msg_ptr_","msg")
 		cons = safetemplate.add_member(:private,CPP::Constructor.new(safetemplate))
-		cons.args << "aos_queue *queue"
+		cons.args << "RawQueue *queue"
 		cons.add_cons("msg_ptr_","queue")
 		safetemplate.public
 		template.public
diff --git a/aos/build/queues/output/q_file.rb b/aos/build/queues/output/q_file.rb
index af76ee1..5e016c0 100644
--- a/aos/build/queues/output/q_file.rb
+++ b/aos/build/queues/output/q_file.rb
@@ -1,4 +1,9 @@
-require "sha1"
+begin
+  require "sha1"
+rescue LoadError
+  require "digest/sha1"
+end
+
 module Target
 end
 class Target::Node
@@ -76,7 +81,7 @@
 		ts = (@queues.collect { |queue|
 			queue.msg_hash()
 		}).join("") + name
-		return "0x#{SHA1.hexdigest(ts)[-8..-1]}"
+		return "0x#{Digest::SHA1.hexdigest(ts)[-8..-1]}"
 	end
 	def create(cpp_tree)
 		return if(@extern)
diff --git a/aos/build/tools_config b/aos/build/tools_config
new file mode 100644
index 0000000..d47a3ce
--- /dev/null
+++ b/aos/build/tools_config
@@ -0,0 +1,13 @@
+# This is a shell fragment that sets up variables related to where the tools
+# that download_externals.sh downloads so build.sh can use.
+
+EXTERNALS=${AOS}/../output/downloaded
+
+NINJA_RELEASE=v1.4.0
+NINJA_DIR=${EXTERNALS}/ninja-${NINJA_RELEASE}
+NINJA=${NINJA_DIR}/ninja
+
+# From chromium@154360:trunk/src/DEPS.
+GYP_REVISION=1738
+GYP_DIR=${EXTERNALS}/gyp-${GYP_REVISION}
+GYP=${GYP_DIR}/gyp
diff --git a/aos/common/Configuration.cpp b/aos/common/Configuration.cpp
deleted file mode 100644
index 90de05d..0000000
--- a/aos/common/Configuration.cpp
+++ /dev/null
@@ -1,205 +0,0 @@
-#include "Configuration.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#ifdef __VXWORKS__
-#include <ifLib.h>
-#include <inetLib.h>
-#else
-#include <ifaddrs.h>
-#endif
-
-#include "aos/aos_core.h"
-#ifndef __VXWORKS__
-#include "aos/common/unique_malloc_ptr.h"
-#endif
-#include "aos/common/once.h"
-
-namespace aos {
-namespace configuration {
-
-namespace {
-
-#ifdef __VXWORKS__
-const size_t kMaxAddrLength = INET_ADDR_LEN;
-#else
-// Including the terminating '\0'.
-const size_t kMaxAddrLength = 18;
-#endif
-// Returns whether or not the current IP address is in ownIPAddress.
-bool GetOwnIPAddress();
-
-#ifdef __VXWORKS__
-// vxworks doesn't have real asprintf.......
-static inline int aos_asprintf(size_t max_len, char **strp, const char *fmt, ...) {
-  *strp = static_cast<char *>(malloc(max_len));
-  if (*strp == NULL) {
-    return -1;
-  }
-  va_list argp;
-  va_start(argp, fmt);
-  const int r = vsnprintf(*strp, max_len, fmt, argp);
-  va_end(argp);
-  if (static_cast<uintmax_t>(r) >= max_len) {
-    errno = EOVERFLOW;
-    free(*strp);
-    return -1;
-  }
-  return r;
-}
-
-// 4-slot cRIO: motfec0
-// 8-slot cRIO port 1: fec0
-// ifShow will show you all of the ones on a cRIO
-const char *const kCrioNetInterfaces[] = {"fec0", "motfec0"};
-bool GetOwnIPAddress(char *buffer, size_t bufferSize) {
-  if (bufferSize < INET_ADDR_LEN) {
-    LOG(ERROR, "bufferSize(%jd) isn't >= INET_ADDR_LEN(%jd)\n",
-        static_cast<intmax_t>(bufferSize),
-        static_cast<intmax_t>(INET_ADDR_LEN));
-    return false;
-  }
-  for (size_t i = 0;
-       i < sizeof(kCrioNetInterfaces) / sizeof(kCrioNetInterfaces[0]); ++i) {
-    if (ifAddrGet(const_cast<char *>(kCrioNetInterfaces[i]), buffer) != OK) {
-      LOG(DEBUG, "ifAddrGet(\"%s\", %p) failed with %d: %s\n",
-          kCrioNetInterfaces[i], buffer, errno, strerror(errno));
-    } else {
-      return true;
-    }
-  }
-  LOG(ERROR, "couldn't get the cRIO's IP address\n");
-  return false;
-}
-#else
-static inline int aos_asprintf(size_t, char **strp, const char *fmt, ...) {
-  va_list argp;
-  va_start(argp, fmt);
-  const int r = vasprintf(strp, fmt, argp);
-  va_end(argp);
-  return r;
-}
-
-const char *const kAtomNetInterface = "eth0";
-bool GetOwnIPAddress(char *buffer, size_t bufferSize) {
-  ifaddrs *addrs;
-  if (getifaddrs(&addrs) != 0) {
-    LOG(ERROR, "getifaddrs(%p) failed with %d: %s\n", &addrs,
-        errno, strerror(errno));
-    return false;
-  }
-  // Smart pointers don't work very well for iterating through a linked list,
-  // but it does do a very nice job of making sure that addrs gets freed.
-  unique_c_ptr<ifaddrs, freeifaddrs> addrs_deleter(addrs);
-
-  for (; addrs != NULL; addrs = addrs->ifa_next) {
-    if (addrs->ifa_addr->sa_family == AF_INET) {
-      if (strcmp(kAtomNetInterface, addrs->ifa_name) == 0) {
-        const char *ipAddress = inet_ntoa(
-            reinterpret_cast<sockaddr_in *>(addrs->ifa_addr)->sin_addr);
-        strncpy(buffer, ipAddress, bufferSize);
-        return true;
-      }
-    }
-  }
-  LOG(ERROR, "couldn't find an AF_INET interface named \"%s\"\n",
-      kAtomNetInterface);
-  return false;
-}
-#endif
-
-const char *RawIPAddress(uint8_t last_part) {
-  char ownIPAddress[kMaxAddrLength];
-  if (!GetOwnIPAddress(ownIPAddress, sizeof(ownIPAddress))) {
-    return NULL;
-  }
-  char *last_dot = strrchr(ownIPAddress, '.');
-  if (last_dot == NULL) {
-    LOG(ERROR, "can't find any '.'s in \"%s\"\n", ownIPAddress);
-    return NULL;
-  }
-  *last_dot = '\0';
-
-  char *r;
-  if (aos_asprintf(kMaxAddrLength, &r, "%s.%hhu",
-                   ownIPAddress, last_part) == -1) {
-    return NULL;
-  }
-  return r;
-}
-
-}  // namespace
-
-const char *GetIPAddress(NetworkDevice device) {
-  switch (device) {
-    case NetworkDevice::kAtom:
-      return RawIPAddress(179);
-    case NetworkDevice::kCRIO:
-      return RawIPAddress(2);
-  }
-  LOG(FATAL, "Unknown network device.");
-  return NULL;
-}
-
-namespace {
-const char *DoGetRootDirectory() {
-#ifdef __VXWORKS__
-  return "/";
-#else
-  ssize_t size = 0;
-  char *r = NULL;
-  while (true) {
-    if (r != NULL) delete r;
-    size += 256;
-    r = new char[size];
-
-    ssize_t ret = readlink("/proc/self/exe", r, size);
-    if (ret < 0) {
-      if (ret != -1) {
-        LOG(WARNING, "it returned %zd, not -1\n", ret);
-      }
-      LOG(FATAL, "readlink(\"/proc/self/exe\", %p, %zu) failed with %d: %s\n",
-          r, size, errno, strerror(errno));
-    }
-    if (ret < size) {
-      void *last_slash = memrchr(r, '/', size);
-      if (last_slash == NULL) {
-        r[ret] = '\0';
-        LOG(FATAL, "couldn't find a '/' in \"%s\"\n", r);
-      }
-      *static_cast<char *>(last_slash) = '\0';
-      LOG(INFO, "got a root dir of \"%s\"\n", r);
-      return r;
-    }
-  }
-#endif
-}
-
-const char *DoGetLoggingDirectory() {
-  static const char kSuffix[] = "/../../tmp/robot_logs";
-  const char *root = GetRootDirectory();
-  char *r = new char[strlen(root) + sizeof(kSuffix)];
-  strcpy(r, root);
-  strcat(r, kSuffix);
-  return r;
-}
-}  // namespace
-
-const char *GetRootDirectory() {
-  static aos::Once<const char> once(DoGetRootDirectory);
-  return once.Get();
-}
-
-const char *GetLoggingDirectory() {
-  static aos::Once<const char> once(DoGetLoggingDirectory);
-  return once.Get();
-}
-
-}  // namespace configuration
-}  // namespace aos
diff --git a/aos/common/Configuration.h b/aos/common/Configuration.h
deleted file mode 100644
index 2f7e777..0000000
--- a/aos/common/Configuration.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef AOS_COMMON_CONFIGURATION_H_
-#define AOS_COMMON_CONFIGURATION_H_
-
-#include "aos/aos_stdint.h"
-
-namespace aos {
-
-// Constants representing the various ports used for communications and some
-// documentation about what each is used for.
-enum class NetworkPort : uint16_t {
-  // UDP socket sending motor values from the atom to the crio.
-  kMotors = 9710,
-  // UDP socket forwarding drivers station packets from the crio to the atom.
-  kDS = 9711,
-  // UDP socket sending sensor values from the crio to the atom.
-  kSensors = 9712,
-  // TCP socket(s) (automatically reconnects) sending logs from the crio to the
-  // atom.
-  kLogs = 9713,
-  // HTTP server that sends out camera feeds in mjpg format.
-  // Should not be changed because this number shows up elsewhere too.
-  kCameraStreamer = 9714,
-};
-
-// Holds global configuration data. All of the functions are safe to call
-// from wherever (the ones that need to create locks on the cRIO).
-namespace configuration {
-
-// Constants indentifying various devices on the network.
-enum class NetworkDevice {
-  // The computer that the cRIO talks to.
-  kAtom,
-  kCRIO,
-};
-// Returns the IP address to get to the specified machine.
-// The return value should be passed to free(3) if it is no longer needed.
-const char *GetIPAddress(NetworkDevice device);
-
-// Returns the "root directory" for this run. Under linux, this is the
-// directory where the executable is located (from /proc/self/exe) and under
-// vxworks it is just "/".
-// The return value will always be to a static string, so no freeing is
-// necessary.
-const char *GetRootDirectory();
-// Returns the directory where logs get written. Relative to GetRootDirectory().
-// The return value will always be to a static string, so no freeing is
-// necessary.
-const char *GetLoggingDirectory();
-
-}  // namespace configuration
-}  // namespace aos
-
-#endif
diff --git a/aos/common/byteorder.h b/aos/common/byteorder.h
index 3444f98..87ef39a 100644
--- a/aos/common/byteorder.h
+++ b/aos/common/byteorder.h
@@ -4,6 +4,7 @@
 #ifndef __VXWORKS__
 #include <endian.h> // endian(3)
 #endif
+#include <string.h>
 
 // Contains functions for converting between host and network byte order for
 // things other than 16/32 bit integers (those are provided by byteorder(3)).
diff --git a/aos/common/common.gyp b/aos/common/common.gyp
index 967eb51..d8c10e0 100644
--- a/aos/common/common.gyp
+++ b/aos/common/common.gyp
@@ -21,8 +21,14 @@
         'queue_testutils.cc',
       ],
       'dependencies': [
-        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:ipc_lib'
+        '<(AOS)/build/aos.gyp:logging',
+        'once',
+        '<(EXTERNALS):gtest',
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:shared_mem',
       ],
+      'export_dependent_settings': [
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:shared_mem',
+       ],
     },
     {
       'target_name': 'time',
@@ -31,30 +37,10 @@
         'time.cc'
       ],
       'dependencies': [
-         # TODO(aschuh): Fix this dependency loop by
-         # providing a logging interface.
-         # '<(AOS)/build/aos.gyp:logging',
-         '<(AOS)/build/aos.gyp:aos/ResourceList.h',
-      ],
-    },
-    {
-      'target_name': 'common',
-      'type': 'static_library',
-      'sources': [
-        'Configuration.cpp',
-      ],
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:logging',
-        'once',
-      ],
-      'export_dependent_settings': [
-        'once',
-      ],
-      'conditions': [
-        ['OS=="crio"', {
-          'dependencies': [
-            '<(EXTERNALS):WPILib',
-        ]}],
+        # TODO(aschuh): Fix this dependency loop by
+        # providing a logging interface.
+        # '<(AOS)/build/aos.gyp:logging',
+        'mutex',
       ],
     },
     {
@@ -71,18 +57,31 @@
         },
         {
           'dependencies': [
-            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:ipc_lib',
+            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
           ],
           'export_dependent_settings': [
-            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:ipc_lib',
+            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
           ],
         }]
       ],
       'dependencies': [
-        '<(AOS)/common/common.gyp:common',
+        'time',
       ],
       'export_dependent_settings': [
-        '<(AOS)/common/common.gyp:common',
+        'time',
+      ],
+    },
+    {
+      'target_name': 'scoped_fd',
+      'type': 'static_library',
+      'sources': [
+        # 'scoped_fd.h'
+      ],
+      'dependencies': [
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/build/aos.gyp:logging',
       ],
     },
     {
@@ -105,7 +104,6 @@
       ],
       'variables': {'no_rsync': 1},
       'dependencies': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
       ],
       'direct_dependent_settings': {
         'variables': {
@@ -115,7 +113,6 @@
         },
       },
       'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
       ],
     },
     {
@@ -125,32 +122,42 @@
         'control_loop/Timing.cpp'
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
         '<(AOS)/build/aos.gyp:logging',
+        'time',
       ],
     },
     {
       'target_name': 'controls',
       'type': 'static_library',
-      'sources': [],
+      'sources': [
+        'control_loop/ControlLoop.cc',
+      ],
       'dependencies': [
         '<(AOS)/common/messages/messages.gyp:aos_queues',
         '<(AOS)/build/aos.gyp:logging',
         'timing',
+        'time',
+        'control_loop_queues',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/messages/messages.gyp:aos_queues',
+        '<(AOS)/build/aos.gyp:logging',
+        'timing',
+        'time',
+        'control_loop_queues',
       ],
     },
     {
       'target_name': 'queue_test',
       'type': 'executable',
       'sources': [
-        '<(AOS)/common/queue_test.cc',
+        'queue_test.cc',
       ],
       'dependencies': [
         '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
         'queue_testutils',
-        'common',
         'queue_test_queue',
+        '<(AOS)/common/util/util.gyp:thread',
       ],
     },
     {
@@ -161,8 +168,6 @@
       ],
       'dependencies': [
         '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
-        ':common',
       ],
     },
     {
@@ -193,7 +198,7 @@
       ],
       'dependencies': [
         '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
+        'once',
       ],
     },
     {
@@ -204,7 +209,59 @@
       ],
       'dependencies': [
         '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
+        'time',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+    },
+    {
+      'target_name': 'die',
+      'type': 'static_library',
+      'sources': [
+        'die.cc',
+      ],
+    },
+    {
+      'target_name': 'condition',
+      'type': 'static_library',
+      'sources': [
+        '<(AOS)/atom_code/ipc_lib/condition.cc',
+      ],
+      'dependencies': [
+        'mutex',
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:aos_sync',
+        # TODO(aschuh): Fix this dependency loop by
+        # providing a logging interface.
+        # '<(AOS)/build/aos.gyp:logging',
+      ],
+      'export_dependent_settings': [
+        'mutex',
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:aos_sync',
+      ],
+    },
+    {
+      'target_name': 'mutex',
+      'type': 'static_library',
+      'conditions': [
+        ['OS=="crio"', {
+          'sources': [
+            '<(AOS)/crio/shared_libs/mutex.cpp',
+          ],
+        }, {
+          'sources': [
+            '<(AOS)/atom_code/ipc_lib/mutex.cpp',
+          ],
+          'dependencies': [
+            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:aos_sync',
+          ],
+          'export_dependent_settings': [
+            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:aos_sync',
+          ],
+        }],
+      ],
+      'dependencies': [
+        # TODO(aschuh): Fix this dependency loop by
+        # providing a logging interface.
+        # '<(AOS)/build/aos.gyp:logging',
       ],
     },
     {
@@ -215,10 +272,28 @@
       ],
       'dependencies': [
         '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
+        'mutex',
+        '<(AOS)/build/aos.gyp:logging',
       ],
     },
     {
+      'target_name': 'condition_test',
+      'type': 'executable',
+      'sources': [
+        'condition_test.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        'condition',
+        '<(AOS)/common/util/util.gyp:thread',
+        'time',
+        'mutex',
+        '<(AOS)/build/aos.gyp:logging',
+        'queue_testutils',
+        '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:core_lib',
+       ],
+    },
+    {
       'target_name': 'die_test',
       'type': 'executable',
       'sources': [
@@ -226,7 +301,14 @@
       ],
       'dependencies': [
         '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
+        'die',
+      ],
+    },
+    {
+      'target_name': 'util',
+      'type': 'static_library',
+      'sources': [
+        'util.cc',
       ],
     },
   ],
diff --git a/aos/common/condition.h b/aos/common/condition.h
new file mode 100644
index 0000000..c407070
--- /dev/null
+++ b/aos/common/condition.h
@@ -0,0 +1,79 @@
+#ifndef AOS_COMMON_CONDITION_H_
+#define AOS_COMMON_CONDITION_H_
+
+#include "aos/common/mutex.h"
+#include "aos/atom_code/ipc_lib/aos_sync.h"
+
+namespace aos {
+
+// A condition variable (IPC mechanism where 1 process/task can notify all
+// others that are waiting for something to happen) without the race condition
+// where a notification is sent after some process has checked if the thing has
+// happened but before it has started listening for notifications.
+//
+// This implementation will print debugging information and abort the process
+// if anything weird happens.
+//
+// A simple example of the use of a condition variable (adapted from
+// pthread_cond(3)):
+//
+// int x, y;
+// Mutex mutex;
+// Condition condition(&mutex);
+//
+// // Waiting until x is greater than y:
+// {
+//   MutexLocker locker(&mutex);
+//   while (!(x > y)) condition.Wait();
+//   // do whatever
+// }
+//
+// // Modifying x and/or y:
+// {
+//   MutexLocker locker(&mutex);
+//   // modify x and y
+//   if (x > y) condition.Broadcast();
+// }
+//
+// Notice the loop around the Wait(). This is very important because some other
+// process can lock the mutex and modify the shared state (possibly undoing
+// whatever the Wait()er was waiting for) in between the Broadcast()er unlocking
+// the mutex and the Wait()er(s) relocking it.
+//
+// Multiple condition variables may be associated with the same mutex but
+// exactly 1 mutex must be associated with each condition variable.
+class Condition {
+ public:
+  // m is the mutex that will be associated with this condition variable. This
+  // object will hold on to a reference to it but does not take ownership.
+  explicit Condition(Mutex *m);
+
+  // Waits for the condition variable to be signalled, atomically unlocking the
+  // mutex associated with this condition variable at the same time. The mutex
+  // associated with this condition variable must be locked when this is called
+  // and will be locked when this method returns.
+  // NOTE: The relocking of the mutex is not performed atomically with waking
+  // up.
+  void Wait();
+
+  // Signals at most 1 other process currently Wait()ing on this condition
+  // variable. Calling this does not require the mutex associated with this
+  // condition variable to be locked.
+  // One of the processes with the highest priority level will be woken.
+  void Signal();
+  // Wakes all processes that are currently Wait()ing on this condition
+  // variable. Calling this does not require the mutex associated with this
+  // condition variable to be locked.
+  void Broadcast();
+
+  // Retrieves the mutex associated with this condition variable.
+  Mutex *m() { return m_; }
+
+ private:
+  mutex impl_;
+  Mutex *m_;
+};
+
+}  // namespace aos
+
+#endif  // AOS_COMMON_CONDITION_H_
diff --git a/aos/common/condition_test.cc b/aos/common/condition_test.cc
new file mode 100644
index 0000000..fca2820
--- /dev/null
+++ b/aos/common/condition_test.cc
@@ -0,0 +1,308 @@
+#include "aos/common/condition.h"
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "gtest/gtest.h"
+
+#include "aos/common/time.h"
+#include "aos/common/mutex.h"
+#include "aos/common/queue_testutils.h"
+#include "aos/common/type_traits.h"
+#include "aos/atom_code/ipc_lib/core_lib.h"
+#include "aos/common/logging/logging.h"
+#include "aos/common/macros.h"
+
+using ::aos::time::Time;
+using ::aos::common::testing::GlobalCoreInstance;
+
+namespace aos {
+namespace testing {
+
+class ConditionTest : public ::testing::Test {
+ public:
+  struct Shared {
+    Shared() : condition(&mutex) {}
+
+    Mutex mutex;
+    Condition condition;
+  };
+  static_assert(shm_ok<Shared>::value,
+                "it's going to get shared between forked processes");
+
+  ConditionTest() : shared_(static_cast<Shared *>(shm_malloc(sizeof(Shared)))) {
+    new (shared_) Shared();
+  }
+
+  GlobalCoreInstance my_core;
+
+  Shared *const shared_;
+
+  void Settle() {
+    time::SleepFor(::Time::InSeconds(0.008));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ConditionTest);
+};
+
+class ConditionTestProcess {
+ public:
+  enum class Action {
+    kWaitLockStart,  // lock, delay, wait, unlock
+    kWait,  // delay, lock, wait, unlock
+    kWaitNoUnlock,  // delay, lock, wait
+  };
+
+  // This amount gets added to any passed in delay to make the test repeatable.
+  static constexpr ::Time kMinimumDelay = ::Time::InSeconds(0.015);
+  static constexpr ::Time kDefaultTimeout = ::Time::InSeconds(0.09);
+
+  // delay is how long to wait before doing action to condition.
+  // timeout is how long to wait after delay before deciding that it's hung.
+  ConditionTestProcess(const ::Time &delay, Action action, Condition *condition,
+                       const ::Time &timeout = kDefaultTimeout)
+    : delay_(kMinimumDelay + delay), action_(action), condition_(condition),
+      timeout_(delay_ + timeout), child_(-1),
+      shared_(static_cast<Shared *>(shm_malloc(sizeof(Shared)))) {
+    new (shared_) Shared();
+  }
+  ~ConditionTestProcess() {
+    assert(child_ == -1);
+  }
+
+  void Start() {
+    ASSERT_FALSE(shared_->started);
+
+    child_ = fork();
+    if (child_ == 0) {  // in child
+      ::aos::common::testing::PreventExit();
+      Run();
+      exit(EXIT_SUCCESS);
+    } else {  // in parent
+      assert(child_ != -1);
+
+      shared_->ready.Lock();
+
+      shared_->started = true;
+    }
+  }
+
+  bool IsFinished() {
+    return shared_->finished;
+  }
+
+  ::testing::AssertionResult Hung() {
+    if (!shared_->started) {
+      ADD_FAILURE();
+      return ::testing::AssertionFailure() << "not started yet";
+    }
+    if (shared_->finished) {
+      Join();
+      return ::testing::AssertionFailure() << "already returned";
+    }
+    if (shared_->delayed) {
+      if (shared_->start_time > ::Time::Now() + timeout_) {
+        Kill();
+        return ::testing::AssertionSuccess() << "already been too long";
+      }
+    } else {
+      shared_->done_delaying.Lock();
+    }
+    time::SleepFor(::Time::InSeconds(0.01));
+    if (!shared_->finished) time::SleepUntil(shared_->start_time + timeout_);
+    if (shared_->finished) {
+      Join();
+      return ::testing::AssertionFailure() << "completed within timeout";
+    } else {
+      Kill();
+      return ::testing::AssertionSuccess() << "took too long";
+    }
+  }
+  ::testing::AssertionResult Test() {
+    Start();
+    return Hung();
+  }
+
+ private:
+  struct Shared {
+    Shared()
+      : started(false), delayed(false), start_time(0, 0), finished(false) {
+      done_delaying.Lock();
+      ready.Lock();
+    }
+
+    volatile bool started;
+    volatile bool delayed;
+    Mutex done_delaying;
+    ::Time start_time;
+    volatile bool finished;
+    Mutex ready;
+  };
+  static_assert(shm_ok<Shared>::value,
+                "it's going to get shared between forked processes");
+
+  void Run() {
+    if (action_ == Action::kWaitLockStart) {
+      shared_->ready.Unlock();
+      condition_->m()->Lock();
+    }
+    time::SleepFor(delay_);
+    shared_->start_time = ::Time::Now();
+    shared_->delayed = true;
+    shared_->done_delaying.Unlock();
+    if (action_ != Action::kWaitLockStart) {
+      shared_->ready.Unlock();
+      condition_->m()->Lock();
+    }
+    condition_->Wait();
+    shared_->finished = true;
+    if (action_ != Action::kWaitNoUnlock) {
+      condition_->m()->Unlock();
+    }
+  }
+
+  void Join() {
+    assert(child_ != -1);
+    int status;
+    do {
+      assert(waitpid(child_, &status, 0) == child_);
+    } while (!(WIFEXITED(status) || WIFSIGNALED(status)));
+    child_ = -1;
+  }
+  void Kill() {
+    assert(child_ != -1);
+    assert(kill(child_, SIGTERM) == 0);
+    Join();
+  }
+
+  const ::Time delay_;
+  const Action action_;
+  Condition *const condition_;
+  const ::Time timeout_;
+
+  pid_t child_;
+
+  Shared *const shared_;
+
+  DISALLOW_COPY_AND_ASSIGN(ConditionTestProcess);
+};
+constexpr ::Time ConditionTestProcess::kMinimumDelay;
+constexpr ::Time ConditionTestProcess::kDefaultTimeout;
+
+// Makes sure that the testing framework and everything work for a really simple
+// Wait() and then Signal().
+TEST_F(ConditionTest, Basic) {
+  ConditionTestProcess child(::Time(0, 0),
+                             ConditionTestProcess::Action::kWait,
+                             &shared_->condition);
+  child.Start();
+  Settle();
+  EXPECT_FALSE(child.IsFinished());
+  shared_->condition.Signal();
+  EXPECT_FALSE(child.Hung());
+}
+
+// Makes sure that the worker child locks before it tries to Wait() etc.
+TEST_F(ConditionTest, Locking) {
+  ConditionTestProcess child(::Time(0, 0),
+                             ConditionTestProcess::Action::kWait,
+                             &shared_->condition);
+  shared_->mutex.Lock();
+  child.Start();
+  Settle();
+  // This Signal() shouldn't do anything because the child should still be
+  // waiting to lock the mutex.
+  shared_->condition.Signal();
+  Settle();
+  shared_->mutex.Unlock();
+  EXPECT_TRUE(child.Hung());
+}
+
+// Tests that the work child only catches a Signal() after the mutex gets
+// unlocked.
+TEST_F(ConditionTest, LockFirst) {
+  ConditionTestProcess child(::Time(0, 0),
+                             ConditionTestProcess::Action::kWait,
+                             &shared_->condition);
+  shared_->mutex.Lock();
+  child.Start();
+  Settle();
+  shared_->condition.Signal();
+  Settle();
+  EXPECT_FALSE(child.IsFinished());
+  shared_->mutex.Unlock();
+  Settle();
+  EXPECT_FALSE(child.IsFinished());
+  shared_->condition.Signal();
+  EXPECT_FALSE(child.Hung());
+}
+
+// Tests that the mutex gets relocked after Wait() returns.
+TEST_F(ConditionTest, Relocking) {
+  ConditionTestProcess child(::Time(0, 0),
+                             ConditionTestProcess::Action::kWaitNoUnlock,
+                             &shared_->condition);
+  child.Start();
+  Settle();
+  shared_->condition.Signal();
+  EXPECT_FALSE(child.Hung());
+  EXPECT_FALSE(shared_->mutex.TryLock());
+}
+
+// Tests that Signal() stops exactly 1 Wait()er.
+TEST_F(ConditionTest, SignalOne) {
+  ConditionTestProcess child1(::Time(0, 0),
+                              ConditionTestProcess::Action::kWait,
+                              &shared_->condition);
+  ConditionTestProcess child2(::Time(0, 0),
+                              ConditionTestProcess::Action::kWait,
+                              &shared_->condition);
+  ConditionTestProcess child3(::Time(0, 0),
+                              ConditionTestProcess::Action::kWait,
+                              &shared_->condition);
+  auto number_finished = [&]() { return (child1.IsFinished() ? 1 : 0) +
+    (child2.IsFinished() ? 1 : 0) + (child3.IsFinished() ? 1 : 0); };
+  child1.Start();
+  child2.Start();
+  child3.Start();
+  Settle();
+  EXPECT_EQ(0, number_finished());
+  shared_->condition.Signal();
+  Settle();
+  EXPECT_EQ(1, number_finished());
+  shared_->condition.Signal();
+  Settle();
+  EXPECT_EQ(2, number_finished());
+  shared_->condition.Signal();
+  Settle();
+  EXPECT_EQ(3, number_finished());
+  EXPECT_FALSE(child1.Hung());
+  EXPECT_FALSE(child2.Hung());
+  EXPECT_FALSE(child3.Hung());
+}
+
+// Tests that Brodcast() wakes multiple Wait()ers.
+TEST_F(ConditionTest, Broadcast) {
+  ConditionTestProcess child1(::Time(0, 0),
+                              ConditionTestProcess::Action::kWait,
+                              &shared_->condition);
+  ConditionTestProcess child2(::Time(0, 0),
+                              ConditionTestProcess::Action::kWait,
+                              &shared_->condition);
+  ConditionTestProcess child3(::Time(0, 0),
+                              ConditionTestProcess::Action::kWait,
+                              &shared_->condition);
+  child1.Start();
+  child2.Start();
+  child3.Start();
+  Settle();
+  shared_->condition.Broadcast();
+  EXPECT_FALSE(child1.Hung());
+  EXPECT_FALSE(child2.Hung());
+  EXPECT_FALSE(child3.Hung());
+}
+
+}  // namespace testing
+}  // namespace aos
diff --git a/aos/common/control_loop/ControlLoop-tmpl.h b/aos/common/control_loop/ControlLoop-tmpl.h
index 80d592a..69c3121 100644
--- a/aos/common/control_loop/ControlLoop-tmpl.h
+++ b/aos/common/control_loop/ControlLoop-tmpl.h
@@ -9,16 +9,16 @@
 
 // TODO(aschuh): Tests.
 
-template <class T, bool has_position>
-void ControlLoop<T, has_position>::ZeroOutputs() {
+template <class T, bool has_position, bool fail_no_position>
+void ControlLoop<T, has_position, fail_no_position>::ZeroOutputs() {
   aos::ScopedMessagePtr<OutputType> output =
       control_loop_->output.MakeMessage();
   Zero(output.get());
   output.Send();
 }
 
-template <class T, bool has_position>
-void ControlLoop<T, has_position>::Iterate() {
+template <class T, bool has_position, bool fail_no_position>
+void ControlLoop<T, has_position, fail_no_position>::Iterate() {
   // Temporary storage for printing out inputs and outputs.
   char state[1024];
 
@@ -60,12 +60,16 @@
         }
       } else {
         LOG(ERROR, "Never had a position.\n");
-        ZeroOutputs();
-        return;
+        if (fail_no_position) {
+          ZeroOutputs();
+          return;
+        }
       }
     }
-    position->Print(state, sizeof(state));
-    LOG(DEBUG, "position={%s}\n", state);
+    if (position) {
+      position->Print(state, sizeof(state));
+      LOG(DEBUG, "position={%s}\n", state);
+    }
   }
 
   bool outputs_enabled = false;
@@ -110,10 +114,10 @@
   status.Send();
 }
 
-template <class T, bool has_position>
-void ControlLoop<T, has_position>::Run() {
+template <class T, bool has_position, bool fail_no_position>
+void ControlLoop<T, has_position, fail_no_position>::Run() {
   while (true) {
-    ::aos::time::PhasedLoop10MS(0);
+    time::SleepUntil(NextLoopTime());
     Iterate();
   }
 }
diff --git a/aos/common/control_loop/ControlLoop.cc b/aos/common/control_loop/ControlLoop.cc
new file mode 100644
index 0000000..ea62d85
--- /dev/null
+++ b/aos/common/control_loop/ControlLoop.cc
@@ -0,0 +1,13 @@
+#include "aos/common/control_loop/ControlLoop.h"
+
+namespace aos {
+namespace control_loops {
+
+time::Time NextLoopTime(time::Time start) {
+  return (start / static_cast<int32_t>(kLoopFrequency.ToNSec())) *
+      static_cast<int32_t>(kLoopFrequency.ToNSec()) +
+      kLoopFrequency;
+}
+
+}  // namespace control_loops
+}  // namespace aos
diff --git a/aos/common/control_loop/ControlLoop.h b/aos/common/control_loop/ControlLoop.h
index b69cf01..6af7235 100644
--- a/aos/common/control_loop/ControlLoop.h
+++ b/aos/common/control_loop/ControlLoop.h
@@ -3,10 +3,10 @@
 
 #include <cstring>
 
-#include "aos/aos_core.h"
 #include "aos/common/control_loop/Timing.h"
-#include "aos/common/messages/RobotState.q.h"
 #include "aos/common/type_traits.h"
+#include "aos/common/queue.h"
+#include "aos/common/time.h"
 
 namespace aos {
 namespace control_loops {
@@ -36,6 +36,12 @@
   virtual uint32_t UniqueID() = 0;
 };
 
+// Control loops run this often, "starting" at time 0.
+constexpr time::Time kLoopFrequency = time::Time::InSeconds(0.01);
+
+// Calculates the next time to run control loops after start.
+time::Time NextLoopTime(time::Time start = time::Time::Now());
+
 // Provides helper methods to assist in writing control loops.
 // This template expects to be constructed with a queue group as an argument
 // that has a goal, position, status, and output queue.
@@ -44,14 +50,14 @@
 // If has_position is false, the control loop will always use NULL as the
 // position and not check the queue.  This is used for "loops" that control
 // motors open loop.
-template <class T, bool has_position = true>
+template <class T, bool has_position = true, bool fail_no_position = true>
 class ControlLoop : public SerializableControlLoop {
  public:
   // Maximum age of position packets before the loop will be disabled due to
   // invalid position data.
-  static const int kPositionTimeoutMs = 100;
+  static const int kPositionTimeoutMs = 1000;
   // Maximum age of driver station packets before the loop will be disabled.
-  static const int kDSPacketTimeoutMs = 100;
+  static const int kDSPacketTimeoutMs = 500;
 
   ControlLoop(T *control_loop) : control_loop_(control_loop) {}
 
diff --git a/aos/common/control_loop/Timing.cpp b/aos/common/control_loop/Timing.cpp
index 63fda44..8f42623 100644
--- a/aos/common/control_loop/Timing.cpp
+++ b/aos/common/control_loop/Timing.cpp
@@ -1,18 +1,19 @@
-#include "aos/common/logging/logging.h"
 #include "aos/common/control_loop/Timing.h"
 
+#include <string.h>
+
+#include "aos/common/logging/logging.h"
 #include "aos/common/time.h"
 
 namespace aos {
 namespace time {
 
 void PhasedLoopXMS(int ms, int offset) {
-  // TODO(brians): Rewrite this cleaner.
   // TODO(brians): Tests!
-  int64_t period_nsec = Time::InMS(ms).nsec();
-  SleepUntil(Time::InNS((Time::Now().ToNSec() / period_nsec +
-                         static_cast<int64_t>(1)) * period_nsec +
-                        Time::InUS(offset).ToNSec()));
+  const Time frequency = Time::InMS(ms);
+  SleepUntil((Time::Now() / static_cast<int32_t>(frequency.ToNSec())) *
+             static_cast<int32_t>(frequency.ToNSec()) +
+             frequency + Time::InUS(offset));
 }
 
 }  // namespace timing
diff --git a/aos/common/control_loop/control_loops.q b/aos/common/control_loop/control_loops.q
index 5ba30ec..823005e 100644
--- a/aos/common/control_loop/control_loops.q
+++ b/aos/common/control_loop/control_loops.q
@@ -20,7 +20,7 @@
 };
 
 message Output {
-  double pwm;
+  double voltage;
 };
 
 message Status {
diff --git a/aos/common/die.cc b/aos/common/die.cc
index 00a86bb..467b81d 100644
--- a/aos/common/die.cc
+++ b/aos/common/die.cc
@@ -10,6 +10,8 @@
 #include <taskLib.h>
 // Have to re-declare it with __attribute__((noreturn)).
 extern "C" void abort() __attribute__((noreturn));
+#include <usrLib.h>
+#include <dbgLib.h>
 #endif
 
 #include <string>
@@ -22,6 +24,7 @@
   va_list args;
   va_start(args, format);
   VDie(format, args);
+  // va_end(args)  // not because VDie never returns
 }
 
 namespace {
@@ -50,21 +53,21 @@
 }  // namespace
 
 void VDie(const char *format, va_list args_in) {
-  va_list args;
+  // We don't bother va_ending either of these because we're going nowhere and
+  // vxworks has some weird bugs that sometimes show up...
+  va_list args1, args2;
 
   fputs("aos fatal: ERROR!! details following\n", stderr);
-  va_copy(args, args_in);
-  vfprintf(stderr, format, args);
-  va_end(args);
+  va_copy(args1, args_in);
+  vfprintf(stderr, format, args1);
   fputs("aos fatal: ERROR!! see stderr for details\n", stdout);
 
   const std::string filename = GetFilename();
   if (!filename.empty()) {
     FILE *error_file = fopen(filename.c_str(), "w");
     if (error_file != NULL) {
-      va_copy(args, args_in);
-      vfprintf(error_file, format, args);
-      va_end(args);
+      va_copy(args2, args_in);
+      vfprintf(error_file, format, args2);
       fclose(error_file);
     } else {
       fprintf(stderr, "aos fatal: fopen('%s', \"w\") failed with %d (%s)\n",
@@ -72,6 +75,15 @@
     }
   }
 
+#ifdef __VXWORKS__
+  printf("I am 0x%x suspending for debugging purposes.\n", taskIdSelf());
+  printf("\t`tt 0x%x` will give you a stack trace.\n", taskIdSelf());
+  fputs("\t`lkAddr` will reverse lookup a symbol for you.\n", stdout);
+  fputs("\t`dbgHelp` and `help` have some useful commands in them.\n", stdout);
+  taskSuspend(0);
+  printf("You weren't supposed to resume 0x%x!!. Going to really die now.\n",
+         taskIdSelf());
+#endif
   abort();
 }
 
diff --git a/aos/common/input/SensorInput-tmpl.h b/aos/common/input/SensorInput-tmpl.h
deleted file mode 100644
index e92a923..0000000
--- a/aos/common/input/SensorInput-tmpl.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#include "aos/common/input/SensorInput.h"
-#ifndef __VXWORKS__
-#include "aos/common/network/ReceiveSocket.h"
-#include "aos/common/Configuration.h"
-#endif
-
-namespace aos {
-
-#ifdef __VXWORKS__
-template<class Values> SEM_ID SensorInput<Values>::lock_ = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
-template<class Values> std::vector<SensorInput<Values> *> SensorInput<Values>::running_;
-#endif
-template<class Values> void SensorInput<Values>::Run() {
-#ifndef __VXWORKS__
-	ReceiveSocket sock(NetworkPort::kSensors);
-  Values values;
-	while (true) {
-		if (sock.Recv(&values, sizeof(values)) == -1) {
-      LOG(WARNING, "socket receive failed\n");
-      continue;
-    }
-    RunIteration(values);
-	}
-#else
-  semTake(lock_, WAIT_FOREVER);
-  running_.push_back(this);
-  semGive(lock_);
-#endif
-}
-
-#ifdef __VXWORKS__
-template<class Values> void SensorInput<Values>::RunIterationAll(Values &vals) {
-  semTake(lock_, WAIT_FOREVER);
-  for (auto it = running_.begin(); it != running_.end(); ++it) {
-    (*it)->RunIteration(vals);
-  }
-  semGive(lock_);
-}
-#endif
-
-} // namespace aos
diff --git a/aos/common/input/SensorInput.h b/aos/common/input/SensorInput.h
deleted file mode 100644
index 7f8eaa7..0000000
--- a/aos/common/input/SensorInput.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef AOS_INPUT_SENSOR_INPUT_H_
-#define AOS_INPUT_SENSOR_INPUT_H_
-
-#include "aos/aos_core.h"
-#ifdef __VXWORKS__
-#include <vector>
-#include <semLib.h>
-#endif
-
-namespace aos {
-
-// Class for implementing code that takes information from a sensor struct and
-// places it into queues. Subclasses should be compiled for both the atom and
-// the crio to support crio control loops.
-template<class Values> class SensorInput {
- protected:
-  virtual void RunIteration(Values &values) = 0;
- public:
-  // Enters an infinite loop that reads values and calls RunIteration.
-  void Run();
-
-#ifdef __VXWORKS__
-  // Calls RunIteration on all instances with values.
-  static void RunIterationAll(Values &values);
- private:
-  static SEM_ID lock_;
-  static std::vector<SensorInput *> running_;
-#endif
-};
-
-} // namespace aos
-
-#include "SensorInput-tmpl.h"
-
-#endif
-
diff --git a/aos/common/input/driver_station_data.cc b/aos/common/input/driver_station_data.cc
new file mode 100644
index 0000000..18b3403
--- /dev/null
+++ b/aos/common/input/driver_station_data.cc
@@ -0,0 +1,76 @@
+#include "aos/common/input/driver_station_data.h"
+
+namespace aos {
+namespace input {
+namespace driver_station {
+
+Data::Data() : current_values_(), old_values_() {}
+
+void Data::Update(const NetworkRobotJoysticks &new_values) {
+  old_values_ = current_values_;
+  current_values_ = new_values;
+}
+
+namespace {
+
+bool GetButton(const ButtonLocation location,
+               const NetworkRobotJoysticks &values) {
+  return values.joysticks[location.joystick() - 1].buttons &
+      (1 << (location.number() - 1));
+}
+
+bool GetControlBitValue(const ControlBit bit,
+                        const NetworkRobotJoysticks &values) {
+  switch (bit) {
+    case ControlBit::kTestMode:
+      return values.control.test_mode();
+    case ControlBit::kFmsAttached:
+      return values.control.fms_attached();
+    case ControlBit::kAutonomous:
+      return values.control.autonomous();
+    case ControlBit::kEnabled:
+      return values.control.enabled();
+    default:
+      __builtin_unreachable();
+  }
+}
+
+}  // namespace
+
+bool Data::IsPressed(const ButtonLocation location) const {
+  return GetButton(location, current_values_);
+}
+
+bool Data::PosEdge(const ButtonLocation location) const {
+  return !GetButton(location, old_values_) &&
+      GetButton(location, current_values_);
+}
+
+bool Data::NegEdge(const ButtonLocation location) const {
+  return GetButton(location, old_values_) &&
+      !GetButton(location, current_values_);
+}
+
+bool Data::GetControlBit(const ControlBit bit) const {
+  return GetControlBitValue(bit, current_values_);
+}
+
+bool Data::PosEdge(const ControlBit bit) const {
+  return !GetControlBitValue(bit, old_values_) &&
+      GetControlBitValue(bit, current_values_);
+}
+
+bool Data::NegEdge(const ControlBit bit) const {
+  return GetControlBitValue(bit, old_values_) &&
+      !GetControlBitValue(bit, current_values_);
+}
+
+float Data::GetAxis(JoystickAxis axis) const {
+  // TODO(brians): check this math against what our joysticks report as their
+  // logical minimums and maximums
+  return current_values_.joysticks[axis.joystick() - 1].axes[axis.number() - 1] / 127.0;
+}
+
+}  // namespace driver_station
+}  // namespace input
+}  // namespace aos
diff --git a/aos/common/input/driver_station_data.h b/aos/common/input/driver_station_data.h
new file mode 100644
index 0000000..dca33f9
--- /dev/null
+++ b/aos/common/input/driver_station_data.h
@@ -0,0 +1,96 @@
+#ifndef AOS_COMMON_INPUT_DRIVER_STATION_DATA_H_
+#define AOS_COMMON_INPUT_DRIVER_STATION_DATA_H_
+
+// This file defines several types to support nicely looking at the data
+// received from the driver's station.
+
+#include <assert.h>
+
+#include <memory>
+
+#include "aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.h"
+
+namespace aos {
+namespace input {
+namespace driver_station {
+
+// Represents a feature of a joystick (a button or an axis).
+// All indices are 1-based.
+class JoystickFeature {
+ public:
+  JoystickFeature(int joystick, int number)
+      : joystick_(joystick), number_(number) {}
+
+  // How many joysticks there are.
+  static const int kJoysticks = sizeof(NetworkRobotJoysticks::joysticks) /
+                                sizeof(NetworkRobotJoysticks::joysticks[0]);
+
+  // Which joystick number this is (1-based).
+  int joystick() const { return joystick_; }
+  // Which feature on joystick() this is (1-based).
+  int number() const { return number_; }
+
+ private:
+  const int joystick_, number_;
+};
+
+// Represents the location of a button.
+// Use Data to actually get the value.
+// Safe for static initialization.
+class ButtonLocation : public JoystickFeature {
+ public:
+  ButtonLocation(int joystick, int number)
+      : JoystickFeature(joystick, number) {}
+
+  // How many buttons there are available on each joystick.
+  static const int kButtons = 12;
+};
+
+// Represents various bits of control information that the DS sends.
+// Use Data to actually get the value.
+enum class ControlBit {
+  kTestMode, kFmsAttached, kAutonomous, kEnabled
+};
+
+// Represents a single axis of a joystick.
+// Use Data to actually get the value.
+// Safe for static initialization.
+class JoystickAxis : public JoystickFeature {
+ public:
+  JoystickAxis(int joystick, int number)
+      : JoystickFeature(joystick, number) {}
+
+  // How many axes there are available on each joystick.
+  static const int kAxes = sizeof(NetworkRobotJoysticks::Joystick::axes) /
+                           sizeof(NetworkRobotJoysticks::Joystick::axes[0]);
+};
+
+class Data {
+ public:
+  // Initializes the data to all buttons and control bits off and all joysticks
+  // at 0.
+  Data();
+
+  // Updates the current information with a new set of values.
+  void Update(const NetworkRobotJoysticks &new_values);
+
+  bool IsPressed(ButtonLocation location) const;
+  bool PosEdge(ButtonLocation location) const;
+  bool NegEdge(ButtonLocation location) const;
+
+  bool GetControlBit(ControlBit bit) const;
+  bool PosEdge(ControlBit bit) const;
+  bool NegEdge(ControlBit bit) const;
+
+  // Returns the value in the range [-1.0, 1.0].
+  float GetAxis(JoystickAxis axis) const;
+
+ private:
+  NetworkRobotJoysticks current_values_, old_values_;
+};
+
+}  // namespace driver_station
+}  // namespace input
+}  // namespace aos
+
+#endif  // AOS_COMMON_INPUT_DRIVER_STATION_DATA_H_
diff --git a/aos/common/input/input.gyp b/aos/common/input/input.gyp
new file mode 100644
index 0000000..e5c964c
--- /dev/null
+++ b/aos/common/input/input.gyp
@@ -0,0 +1,17 @@
+{
+  'targets': [
+    {
+      'target_name': 'driver_station_data',
+      'type': 'static_library',
+      'sources': [
+        'driver_station_data.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):WPILib-NetworkRobotValues',
+      ],
+      'export_dependent_settings': [
+        '<(EXTERNALS):WPILib-NetworkRobotValues',
+      ],
+    },
+  ],
+}
diff --git a/aos/common/inttypes.h b/aos/common/inttypes.h
index e10a33b..a96130f 100644
--- a/aos/common/inttypes.h
+++ b/aos/common/inttypes.h
@@ -8,12 +8,16 @@
 #ifndef __VXWORKS__
 #include <inttypes.h>
 #else
+#define PRId64 "lld"
+#define PRIu64 "llu"
+
 // It warns about just "d", but not this, which is kind of weird because
 // sizeof(int) == sizeof(long) == sizeof(int32_t) == 4, but oh well.
 #define PRId32 "ld"
 #define PRIx32 "lx"
-#define PRId64 "lld"
-#define PRIu16 "u"
+#define PRIu32 "lu"
+
+#define PRIu16 "hu"
 #endif
 
 #endif  // AOS_COMMON_INTTYPES_H_
diff --git a/aos/common/libstdc++/README b/aos/common/libstdc++/README
new file mode 100644
index 0000000..df8269e
--- /dev/null
+++ b/aos/common/libstdc++/README
@@ -0,0 +1,3 @@
+This directory contains replacement include files for ones that the libstdc++ we're using on the cRIO either don't implement completely or doesn't have at all.
+The ones in aos/crio/libstdc++ are copied from the libstdc++ that came with the compiler and tweaked so that they work.
+When used for compiles not for vxworks, they just #include the usual standard library header.
diff --git a/aos/common/libstdc++/memory b/aos/common/libstdc++/memory
new file mode 100644
index 0000000..31ab6e9
--- /dev/null
+++ b/aos/common/libstdc++/memory
@@ -0,0 +1,4 @@
+#include <memory>
+#ifdef __VXWORKS__
+#include "aos/crio/libstdc++/unique_ptr.h"
+#endif
diff --git a/aos/common/libstdc++/type_traits b/aos/common/libstdc++/type_traits
new file mode 100644
index 0000000..ada2002
--- /dev/null
+++ b/aos/common/libstdc++/type_traits
@@ -0,0 +1,5 @@
+#ifdef __VXWORKS__
+#include "aos/crio/libstdc++/type_traits"
+#else
+#include <type_traits>
+#endif
diff --git a/aos/common/libstdc++/utility b/aos/common/libstdc++/utility
new file mode 100644
index 0000000..50b8aa3
--- /dev/null
+++ b/aos/common/libstdc++/utility
@@ -0,0 +1,4 @@
+#include <utility>
+#ifdef __VXWORKS__
+#include "aos/crio/libstdc++/move.h"
+#endif
diff --git a/aos/common/logging/logging.gyp b/aos/common/logging/logging.gyp
new file mode 100644
index 0000000..b6b339a
--- /dev/null
+++ b/aos/common/logging/logging.gyp
@@ -0,0 +1,15 @@
+{
+  'targets': [
+    {
+      'target_name': 'logging_impl_test',
+      'type': '<(aos_target)',
+      'sources': [
+        'logging_impl_test.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+    },
+  ],
+}
diff --git a/aos/common/logging/logging.h b/aos/common/logging/logging.h
index e3ff839..6de118b 100644
--- a/aos/common/logging/logging.h
+++ b/aos/common/logging/logging.h
@@ -1,102 +1,224 @@
 #ifndef AOS_COMMON_LOGGING_LOGGING_H_
-// must be kept in sync with crio/logging/crio_logging.h and atom_code/logging/atom_logging.h
 #define AOS_COMMON_LOGGING_LOGGING_H_
 
+// This file contains the logging client interface. It works with both C and C++
+// code.
+
+#include <stdio.h>
 #include <stdint.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <string.h>
+#include <stdlib.h>
+
+#ifdef __VXWORKS__
+// Because the vxworks system headers miss the noreturn...
+extern "C" void abort(void) __attribute__((noreturn));
+#endif
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 typedef uint8_t log_level;
+
 #define DECL_LEVELS \
 DECL_LEVEL(DEBUG, 0); /* stuff that gets printed out every cycle */ \
 DECL_LEVEL(INFO, 1); /* things like PosEdge/NegEdge */ \
-/* things that might still work if they happen occasionally but should be watched */ \
+/* things that might still work if they happen occasionally */ \
 DECL_LEVEL(WARNING, 2); \
 /*-1 so that vxworks macro of same name will have same effect if used*/ \
 DECL_LEVEL(ERROR, -1); /* errors */ \
-DECL_LEVEL(FATAL, 4); /* serious errors. the logging code will terminate the process/task */ \
+/* serious errors. the logging code will terminate the process/task */ \
+DECL_LEVEL(FATAL, 4); \
 DECL_LEVEL(LOG_UNKNOWN, 5); /* unknown logging level */
-#define DECL_LEVEL(name, value) extern const log_level name;
+#define DECL_LEVEL(name, value) static const log_level name = value;
 #undef ERROR
-DECL_LEVELS
+DECL_LEVELS;
 #undef DECL_LEVEL
 
 #define STRINGIFY(x) TO_STRING(x)
 #define TO_STRING(x) #x
 
 //not static const size_t for c code
-#define LOG_MESSAGE_LEN 300
+#define LOG_MESSAGE_LEN 400
+
+#ifdef __VXWORKS__
+// We're using ancient glibc, so sticking to just what the syscall can handle is
+// probably safer.
+#define LOG_PRINTF_FORMAT_TYPE printf
+#else
+#define LOG_PRINTF_FORMAT_TYPE gnu_printf
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+// Actually implements the basic logging call.
+// Does not check that level is valid.
+void log_do(log_level level, const char *format, ...)
+  __attribute__((format(LOG_PRINTF_FORMAT_TYPE, 2, 3)));
+
+void log_cork(int line, const char *function, const char *format, ...)
+  __attribute__((format(LOG_PRINTF_FORMAT_TYPE, 3, 4)));
+// Implements the uncork logging call.
+void log_uncork(int line, const char *function, log_level level,
+                const char *file, const char *format, ...)
+  __attribute__((format(LOG_PRINTF_FORMAT_TYPE, 5, 6)));
+#ifdef __cplusplus
+}
+#endif
+
+// A magical static const char[] or string literal that communicates the name
+// of the enclosing function.
+// It's currently using __PRETTY_FUNCTION__ because both GCC and Clang support
+// that and it gives nicer results in C++ than the standard __func__ (which
+// would also work).
+//#define LOG_CURRENT_FUNCTION __PRETTY_FUNCTION__
+#define LOG_CURRENT_FUNCTION __func__
+
+#undef LOG_SOURCENAME
+#define LOG_SOURCENAME __FILE__
+
+// The basic logging call.
+#define LOG(level, format, args...) do {\
+  log_do(level, LOG_SOURCENAME ": " STRINGIFY(__LINE__) ": %s: " format, \
+         LOG_CURRENT_FUNCTION, ##args); \
+  /* so that GCC knows that it won't return */ \
+  if (level == FATAL) { \
+    fprintf(stderr, "log_do(FATAL) fell through!!!!!\n"); \
+    printf("see stderr\n"); \
+    abort(); \
+  } \
+} while (0)
 
 // Allows format to not be a string constant.
-#define LOG_DYNAMIC(level, format, args...) do{ \
+#define LOG_DYNAMIC(level, format, args...) do { \
 	static char log_buf[LOG_MESSAGE_LEN]; \
 	int ret = snprintf(log_buf, sizeof(log_buf), format, ##args); \
-	if(ret < 0 || (uintmax_t)ret >= LOG_MESSAGE_LEN){ \
-		LOG(WARNING, "next message was too long so not subbing in args\n"); \
+	if (ret < 0 || (uintmax_t)ret >= LOG_MESSAGE_LEN) { \
+		LOG(ERROR, "next message was too long so not subbing in args\n"); \
 		LOG(level, "%s", format); \
 	}else{ \
 		LOG(level, "%s", log_buf); \
 	} \
-}while(0)
+} while (0)
 
-// The struct that the crio-side code uses for making logging calls.
-// Packed so it's the same on the atom and the crio.
-typedef struct {
-  // pid_t here at the front like in log_message
-  pid_t identifier; // must ALWAYS be -1 to identify that this is a crio log message
-  log_level level;
-  // still has to fit in LOG_MESSAGE_LEN on the atom side
-	char message[LOG_MESSAGE_LEN - 50];
-  double time;
-  uint8_t sequence;
-} __attribute__((packed)) log_crio_message;
-
-#ifdef __cplusplus
-// Just sticks the message into the shared memory queue.
-int log_crio_message_send(log_crio_message &to_send);
-// Returns left > right. LOG_UNKNOWN is most important.
-static inline bool log_gt_important(log_level left, log_level right) {
-  log_level l = left, r = right;
-  if (l == ERROR) l = 3;
-  if (r == ERROR) r = 3;
-  return left > right;
-}
-#endif
-
-// Returns a string representing level or "unknown".
-static inline const char *log_str(log_level level) {
-  // c doesn't really have const variables so they don't work in case statements
-	if (level == DEBUG) return "DEBUG";
-	if (level == INFO) return "INFO";
-	if (level == WARNING) return "WARNING";
-	if (level == ERROR) return "ERROR";
-	if (level == FATAL) return "FATAL";
-	return "unknown";
-}
-// Returns the log level represented by str or LOG_UNKNOWN.
-static inline log_level str_log(const char *str) {
-  if (!strcmp(str, "DEBUG")) return DEBUG;
-  if (!strcmp(str, "INFO")) return INFO;
-  if (!strcmp(str, "WARNING")) return WARNING;
-  if (!strcmp(str, "ERROR")) return ERROR;
-  if (!strcmp(str, "FATAL")) return FATAL;
-  return LOG_UNKNOWN;
-}
+// Allows "bottling up" multiple log fragments which can then all be logged in
+// one message with LOG_UNCORK.
+// Calls from a given thread/task will be grouped together.
+#define LOG_CORK(format, args...) do { \
+  log_cork(__LINE__, LOG_CURRENT_FUNCTION, format, ##args); \
+} while (0)
+// Actually logs all of the saved up log fragments (including format and args on
+// the end).
+#define LOG_UNCORK(level, format, args...) do { \
+  log_uncork(__LINE__, LOG_CURRENT_FUNCTION, level, LOG_SOURCENAME, \
+             format, ##args); \
+} while (0)
 
 #ifdef __cplusplus
 }
 #endif
 
-#ifdef __unix
-#include "aos/atom_code/logging/atom_logging.h"  // IWYU pragma: export
-#else
-#include "aos/crio/logging/crio_logging.h"  // IWYU pragma: export
-#endif
+#ifdef __cplusplus
+
+namespace aos {
+
+// CHECK* macros, similar to glog
+// (<http://google-glog.googlecode.com/svn/trunk/doc/glog.html>)'s, except they
+// don't support streaming in extra text. Some of the implementation is borrowed
+// from there too.
+// They all LOG(FATAL) with a helpful message when the check fails.
+// TODO(brians): Replace assert with CHECK
+// Portions copyright (c) 1999, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// CHECK dies with a fatal error if condition is not true.  It is *not*
+// controlled by NDEBUG, so the check will be executed regardless of
+// compilation mode.  Therefore, it is safe to do things like:
+//    CHECK(fp->Write(x) == 4)
+#define CHECK(condition)  \
+  if (__builtin_expect(!(condition), 0)) { \
+    LOG(FATAL, "CHECK(%s) failed\n", #condition); \
+  }
+
+// Helper functions for CHECK_OP macro.
+// The (int, int) specialization works around the issue that the compiler
+// will not instantiate the template version of the function on values of
+// unnamed enum type.
+#define DEFINE_CHECK_OP_IMPL(name, op) \
+  template <typename T1, typename T2> \
+  inline void LogImpl##name(const T1& v1, const T2& v2,    \
+                            const char* exprtext) { \
+    if (!__builtin_expect(v1 op v2, 1)) { \
+      LOG(FATAL, "CHECK(%s) failed\n", exprtext); \
+    } \
+  } \
+  inline void LogImpl##name(int v1, int v2, const char* exprtext) { \
+    ::aos::LogImpl##name<int, int>(v1, v2, exprtext); \
+  }
+
+// We use the full name Check_EQ, Check_NE, etc. in case the file including
+// base/logging.h provides its own #defines for the simpler names EQ, NE, etc.
+// This happens if, for example, those are used as token names in a
+// yacc grammar.
+DEFINE_CHECK_OP_IMPL(Check_EQ, ==)  // Compilation error with CHECK_EQ(NULL, x)?
+DEFINE_CHECK_OP_IMPL(Check_NE, !=)  // Use CHECK(x == NULL) instead.
+DEFINE_CHECK_OP_IMPL(Check_LE, <=)
+DEFINE_CHECK_OP_IMPL(Check_LT, < )
+DEFINE_CHECK_OP_IMPL(Check_GE, >=)
+DEFINE_CHECK_OP_IMPL(Check_GT, > )
+
+#define CHECK_OP(name, op, val1, val2) \
+  ::aos::LogImplCheck##name(val1, val2, \
+                            STRINGIFY(val1) STRINGIFY(op) STRINGIFY(val2))
+
+#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2)
+#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2)
+#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2)
+#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2)
+#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2)
+#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2)
+
+// A small helper for CHECK_NOTNULL().
+template <typename T>
+inline T* CheckNotNull(const char *value_name, T *t) {
+  if (t == NULL) {
+    LOG(FATAL, "'%s' must not be NULL\n", value_name);
+  }
+  return t;
+}
+
+// Check that the input is non NULL.  This very useful in constructor
+// initializer lists.
+#define CHECK_NOTNULL(val) \
+  ::aos::CheckNotNull(STRINGIFY(val), val)
+
+}  // namespace aos
+
+#endif  // __cplusplus
 
 #endif
-
diff --git a/aos/common/logging/logging_impl.cc b/aos/common/logging/logging_impl.cc
new file mode 100644
index 0000000..980f65a
--- /dev/null
+++ b/aos/common/logging/logging_impl.cc
@@ -0,0 +1,253 @@
+#include "aos/common/logging/logging_impl.h"
+
+#include <assert.h>
+
+#include "aos/common/die.h"
+#include "aos/common/time.h"
+#include "aos/common/inttypes.h"
+#include "aos/common/once.h"
+
+namespace aos {
+namespace logging {
+namespace {
+
+using internal::Context;
+
+LogImplementation *global_top_implementation(NULL);
+// Just going to use a mutex instead of getting fancy because speed doesn't
+// really matter when accessing global_top_implementation.
+Mutex global_top_implementation_mutex;
+LogImplementation *get_global_top_implementation() {
+  MutexLocker locker(&global_top_implementation_mutex);
+  return global_top_implementation;
+}
+
+// The root LogImplementation. It only logs to stderr/stdout.
+// Some of the things specified in the LogImplementation documentation doesn't
+// apply here (mostly the parts about being able to use LOG) because this is the
+// root one.
+class RootLogImplementation : public LogImplementation {
+  virtual void set_next(LogImplementation *) {
+    LOG(FATAL, "can't have a next logger from here\n");
+  }
+
+  virtual void DoLog(log_level level, const char *format, va_list ap) {
+    LogMessage message;
+    internal::FillInMessage(level, format, ap, &message);
+    internal::PrintMessage(stderr, message);
+    fputs("root logger got used, see stderr for message\n", stdout);
+  }
+};
+
+void SetGlobalImplementation(LogImplementation *implementation) {
+  Context *context = Context::Get();
+
+  context->implementation = implementation;
+  {
+    MutexLocker locker(&global_top_implementation_mutex);
+    global_top_implementation = implementation;
+  }
+}
+
+// Prints format (with ap) into output and correctly deals with the result
+// being too long etc.
+void ExecuteFormat(char *output, size_t output_size,
+                   const char *format, va_list ap) {
+  static const char *continued = "...\n";
+  const size_t size = output_size - strlen(continued);
+  const int ret = vsnprintf(output, size, format, ap);
+  if (ret < 0) {
+    LOG(FATAL, "vsnprintf(%p, %zd, %s, args) failed with %d (%s)\n",
+        output, size, format, errno, strerror(errno));
+  } else if (static_cast<uintmax_t>(ret) >= static_cast<uintmax_t>(size)) {
+    // Overwrite the '\0' at the end of the existing data and
+    // copy in the one on the end of continued.
+    memcpy(&output[size - 1], continued, strlen(continued) + 1);
+  }
+}
+
+void NewContext() {
+  Context::Delete();
+}
+
+void *DoInit() {
+  SetGlobalImplementation(new RootLogImplementation());
+
+#ifndef __VXWORKS__
+  if (pthread_atfork(NULL /*prepare*/, NULL /*parent*/,
+                     NewContext /*child*/) != 0) {
+    LOG(FATAL, "pthread_atfork(NULL, NULL, %p) failed\n",
+        NewContext);
+  }
+#endif
+
+  return NULL;
+}
+
+}  // namespace
+namespace internal {
+
+Context::Context()
+    : implementation(get_global_top_implementation()),
+      sequence(0) {
+  cork_data.Reset();
+}
+
+void FillInMessage(log_level level, const char *format, va_list ap,
+                   LogMessage *message) {
+  Context *context = Context::Get();
+
+  ExecuteFormat(message->message, sizeof(message->message), format, ap);
+
+  message->level = level;
+  message->source = context->source;
+  memcpy(message->name, context->name.c_str(), context->name.size() + 1);
+
+  time::Time now = time::Time::Now();
+  message->seconds = now.sec();
+  message->nseconds = now.nsec();
+
+  message->sequence = context->sequence++;
+}
+
+void PrintMessage(FILE *output, const LogMessage &message) {
+  fprintf(output, "%s(%" PRId32 ")(%05" PRIu16 "): %s at"
+          " %010" PRId32 ".%09" PRId32 "s: %s",
+          message.name, static_cast<int32_t>(message.source), message.sequence,
+          log_str(message.level), message.seconds, message.nseconds,
+          message.message);
+}
+
+}  // namespace internal
+
+StreamLogImplementation::StreamLogImplementation(FILE *stream)
+    : stream_(stream) {}
+
+void StreamLogImplementation::DoLog(log_level level, const char *format,
+                                    va_list ap) {
+  LogMessage message;
+  internal::FillInMessage(level, format, ap, &message);
+  internal::PrintMessage(stream_, message);
+}
+
+void LogImplementation::DoVLog(log_level level, const char *format, va_list ap,
+                   int levels) {
+  Context *context = Context::Get();
+
+  LogImplementation *top_implementation = context->implementation;
+  LogImplementation *new_implementation = top_implementation;
+  LogImplementation *implementation = NULL;
+  assert(levels >= 1);
+  for (int i = 0; i < levels; ++i) {
+    implementation = new_implementation;
+    if (new_implementation == NULL) {
+      Die("no logging implementation to use\n");
+    }
+    new_implementation = new_implementation->next();
+  }
+  context->implementation = new_implementation;
+  implementation->DoLog(level, format, ap);
+  context->implementation = top_implementation;
+
+  if (level == FATAL) {
+    VDie(format, ap);
+  }
+}
+
+void VLog(log_level level, const char *format, va_list ap) {
+  LogImplementation::DoVLog(level, format, ap, 1);
+}
+
+void VCork(int line, const char *function, const char *format, va_list ap) {
+  Context *context = Context::Get();
+
+  const size_t message_length = strlen(context->cork_data.message);
+  if (line > context->cork_data.line_max) context->cork_data.line_max = line;
+  if (line < context->cork_data.line_min) context->cork_data.line_min = line;
+
+  if (context->cork_data.function == NULL) {
+    context->cork_data.function = function;
+  } else {
+    if (strcmp(context->cork_data.function, function) != 0) {
+      LOG(FATAL, "started corking data in function %s but then moved to %s\n",
+          context->cork_data.function, function);
+    }
+  }
+
+  ExecuteFormat(context->cork_data.message + message_length,
+                sizeof(context->cork_data.message) - message_length,
+                format, ap);
+}
+
+void VUnCork(int line, const char *function, log_level level, const char *file,
+             const char *format, va_list ap) {
+  Context *context = Context::Get();
+
+  VCork(line, function, format, ap);
+
+  log_do(level, "%s: %d-%d: %s: %s", file,
+         context->cork_data.line_min, context->cork_data.line_max, function,
+         context->cork_data.message);
+
+  context->cork_data.Reset();
+}
+
+void LogNext(log_level level, const char *format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  LogImplementation::DoVLog(level, format, ap, 2);
+  va_end(ap);
+}
+
+void AddImplementation(LogImplementation *implementation) {
+  Context *context = Context::Get();
+
+  if (implementation->next() != NULL) {
+    LOG(FATAL, "%p already has a next implementation, but it's not"
+        " being used yet\n", implementation);
+  }
+
+  LogImplementation *old = context->implementation;
+  if (old != NULL) {
+    implementation->set_next(old);
+  }
+  SetGlobalImplementation(implementation);
+}
+
+void Init() {
+  static Once<void> once(DoInit);
+  once.Get();
+}
+
+void Load() {
+  Context::Get();
+}
+
+void Cleanup() {
+  Context::Delete();
+}
+
+}  // namespace logging
+}  // namespace aos
+
+void log_do(log_level level, const char *format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  aos::logging::VLog(level, format, ap);
+  va_end(ap);
+}
+
+void log_cork(int line, const char *function, const char *format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  aos::logging::VCork(line, function, format, ap);
+  va_end(ap);
+}
+
+void log_uncork(int line, const char *function, log_level level,
+                const char *file, const char *format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  aos::logging::VUnCork(line, function, level, file, format, ap);
+  va_end(ap);
+}
diff --git a/aos/common/logging/logging_impl.h b/aos/common/logging/logging_impl.h
new file mode 100644
index 0000000..18f35bc
--- /dev/null
+++ b/aos/common/logging/logging_impl.h
@@ -0,0 +1,217 @@
+#ifndef AOS_COMMON_LOGGING_LOGGING_IMPL_H_
+#define AOS_COMMON_LOGGING_LOGGING_IMPL_H_
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <limits.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <string>
+
+#include "aos/common/logging/logging.h"
+#include "aos/common/type_traits.h"
+#include "aos/common/mutex.h"
+
+// This file has all of the logging implementation. It can't be #included by C
+// code like logging.h can.
+// It is useful for the rest of the logging implementation and other C++ code
+// that needs to do special things with logging.
+
+namespace aos {
+namespace logging {
+
+// Unless explicitly stated otherwise, format must always be a string constant,
+// args are printf-style arguments for format, and ap is a va_list of args.
+// The validity of format and args together will be checked at compile time
+// using a gcc function attribute.
+
+// The struct that the code uses for making logging calls.
+// Packed so that it ends up the same under both linux and vxworks.
+struct __attribute__((packed)) LogMessage {
+#ifdef __VXWORKS__
+  static_assert(sizeof(pid_t) == sizeof(int),
+                "we use task IDs (aka ints) and pid_t interchangeably");
+#endif
+  // Actually the task ID (aka a pointer to the TCB) on the cRIO.
+  pid_t source;
+  static_assert(sizeof(source) == 4, "that's how they get printed");
+  // Per task/thread.
+  uint16_t sequence;
+  log_level level;
+  int32_t seconds, nseconds;
+  char name[100];
+  char message[LOG_MESSAGE_LEN];
+};
+static_assert(shm_ok<LogMessage>::value, "it's going in a queue");
+
+// Returns left > right. LOG_UNKNOWN is most important.
+static inline bool log_gt_important(log_level left, log_level right) {
+  if (left == ERROR) left = 3;
+  if (right == ERROR) right = 3;
+  return left > right;
+}
+
+// Returns a string representing level or "unknown".
+static inline const char *log_str(log_level level) {
+#define DECL_LEVEL(name, value) if (level == name) return #name;
+  DECL_LEVELS;
+#undef DECL_LEVEL
+  return "unknown";
+}
+// Returns the log level represented by str or LOG_UNKNOWN.
+static inline log_level str_log(const char *str) {
+#define DECL_LEVEL(name, value) if (!strcmp(str, #name)) return name;
+  DECL_LEVELS;
+#undef DECL_LEVEL
+  return LOG_UNKNOWN;
+}
+
+// Takes a message and logs it. It will set everything up and then call DoLog
+// for the current LogImplementation.
+void VLog(log_level level, const char *format, va_list ap);
+// Adds to the saved up message.
+void VCork(int line, const char *format, va_list ap);
+// Actually logs the saved up message.
+void VUnCork(int line, log_level level, const char *file,
+             const char *format, va_list ap);
+
+// Will call VLog with the given arguments for the next logger in the chain.
+void LogNext(log_level level, const char *format, ...)
+  __attribute__((format(LOG_PRINTF_FORMAT_TYPE, 2, 3)));
+
+// Represents a system that can actually take log messages and do something
+// useful with them.
+// All of the code (transitively too!) in the DoLog here can make
+// normal LOG and LOG_DYNAMIC calls but can NOT call LOG_CORK/LOG_UNCORK. These
+// calls will not result in DoLog recursing. However, implementations must be
+// safe to call from multiple threads/tasks at the same time. Also, any other
+// overriden methods may end up logging through a given implementation's DoLog.
+class LogImplementation {
+ public:
+  LogImplementation() : next_(NULL) {}
+
+  // The one that this one's implementation logs to.
+  // NULL means that there is no next one.
+  LogImplementation *next() { return next_; }
+  // Virtual in case a subclass wants to perform checks. There will be a valid
+  // logger other than this one available while this is called.
+  virtual void set_next(LogImplementation *next) { next_ = next; }
+
+ private:
+  // Actually logs the given message. Implementations should somehow create a
+  // LogMessage and then call internal::FillInMessage.
+  virtual void DoLog(log_level level, const char *format, va_list ap) = 0;
+
+  // Function of this class so that it can access DoLog.
+  // Levels is how many LogImplementations to not use off the stack.
+  static void DoVLog(log_level, const char *format, va_list ap, int levels);
+  // Friends so that they can access DoVLog.
+  friend void VLog(log_level, const char *, va_list);
+  friend void LogNext(log_level, const char *, ...);
+
+  LogImplementation *next_;
+};
+
+// A log implementation that dumps all messages to a C stdio stream.
+class StreamLogImplementation : public LogImplementation {
+ public:
+  StreamLogImplementation(FILE *stream);
+
+ private:
+  virtual void DoLog(log_level level, const char *format, va_list ap);
+
+  FILE *const stream_;
+};
+
+// Adds another implementation to the stack of implementations in this
+// task/thread.
+// Any tasks/threads created after this call will also use this implementation.
+// The cutoff is when the state in a given task/thread is created (either lazily
+// when needed or by calling Load()).
+// The logging system takes ownership of implementation. It will delete it if
+// necessary, so it must be created with new.
+void AddImplementation(LogImplementation *implementation);
+
+// Must be called at least once per process/load before anything else is
+// called. This function is safe to call multiple times from multiple
+// tasks/threads.
+void Init();
+
+// Forces all of the state that is usually lazily created when first needed to
+// be created when called. Cleanup() will delete it.
+void Load();
+// Resets all information in this task/thread to its initial state.
+// NOTE: This is not the opposite of Init(). The state that this deletes is
+// lazily created when needed. It is actually the opposite of Load().
+void Cleanup();
+
+// This is where all of the code that is only used by actual LogImplementations
+// goes.
+namespace internal {
+
+// An separate instance of this class is accessible from each task/thread.
+// NOTE: It will get deleted in the child of a fork.
+struct Context {
+  Context();
+
+  // Gets the Context object for this task/thread. Will create one the first
+  // time it is called.
+  //
+  // The implementation for each platform will lazily instantiate a new instance
+  // and then initialize name the first time.
+  // IMPORTANT: The implementation of this can not use logging.
+  static Context *Get();
+  // Deletes the Context object for this task/thread so that the next Get() is
+  // called it will create a new one.
+  // It is valid to call this when Get() has never been called.
+  static void Delete();
+
+  // Which one to log to right now.
+  // Will be NULL if there is no logging implementation to use right now.
+  LogImplementation *implementation;
+
+  // A name representing this task/(process and thread).
+  // strlen(name.c_str()) must be <= sizeof(LogMessage::name).
+  ::std::string name;
+
+  // What to assign LogMessage::source to in this task/thread.
+  pid_t source;
+
+  // The sequence value to send out with the next message.
+  uint16_t sequence;
+
+  // Contains all of the information related to implementing LOG_CORK and
+  // LOG_UNCORK.
+  struct {
+    char message[LOG_MESSAGE_LEN];
+    int line_min, line_max;
+    // Sets the data up to record a new series of corked logs.
+    void Reset() {
+      message[0] = '\0';  // make strlen of it 0
+      line_min = INT_MAX;
+      line_max = -1;
+      function = NULL;
+    }
+    // The function that the calls are in.
+    // REMEMBER: While the compiler/linker will probably optimize all of the
+    // identical strings to point to the same data, it might not, so using == to
+    // compare this with another value is a bad idea.
+    const char *function;
+  } cork_data;
+};
+
+// Fills in *message according to the given inputs. Used for implementing
+// LogImplementation::DoLog.
+void FillInMessage(log_level level, const char *format, va_list ap,
+                   LogMessage *message);
+
+// Prints message to output.
+void PrintMessage(FILE *output, const LogMessage &message);
+
+}  // namespace internal
+}  // namespace logging
+}  // namespace aos
+
+#endif  // AOS_COMMON_LOGGING_LOGGING_IMPL_H_
diff --git a/aos/common/logging/logging_impl_test.cc b/aos/common/logging/logging_impl_test.cc
new file mode 100644
index 0000000..faaf1cd
--- /dev/null
+++ b/aos/common/logging/logging_impl_test.cc
@@ -0,0 +1,177 @@
+#include <string>
+
+#include "gtest/gtest.h"
+
+#include "aos/common/logging/logging_impl.h"
+#include "aos/common/time.h"
+#include "aos/common/die.h"
+#include "aos/common/inttypes.h"
+
+using ::testing::AssertionResult;
+using ::testing::AssertionSuccess;
+using ::testing::AssertionFailure;
+
+namespace aos {
+namespace logging {
+namespace testing {
+
+class TestLogImplementation : public LogImplementation {
+  virtual void DoLog(log_level level, const char *format, va_list ap) {
+    internal::FillInMessage(level, format, ap, &message_);
+
+    used_ = true;
+  }
+
+  LogMessage message_;
+
+ public:
+  const LogMessage &message() { return message_; }
+  bool used() { return used_; }
+  void reset_used() { used_ = false; }
+
+  TestLogImplementation() : used_(false) {}
+
+  bool used_;
+};
+class LoggingTest : public ::testing::Test {
+ protected:
+  AssertionResult WasAnythingLogged() {
+    if (log_implementation->used()) {
+      return AssertionSuccess() << "read message '" <<
+          log_implementation->message().message << "'";
+    }
+    return AssertionFailure();
+  }
+  AssertionResult WasLogged(log_level level, const std::string message) {
+    if (!log_implementation->used()) {
+      return AssertionFailure() << "nothing was logged";
+    }
+    if (log_implementation->message().level != level) {
+      return AssertionFailure() << "a message with level " <<
+          log_str(log_implementation->message().level) <<
+          " was logged instead of " << log_str(level);
+    }
+    internal::Context *context = internal::Context::Get();
+    if (log_implementation->message().source != context->source) {
+      Die("got a message from %" PRIu32 ", but we're %" PRIu32 "\n",
+          static_cast<uint32_t>(log_implementation->message().source),
+          static_cast<uint32_t>(context->source));
+    }
+    if (strcmp(log_implementation->message().name,
+               context->name.c_str()) != 0) {
+      Die("got a message from %s, but we're %s\n",
+          log_implementation->message().name, context->name.c_str());
+    }
+    if (strstr(log_implementation->message().message, message.c_str())
+        == NULL) {
+      return AssertionFailure() << "got a message of '" <<
+          log_implementation->message().message <<
+          "' but expected it to contain '" << message << "'";
+    }
+
+    return AssertionSuccess() << log_implementation->message().message;
+  }
+
+ private:
+  virtual void SetUp() {
+    static bool first = true;
+    if (first) {
+      first = false;
+
+      Init();
+      // We'll end up with several of them stacked up, but it really doesn't
+      // matter.
+      AddImplementation(log_implementation = new TestLogImplementation());
+    }
+
+    log_implementation->reset_used();
+  }
+  virtual void TearDown() {
+    Cleanup();
+  }
+
+  static TestLogImplementation *log_implementation;
+};
+TestLogImplementation *LoggingTest::log_implementation(NULL);
+typedef LoggingTest LoggingDeathTest;
+
+// Tests both basic logging functionality and that the test setup works
+// correctly.
+TEST_F(LoggingTest, Basic) {
+  EXPECT_FALSE(WasAnythingLogged());
+  LOG(INFO, "test log 1\n");
+  EXPECT_TRUE(WasLogged(INFO, "test log 1\n"));
+  LOG(INFO, "test log 1.5\n");
+  // there's a subtle typo on purpose...
+  EXPECT_FALSE(WasLogged(INFO, "test log 15\n"));
+  LOG(ERROR, "test log 2=%d\n", 55);
+  EXPECT_TRUE(WasLogged(ERROR, "test log 2=55\n"));
+  LOG(ERROR, "test log 3\n");
+  EXPECT_FALSE(WasLogged(WARNING, "test log 3\n"));
+  LOG(WARNING, "test log 4\n");
+  EXPECT_TRUE(WasAnythingLogged());
+}
+TEST_F(LoggingTest, Cork) {
+  static const int begin_line = __LINE__;
+  LOG_CORK("first part ");
+  LOG_CORK("second part (=%d) ", 19);
+  EXPECT_FALSE(WasAnythingLogged());
+  LOG_CORK("third part ");
+  static const int end_line = __LINE__;
+  LOG_UNCORK(WARNING, "last part %d\n", 5);
+  std::stringstream expected;
+  expected << "logging_impl_test.cc: ";
+  expected << (begin_line + 1);
+  expected << "-";
+  expected << (end_line + 1);
+  expected << ": ";
+  expected << __func__;
+  expected << ": first part second part (=19) third part last part 5\n";
+  EXPECT_TRUE(WasLogged(WARNING, expected.str()));
+}
+
+#ifndef __VXWORKS__
+TEST_F(LoggingDeathTest, Fatal) {
+  ASSERT_EXIT(LOG(FATAL, "this should crash it\n"),
+              ::testing::KilledBySignal(SIGABRT),
+              "this should crash it");
+}
+#endif
+
+TEST_F(LoggingTest, PrintfDirectives) {
+  LOG(INFO, "test log %%1 %%d\n");
+  EXPECT_TRUE(WasLogged(INFO, "test log %1 %d\n"));
+  LOG_DYNAMIC(WARNING, "test log %%2 %%f\n");
+  EXPECT_TRUE(WasLogged(WARNING, "test log %2 %f\n"));
+  LOG_CORK("log 3 part %%1 %%d ");
+  LOG_UNCORK(DEBUG, "log 3 part %%2 %%f\n");
+  EXPECT_TRUE(WasLogged(DEBUG, "log 3 part %1 %d log 3 part %2 %f\n"));
+}
+
+TEST_F(LoggingTest, Timing) {
+  // For writing only.
+  //static const long kTimingCycles = 5000000;
+  static const long kTimingCycles = 5000;
+
+  time::Time start = time::Time::Now();
+  for (long i = 0; i < kTimingCycles; ++i) {
+    LOG(INFO, "a\n");
+  }
+  time::Time end = time::Time::Now();
+  time::Time diff = end - start;
+  printf("short message took %lld nsec for %ld\n",
+         diff.ToNSec(), kTimingCycles);
+
+  start = time::Time::Now();
+  for (long i = 0; i < kTimingCycles; ++i) {
+    LOG(INFO, "something longer than just \"a\" to log to test timing\n");
+  }
+  end = time::Time::Now();
+  diff = end - start;
+  printf("long message took %lld nsec for %ld\n",
+         diff.ToNSec(), kTimingCycles);
+}
+
+}  // namespace testing
+}  // namespace logging
+}  // namespace aos
diff --git a/aos/common/macros.h b/aos/common/macros.h
index 88fc52e..2018b36 100644
--- a/aos/common/macros.h
+++ b/aos/common/macros.h
@@ -6,8 +6,8 @@
 // A macro to disallow the copy constructor and operator= functions
 // This should be used in the private: declarations for a class
 #define DISALLOW_COPY_AND_ASSIGN(TypeName) \
-  TypeName(const TypeName&);               \
-  void operator=(const TypeName&)
+  TypeName(const TypeName&) = delete;      \
+  void operator=(const TypeName&) = delete
 // A macro to wrap arguments to macros that contain commas.
 // Useful for DISALLOW_COPY_AND_ASSIGNing templated types with multiple template
 // arguments.
diff --git a/aos/common/messages/QueueHolder.h b/aos/common/messages/QueueHolder.h
index 6cf2835..8d8ba51 100644
--- a/aos/common/messages/QueueHolder.h
+++ b/aos/common/messages/QueueHolder.h
@@ -2,14 +2,18 @@
 #define __AOS_MESSAGES_QUEUE_HOLDER_H_
 
 #include <stddef.h>
+#include <string.h>
 
 #include <algorithm>
 
-#include "aos/aos_core.h"
 #include "aos/common/control_loop/Timing.h"
 #include "aos/common/byteorder.h"
 #include "aos/common/time.h"
 #include "aos/common/type_traits.h"
+#include "aos/common/logging/logging.h"
+#ifndef __VXWORKS__
+#include "aos/atom_code/ipc_lib/queue.h"
+#endif
 
 namespace aos {
 
@@ -67,7 +71,7 @@
 #define aos_check_rv __attribute__((warn_unused_result))
 template<typename T> class QueueHolderNoBuilder {
 #ifndef __VXWORKS__
-  aos_queue *const queue_;
+  Queue *const queue_;
   static_assert(shm_ok<T>::value, "T must be able to"
                 " go through shared memory and memcpy");
   T t_;
@@ -76,7 +80,7 @@
 #endif
  public:
 #ifndef __VXWORKS__
-  explicit QueueHolderNoBuilder(aos_queue *queue) : queue_(queue) {}
+  explicit QueueHolderNoBuilder(Queue *queue) : queue_(queue) {}
 #else
   QueueHolderNoBuilder() {}
 #endif
@@ -154,7 +158,7 @@
   QueueBuilder<T> builder_;
  public:
 #ifndef __VXWORKS__
-  explicit QueueHolder(aos_queue *queue) : QueueHolderNoBuilder<T>(queue),
+  explicit QueueHolder(Queue *queue) : QueueHolderNoBuilder<T>(queue),
     builder_(*this) {}
 #else
   QueueHolder() : builder_(*this) {}
@@ -167,7 +171,6 @@
   }
 };
 
-} // namespace aos
+}  // namespace aos
 
 #endif
-
diff --git a/aos/common/messages/messages.gyp b/aos/common/messages/messages.gyp
index 94508c4..b76dbba 100644
--- a/aos/common/messages/messages.gyp
+++ b/aos/common/messages/messages.gyp
@@ -1,6 +1,33 @@
 {
   'targets': [
     {
+      'target_name': 'QueueHolder',
+      'type': 'static_library',
+      'sources': [
+        # 'QueueHolder.h'
+      ],
+      'dependencies': [
+        '<(AOS)/common/common.gyp:timing',
+        '<(AOS)/common/common.gyp:time',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:timing',
+        '<(AOS)/common/common.gyp:time',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+      'conditions': [
+        ['OS!="crio"', {
+          'dependencies': [
+            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
+          ],
+          'export_dependent_settings': [
+            '<(AOS)/atom_code/ipc_lib/ipc_lib.gyp:queue',
+          ],
+        }],
+      ],
+    },
+    {
       'target_name': 'aos_queues',
       'type': 'static_library',
       'sources': [
@@ -10,11 +37,9 @@
         'header_path': 'aos/common/messages',
       },
       'dependencies': [
-        '<(AOS)/build/aos.gyp:aos_internal_nolib',
         '<(AOS)/common/common.gyp:queues',
       ],
       'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:aos_internal_nolib',
         '<(AOS)/common/common.gyp:queues',
       ],
       'includes': ['../../build/queues.gypi'],
@@ -28,12 +53,6 @@
       'variables': {
         'header_path': 'aos/common/messages',
       },
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:aos_internal_nolib',
-      ],
-      'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:aos_internal_nolib',
-      ],
       'direct_dependent_settings': {
         'variables': {
           'jni_libs': ['queues_so'],
diff --git a/aos/common/mutex.h b/aos/common/mutex.h
index c1d6f95..b6b277c 100644
--- a/aos/common/mutex.h
+++ b/aos/common/mutex.h
@@ -5,12 +5,14 @@
 #include <semLib.h>
 #endif
 
-#include "aos/aos_core.h"
 #include "aos/common/macros.h"
 #include "aos/common/type_traits.h"
+#include "aos/atom_code/ipc_lib/aos_sync.h"
 
 namespace aos {
 
+class Condition;
+
 // An abstraction of a mutex that has implementations both for the
 // atom and for the cRIO.
 // If there are multiple tasks or processes contending for the mutex,
@@ -42,6 +44,9 @@
   typedef mutex ImplementationType;
 #endif
   ImplementationType impl_;
+
+  friend class Condition;  // for access to impl_
+
 #ifdef __VXWORKS__
   DISALLOW_COPY_AND_ASSIGN(Mutex);
 #endif
@@ -64,6 +69,20 @@
   Mutex *mutex_;
   DISALLOW_COPY_AND_ASSIGN(MutexLocker);
 };
+// The inverse of MutexLocker.
+class MutexUnlocker {
+ public:
+  explicit MutexUnlocker(Mutex *mutex) : mutex_(mutex) {
+    mutex_->Unlock();
+  }
+  ~MutexUnlocker() {
+    mutex_->Lock();
+  }
+
+ private:
+  Mutex *mutex_;
+  DISALLOW_COPY_AND_ASSIGN(MutexUnlocker);
+};
 
 }  // namespace aos
 
diff --git a/aos/common/mutex_test.cpp b/aos/common/mutex_test.cpp
index a5d5e86..652cd9e 100644
--- a/aos/common/mutex_test.cpp
+++ b/aos/common/mutex_test.cpp
@@ -1,7 +1,16 @@
 #include "aos/common/mutex.h"
 
+#include <sched.h>
+#include <math.h>
+#include <pthread.h>
+#ifdef __VXWORKS__
+#include <taskLib.h>
+#endif
+
 #include "gtest/gtest.h"
 
+#include "aos/atom_code/ipc_lib/aos_sync.h"
+
 namespace aos {
 namespace testing {
 
@@ -51,5 +60,17 @@
   EXPECT_TRUE(test_mutex.TryLock());
 }
 
+TEST_F(MutexTest, MutexUnlocker) {
+  test_mutex.Lock();
+  {
+    aos::MutexUnlocker unlocker(&test_mutex);
+    // If this fails, then something weird is going on and the next line might
+    // hang, so fail immediately.
+    ASSERT_TRUE(test_mutex.TryLock());
+    test_mutex.Unlock();
+  }
+  EXPECT_FALSE(test_mutex.TryLock());
+}
+
 }  // namespace testing
 }  // namespace aos
diff --git a/aos/common/network/ReceiveSocket.cpp b/aos/common/network/ReceiveSocket.cpp
index 671f966..d98be54 100644
--- a/aos/common/network/ReceiveSocket.cpp
+++ b/aos/common/network/ReceiveSocket.cpp
@@ -6,7 +6,7 @@
 #include <stddef.h>
 
 #include "aos/common/network/SocketLibraries.h"
-#include "aos/aos_core.h"
+#include "aos/common/logging/logging.h"
 
 namespace aos {
 
@@ -19,12 +19,12 @@
     return ret;
   }
 
-	if (bind(socket_, &addr_.addr,
+  if (bind(socket_, &addr_.addr,
            sizeof(addr_)) == -1) {
     LOG(ERROR, "failed to bind to address '%s' because of %d: %s\n", localhost,
         errno, strerror(errno));
     return last_ret_ = -1;
-	}
+  }
   return last_ret_ = 0;
 }
 
diff --git a/aos/common/network/ReceiveSocket.h b/aos/common/network/ReceiveSocket.h
index bd834c9..468cb22 100644
--- a/aos/common/network/ReceiveSocket.h
+++ b/aos/common/network/ReceiveSocket.h
@@ -7,11 +7,8 @@
 
 class ReceiveSocket : public Socket {
  public:
-	inline ReceiveSocket(NetworkPort port) { Connect(port); }
+  inline ReceiveSocket(NetworkPort port) { Connect(port); }
   int Connect(NetworkPort port);
-
-  inline int Recv(void *buf, int length) { return Socket::Recv(buf, length); }
-  inline int Recv(void *buf, int length, long usec) { return Socket::Recv(buf, length, usec); }
 };
 
 } // namespace aos
diff --git a/aos/common/network/SendSocket.cpp b/aos/common/network/SendSocket.cpp
index 89665dc..59fd570 100644
--- a/aos/common/network/SendSocket.cpp
+++ b/aos/common/network/SendSocket.cpp
@@ -6,8 +6,8 @@
 #include <stddef.h>
 #include <math.h>
 
-#include "aos/aos_core.h"
 #include "aos/common/network/SocketLibraries.h"
+#include "aos/common/logging/logging.h"
 
 namespace aos {
 
@@ -18,25 +18,14 @@
     return ret;
   }
 
-	if (connect(socket_, &addr_.addr,
+  if (connect(socket_, &addr_.addr,
               sizeof(addr_)) < 0) {
     LOG(ERROR, "couldn't connect to ip '%s' because of %d: %s\n", robot_ip,
         errno, strerror(errno));
     last_ret_ = 1;
   }
 
-	hold_msg_len_ = 0;
   return last_ret_ = 0;
 }
 
-int SendSocket::SendHoldMsg() {
-	if (hold_msg_len_ > 0) {
-		int val = Send(hold_msg_, hold_msg_len_);
-		hold_msg_len_ = 0;
-		return val;
-	}
-	return -1;
-}
-
-} // namespace aos
-
+}  // namespace aos
diff --git a/aos/common/network/SendSocket.h b/aos/common/network/SendSocket.h
index 6d3feb1..9323da8 100644
--- a/aos/common/network/SendSocket.h
+++ b/aos/common/network/SendSocket.h
@@ -3,23 +3,23 @@
 
 #include "Socket.h"
 
+#include "aos/atom_code/configuration.h"
+#include "aos/common/network_port.h"
+#include "aos/common/util.h"
+
 namespace aos {
 
 class SendSocket : public Socket {
  public:
-	//inline int Send(const void *buf, int length) { return Socket::Send(buf, length); }
   // Connect must be called before use.
   SendSocket() {}
   // Calls Connect automatically.
-	SendSocket(NetworkPort port, const char *robot_ip) {
-    Connect(port, robot_ip);
+  SendSocket(NetworkPort port, ::aos::NetworkAddress address) {
+    Connect(port,
+            ::aos::util::MakeIPAddress(::aos::configuration::GetOwnIPAddress(),
+                                       address));
   }
-	int Connect(NetworkPort port, const char *robot_ip, int type = SOCK_DGRAM);
-
-  static const size_t MAX_MSG = 4096;
-	char hold_msg_[MAX_MSG];
-	size_t hold_msg_len_;
-	int SendHoldMsg();
+  int Connect(NetworkPort port, const char *robot_ip, int type = SOCK_DGRAM);
 };
 
 } // namespace aos
diff --git a/aos/common/network/Socket.cpp b/aos/common/network/Socket.cpp
index b01bcb8..0366e7c 100644
--- a/aos/common/network/Socket.cpp
+++ b/aos/common/network/Socket.cpp
@@ -3,37 +3,40 @@
 #include <string.h>
 #include <errno.h>
 
-#include "aos/aos_core.h"
+#include "aos/common/logging/logging.h"
 #include "aos/common/network/SocketLibraries.h"
 
 namespace aos {
 
 int Socket::Connect(NetworkPort port, const char *address, int type) {
   last_ret_ = 0;
-	if ((socket_ = socket(AF_INET, type, 0)) < 0) {
-    LOG(ERROR, "failed to create socket because of %d: %s\n", errno, strerror(errno));
+  if ((socket_ = socket(AF_INET, type, 0)) < 0) {
+    LOG(ERROR, "failed to create socket because of %d: %s\n",
+        errno, strerror(errno));
     return last_ret_ = 1;
-	}
+  }
 
-	memset(&addr_, 0, sizeof(addr_));
-	addr_.in.sin_family = AF_INET;
+  memset(&addr_, 0, sizeof(addr_));
+  addr_.in.sin_family = AF_INET;
   addr_.in.sin_port = htons(static_cast<uint16_t>(port));
 #ifndef __VXWORKS__
   const int failure_return = 0;
 #else
   const int failure_return = -1;
 #endif
-	if (inet_aton(lame_unconst(address), &addr_.in.sin_addr) == failure_return) {
-		LOG(ERROR, "Invalid IP address '%s' because of %d: %s\n", address,
+  if (inet_aton(lame_unconst(address), &addr_.in.sin_addr) == failure_return) {
+    LOG(ERROR, "Invalid IP address '%s' because of %d: %s\n", address,
         errno, strerror(errno));
     return last_ret_ = -1;
-	}
+  }
 
   return last_ret_ = 0;
 }
+
 Socket::Socket() : socket_(-1), last_ret_(2) {}
+
 Socket::~Socket() {
-	close(socket_);
+  close(socket_);
 }
 
 void Socket::Reset() {
@@ -44,34 +47,36 @@
   last_ret_ = 0;
 }
 
-int Socket::Recv(void *buf, int length) {
-	const int ret = recv(socket_, static_cast<char *>(buf), length, 0);
-  last_ret_ = (ret == -1) ? -1 : 0;
-  return ret;
-}
-int Socket::Recv(void *buf, int length, long usec) {
-	timeval tv;
-	tv.tv_sec = 0;
-	tv.tv_usec = usec;
-	fd_set fds;
-	FD_ZERO(&fds);
-	FD_SET(socket_, &fds);
-	switch (select(FD_SETSIZE, &fds, NULL, NULL, &tv)) {
-		case 1:
-      return Recv(buf, length);
-		case 0:
-			return last_ret_ = 0;
-		default:
-			perror("select on socket to receive from failed");
-			return last_ret_ = -1;
-	}
-}
-int Socket::Send(const void *buf, int length) {
-	const int ret = write(socket_,
-                        lame_unconst(static_cast<const char *>(buf)), length);
-  //const int ret = length;
+int Socket::Receive(void *buf, int length) {
+  const int ret = recv(socket_, static_cast<char *>(buf), length, 0);
   last_ret_ = (ret == -1) ? -1 : 0;
   return ret;
 }
 
-} // namespace aos
+int Socket::Receive(void *buf, int length, time::Time timeout) {
+  timeval timeout_timeval = timeout.ToTimeval();
+  fd_set fds;
+  FD_ZERO(&fds);
+  FD_SET(socket_, &fds);
+  switch (select(FD_SETSIZE, &fds, NULL, NULL, &timeout_timeval)) {
+    case 1:
+      return Receive(buf, length);
+    case 0:
+      return last_ret_ = 0;
+    default:
+      if (errno == EINTR) {
+        return last_ret_ = 0;
+      }
+      LOG(FATAL, "select(FD_SETSIZE, %p, NULL, NULL, %p) failed with %d: %s\n",
+          &fds, &timeout_timeval, errno, strerror(errno));
+  }
+}
+
+int Socket::Send(const void *buf, int length) {
+  const int ret = write(socket_,
+                        lame_unconst(static_cast<const char *>(buf)), length);
+  last_ret_ = (ret == -1) ? -1 : 0;
+  return ret;
+}
+
+}  // namespace aos
diff --git a/aos/common/network/Socket.h b/aos/common/network/Socket.h
index ceee754..7a20d3e 100644
--- a/aos/common/network/Socket.h
+++ b/aos/common/network/Socket.h
@@ -1,5 +1,5 @@
-#ifndef AOS_NETWORK_SOCKET_H_
-#define AOS_NETWORK_SOCKET_H_
+#ifndef AOS_COMMON_NETWORK_SOCKET_H_
+#define AOS_COMMON_NETWORK_SOCKET_H_
 
 #include <sys/socket.h>
 #include <sys/types.h>
@@ -8,7 +8,9 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
-#include "aos/common/Configuration.h"
+
+#include "aos/common/time.h"
+#include "aos/common/network_port.h"
 
 namespace aos {
 
@@ -16,9 +18,21 @@
  public:
   int LastStatus() const { return last_ret_; }
 
-	int Send(const void *buf, int length);
-	int Recv(void *buf, int length);
-	int Recv(void *buf, int length, long usec); // returns 0 if timed out
+  int Send(const void *buf, int length);
+
+  // buf is where to put the data and length is the maximum amount of data to
+  // put in for all overloads.
+  // All overloads return how many bytes were received or -1 for error. 0 is a
+  // valid return value for all overloads.
+  // No timeout.
+  int Receive(void *buf, int length);
+  // DEPRECATED(brians): use the time::Time overload instead
+  int Receive(void *buf, int length, long usec_timeout) {
+    return Receive(buf, length, time::Time::InUS(usec_timeout));
+  }
+  // timeout is relative
+  int Receive(void *buf, int length, time::Time timeout);
+
  protected:
   int Connect(NetworkPort port, const char *address, int type = SOCK_DGRAM);
   Socket();
@@ -27,16 +41,15 @@
   // Resets socket_ and last_ret_.
   void Reset();
 
-	union {
+  union {
     sockaddr_in in;
     sockaddr addr;
   } addr_; // filled in by Connect
 
-	int socket_;
+  int socket_;
   int last_ret_;
 };
 
-} // namespace aos
+}  // namespace aos
 
-#endif
-
+#endif  // AOS_COMMON_NETWORK_SOCKET_H_
diff --git a/aos/common/network/network.gyp b/aos/common/network/network.gyp
index ca3e653..60b37aa 100644
--- a/aos/common/network/network.gyp
+++ b/aos/common/network/network.gyp
@@ -1,6 +1,18 @@
 {
   'targets': [
     {
+      'target_name': 'team_number',
+      'type': 'static_library',
+      'sources': [
+        'team_number.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/atom_code.gyp:configuration',
+        '<(AOS)/common/common.gyp:once',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+    },
+    {
       'target_name': 'socket_so',
       'type': 'shared_library',
       'variables': {'no_rsync': 1},
@@ -10,10 +22,9 @@
         'Socket.cpp',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
+        '<(AOS)/build/aos.gyp:logging',
       ],
       'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
       ],
       'conditions': [
         ['OS=="crio"', {
@@ -38,18 +49,15 @@
         'SendSocket.cpp',
         'Socket.cpp',
       ],
-      'conditions': [
-        ['OS=="crio"', {
-          'dependencies': [
-            '<(EXTERNALS):WPILib',
-          ]}
-        ],
-      ],
       'dependencies': [
         '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/common/common.gyp:time',
+        '<(AOS)/common/common.gyp:util',
+        '<(AOS)/atom_code/atom_code.gyp:configuration',
       ],
       'export_dependent_settings': [
         '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/common/common.gyp:time',
       ],
     },
   ],
diff --git a/aos/common/network/team_number.cc b/aos/common/network/team_number.cc
new file mode 100644
index 0000000..367f991
--- /dev/null
+++ b/aos/common/network/team_number.cc
@@ -0,0 +1,31 @@
+#include "aos/common/network/team_number.h"
+
+#include <netinet/in.h>
+#include <inttypes.h>
+
+#include "aos/common/once.h"
+#include "aos/atom_code/configuration.h"
+#include "aos/common/logging/logging.h"
+
+namespace aos {
+namespace network {
+namespace {
+
+uint16_t *DoGetTeamNumber() {
+  const in_addr &address = configuration::GetOwnIPAddress();
+  static uint16_t r =
+      (((address.s_addr & 0xFF00) >> 8) * 100) +
+      (((address.s_addr & 0xFF0000) >> 16) & 0xFF);
+  LOG(INFO, "team number is %" PRIu16 "\n", r);
+  return &r;
+}
+
+}  // namespace
+
+uint16_t GetTeamNumber() {
+  static Once<uint16_t> once(DoGetTeamNumber);
+  return *once.Get();
+}
+
+}  // namespace network
+}  // namespace aos
diff --git a/aos/common/network/team_number.h b/aos/common/network/team_number.h
new file mode 100644
index 0000000..f250c85
--- /dev/null
+++ b/aos/common/network/team_number.h
@@ -0,0 +1,17 @@
+#ifndef AOS_COMMON_NETWORK_TEAM_NUMBER_H_
+#define AOS_COMMON_NETWORK_TEAM_NUMBER_H_
+
+#include <stdint.h>
+
+namespace aos {
+namespace network {
+
+// Retrieves the current team number based off of the network address.
+// This function will only do the complicated stuff once so it is cheap to call
+// repeatedly.
+uint16_t GetTeamNumber();
+
+}  // namespace network
+}  // namespace aos
+
+#endif  // AOS_COMMON_NETWORK_TEAM_NUMBER_H_
diff --git a/aos/common/network_port.h b/aos/common/network_port.h
new file mode 100644
index 0000000..a8f2d1d
--- /dev/null
+++ b/aos/common/network_port.h
@@ -0,0 +1,35 @@
+#ifndef AOS_COMMON_NETWORK_PORT_H_
+#define AOS_COMMON_NETWORK_PORT_H_
+
+#include "aos/aos_stdint.h"
+
+namespace aos {
+
+// Constants representing the various ports used for communications and some
+// documentation about what each is used for.
+enum class NetworkPort : uint16_t {
+  // UDP socket sending motor values from the atom to the crio.
+  kMotors = 9710,
+  // UDP socket forwarding drivers station packets from the crio to the atom.
+  kDS = 9711,
+  // UDP socket sending sensor values from the crio to the atom.
+  kSensors = 9712,
+  // TCP socket(s) (automatically reconnects) sending logs from the crio to the
+  // atom.
+  kLogs = 9713,
+  // HTTP server that sends out camera feeds in mjpg format.
+  // Should not be changed because this number shows up elsewhere too.
+  kCameraStreamer = 9714,
+};
+
+// Constants representing the various devices that talk on the network and the
+// last segment of their IP addresses.
+enum class NetworkAddress : uint8_t {
+  // The computer that the cRIO talks to.
+  kAtom = 179,
+  kCRIO = 2,
+};
+
+}  // namespace aos
+
+#endif  // AOS_COMMON_NETWORK_PORT_H_
diff --git a/aos/common/once_test.cc b/aos/common/once_test.cc
index ed21b37..7c6e5de 100644
--- a/aos/common/once_test.cc
+++ b/aos/common/once_test.cc
@@ -114,6 +114,7 @@
 // Tests calling Reset() to run the function a second time.
 TEST_F(OnceTest, Recalculate) {
   Once<int> once(Function);
+  once.Reset();
 
   EXPECT_EQ(value_, *once.Get());
   EXPECT_EQ(1, times_run_);
diff --git a/aos/common/queue.cc b/aos/common/queue.cc
index 7e7f2a1..b3a4799 100644
--- a/aos/common/queue.cc
+++ b/aos/common/queue.cc
@@ -30,7 +30,7 @@
 }
 
 size_t Message::Print(char *buffer, int length) const {
-  return snprintf(buffer, length, "%"PRId32".%09"PRId32"s",
+  return snprintf(buffer, length, "%" PRId32 ".%09" PRId32 "s",
                   sent_time.sec(), sent_time.nsec());
 }
 
diff --git a/aos/common/queue.h b/aos/common/queue.h
index 7b38e67..68cb338 100644
--- a/aos/common/queue.h
+++ b/aos/common/queue.h
@@ -9,7 +9,7 @@
 #undef USE_UNSAFE
 #endif
 
-#include "aos/aos_core.h"
+#include "aos/common/time.h"
 #include "aos/common/macros.h"
 #ifndef USE_UNSAFE
 #include "aos/atom_code/ipc_lib/queue.h"
@@ -138,7 +138,7 @@
 
 #ifndef USE_UNSAFE
   // Only Queue should be able to build a queue.
-  ScopedMessagePtr(aos_queue *queue, T *msg)
+  ScopedMessagePtr(RawQueue *queue, T *msg)
       : queue_(queue), msg_(msg) {}
 #else
   ScopedMessagePtr(T *msg)
@@ -152,10 +152,10 @@
 
 #ifndef USE_UNSAFE
   // Sets the queue that owns this message.
-  void set_queue(aos_queue *queue) { queue_ = queue; }
+  void set_queue(RawQueue *queue) { queue_ = queue; }
 
   // The queue that the message is a part of.
-  aos_queue *queue_;
+  RawQueue *queue_;
 #endif  // USE_UNSAFE
   // The message or NULL.
   T *msg_;
@@ -202,6 +202,10 @@
   // take a different amount of time the first cycle.
   void Init();
 
+  // Removes all internal references to shared memory so shared memory can be
+  // restarted safely.  This should only be used in testing.
+  void Clear();
+
   // Fetches the next message from the queue.
   // Returns true if there was a new message available and we successfully
   // fetched it.  This removes the message from the queue for all readers.
@@ -277,7 +281,7 @@
 #else
   T *MakeRawMessage();
   // Pointer to the queue that this object fetches from.
-  aos_queue *queue_;
+  RawQueue *queue_;
 #endif
   // Scoped pointer holding the latest message or NULL.
   ScopedMessagePtr<const T> queue_msg_;
diff --git a/aos/common/queue_test.cc b/aos/common/queue_test.cc
index b24fcd5..32d1d23 100644
--- a/aos/common/queue_test.cc
+++ b/aos/common/queue_test.cc
@@ -5,53 +5,12 @@
 #include "gtest/gtest.h"
 #include "aos/common/test_queue.q.h"
 #include "aos/common/queue_testutils.h"
-
+#include "aos/common/util/thread.h"
 
 using ::aos::time::Time;
 
 namespace aos {
 namespace common {
-
-// TODO(aschuh): Pull this out somewhere and test it.
-class Thread {
- public:
-  Thread () {
-    started_ = false;
-    joined_ = false;
-  }
-
-  ~Thread() {
-    if (!joined_ && started_) {
-      assert(false);
-    }
-  }
-
-  void Start() {
-    assert(!started_);
-    pthread_create(&thread_, NULL, &Thread::StaticRun, this);
-    started_ = true;
-  }
-
-  virtual void Run() = 0;
-
-  void Join() {
-    assert(!joined_);
-    pthread_join(thread_, NULL);
-    joined_ = true;
-  }
- private:
-  static void *StaticRun(void *thread_class) {
-    static_cast<Thread *>(thread_class)->Run();
-    return NULL;
-  }
-
-  pthread_t thread_;
-  bool started_;
-  bool joined_;
-
-  DISALLOW_COPY_AND_ASSIGN(Thread);
-};
-
 namespace testing {
 
 class QueueTest : public ::testing::Test {
@@ -65,7 +24,7 @@
   QueueTest() : my_test_queue(".aos.common.testing.test_queue") {}
 };
 
-class MyThread : public Thread {
+class MyThread : public util::Thread {
  public:
   MyThread() : threaded_test_queue(".aos.common.testing.test_queue") {}
 
@@ -89,7 +48,7 @@
   usleep(50000);
   my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
   t.Join();
-  EXPECT_EQ(true, t.threaded_test_queue.IsNewerThanMS(20));
+  EXPECT_LE(t.threaded_test_queue.Age(), time::Time::InMS(55));
 }
 
 // Tests that we can send a message with the message pointer and get it back.
diff --git a/aos/common/queue_testutils.cc b/aos/common/queue_testutils.cc
index 6cce012..8d195c5 100644
--- a/aos/common/queue_testutils.cc
+++ b/aos/common/queue_testutils.cc
@@ -1,26 +1,155 @@
 #include "aos/common/queue_testutils.h"
+
+#include <string.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "gtest/gtest.h"
+
 #include "aos/common/queue.h"
+#include "aos/common/logging/logging_impl.h"
+#include "aos/common/once.h"
+
+using ::aos::logging::LogMessage;
 
 namespace aos {
 namespace common {
 namespace testing {
+namespace {
+
+class TestLogImplementation : public logging::LogImplementation {
+ public:
+  const ::std::vector<LogMessage> &messages() { return messages_; }
+
+  // This class has to be a singleton so that everybody can get access to the
+  // same instance to read out the messages etc.
+  static TestLogImplementation *GetInstance() {
+    static Once<TestLogImplementation> once(CreateInstance);
+    return once.Get();
+  }
+
+  // Clears out all of the messages already recorded.
+  void ClearMessages() {
+    messages_.clear();
+  }
+
+  // Prints out all of the messages (like when a test fails).
+  void PrintAllMessages() {
+    for (auto it = messages_.begin(); it != messages_.end(); ++it) {
+      logging::internal::PrintMessage(stdout, *it);
+    }
+  }
+
+ private:
+  TestLogImplementation() {}
+
+  static TestLogImplementation *CreateInstance() {
+    return new TestLogImplementation();
+  }
+
+  virtual void DoLog(log_level level, const char *format, va_list ap) {
+    LogMessage message;
+
+    logging::internal::FillInMessage(level, format, ap, &message);
+
+    if (!logging::log_gt_important(WARNING, level)) {
+      logging::internal::PrintMessage(stdout, message);
+    }
+
+    messages_.push_back(message);
+  }
+
+  ::std::vector<LogMessage> messages_;
+};
+
+class MyTestEventListener : public ::testing::EmptyTestEventListener {
+  virtual void OnTestStart(const ::testing::TestInfo &/*test_info*/) {
+    TestLogImplementation::GetInstance()->ClearMessages();
+  }
+  virtual void OnTestEnd(const ::testing::TestInfo &test_info) {
+    if (test_info.result()->Failed()) {
+      printf("Test %s failed. Printing out all log messages.\n",
+             test_info.name());
+      fputs("\tThis will include already printed WARNING and up messages.\n",
+            stdout);
+      fputs("\tIt will also include duplicates of all gtest failures.\n",
+            stdout);
+      TestLogImplementation::GetInstance()->PrintAllMessages();
+    }
+  }
+
+  virtual void OnTestPartResult( const ::testing::TestPartResult &result) {
+    if (result.failed()) {
+      const char *failure_type = "unknown";
+      switch (result.type()) {
+        case ::testing::TestPartResult::Type::kNonFatalFailure:
+          failure_type = "EXPECT";
+          break;
+        case ::testing::TestPartResult::Type::kFatalFailure:
+          failure_type = "ASSERT";
+          break;
+        case ::testing::TestPartResult::Type::kSuccess:
+          break;
+      }
+      log_do(ERROR, "%s: %d: gtest %s failure\n%s\n",
+             result.file_name(),
+             result.line_number(),
+             failure_type,
+             result.message());
+    }
+  }
+};
+
+void *DoEnableTestLogging() {
+  logging::Init();
+  logging::AddImplementation(TestLogImplementation::GetInstance());
+
+  ::testing::UnitTest::GetInstance()->listeners().Append(
+      new MyTestEventListener());
+
+  return NULL;
+}
+
+Once<void> enable_test_logging_once(DoEnableTestLogging);
+
+const size_t kCoreSize = 0x100000;
+
+void TerminateExitHandler() {
+  _exit(EXIT_SUCCESS);
+}
+
+}  // namespace
 
 GlobalCoreInstance::GlobalCoreInstance() {
-  const size_t kCoreSize = 0x100000;
   global_core = &global_core_data_;
-  global_core->owner = 1;
-  void *memory = malloc(kCoreSize);
-  assert(memory != NULL);
-  memset(memory, 0, kCoreSize);
+  global_core->owner = true;
+  // Use mmap(2) manually instead of through malloc(3) so that we can pass
+  // MAP_SHARED which allows forked processes to communicate using the
+  // "shared" memory.
+  void *memory = mmap(NULL, kCoreSize, PROT_READ | PROT_WRITE,
+                      MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+  assert(memory != MAP_FAILED);
 
   assert(aos_core_use_address_as_shared_mem(memory, kCoreSize) == 0);
+
+  EnableTestLogging();
 }
 
 GlobalCoreInstance::~GlobalCoreInstance() {
-  free(global_core->mem_struct);
+  assert(munmap(global_core->mem_struct, kCoreSize) == 0);
   global_core = NULL;
 }
 
+void EnableTestLogging() {
+  enable_test_logging_once.Get();
+}
+
+void PreventExit() {
+  assert(atexit(TerminateExitHandler) == 0);
+}
+
 }  // namespace testing
 }  // namespace common
 }  // namespace aos
diff --git a/aos/common/queue_testutils.h b/aos/common/queue_testutils.h
index 81f1efb..2d26262 100644
--- a/aos/common/queue_testutils.h
+++ b/aos/common/queue_testutils.h
@@ -1,11 +1,20 @@
-#include "aos/common/queue.h"
+#ifndef AOS_COMMON_QUEUE_TESTUTILS_H_
+#define AOS_COMMON_QUEUE_TESTUTILS_H_
+
+#include "aos/atom_code/ipc_lib/shared_mem.h"
+
+// This file has some general helper functions for dealing with testing things
+// that use shared memory etc.
 
 namespace aos {
 namespace common {
 namespace testing {
 
+// Manages creating and cleaning up "shared memory" which works within this
+// process and any that it fork(2)s.
 class GlobalCoreInstance {
  public:
+  // Calls EnableTestLogging().
   GlobalCoreInstance();
   ~GlobalCoreInstance();
 
@@ -13,6 +22,21 @@
   struct aos_core global_core_data_;
 };
 
+// Enables the logging framework for use during a gtest test.
+// It will print out all WARNING and above messages all of the time. It will
+// also print out all log messages when a test fails.
+// This function only needs to be called once in each process (after gtest is
+// initialized), however it can be called more than that.
+void EnableTestLogging();
+
+// Registers an exit handler (using atexit(3)) which will call _exit(2).
+// Intended to be called in a freshly fork(2)ed process where it will run before
+// any other exit handlers that were already registered and prevent them from
+// being run.
+void PreventExit();
+
 }  // namespace testing
 }  // namespace common
 }  // namespace aos
+
+#endif  // AOS_COMMON_QUEUE_TESTUTILS_H_
diff --git a/aos/common/scoped_fd.h b/aos/common/scoped_fd.h
index e654d3d..eb22f80 100644
--- a/aos/common/scoped_fd.h
+++ b/aos/common/scoped_fd.h
@@ -1,4 +1,7 @@
+#include <unistd.h>
+
 #include "aos/common/macros.h"
+#include "aos/common/logging/logging.h"
 
 namespace aos {
 
diff --git a/aos/common/time.cc b/aos/common/time.cc
index 1d97b80..ced0c4d 100644
--- a/aos/common/time.cc
+++ b/aos/common/time.cc
@@ -3,31 +3,81 @@
 #ifdef __VXWORKS__
 #include <taskLib.h>
 #endif
+#include <errno.h>
+#include <string.h>
 
 #include "aos/common/logging/logging.h"
 #include "aos/common/inttypes.h"
+#include "aos/common/mutex.h"
 
 namespace aos {
 namespace time {
 
-Time Time::Now(clockid_t clock) {
-  timespec temp;
-  if (clock_gettime(clock, &temp) != 0) {
-    // TODO(aschuh): There needs to be a pluggable low level logging interface
-    // so we can break this dependency loop.  This also would help during
-    // startup.
-    LOG(FATAL, "clock_gettime(%jd, %p) failed with %d: %s\n",
-        static_cast<uintmax_t>(clock), &temp, errno, strerror(errno));
-  }
-  return Time(temp);
+// State required to enable and use mock time.
+namespace {
+// True if mock time is enabled.
+// This does not need to be checked with the mutex held because setting time to
+// be enabled or disabled is atomic, and all future operations are atomic
+// anyways.  If there is a race condition setting or clearing whether time is
+// enabled or not, it will still be a race condition if current_mock_time is
+// also set atomically with enabled.
+bool mock_time_enabled = false;
+// Mutex to make time reads and writes thread safe.
+Mutex time_mutex;
+// Current time when time is mocked.
+Time current_mock_time(0, 0);
+
+// TODO(aschuh): This doesn't include SleepFor and SleepUntil.
+// TODO(aschuh): Create a clock source object and change the default?
+//  That would let me create a MockTime clock source.
 }
-void Time::Check() {
-  if (nsec_ >= kNSecInSec || nsec_ < 0) {
-    LOG(FATAL, "0 <= nsec_(%"PRId32") < %"PRId32" isn't true.\n",
-        nsec_, kNSecInSec);
+
+void Time::EnableMockTime(const Time &now) {
+  mock_time_enabled = true;
+  MutexLocker time_mutex_locker(&time_mutex);
+  current_mock_time = now;
+}
+
+void Time::DisableMockTime() {
+  MutexLocker time_mutex_locker(&time_mutex);
+  mock_time_enabled = false;
+}
+
+void Time::SetMockTime(const Time &now) {
+  MutexLocker time_mutex_locker(&time_mutex);
+  if (!mock_time_enabled) {
+    LOG(FATAL, "Tried to set mock time and mock time is not enabled\n");
   }
+  current_mock_time = now;
+}
+
+void Time::IncrementMockTime(const Time &amount) {
+  static ::aos::Mutex mutex;
+  ::aos::MutexLocker sync(&mutex);
+  SetMockTime(Now() + amount);
+}
+
+Time Time::Now(clockid_t clock) {
+  if (mock_time_enabled) {
+    MutexLocker time_mutex_locker(&time_mutex);
+    return current_mock_time;
+  } else {
+    timespec temp;
+    if (clock_gettime(clock, &temp) != 0) {
+      LOG(FATAL, "clock_gettime(%jd, %p) failed with %d: %s\n",
+          static_cast<uintmax_t>(clock), &temp, errno, strerror(errno));
+    }
+    return Time(temp);
+  }
+}
+
+void Time::CheckImpl(int32_t nsec) {
   static_assert(aos::shm_ok<Time>::value,
                 "it should be able to go through shared memory");
+  if (nsec >= kNSecInSec || nsec < 0) {
+    LOG(FATAL, "0 <= nsec(%" PRId32 ") < %" PRId32 " isn't true.\n",
+        nsec, kNSecInSec);
+  }
 }
 
 Time &Time::operator+=(const Time &rhs) {
@@ -60,6 +110,10 @@
   sec_ *= rhs;  // better not overflow, or the result is just too big
   nsec_ = temp % kNSecInSec;
   sec_ += (temp - nsec_) / kNSecInSec;
+  if (nsec_ < 0) {
+    nsec_ += kNSecInSec;
+    sec_ -= 1;
+  }
   return *this;
 }
 const Time Time::operator*(int32_t rhs) const {
@@ -68,22 +122,37 @@
 Time &Time::operator/=(int32_t rhs) {
   nsec_ = (sec_ % rhs) * (kNSecInSec / rhs) + nsec_ / rhs;
   sec_ /= rhs;
+  if (nsec_ < 0) {
+    nsec_ += kNSecInSec;
+    sec_ -= 1;
+  }
   return *this;
 }
 const Time Time::operator/(int32_t rhs) const {
   return Time(*this) /= rhs;
 }
+double Time::operator/(const Time &rhs) const {
+  return ToSeconds() / rhs.ToSeconds();
+}
 Time &Time::operator%=(int32_t rhs) {
   nsec_ = ToNSec() % rhs;
   const int wraps = nsec_ / kNSecInSec;
   sec_ = wraps;
   nsec_ -= kNSecInSec * wraps;
+  if (nsec_ < 0) {
+    nsec_ += kNSecInSec;
+    sec_ -= 1;
+  }
   return *this;
 }
 const Time Time::operator%(int32_t rhs) const {
   return Time(*this) %= rhs;
 }
 
+const Time Time::operator-() const {
+  return Time(-sec_ - 1, kNSecInSec - nsec_);
+}
+
 bool Time::operator==(const Time &rhs) const {
   return sec_ == rhs.sec_ && nsec_ == rhs.nsec_;
 }
diff --git a/aos/common/time.h b/aos/common/time.h
index 1d7ccae..bc2dc3e 100644
--- a/aos/common/time.h
+++ b/aos/common/time.h
@@ -23,25 +23,36 @@
 // 0 <= nsec_ < kNSecInSec should always be true. All functions here will make
 // sure that that is true if it was on all inputs (including *this).
 //
+// Negative times are supported so that all of the normal arithmetic identities
+// work. nsec_ is still always positive.
+//
 // The arithmetic and comparison operators are overloaded because they make
 // complete sense and are very useful. The default copy and assignment stuff is
-// left because it works fine. Multiplication and division of Times by Times are
+// left because it works fine. Multiplication of Times by Times is
 // not implemented because I can't think of any uses for them and there are
-// multiple ways to do it.
+// multiple ways to do it. Division of Times by Times is implemented as the
+// ratio of them. Multiplication, division, and modulus of Times by integers are
+// implemented as interpreting the argument as nanoseconds.
 struct Time {
+#ifdef SWIG
+// All of the uses of constexpr here can safely be simply removed.
+// NOTE: This means that relying on the fact that constexpr implicitly makes
+// member functions const is not valid, so they all have to be explicitly marked
+// const.
+#define constexpr
+#endif  // SWIG
  public:
   static const int32_t kNSecInSec = 1000000000;
   static const int32_t kNSecInMSec = 1000000;
   static const int32_t kNSecInUSec = 1000;
   static const int32_t kMSecInSec = 1000;
   static const int32_t kUSecInSec = 1000000;
-  Time(int32_t sec, int32_t nsec) : sec_(sec), nsec_(nsec) {
-    Check();
+  constexpr Time(int32_t sec, int32_t nsec)
+      : sec_(sec), nsec_(CheckConstexpr(nsec)) {
   }
   #ifndef SWIG
-  explicit Time(const struct timespec &value)
-      : sec_(value.tv_sec), nsec_(value.tv_nsec) {
-    Check();
+  explicit constexpr Time(const struct timespec &value)
+      : sec_(value.tv_sec), nsec_(CheckConstexpr(value.tv_nsec)) {
   }
   struct timespec ToTimespec() const {
     struct timespec ans;
@@ -49,9 +60,8 @@
     ans.tv_nsec = nsec_;
     return ans;
   }
-  explicit Time(const struct timeval &value)
-      : sec_(value.tv_sec), nsec_(value.tv_usec * kNSecInUSec) {
-    Check();
+  explicit constexpr Time(const struct timeval &value)
+      : sec_(value.tv_sec), nsec_(CheckConstexpr(value.tv_usec * kNSecInUSec)) {
   }
   struct timeval ToTimeval() const {
     struct timeval ans;
@@ -60,6 +70,7 @@
     return ans;
   }
   #endif  // SWIG
+
   // CLOCK_MONOTONIC on the fitpc and CLOCK_REALTIME on the cRIO because the
   // cRIO doesn't have any others.
   // CLOCK_REALTIME is the default realtime clock and CLOCK_MONOTONIC doesn't
@@ -78,32 +89,44 @@
   static Time Now(clockid_t clock = kDefaultClock);
 
   // Constructs a Time representing seconds.
-  static Time InSeconds(double seconds) {
-    return Time(static_cast<int32_t>(seconds),
-                (seconds - static_cast<int32_t>(seconds)) * kNSecInSec);
+  static constexpr Time InSeconds(double seconds) {
+    return (seconds < 0.0) ?
+        Time(static_cast<int32_t>(seconds) - 1,
+             (seconds - static_cast<int32_t>(seconds) + 1.0) * kNSecInSec) :
+        Time(static_cast<int32_t>(seconds),
+             (seconds - static_cast<int32_t>(seconds)) * kNSecInSec);
   }
 
   // Constructs a time representing microseconds.
-  static Time InNS(int64_t nseconds) {
-    return Time(nseconds / static_cast<int64_t>(kNSecInSec),
-                nseconds % kNSecInSec);
+  static constexpr Time InNS(int64_t nseconds) {
+    return (nseconds < 0) ?
+        Time(nseconds / static_cast<int64_t>(kNSecInSec) - 1,
+             (nseconds % kNSecInSec) + kNSecInSec) :
+        Time(nseconds / static_cast<int64_t>(kNSecInSec),
+             nseconds % kNSecInSec);
   }
 
   // Constructs a time representing microseconds.
-  static Time InUS(int useconds) {
-    return Time(useconds / kUSecInSec, (useconds % kUSecInSec) * kNSecInUSec);
+  static constexpr Time InUS(int useconds) {
+    return (useconds < 0) ?
+        Time(useconds / kUSecInSec - 1,
+             (useconds % kUSecInSec) * kNSecInUSec + kNSecInSec) :
+      Time(useconds / kUSecInSec, (useconds % kUSecInSec) * kNSecInUSec);
   }
 
   // Constructs a time representing mseconds.
-  static Time InMS(int mseconds) {
-    return Time(mseconds / kMSecInSec, (mseconds % kMSecInSec) * kNSecInMSec);
+  static constexpr Time InMS(int mseconds) {
+    return (mseconds < 0) ?
+        Time(mseconds / kMSecInSec - 1,
+             (mseconds % kMSecInSec) * kNSecInMSec + kNSecInSec) :
+        Time(mseconds / kMSecInSec, (mseconds % kMSecInSec) * kNSecInMSec);
   }
 
   // Checks whether or not this time is within amount nanoseconds of other.
   bool IsWithin(const Time &other, int64_t amount) const;
 
   // Returns the time represented all in nanoseconds.
-  int64_t ToNSec() const {
+  int64_t constexpr ToNSec() const {
     return static_cast<int64_t>(sec_) * static_cast<int64_t>(kNSecInSec) +
         static_cast<int64_t>(nsec_);
   }
@@ -113,16 +136,26 @@
   int ToTicks() const {
     return ToNSec() / static_cast<int64_t>(kNSecInSec / sysClkRateGet());
   }
+  // Constructs a Time representing ticks.
+  static Time InTicks(int ticks) {
+    return Time::InSeconds(static_cast<double>(ticks) / sysClkRateGet());
+  }
 #endif
 
   // Returns the time represented in milliseconds.
-  int64_t ToMSec() const {
+  int64_t constexpr ToMSec() const {
     return static_cast<int64_t>(sec_) * static_cast<int64_t>(kMSecInSec) +
         (static_cast<int64_t>(nsec_) / static_cast<int64_t>(kNSecInMSec));
   }
 
+  // Returns the time represent in microseconds.
+  int64_t constexpr ToUSec() const {
+    return static_cast<int64_t>(sec_) * static_cast<int64_t>(kUSecInSec) +
+        (static_cast<int64_t>(nsec_) / static_cast<int64_t>(kNSecInUSec));
+  }
+
   // Returns the time represented in fractional seconds.
-  double ToSeconds() const {
+  double constexpr ToSeconds() const {
     return static_cast<double>(sec_) + static_cast<double>(nsec_) / kNSecInSec;
   }
 
@@ -132,13 +165,22 @@
   Time &operator*=(int32_t rhs);
   Time &operator/=(int32_t rhs);
   Time &operator%=(int32_t rhs);
+  Time &operator%=(double rhs) = delete;
+  Time &operator*=(double rhs) = delete;
+  Time &operator/=(double rhs) = delete;
+  const Time operator*(double rhs) const = delete;
+  const Time operator/(double rhs) const = delete;
+  const Time operator%(double rhs) const = delete;
   #endif
   const Time operator+(const Time &rhs) const;
   const Time operator-(const Time &rhs) const;
   const Time operator*(int32_t rhs) const;
   const Time operator/(int32_t rhs) const;
+  double operator/(const Time &rhs) const;
   const Time operator%(int32_t rhs) const;
 
+  const Time operator-() const;
+
   bool operator==(const Time &rhs) const;
   bool operator!=(const Time &rhs) const;
   bool operator<(const Time &rhs) const;
@@ -151,18 +193,50 @@
   friend std::ostream &operator<<(std::ostream &os, const Time &time);
   #endif  // SWIG
 
-  int32_t sec() const { return sec_; }
+  int32_t constexpr sec() const { return sec_; }
   void set_sec(int32_t sec) { sec_ = sec; }
-  int32_t nsec() const { return nsec_; }
+  int32_t constexpr nsec() const { return nsec_; }
   void set_nsec(int32_t nsec) {
     nsec_ = nsec;
     Check();
   }
 
+  // Absolute value.
+  Time abs() const {
+    if (*this > Time(0, 0)) return *this;
+    if (nsec_ == 0) return Time(-sec_, 0);
+    return Time(-sec_ - 1, kNSecInSec - nsec_);
+  }
+
+  // Enables returning the mock time value for Now instead of checking the
+  // system clock.  This should only be used when testing things depending on
+  // time, or many things may/will break.
+  static void EnableMockTime(const Time &now);
+  // Sets now when time is being mocked.
+  static void SetMockTime(const Time &now);
+  // Convenience function to just increment the mock time by a certain amount in
+  // a thread safe way.
+  static void IncrementMockTime(const Time &amount);
+  // Disables mocking time.
+  static void DisableMockTime();
+
  private:
   int32_t sec_, nsec_;
-  // LOG(FATAL)s if nsec_ is >= kNSecInSec.
-  void Check();
+
+  // LOG(FATAL)s if nsec is >= kNSecInSec or negative.
+  static void CheckImpl(int32_t nsec);
+  void Check() { CheckImpl(nsec_); }
+  // A constexpr version of CheckImpl that returns the given value when it
+  // succeeds or evaluates to non-constexpr and returns 0 when it fails.
+  // This will result in the usual LOG(FATAL) if this is used where it isn't
+  // required to be constexpr or a compile error if it is.
+  static constexpr int32_t CheckConstexpr(int32_t nsec) {
+    return (nsec >= kNSecInSec || nsec < 0) ? CheckImpl(nsec), 0 : nsec;
+  }
+
+#ifdef SWIG
+#undef constexpr
+#endif  // SWIG
 };
 
 // Sleeps for the amount of time represented by time counted by clock.
diff --git a/aos/common/time_test.cc b/aos/common/time_test.cc
index e72e5bd..ebc8284 100644
--- a/aos/common/time_test.cc
+++ b/aos/common/time_test.cc
@@ -56,6 +56,9 @@
   EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
   EXPECT_EQ(MACRO_DARG(Time(50, 300)),
             t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
+  EXPECT_EQ(Time(-46, 500), t + Time(-100, 0));
+  EXPECT_EQ(Time(-47, Time::kNSecInSec - 500),
+            Time(-101, Time::kNSecInSec - 1000) + t);
 }
 TEST(TimeTest, Subtraction) {
   Time t(54, 500);
@@ -66,28 +69,61 @@
             t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
   EXPECT_EQ(MACRO_DARG(Time(55, 800)),
             t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
+  EXPECT_EQ(Time(54, 5500), t - Time(-1, Time::kNSecInSec - 5000));
+  EXPECT_EQ(Time(-50, Time::kNSecInSec - 300),
+            Time(5, 200) - t);
 }
 
 TEST(TimeTest, Multiplication) {
   Time t(54, Time::kNSecInSec / 3);
   EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
   EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
+  EXPECT_EQ(Time(-109, Time::kNSecInSec / 3 + 1), t * -2);
+  EXPECT_EQ(Time(-55, Time::kNSecInSec / 3 * 2 + 1), t * -1);
+  EXPECT_EQ(Time(-218, Time::kNSecInSec / 3 * 2 + 2), (t * -1) * 4);
 }
-TEST(TimeTest, Division) {
-  EXPECT_EQ(MACRO_DARG(Time(5, Time::kNSecInSec / 10 * 4 + 50)),
-            MACRO_DARG(Time(54, 500)) / 10);
+TEST(TimeTest, DivisionByInt) {
+  EXPECT_EQ(Time(5, Time::kNSecInSec / 10 * 4 + 50), Time(54, 500) / 10);
+  EXPECT_EQ(Time(2, Time::kNSecInSec / 4 * 3),
+            Time(5, Time::kNSecInSec / 2) / 2);
+  EXPECT_EQ(Time(-3, Time::kNSecInSec / 4 * 3),
+            Time(-5, Time::kNSecInSec / 2) / 2);
+}
+TEST(TimeTest, DivisionByTime) {
+  EXPECT_DOUBLE_EQ(2, Time(10, 0) / Time(5, 0));
+  EXPECT_DOUBLE_EQ(9, Time(27, 0) / Time(3, 0));
+  EXPECT_DOUBLE_EQ(9.25, Time(37, 0) / Time(4, 0));
+  EXPECT_DOUBLE_EQ(5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(7, 0));
+  EXPECT_DOUBLE_EQ(-5.25, Time(-37, Time::kNSecInSec / 4) / Time(7, 0));
+  EXPECT_DOUBLE_EQ(-5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(-7, 0));
+}
+
+TEST(TimeTest, Negation) {
+  EXPECT_EQ(Time(-5, 1234), -Time(4, Time::kNSecInSec - 1234));
+  EXPECT_EQ(Time(5, Time::kNSecInSec * 2 / 3 + 1),
+            -Time(-6, Time::kNSecInSec / 3));
 }
 
 TEST(TimeTest, Comparisons) {
-  EXPECT_TRUE(MACRO_DARG(Time(971, 254) > Time(971, 253)));
-  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
-  EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(971, 255)));
-  EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 255)));
-  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
-  EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 254)));
-  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 254)));
-  EXPECT_TRUE(MACRO_DARG(Time(972, 254) > Time(971, 254)));
-  EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(972, 254)));
+  EXPECT_TRUE(Time(971, 254) > Time(971, 253));
+  EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
+  EXPECT_TRUE(Time(971, 254) < Time(971, 255));
+  EXPECT_TRUE(Time(971, 254) <= Time(971, 255));
+  EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
+  EXPECT_TRUE(Time(971, 254) <= Time(971, 254));
+  EXPECT_TRUE(Time(971, 254) >= Time(971, 254));
+  EXPECT_TRUE(Time(972, 254) > Time(971, 254));
+  EXPECT_TRUE(Time(971, 254) < Time(972, 254));
+
+  EXPECT_TRUE(Time(-971, 254) > Time(-971, 253));
+  EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
+  EXPECT_TRUE(Time(-971, 254) < Time(-971, 255));
+  EXPECT_TRUE(Time(-971, 254) <= Time(-971, 255));
+  EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
+  EXPECT_TRUE(Time(-971, 254) <= Time(-971, 254));
+  EXPECT_TRUE(Time(-971, 254) >= Time(-971, 254));
+  EXPECT_TRUE(Time(-972, 254) < Time(-971, 254));
+  EXPECT_TRUE(Time(-971, 254) > Time(-972, 254));
 }
 
 TEST(TimeTest, Within) {
@@ -95,50 +131,81 @@
   EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
   EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
                                              250)));
+  EXPECT_TRUE(Time(-5, Time::kNSecInSec - 200).IsWithin(Time(-4, 0), 250));
+  EXPECT_TRUE(Time(-5, 200).IsWithin(Time(-5, 0), 250));
 }
 
-TEST(TimeTest, Modulo) {
+TEST(TimeTest, Modulus) {
   EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
             MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
+  EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
+            Time(-50, 0) % (Time::kNSecInSec / 10 * 3));
+  EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
+            Time(-50, 0) % (-Time::kNSecInSec / 10 * 3));
+  EXPECT_EQ(Time(0, Time::kNSecInSec / 10 * 2),
+            Time(50, 0) % (-Time::kNSecInSec / 10 * 3));
 }
 
+// TODO(brians): Finish tests for negatives from here on.
 TEST(TimeTest, InSeconds) {
   EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
             Time::InSeconds(2.55));
+  EXPECT_EQ(MACRO_DARG(Time(-3, Time::kNSecInSec / 100 * 45)),
+            Time::InSeconds(-2.55));
 }
 
 TEST(TimeTest, ToSeconds) {
-  EXPECT_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
+  EXPECT_DOUBLE_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
+  EXPECT_NEAR(-13.23, Time::InSeconds(-13.23).ToSeconds(),
+              1.0 / Time::kNSecInSec * 2);
 }
 
-#ifdef __VXWORKS__
-TEST(TimeTest, ToTicks) {
-  EXPECT_EQ(sysClkRateGet() / 100,
-            MACRO_DARG(Time(0, Time::kNSecInSec / 100).ToTicks()));
-}
-#endif
-
 TEST(TimeTest, InMS) {
   Time t = Time::InMS(254971);
   EXPECT_EQ(254, t.sec());
   EXPECT_EQ(971000000, t.nsec());
+
+  Time t2 = Time::InMS(-254971);
+  EXPECT_EQ(-255, t2.sec());
+  EXPECT_EQ(Time::kNSecInSec - 971000000, t2.nsec());
+}
+
+TEST(TimeTest, ToMSec) {
+  EXPECT_EQ(254971, Time(254, 971000000).ToMSec());
+  EXPECT_EQ(-254971, Time(-255, Time::kNSecInSec - 971000000).ToMSec());
 }
 
 TEST(TimeTest, InNS) {
   Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
   EXPECT_EQ(973, t.sec());
   EXPECT_EQ(254111971, t.nsec());
+
+  Time t2 = Time::InNS(static_cast<int64_t>(-973254111971ll));
+  EXPECT_EQ(-974, t2.sec());
+  EXPECT_EQ(Time::kNSecInSec - 254111971, t2.nsec());
 }
 
 TEST(TimeTest, InUS) {
   Time t = Time::InUS(254111971);
   EXPECT_EQ(254, t.sec());
   EXPECT_EQ(111971000, t.nsec());
+
+  Time t2 = Time::InUS(-254111971);
+  EXPECT_EQ(-255, t2.sec());
+  EXPECT_EQ(Time::kNSecInSec - 111971000, t2.nsec());
 }
 
-TEST(TimeTest, ToMSec) {
-  Time t(254, 971000000);
-  EXPECT_EQ(254971, t.ToMSec());
+TEST(TimeTest, ToUSec) {
+  EXPECT_EQ(254000971, Time(254, 971000).ToUSec());
+  EXPECT_EQ(-254000971, Time(-255, Time::kNSecInSec - 971000).ToUSec());
+}
+
+TEST(TimeTest, Abs) {
+  EXPECT_EQ(MACRO_DARG(Time(971, 1114)), MACRO_DARG(Time(971, 1114).abs()));
+  EXPECT_EQ(MACRO_DARG(Time(253, Time::kNSecInSec * 0.3)),
+            MACRO_DARG(Time(-254, Time::kNSecInSec * 0.7).abs()));
+  EXPECT_EQ(MACRO_DARG(-Time(-971, 973).ToNSec()),
+            MACRO_DARG(Time(970, Time::kNSecInSec - 973).ToNSec()));
 }
 
 }  // namespace testing
diff --git a/aos/common/type_traits.h b/aos/common/type_traits.h
index 9c06b02..4ce6af4 100644
--- a/aos/common/type_traits.h
+++ b/aos/common/type_traits.h
@@ -1,11 +1,7 @@
 #ifndef AOS_COMMON_TYPE_TRAITS_
 #define AOS_COMMON_TYPE_TRAITS_
 
-#ifndef __VXWORKS__
-#include <type_traits>
-#else
-#include "aos/crio/type_traits/type_traits"
-#endif
+#include "aos/common/libstdc++/type_traits"
 
 namespace aos {
 
diff --git a/aos/common/util.cc b/aos/common/util.cc
new file mode 100644
index 0000000..2903611
--- /dev/null
+++ b/aos/common/util.cc
@@ -0,0 +1,31 @@
+#include "aos/common/util.h"
+
+#include <stdlib.h>
+#ifndef __VXWORKS__
+#include <string.h>
+#endif
+
+namespace aos {
+namespace util {
+
+const char *MakeIPAddress(const in_addr &base_address,
+                          ::aos::NetworkAddress last_segment) {
+  in_addr address = base_address;
+  SetLastSegment(&address, last_segment);
+
+#ifdef __VXWORKS__
+  char *r = static_cast<char *>(malloc(INET_ADDR_LEN));
+  inet_ntoa_b(address, r);
+  return r;
+#else
+  return strdup(inet_ntoa(address));
+#endif
+}
+
+void SetLastSegment(in_addr *address, ::aos::NetworkAddress last_segment) {
+  address->s_addr &= ~(htonl(0xFF));
+  address->s_addr |= htonl(static_cast<uint8_t>(last_segment));
+}
+
+}  // namespace util
+}  // namespace aos
diff --git a/aos/common/util.h b/aos/common/util.h
new file mode 100644
index 0000000..f41b86e
--- /dev/null
+++ b/aos/common/util.h
@@ -0,0 +1,29 @@
+#ifndef AOS_COMMON_UTIL_H_
+#define AOS_COMMON_UTIL_H_
+
+#ifdef __VXWORKS__
+#include <inetLib.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#include "aos/common/network_port.h"
+
+namespace aos {
+namespace util {
+
+// Makes an IP address string from base_address with the last byte set to
+// last_segment.
+// Returns a malloc(3)ed string.
+const char *MakeIPAddress(const in_addr &base_address,
+                          ::aos::NetworkAddress last_segment);
+
+// Sets the last byte of *address to last_segment.
+void SetLastSegment(in_addr *address, ::aos::NetworkAddress last_segment);
+
+}  // namespace util
+}  // namespace aos
+
+#endif  // AOS_COMMON_UTIL_H_
diff --git a/aos/common/util/thread.cc b/aos/common/util/thread.cc
new file mode 100644
index 0000000..fab62eb
--- /dev/null
+++ b/aos/common/util/thread.cc
@@ -0,0 +1,39 @@
+#include "aos/common/util/thread.h"
+
+#include <pthread.h>
+#include <assert.h>
+
+namespace aos {
+namespace util {
+
+Thread::Thread() : started_(false), joined_(false), should_terminate_(false) {}
+
+Thread::~Thread() {
+  if (started_ && !joined_) {
+    assert(false);
+  }
+}
+
+void Thread::Start() {
+  assert(!started_);
+  started_ = true;
+  assert(pthread_create(&thread_, NULL, &Thread::StaticRun, this) == 0);
+}
+
+void Thread::Join() {
+  assert(!joined_ && started_);
+  joined_ = true;
+  {
+    MutexLocker locker(&should_terminate_mutex_);
+    should_terminate_ = true;
+  }
+  assert(pthread_join(thread_, NULL) == 0);
+}
+
+void *Thread::StaticRun(void *self) {
+  static_cast<Thread *>(self)->Run();
+  return NULL;
+}
+
+}  // namespace util
+}  // namespace aos
diff --git a/aos/common/util/thread.h b/aos/common/util/thread.h
new file mode 100644
index 0000000..ab6f09c
--- /dev/null
+++ b/aos/common/util/thread.h
@@ -0,0 +1,50 @@
+#ifndef AOS_COMMON_UTIL_THREAD_H_
+#define AOS_COMMON_UTIL_THREAD_H_
+
+#include "aos/common/mutex.h"
+
+namespace aos {
+namespace util {
+
+// A nice wrapper around a pthreads thread.
+//
+// TODO(aschuh): Test this.
+class Thread {
+ public:
+  Thread();
+  virtual ~Thread();
+
+  // Actually creates the thread.
+  void Start();
+
+  // Asks the code to stop and then waits until it has done so.
+  void Join();
+
+ protected:
+  // Subclasses need to call this periodically if they are going to loop to
+  // check whether they have been asked to stop.
+  bool should_continue() {
+    MutexLocker locker(&should_terminate_mutex_);
+    return !should_terminate_;
+  }
+
+ private:
+  // Where subclasses actually do something.
+  //
+  // They should not block for long periods of time without checking
+  // should_continue().
+  virtual void Run() = 0;
+
+  static void *StaticRun(void *self);
+
+  pthread_t thread_;
+  bool started_;
+  bool joined_;
+  bool should_terminate_;
+  Mutex should_terminate_mutex_;
+};
+
+}  // namespace util
+}  // namespace aos
+
+#endif  // AOS_COMMON_UTIL_THREAD_H_
diff --git a/aos/common/util/trapezoid_profile_test.cc b/aos/common/util/trapezoid_profile_test.cc
index 6a06942..882d1b5 100644
--- a/aos/common/util/trapezoid_profile_test.cc
+++ b/aos/common/util/trapezoid_profile_test.cc
@@ -31,11 +31,12 @@
   TrapezoidProfile profile_;
 
   ::testing::AssertionResult At(double position, double velocity) {
-    if (velocity != position_(1)) {
+    static const double kDoubleNear = 0.00001;
+    if (::std::abs(velocity - position_(1)) > kDoubleNear) {
       return ::testing::AssertionFailure() << "velocity is " << position_(1) <<
           " not " << velocity;
     }
-    if (position != position_(0)) {
+    if (::std::abs(position - position_(0)) > kDoubleNear) {
       return ::testing::AssertionFailure() << "position is " << position_(0) <<
           " not " << position;
     }
diff --git a/aos/common/util/util.gyp b/aos/common/util/util.gyp
index 15f868f..852f3d7 100644
--- a/aos/common/util/util.gyp
+++ b/aos/common/util/util.gyp
@@ -1,6 +1,19 @@
 {
   'targets': [
     {
+      'target_name': 'thread',
+      'type': 'static_library',
+      'sources': [
+        'thread.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/common/common.gyp:mutex',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:mutex',
+      ],
+    },
+    {
       'target_name': 'trapezoid_profile',
       'type': 'static_library',
       'sources': [
@@ -26,9 +39,24 @@
         '<(EXTERNALS):gtest',
         # TODO(brians): remove this when time no longer requires it
         '<(AOS)/build/aos.gyp:logging',
-        # TODO(brians): remove this when logging no longer requires it
-        #'<(AOS)/common/common.gyp:die',
-        '<(AOS)/build/aos.gyp:libaos',
+      ],
+    },
+    {
+      'target_name': 'wrapping_counter',
+      'type': 'static_library',
+      'sources': [
+        'wrapping_counter.cc',
+      ],
+    },
+    {
+      'target_name': 'wrapping_counter_test',
+      'type': 'executable',
+      'sources': [
+        'wrapping_counter_test.cc',
+      ],
+      'dependencies': [
+        'wrapping_counter',
+        '<(EXTERNALS):gtest',
       ],
     },
   ],
diff --git a/aos/common/util/wrapping_counter.cc b/aos/common/util/wrapping_counter.cc
new file mode 100644
index 0000000..61f5047
--- /dev/null
+++ b/aos/common/util/wrapping_counter.cc
@@ -0,0 +1,19 @@
+#include "aos/common/util/wrapping_counter.h"
+
+namespace aos {
+namespace util {
+
+WrappingCounter::WrappingCounter(int32_t initial_count)
+    : count_(initial_count), last_count_(0) {}
+
+int32_t WrappingCounter::Update(uint8_t current) {
+  if (last_count_ > current) {
+    count_ += 0x100;
+  }
+  count_ = (count_ & 0xffffff00) | current;
+  last_count_ = current;
+  return count_;
+}
+
+}  // namespace util
+}  // namespace aos
diff --git a/aos/common/util/wrapping_counter.h b/aos/common/util/wrapping_counter.h
new file mode 100644
index 0000000..fbf3611
--- /dev/null
+++ b/aos/common/util/wrapping_counter.h
@@ -0,0 +1,34 @@
+#ifndef AOS_COMMON_UTIL_WRAPPING_COUNTER_H_
+#define AOS_COMMON_UTIL_WRAPPING_COUNTER_H_
+
+#include <stdint.h>
+
+namespace aos {
+namespace util {
+
+// Deals correctly with 1-byte counters which wrap.
+// This is only possible if the counter never wraps twice between Update calls.
+// It will also fail if the counter ever goes down (that will be interpreted as
+// +255 instead of -1, for example).
+class WrappingCounter {
+ public:
+  WrappingCounter(int32_t initial_count = 0);
+
+  // Updates the internal counter with a new raw value.
+  // Returns count() for convenience.
+  int32_t Update(uint8_t current);
+
+  // Resets the actual count to value.
+  void Reset(int32_t value = 0) { count_ = value; }
+
+  int32_t count() const { return count_; }
+
+ private:
+  int32_t count_;
+  uint8_t last_count_;
+};
+
+}  // namespace util
+}  // namespace aos
+
+#endif  // AOS_COMMON_UTIL_WRAPPING_COUNTER_H_
diff --git a/aos/common/util/wrapping_counter_test.cc b/aos/common/util/wrapping_counter_test.cc
new file mode 100644
index 0000000..e257fb0
--- /dev/null
+++ b/aos/common/util/wrapping_counter_test.cc
@@ -0,0 +1,58 @@
+#include "aos/common/util/wrapping_counter.h"
+
+#include <limits.h>
+
+#include "gtest/gtest.h"
+
+namespace aos {
+namespace util {
+namespace testing {
+
+TEST(WrappingCounterTest, Basic) {
+  WrappingCounter test_counter;
+  EXPECT_EQ(0, test_counter.count());
+  EXPECT_EQ(1, test_counter.Update(1));
+  EXPECT_EQ(1, test_counter.Update(1));
+  EXPECT_EQ(2, test_counter.Update(2));
+  EXPECT_EQ(7, test_counter.Update(7));
+  EXPECT_EQ(7, test_counter.count());
+  EXPECT_EQ(123, test_counter.Update(123));
+  EXPECT_EQ(123, test_counter.count());
+}
+
+TEST(WrappingCounterTest, Reset) {
+  WrappingCounter test_counter;
+  test_counter.Update(5);
+  test_counter.Reset();
+  EXPECT_EQ(0, test_counter.count());
+  test_counter.Reset(56);
+  EXPECT_EQ(56, test_counter.count());
+}
+
+namespace {
+void test_wrapping(int16_t start, int16_t step) {
+  WrappingCounter test_counter;
+  for (int16_t i = start; i < INT16_MAX - step; i += step) {
+    EXPECT_EQ(i, test_counter.Update(i & 0xFF));
+  }
+}
+}
+
+// This tests the basic wrapping functionality.
+TEST(WrappingCounterTest, ReasonableWrapping) {
+  test_wrapping(0, 13);
+  test_wrapping(0, 53);
+  test_wrapping(0, 64);
+  test_wrapping(0, 73);
+}
+
+// It would be reasonable for these to fail if the implementation changes.
+TEST(WrappingCounterTest, UnreasonableWrapping) {
+  test_wrapping(0, 128);
+  test_wrapping(0, 213);
+  test_wrapping(0, 255);
+}
+
+}  // namespace testing
+}  // namespace util
+}  // namespace aos
diff --git a/aos/config/10-net-eth0.rules b/aos/config/10-net-eth0.rules
new file mode 100644
index 0000000..c4e17e0
--- /dev/null
+++ b/aos/config/10-net-eth0.rules
@@ -0,0 +1,6 @@
+# This is a file that will make any NIC eth0.
+# It prevents the persistent net rules generator from running because that ends
+# up naming the 1 NIC eth1 instead of when you move a disk between fit-pcs.
+# Put it in /etc/udev/rules.d/ to use it.
+
+SUBSYSTEM=="net", ACTION=="add", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
diff --git a/aos/config/README.txt b/aos/config/README.txt
index 8462f69..4732bb3 100644
--- a/aos/config/README.txt
+++ b/aos/config/README.txt
@@ -8,4 +8,3 @@
 		if on a 64-bit x86 machine, create a 32-bit chroot to build in
 		make sure fakeroot and kernel-package are installed
 		in the linux-x.x.x directory: fakeroot make-kpkg --jobs=4 kernel_image
-
diff --git a/aos/config/aos.conf b/aos/config/aos.conf
index 29d84fa..bda250f 100644
--- a/aos/config/aos.conf
+++ b/aos/config/aos.conf
@@ -1,6 +1,6 @@
 # put this file in /etc/security/limits.d/ to make it work
 # you have to create a group named aos (groupadd aos) and then add anybody you want to it (vim /etc/group)
+# See limits.conf(5) for details.
 
 @aos hard memlock unlimited
 @aos hard rtprio 40
-
diff --git a/aos/config/configure-fitpc.txt b/aos/config/configure-fitpc.txt
new file mode 100644
index 0000000..cb19d7a
--- /dev/null
+++ b/aos/config/configure-fitpc.txt
@@ -0,0 +1,58 @@
+This file contains notes on setting up a new fit-pc image.
+Doing it right requires knowing what you're doing as a Debian sysadmin, so the
+main goal of this file is to avoid forgetting anything.
+
+Brian last updated this on 2013-08-28 with Debian Wheezy.
+
+1.  Install Debian stable.
+      It will need firmware during the installation.
+	  I partitioned it with (in order) a 0.5G ext2 /boot, a 2G swap, a 3.0G xfs
+	    /, and then an xfs /home on the rest of the SSD.
+      Create 1 user named "driver".
+	  Select only "SSH Server" and
+	    "Basic System Utilities"(or something like that) in tasksel.
+2.  Install aos.conf and starter.
+	  I just changed aos.conf to give driver permissions instead of the group.
+3.  Make exim4 start faster.
+      `dpkg-reconfigure exim4-config` and select the option for making minimal
+	    DNS queries (it also says some junk about modems).
+4.  Configure the network.
+      Edit /etc/network/interfaces to give it the right static IP address.
+	  Set up eth1 like the default eth0 in case the NIC gets assigned that (see
+	    #8 below). That shouldn't be a problem any more, but it's probably good
+		to be on the safe side because it can be a pain to find a screen to fix
+		it otherwise.
+5.  Install stuff.
+      firmware-linux-nonfree is always a good one to get.
+	  Remember to add
+	    <http://robotics.mvla.net/files/frc971/packages/frc971.list>.
+      Besides the custom linux-image package, you'll figure everything else out
+	    as you start trying to run stuff.
+6.  Make SSH logins faster.
+      Add the line "UseDNS no" to /etc/ssh/sshd_config.
+7.  Make it so that the programming team can log in without passwords.
+      Everybody will have to run `ssh-copy-id -i ~/.ssh/id_rsa.pub fitpc` (see
+	    <http://www.debian-administration.org/articles/152> for details).
+8.  Make udev to stop being annoying and naming NICs eth1.
+      udev want to remember the ethernet NIC from each device and name the one
+	    in a new fitpc eth1, which breaks stuff. If that happens, removing
+		/etc/udev/rules.d/70-persistent-net.rules will make it autogenerate a
+		new one and fix it.
+	  To prevent this problem from happening in the first place, follow the
+	    directions in 10-net-eth0.rules.
+9.  Download the code!
+      In order for it to actually run, you'll have to
+	    `mkdir -p ~driver/tmp/robot_logs`.
+50. Clone the image to the rest of the disks.
+      I've had good luck with `dd if=/dev/sdx of=/dev/sdx bs=16384` before, but
+	    that didn't work this time...
+      Using gparted's copy/paste feature for each partition worked this time.
+	    A bug in the gparted version I used meant that it wouldn't copy an XFS
+		  partition to a smaller destination, so I had to manually mount both of
+		  them and `xfsdump -J - /path/to/src | xfsrestore -J - /path/to/dest`.
+		Doing it that way changes the UUIDs on the XFS partitions.
+		  To deal with that, I edited the UUIDs in the /etc/fstab of the clone.
+		  I also had to manually install grub on the clone, which meant mounting
+		    the clone's /boot, `grub-install --boot-directory=bla /dev/sdx`, and
+			then using sed to switch the UUIDs in the clone's
+			/boot/grub/grub.cfg.
diff --git a/aos/config/starter b/aos/config/starter
index f82df4b..f7a9c18 100755
--- a/aos/config/starter
+++ b/aos/config/starter
@@ -12,6 +12,8 @@
 
 # Author: Spartan Robotics <spartanrobotics.org>
 
+# Install by placing in /etc/init.d/ and then `update-rc.d starter defaults`.
+
 # Do NOT "set -e"
 
 # PATH should only include /usr/* if it runs after the mountnfs.sh script
diff --git a/aos/controls/polytope.h b/aos/controls/polytope.h
new file mode 100644
index 0000000..a873722
--- /dev/null
+++ b/aos/controls/polytope.h
@@ -0,0 +1,126 @@
+#ifndef _AOS_CONTROLS_POLYTOPE_H_
+#define _AOS_CONTROLS_POLYTOPE_H_
+
+#include "Eigen/Dense"
+#include "libcdd-094g-prefix/include/setoper.h"
+#include "libcdd-094g-prefix/include/cdd.h"
+
+namespace aos {
+namespace controls {
+
+// A n dimension polytope.
+template <int number_of_dimensions>
+class HPolytope {
+ public:
+  // Constructs a polytope given the H and k matricies.
+  HPolytope(Eigen::Matrix<double, Eigen::Dynamic, number_of_dimensions> H,
+            Eigen::Matrix<double, Eigen::Dynamic, 1> k)
+      : H_(H),
+        k_(k) {
+  }
+
+  static void Init() {
+    dd_set_global_constants();
+  }
+
+  // Returns a reference to H.
+  const Eigen::Matrix<double, Eigen::Dynamic,
+                      number_of_dimensions> &H() const {
+    return H_;
+  }
+
+  // Returns a reference to k.
+  const Eigen::Matrix<double, Eigen::Dynamic,
+                      1> &k() const {
+    return k_;
+  }
+
+  // Returns the number of dimensions in the polytope.
+  int ndim() const { return number_of_dimensions; }
+
+  // Returns the number of constraints currently in the polytope.
+  int num_constraints() const { return k_.rows(); }
+
+  // Returns true if the point is inside the polytope.
+  bool IsInside(Eigen::Matrix<double, number_of_dimensions, 1> point);
+
+  // Returns the list of vertices inside the polytope.
+  Eigen::Matrix<double, number_of_dimensions, Eigen::Dynamic> Vertices();
+
+ private:
+  Eigen::Matrix<double, Eigen::Dynamic, number_of_dimensions> H_;
+  Eigen::Matrix<double, Eigen::Dynamic, 1> k_;
+};
+
+template <int number_of_dimensions>
+bool HPolytope<number_of_dimensions>::IsInside(
+    Eigen::Matrix<double, number_of_dimensions, 1> point) {
+  auto ev = H_ * point;
+  for (int i = 0; i < num_constraints(); ++i) {
+    if (ev(i, 0) > k_(i, 0)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+template <int number_of_dimensions>
+Eigen::Matrix<double, number_of_dimensions, Eigen::Dynamic>
+    HPolytope<number_of_dimensions>::Vertices() {
+  dd_MatrixPtr matrix = dd_CreateMatrix(num_constraints(), ndim() + 1);
+
+  // Copy the data over. TODO(aschuh): Is there a better way?  I hate copying...
+  for (int i = 0; i < num_constraints(); ++i) {
+    dd_set_d(matrix->matrix[i][0], k_(i, 0));
+    for (int j = 0; j < ndim(); ++j) {
+      dd_set_d(matrix->matrix[i][j + 1], -H_(i, j));
+    }
+  }
+
+  matrix->representation = dd_Inequality;
+  matrix->numbtype = dd_Real;
+
+  dd_ErrorType error;
+  dd_PolyhedraPtr polyhedra = dd_DDMatrix2Poly(matrix, &error);
+  if (error != dd_NoError || polyhedra == NULL) {
+    dd_WriteErrorMessages(stderr, error);
+    dd_FreeMatrix(matrix);
+    Eigen::Matrix<double, number_of_dimensions, Eigen::Dynamic> ans(0, 0);
+    return ans;
+  }
+
+  dd_MatrixPtr vertex_matrix = dd_CopyGenerators(polyhedra);
+
+  int num_vertices = 0;
+  int num_rays = 0;
+  for (int i = 0; i < vertex_matrix->rowsize; ++i) {
+    if (dd_get_d(vertex_matrix->matrix[i][0]) == 0) {
+      num_rays += 1;
+    } else {
+      num_vertices += 1;
+    }
+  }
+
+  Eigen::Matrix<double, number_of_dimensions, Eigen::Dynamic> vertices(
+      number_of_dimensions, num_vertices);
+
+  int vertex_index = 0;
+  for (int i = 0; i < vertex_matrix->rowsize; ++i) {
+    if (dd_get_d(vertex_matrix->matrix[i][0]) != 0) {
+      for (int j = 0; j < number_of_dimensions; ++j) {
+        vertices(j, vertex_index) = dd_get_d(vertex_matrix->matrix[i][j + 1]);
+      }
+      ++vertex_index;
+    }
+  }
+  dd_FreeMatrix(vertex_matrix);
+  dd_FreePolyhedra(polyhedra);
+  dd_FreeMatrix(matrix);
+
+  return vertices;
+}
+
+}  // namespace controls
+}  // namespace aos
+
+#endif  // _AOS_CONTROLS_POLYTOPE_H_
diff --git a/aos/crio/README.txt b/aos/crio/README.txt
index 182b323..9a98575 100644
--- a/aos/crio/README.txt
+++ b/aos/crio/README.txt
@@ -1,5 +1,9 @@
 see ../README.txt for stuff affecting crio and atom code
+There isn't much cRIO code left any more... The general policy is to not break
+things in aos/common/ that are #ifdeffed etc to with on the cRIO for no reason,
+but if there's a major rewrite on anything the vxworks-specific code should
+probably just be deleted. Also, any new stuff in aos/common/ may not work under
+vxworks at all.
 
 [NOTES]
 The assumption that sizeof(pointers) == sizeof(int) == sizeof(UINT32) == sizeof(uint32_t) == 4 is all over the crio code. The vxworks apis use UINT32 to pass user-defined arguments, and just passing pointers through those makes the code a lot simpler.
-
diff --git a/aos/crio/Talon.cpp b/aos/crio/Talon.cpp
deleted file mode 100644
index 54ef459..0000000
--- a/aos/crio/Talon.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "aos/crio/Talon.h"
-#include "WPILib/DigitalModule.h"
-
-Talon::Talon(UINT32 channel) : SafePWM(channel) {
-  // 255 = 2.5ms, 0 = 0.5ms (or something close to that)
-  // these numbers were determined empirically with real hardware by Brian
-  //   on 11/23/12
-  //   got 211->210 as first transition that made a speed difference and
-  //   53->54 on the other side
-  //   going 2 to each side to make sure we get the full range
-  SetBounds(213, 137, 132, 127, 50);
-  // 1X = every 5.05ms, 2X and 4x are multiples of that
-  SetPeriodMultiplier(kPeriodMultiplier_1X);
-  SetRaw(m_centerPwm);
-}
-
-void Talon::Set(float speed, UINT8 /*syncGroup*/) { SetSpeed(speed); }
-float Talon::Get() { return GetSpeed(); }
-void Talon::Disable() { SetRaw(kPwmDisabled); }
-
-void Talon::PIDWrite(float output) { Set(output); }
diff --git a/aos/crio/Talon.h b/aos/crio/Talon.h
deleted file mode 100644
index c116a4d..0000000
--- a/aos/crio/Talon.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef AOS_CRIO_TALON_H_
-#define AOS_CRIO_TALON_H_
-
-#include "WPILib/SafePWM.h"
-#include "WPILib/SpeedController.h"
-#include "WPILib/PIDOutput.h"
-
-// Used for controlling a Talon speed controller. Non-standard API and
-// namespace so that the likely WPILib version will be drop-in replaceable.
-class Talon : public SafePWM, public SpeedController, public PIDOutput {
- public:
-  explicit Talon(UINT32 channel);
-
-  virtual void Set(float value, UINT8 syncGroup=0);
-  virtual float Get();
-  virtual void Disable();
-
-  virtual void PIDWrite(float output);
-};
-
-#endif  // AOS_CRIO_TALON_H_
diff --git a/aos/crio/aos_ctdt.h b/aos/crio/aos_ctdt.h
deleted file mode 100644
index 9292823..0000000
--- a/aos/crio/aos_ctdt.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef AOS_CTDT_H_
-#define AOS_CTDT_H_
-
-// This function will call any function that starts with aos_init_function_*.
-// It will assume that these functions have the signature
-// 'extern "C" aos_init_function_whatever(void);'
-// The aos_ctdt.c/o files are generated at compile time (like ctdt.c/o).
-#ifdef __cplusplus
-extern "C" {
-#endif
-void aos_call_init_functions();
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/aos/crio/bin/netconsole.sh b/aos/crio/bin/netconsole.sh
deleted file mode 100755
index 0578162..0000000
--- a/aos/crio/bin/netconsole.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-# READLINE is nicer, but it dies when given lots of output
-socat UDP4-RECV:6666,reuseaddr!!UDP4-SENDTO:robot:6668 STDIO
diff --git a/aos/crio/controls/ControlsManager.cpp b/aos/crio/controls/ControlsManager.cpp
deleted file mode 100644
index a37ec6f..0000000
--- a/aos/crio/controls/ControlsManager.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "WPILib/Compressor.h"
-
-#include "aos/aos_core.h"
-#include "aos/crio/controls/ControlsManager.h"
-#include "aos/common/Configuration.h"
-#include "aos/crio/aos_ctdt.h"
-#include "aos/crio/motor_server/CRIOControlLoopRunner.h"
-#include "aos/crio/motor_server/MotorServer.h"
-
-namespace aos {
-namespace crio {
-
-// Everything gets an explicit Start call here before calling all of the init
-// functions because it means that all static variables will be initialized
-// before anything actually starts running. It also means that everything will
-// be initialized before any of the init functions start trying to register
-// themselves etc.
-void ControlsManager::StartCompetition() {
-  printf("aos::ControlsManager::RobotMain\n");
-  (new Compressor(14, 1))->Start();
-
-  logging::Start();
-  LOG(INFO, "logging started\n");
-
-  GetWatchdog().SetEnabled(false);
-  LOG(INFO, "disabled watchdog\n");
-
-  RegisterControlLoops();
-  LOG(INFO, "registered control loops\n");
-
-  // CRIOControlLoopRunner calls part of MotorServer, so MotorServer has to get
-  // initialized first.
-  MotorServer::Start();
-  LOG(INFO, "MotorServer started\n");
-  CRIOControlLoopRunner::Start();
-  LOG(INFO, "cRIO control loops started\n");
-
-  LOG(INFO, "calling init functions\n");
-  aos_call_init_functions();
-  LOG(INFO, "initialized\n");
-
-  // Wait forever so that this task doesn't end to avoid confusing any brittle
-  // FIRST code that might be hiding somewhere.
-  while (true) {
-    select(0, NULL, NULL, NULL, NULL);
-  }
-}
-
-}  // namespace crio
-} // namespace aos
diff --git a/aos/crio/controls/ControlsManager.h b/aos/crio/controls/ControlsManager.h
deleted file mode 100644
index 986fe02..0000000
--- a/aos/crio/controls/ControlsManager.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "WPILib/DriverStation.h"
-#include "WPILib/RobotBase.h"
-
-namespace aos {
-namespace crio {
-
-class ControlsManager : public RobotBase {
- public:
-  // Gets called when it is time to register all the control loops.
-  virtual void RegisterControlLoops() = 0;
-  virtual void StartCompetition();
-  static inline ControlsManager &GetInstance() {
-    return *static_cast<ControlsManager *>(&RobotBase::getInstance());
-  }
-  inline DriverStation *GetDS() {
-    return m_ds;
-  }
-};
-
-}  // namespace crio
-}  // namespace aos
diff --git a/aos/crio/controls/JoyStickRead.cpp b/aos/crio/controls/JoyStickRead.cpp
deleted file mode 100644
index 1f5e4c7..0000000
--- a/aos/crio/controls/JoyStickRead.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#include "WPILib/Task.h"
-#include "WPILib/Timer.h"
-
-#include "aos/aos_core.h"
-#include "aos/crio/controls/ControlsManager.h"
-#include "aos/common/network/SendSocket.h"
-#include "aos/common/messages/RobotState.q.h"
-
-namespace aos {
-namespace crio {
-
-class JoystickRead {
-  /*virtual void Disabled () {
-    int i = 0;
-    while (IsDisabled()) {
-    printf("Disabled! %d\n", i);
-    Wait(0.1);
-    i++;
-    }
-    printf("Done with disabled. %d\n", i);
-    }
-    virtual void Autonomous () {
-    int j = 0;
-    while (IsAutonomous()) {
-    printf("Autonomous!  %d\n", j);
-    Wait(0.1);
-  //if (j > 5) {
-  //i(0);
-  //}
-  j ++;
-  }
-  printf("Done with autonomous. %d\n", j);
-  }
-  virtual void OperatorControl () {
-  int i = 0;
-  while (IsOperatorControl()) {
-  printf("Operator Control!  %d\n", i);
-  Wait(0.1);
-  i ++;
-  }
-  printf("Done with operator control. %d\n", i);
-  }*/
- public:
-  DriverStation *ds;
-  JoystickRead() {}
-  void Run() {
-    SendSocket sock(NetworkPort::kDS,
-                    configuration::GetIPAddress(
-                        configuration::NetworkDevice::kAtom));
-    FRCCommonControlData data;
-
-    ds = ControlsManager::GetInstance().GetDS();
-
-    while (true) {
-      // I checked, and this is done intelligently in WPILib.
-      ds->WaitForData();
-
-      robot_state.MakeWithBuilder().enabled(ds->IsEnabled())
-          .autonomous(ds->IsAutonomous()).team_id(ds->GetTeamNumber()).Send();
-      LOG(DEBUG, "sending joystick data\n");
-      data.enabled = ds->IsEnabled();
-      data.autonomous = ds->IsAutonomous();
-      data.fmsAttached = ds->IsFMSAttached();
-      SetStick(data.stick0Axes, 1);
-      SetStick(data.stick1Axes, 2);
-      SetStick(data.stick2Axes, 3);
-      SetStick(data.stick3Axes, 4);
-      data.stick0Buttons = ds->GetStickButtons(1);
-      data.stick1Buttons = ds->GetStickButtons(2);
-      data.stick2Buttons = ds->GetStickButtons(3);
-      data.stick3Buttons = ds->GetStickButtons(4);
-      data.teamID = ds->GetTeamNumber();
-      sock.Send(&data, sizeof(data));
-    }
-  }
-  void SetStick(int8_t axes[6], uint32_t stick) {
-    for (int i = 0; i < 6; ++i) {
-      double val = ds->GetStickAxis(stick, i + 1);
-      if (val < 0) {
-        axes[i] = (val * 128.0) + 0.5;
-      } else {
-        axes[i] = (val * 127.0) + 0.5;
-      }
-    }
-  }
-};
-
-}  // namespace crio
-}  // namespace aos
-
-AOS_RUN_FORK(aos::crio::JoystickRead, "JSR", 100)
diff --git a/aos/crio/crio.gyp b/aos/crio/crio.gyp
index 2d37999..9b5d57e 100644
--- a/aos/crio/crio.gyp
+++ b/aos/crio/crio.gyp
@@ -1,18 +1,10 @@
 {
   'targets': [
     {
-      # This test runs on the atom to verify that the cRIO version of the queues
-      # works.
-      'target_name': 'unsafe_queue_test',
-      'type': '<(aos_target)',
+      'target_name': 'ip',
+      'type': 'static_library',
       'sources': [
-        'queue_test.cc',
-      ],
-      'dependencies': [
-        '<(EXTERNALS):gtest',
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(AOS)/common/common.gyp:common',
-        '<(AOS)/common/common.gyp:queue_test_queue',
+        'ip.cc',
       ],
     },
   ],
diff --git a/aos/crio/googletest/google_test_server.cc b/aos/crio/googletest/google_test_server.cc
deleted file mode 100644
index 46631b5..0000000
--- a/aos/crio/googletest/google_test_server.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <stdio.h>
-
-#include "gtest/gtest.h"
-
-extern "C" int run_gtest(char *arg1, char *arg2, char *arg3, char *arg4,
-                         char *arg5, char *arg6, char *arg7, char *arg8,
-                         char *arg9, char *arg10, char *arg11) {
-  static bool run = false;
-  if (!run) {
-    run = true;
-  } else {
-    printf("error: gtest only supports being run once\n");
-    return -1;
-  }
-
-  char *argv[1 + 11 + 1];
-  // In /tmp in case it wants to write anything relative to "itself".
-  argv[0] = const_cast<char *>("/tmp/aos-crio-googletest-runner");
-  argv[12] = NULL; // the argv passed to main is always NULL-terminated
-  argv[1] = arg1;
-  argv[2] = arg2;
-  argv[3] = arg3;
-  argv[4] = arg4;
-  argv[5] = arg5;
-  argv[6] = arg6;
-  argv[7] = arg7;
-  argv[8] = arg8;
-  argv[9] = arg9;
-  argv[10] = arg10;
-  argv[11] = arg11;
-  int argc = 0;
-  while (argc[argv] != NULL) ++argc;
-
-  testing::GTEST_FLAG(color) = "yes";
-  testing::InitGoogleTest(&argc, argv);
-
-  if (argc > 1) {
-    printf("warning: flags not recognized by gtest passed\n");
-    for (int i = 1; i < argc; ++i) {
-      printf("\t%s\n", argv[i]);
-    }
-  }
-
-  return RUN_ALL_TESTS();
-}
diff --git a/aos/crio/googletest/googletest.gyp b/aos/crio/googletest/googletest.gyp
deleted file mode 100644
index d887ecd..0000000
--- a/aos/crio/googletest/googletest.gyp
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'googletest',
-      'type': 'static_library',
-      'sources': [
-        'google_test_server.cc',
-      ],
-      'dependencies': [
-        '<(EXTERNALS):gtest',
-      ],
-    },
-  ],
-}
diff --git a/aos/crio/ip.cc b/aos/crio/ip.cc
new file mode 100644
index 0000000..9230365
--- /dev/null
+++ b/aos/crio/ip.cc
@@ -0,0 +1,32 @@
+#include "aos/crio/ip.h"
+
+#include <ifLib.h>
+#include <stdio.h>
+
+namespace aos {
+namespace util {
+
+// 4-slot cRIO: motfec0
+// 8-slot cRIO port 1: fec0
+// `ifShow` will show you all of the ones on a given cRIO
+const char *const kCrioNetInterfaces[] = {"fec0", "motfec0"};
+in_addr GetOwnIPAddress() {
+  char buffer[INET_ADDR_LEN];
+  in_addr r;
+  while (true) {
+    for (size_t i = 0;
+         i < sizeof(kCrioNetInterfaces) / sizeof(kCrioNetInterfaces[0]); ++i) {
+      if (ifAddrGet(const_cast<char *>(kCrioNetInterfaces[i]), buffer) == OK) {
+        if (inet_aton(buffer, &r) == OK) {
+          return r;
+        } else {
+          buffer[sizeof(buffer) - 1] = '\0';
+          printf("inet_aton('%s', %p) failed\n", buffer, &r);
+        }
+      }
+    }
+  }
+}
+
+}  // namespace util
+}  // namespace aos
diff --git a/aos/crio/ip.h b/aos/crio/ip.h
new file mode 100644
index 0000000..c1bc457
--- /dev/null
+++ b/aos/crio/ip.h
@@ -0,0 +1,18 @@
+#ifndef AOS_CRIO_IP_H_
+#define AOS_CRIO_IP_H_
+
+#include <inetLib.h>
+
+#include "aos/aos_stdint.h"
+
+namespace aos {
+namespace util {
+
+// Retrieves the IP address of this cRIO and stores it in *address.
+// Loops infinitely until it succeeds.
+in_addr GetOwnIPAddress();
+
+}  // namespace util
+}  // namespace aos
+
+#endif  // AOS_CRIO_IP_H_
diff --git a/aos/crio/libstdc++/move.h b/aos/crio/libstdc++/move.h
new file mode 100644
index 0000000..425fcb6
--- /dev/null
+++ b/aos/crio/libstdc++/move.h
@@ -0,0 +1,117 @@
+// Move, forward and identity for C++0x + swap -*- C++ -*-
+
+// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file move.h
+ *  This is an internal header file, included by other library headers.
+ *  You should not attempt to use it directly.
+ */
+
+#ifndef _MOVE_H
+#define _MOVE_H 1
+
+#include "aos/crio/type_traits/type_traits"
+
+namespace std {
+
+  /// identity
+  template<typename _Tp>
+    struct identity
+    {
+      typedef _Tp type;
+    };
+
+  /// forward (as per N2835)
+  /// Forward lvalues as rvalues.
+  template<typename _Tp>
+    inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
+    forward(typename std::identity<_Tp>::type& __t)
+    { return static_cast<_Tp&&>(__t); }
+
+  /// Forward rvalues as rvalues.
+  template<typename _Tp>
+    inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
+    forward(typename std::identity<_Tp>::type&& __t)
+    { return static_cast<_Tp&&>(__t); }
+
+  // Forward lvalues as lvalues.
+  template<typename _Tp>
+    inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type
+    forward(typename std::identity<_Tp>::type __t)
+    { return __t; }
+
+  // Prevent forwarding rvalues as const lvalues.
+  template<typename _Tp>
+    inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type
+    forward(typename std::remove_reference<_Tp>::type&& __t) = delete;
+
+  /**
+   *  @brief Move a value.
+   *  @ingroup mutating_algorithms
+   *  @param  __t  A thing of arbitrary type.
+   *  @return Same, moved.
+  */
+  template<typename _Tp>
+    inline typename std::remove_reference<_Tp>::type&&
+    move(_Tp&& __t)
+    { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
+
+  /// declval, from type_traits.
+
+#define _GLIBCXX_MOVE(_Tp) std::move(_Tp)
+#define _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val)
+
+#if 0
+  /**
+   *  @brief Swaps two values.
+   *  @ingroup mutating_algorithms
+   *  @param  __a  A thing of arbitrary type.
+   *  @param  __b  Another thing of arbitrary type.
+   *  @return   Nothing.
+  */
+  template<typename _Tp>
+    inline void
+    swap(_Tp& __a, _Tp& __b)
+    {
+      // concept requirements
+      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
+
+      _Tp __tmp = _GLIBCXX_MOVE(__a);
+      __a = _GLIBCXX_MOVE(__b);
+      __b = _GLIBCXX_MOVE(__tmp);
+    }
+
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // DR 809. std::swap should be overloaded for array types.
+  template<typename _Tp, size_t _Nm>
+    inline void
+    swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
+    {
+      for (size_t __n = 0; __n < _Nm; ++__n)
+	swap(__a[__n], __b[__n]);
+    }
+#endif
+
+}  // namespace std
+
+#endif /* _MOVE_H */
diff --git a/aos/crio/type_traits/tr1_impl/type_traits b/aos/crio/libstdc++/tr1_impl/type_traits
similarity index 100%
rename from aos/crio/type_traits/tr1_impl/type_traits
rename to aos/crio/libstdc++/tr1_impl/type_traits
diff --git a/aos/crio/type_traits/type_traits b/aos/crio/libstdc++/type_traits
similarity index 98%
rename from aos/crio/type_traits/type_traits
rename to aos/crio/libstdc++/type_traits
index afef722..186cab4 100644
--- a/aos/crio/type_traits/type_traits
+++ b/aos/crio/libstdc++/type_traits
@@ -42,13 +42,13 @@
 #include <cstddef>
 
 #if defined(_GLIBCXX_INCLUDE_AS_CXX0X)
-#  include "aos/crio/type_traits/tr1_impl/type_traits"
+#  include "aos/crio/libstdc++/tr1_impl/type_traits"
 #else
 #  define _GLIBCXX_INCLUDE_AS_CXX0X
 #  define _GLIBCXX_BEGIN_NAMESPACE_TR1
 #  define _GLIBCXX_END_NAMESPACE_TR1
 #  define _GLIBCXX_TR1
-#  include "aos/crio/type_traits/tr1_impl/type_traits"
+#  include "aos/crio/libstdc++/tr1_impl/type_traits"
 #  undef _GLIBCXX_TR1
 #  undef _GLIBCXX_END_NAMESPACE_TR1
 #  undef _GLIBCXX_BEGIN_NAMESPACE_TR1
diff --git a/aos/crio/libstdc++/unique_ptr.h b/aos/crio/libstdc++/unique_ptr.h
new file mode 100644
index 0000000..f6bda76d
--- /dev/null
+++ b/aos/crio/libstdc++/unique_ptr.h
@@ -0,0 +1,419 @@
+// unique_ptr implementation -*- C++ -*-
+
+// Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file unique_ptr.h
+ *  This is an internal header file, included by other library headers.
+ *  You should not attempt to use it directly.
+ */
+
+#ifndef _UNIQUE_PTR_H
+#define _UNIQUE_PTR_H 1
+
+#include "aos/crio/type_traits/type_traits"
+#include "aos/common/libstdc++/utility"
+#include <assert.h>
+
+namespace std {
+
+  /**
+   * @addtogroup pointer_abstractions
+   * @{
+   */
+
+  /// Primary template, default_delete.
+  template<typename _Tp> 
+    struct default_delete
+      {
+	default_delete() { }
+
+	template<typename _Up>
+	  default_delete(const default_delete<_Up>&) { }
+
+	void
+	operator()(_Tp* __ptr) const
+	{
+	  static_assert(sizeof(_Tp)>0,
+			"can't delete pointer to incomplete type");
+	  delete __ptr;
+	}
+    };
+
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // DR 740 - omit specialization for array objects with a compile time length
+  /// Specialization, default_delete.
+  template<typename _Tp> 
+    struct default_delete<_Tp[]>
+    {
+      void
+      operator()(_Tp* __ptr) const
+      {
+	static_assert(sizeof(_Tp)>0,
+		      "can't delete pointer to incomplete type");
+	delete [] __ptr;
+      }
+    };
+
+  /// 20.7.12.2 unique_ptr for single objects.
+  template <typename _Tp, typename _Tp_Deleter = default_delete<_Tp> > 
+    class unique_ptr
+    {
+      typedef _Tp* unique_ptr::*             __unspecified_pointer_type;
+
+    public:
+      typedef _Tp*               pointer;
+      typedef _Tp                element_type;      
+      typedef _Tp_Deleter        deleter_type;
+
+      // Constructors.
+      unique_ptr()
+      : _t(pointer()), _deleter(deleter_type())
+      { static_assert(!std::is_pointer<deleter_type>::value,
+		      "constructed with null function pointer deleter"); }
+
+      explicit
+      unique_ptr(pointer __p)
+      : _t(__p), _deleter(deleter_type())
+      { static_assert(!std::is_pointer<deleter_type>::value,
+		     "constructed with null function pointer deleter"); }
+
+      unique_ptr(pointer __p,
+          typename std::conditional<std::is_reference<deleter_type>::value, 
+            deleter_type, const deleter_type&>::type __d)
+      : _t(__p), _deleter(__d) { }
+
+      unique_ptr(pointer __p,
+          typename std::remove_reference<deleter_type>::type&& __d)
+      : _t(std::move(__p)), _deleter(std::move(__d))
+      { static_assert(!std::is_reference<deleter_type>::value, 
+		      "rvalue deleter bound to reference"); }
+
+      // Move constructors.
+      unique_ptr(unique_ptr&& __u) 
+      : _t(__u.release()), _deleter(std::forward<deleter_type>(__u.get_deleter())) { }
+
+      template<typename _Up, typename _Up_Deleter> 
+        unique_ptr(unique_ptr<_Up, _Up_Deleter>&& __u) 
+        : _t(__u.release()), _deleter(std::forward<deleter_type>(__u.get_deleter()))
+	{ }
+
+      // Destructor.
+      ~unique_ptr() { reset(); }
+    
+      // Assignment.
+      unique_ptr&
+      operator=(unique_ptr&& __u)
+      { 
+        reset(__u.release()); 
+        get_deleter() = std::move(__u.get_deleter()); 
+        return *this;
+      }
+
+      template<typename _Up, typename _Up_Deleter> 
+        unique_ptr&
+        operator=(unique_ptr<_Up, _Up_Deleter>&& __u)
+	{
+          reset(__u.release()); 
+          get_deleter() = std::move(__u.get_deleter()); 
+          return *this;
+        }
+
+      unique_ptr&
+      operator=(__unspecified_pointer_type) 
+      {
+	reset();
+	return *this;
+      }
+
+      // Observers.
+      typename std::add_lvalue_reference<element_type>::type
+      operator*() const
+      {
+	assert(get() != pointer());
+	return *get();
+      }
+
+      pointer
+      operator->() const
+      {
+	assert(get() != pointer());
+	return get();
+      }
+
+      pointer
+      get() const
+      { return _t; }
+
+      deleter_type&
+      get_deleter()
+      { return _deleter; }
+
+      const deleter_type&
+      get_deleter() const
+      { return _deleter; }
+
+      explicit operator bool() const
+      { return get() == pointer() ? false : true; }
+
+      // Modifiers.
+      pointer
+      release() 
+      {
+	pointer __p = get();
+	_t = pointer();
+	return __p;
+      }
+
+      void
+      reset(pointer __p = pointer())
+      {
+	using std::swap;
+	swap(_t, __p);
+	if (__p != pointer())
+	  get_deleter()(__p);
+      }
+
+      void
+      swap(unique_ptr& __u)
+      {
+	using std::swap;
+	swap(_t, __u._t);
+	swap(_deleter, __u._deleter);
+      }
+
+      // Disable copy from lvalue.
+      unique_ptr(const unique_ptr&) = delete;
+      unique_ptr& operator=(const unique_ptr&) = delete;
+
+    private:
+			_Tp *_t;
+			_Tp_Deleter _deleter;
+  };
+ 
+  /// 20.7.12.3 unique_ptr for array objects with a runtime length
+  // [unique.ptr.runtime]
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // DR 740 - omit specialization for array objects with a compile time length
+  template<typename _Tp, typename _Tp_Deleter> 
+    class unique_ptr<_Tp[], _Tp_Deleter>
+    {
+      typedef _Tp* unique_ptr::*             __unspecified_pointer_type;
+
+    public:
+      typedef _Tp*               pointer;
+      typedef _Tp                element_type;      
+      typedef _Tp_Deleter        deleter_type;
+
+      // Constructors.
+      unique_ptr()
+      : _t(pointer()), _deleter(deleter_type())
+      { static_assert(!std::is_pointer<deleter_type>::value,
+		      "constructed with null function pointer deleter"); }
+
+      explicit
+      unique_ptr(pointer __p)
+      : _t(__p), _deleter(deleter_type())
+      { static_assert(!std::is_pointer<deleter_type>::value,
+		      "constructed with null function pointer deleter"); }
+
+      unique_ptr(pointer __p,
+          typename std::conditional<std::is_reference<deleter_type>::value, 
+              deleter_type, const deleter_type&>::type __d) 
+      : _t(__p), _deleter(__d) { }
+
+      unique_ptr(pointer __p,
+		 typename std::remove_reference<deleter_type>::type && __d)
+      : _t(std::move(__p)), _deleter(std::move(__d))
+      { static_assert(!std::is_reference<deleter_type>::value, 
+		      "rvalue deleter bound to reference"); }
+
+      // Move constructors.
+      unique_ptr(unique_ptr&& __u) 
+      : _t(__u.release()), _deleter(std::forward<deleter_type>(__u.get_deleter())) { }
+
+      template<typename _Up, typename _Up_Deleter> 
+        unique_ptr(unique_ptr<_Up, _Up_Deleter>&& __u) 
+	: _t(__u.release()), _deleter(std::forward<deleter_type>(__u.get_deleter()))
+	{ }
+
+      // Destructor.
+      ~unique_ptr() { reset(); }
+
+      // Assignment.
+      unique_ptr&
+      operator=(unique_ptr&& __u)
+      {
+	reset(__u.release());
+	get_deleter() = std::move(__u.get_deleter()); 
+	return *this; 
+      }
+
+      template<typename _Up, typename _Up_Deleter> 
+        unique_ptr&
+        operator=(unique_ptr<_Up, _Up_Deleter>&& __u)
+	{
+          reset(__u.release());
+          get_deleter() = std::move(__u.get_deleter()); 
+          return *this;
+        }
+
+      unique_ptr&
+      operator=(__unspecified_pointer_type)
+      {
+	reset();
+	return *this;
+      }
+
+      // Observers.
+      typename std::add_lvalue_reference<element_type>::type 
+      operator[](size_t __i) const 
+      {
+	assert(get() != pointer());
+	return get()[__i];
+      }
+
+      pointer
+      get() const
+      { return _t; }
+
+      deleter_type& 
+      get_deleter()
+      { return _deleter; }
+
+      const deleter_type&
+      get_deleter() const
+      { return _deleter; }    
+
+      explicit operator bool() const 
+      { return get() == pointer() ? false : true; }
+    
+      // Modifiers.
+      pointer
+      release() 
+      {
+	pointer __p = get();
+	_t = pointer();
+	return __p;
+      }
+
+      void
+      reset(pointer __p = pointer()) 
+      {
+	using std::swap;
+	swap(_t, __p);
+	if (__p != pointer())
+	  get_deleter()(__p);
+      }
+
+      // DR 821.
+      template<typename _Up>
+        void reset(_Up) = delete;
+
+      void
+      swap(unique_ptr& __u)
+      {
+	swap(_t, __u._t);
+	swap(_deleter, __u._deleter);
+      }
+
+      // Disable copy from lvalue.
+      unique_ptr(const unique_ptr&) = delete;
+      unique_ptr& operator=(const unique_ptr&) = delete;
+
+      // Disable construction from convertible pointer types.
+      // (N2315 - 20.6.5.3.1)
+      template<typename _Up>
+        unique_ptr(_Up*, typename
+		   std::conditional<std::is_reference<deleter_type>::value,
+		   deleter_type, const deleter_type&>::type,
+		   typename std::enable_if<std::is_convertible<_Up*, 
+		   pointer>::value>::type* = 0) = delete;
+
+      template<typename _Up>
+        unique_ptr(_Up*, typename std::remove_reference<deleter_type>::type&&,
+		   typename std::enable_if<std::is_convertible<_Up*, 
+		   pointer>::value>::type* = 0) = delete;
+
+      template<typename _Up>
+        explicit
+        unique_ptr(_Up*, typename std::enable_if<std::is_convertible<_Up*, 
+		   pointer>::value>::type* = 0) = delete;
+
+    private:
+			_Tp *_t;
+			_Tp_Deleter _deleter;
+  };
+  
+  template<typename _Tp, typename _Tp_Deleter> 
+    inline void
+    swap(unique_ptr<_Tp, _Tp_Deleter>& __x,
+	 unique_ptr<_Tp, _Tp_Deleter>& __y)
+    { __x.swap(__y); }
+
+  template<typename _Tp, typename _Tp_Deleter,
+	   typename _Up, typename _Up_Deleter>
+    inline bool
+    operator==(const unique_ptr<_Tp, _Tp_Deleter>& __x,
+	       const unique_ptr<_Up, _Up_Deleter>& __y)
+    { return __x.get() == __y.get(); }
+
+  template<typename _Tp, typename _Tp_Deleter,
+	   typename _Up, typename _Up_Deleter>
+    inline bool
+    operator!=(const unique_ptr<_Tp, _Tp_Deleter>& __x,
+	       const unique_ptr<_Up, _Up_Deleter>& __y)
+    { return !(__x.get() == __y.get()); }
+
+  template<typename _Tp, typename _Tp_Deleter,
+	   typename _Up, typename _Up_Deleter>
+    inline bool
+    operator<(const unique_ptr<_Tp, _Tp_Deleter>& __x,
+	      const unique_ptr<_Up, _Up_Deleter>& __y)
+    { return __x.get() < __y.get(); }
+
+  template<typename _Tp, typename _Tp_Deleter,
+	   typename _Up, typename _Up_Deleter>
+    inline bool
+    operator<=(const unique_ptr<_Tp, _Tp_Deleter>& __x,
+	       const unique_ptr<_Up, _Up_Deleter>& __y)
+    { return !(__y.get() < __x.get()); }
+
+  template<typename _Tp, typename _Tp_Deleter,
+	   typename _Up, typename _Up_Deleter>
+    inline bool
+    operator>(const unique_ptr<_Tp, _Tp_Deleter>& __x,
+	      const unique_ptr<_Up, _Up_Deleter>& __y)
+    { return __y.get() < __x.get(); }
+
+  template<typename _Tp, typename _Tp_Deleter,
+	   typename _Up, typename _Up_Deleter>
+    inline bool
+    operator>=(const unique_ptr<_Tp, _Tp_Deleter>& __x,
+	       const unique_ptr<_Up, _Up_Deleter>& __y)
+    { return !(__x.get() < __y.get()); }
+
+  // @} group pointer_abstractions
+
+}  // namespace std
+
+#endif /* _UNIQUE_PTR_H */
diff --git a/aos/crio/logging/crio_logging.cpp b/aos/crio/logging/crio_logging.cpp
deleted file mode 100644
index 8ebafc0..0000000
--- a/aos/crio/logging/crio_logging.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-#include <string.h>
-
-#include "WPILib/Timer.h"
-#include "WPILib/Task.h"
-
-#include "aos/aos_core.h"
-#include "aos/common/network/SendSocket.h"
-#include "aos/common/Configuration.h"
-#include "aos/common/die.h"
-
-#undef ERROR
-#define DECL_LEVEL(name, value) const log_level name = value;
-DECL_LEVELS
-#undef DECL_LEVEL
-
-//#define fprintf(...)
-
-namespace aos {
-namespace logging {
-namespace {
-
-MSG_Q_ID queue;
-uint8_t sequence = 0;
-
-// This gets run in a low-priority task to take the logs from the queue and send
-// them to the atom over a TCP socket.
-void DoTask() {
-  SendSocket sock;
-  log_crio_message msg;
-  while (true) {
-    const int ret = msgQReceive(queue, reinterpret_cast<char *>(&msg),
-                                sizeof(msg), WAIT_FOREVER);
-    if (ret == ERROR) {
-        fprintf(stderr, "logging: warning: receiving a message failed"
-                " with %d (%s)", errno, strerror(errno));
-        continue;
-    }
-    if (ret != sizeof(msg)) {
-      fprintf(stderr, "logging: warning: received a message of size %d "
-              "instead of %zd\n", ret, sizeof(msg));
-      continue;
-    }
-
-    if (sock.LastStatus() != 0) {
-      if (sock.Connect(NetworkPort::kLogs,
-                       configuration::GetIPAddress(
-                           configuration::NetworkDevice::kAtom),
-                       SOCK_STREAM) != 0) {
-        fprintf(stderr, "logging: warning: connecting failed"
-                " because of %d: %s\n", errno, strerror(errno));
-      }
-    }
-    sock.Send(&msg, sizeof(msg));
-    if (sock.LastStatus() != 0) {
-      fprintf(stderr, "logging: warning: sending '%s' failed"
-              " because of %d: %s\n", msg.message, errno, strerror(errno));
-    }
-  }
-}
-
-}  // namespace
-
-void Start() {
-  queue = msgQCreate(100,  // max messages
-                     sizeof(log_crio_message),
-                     MSG_Q_PRIORITY);
-  Task *task = new Task("LogSender",
-                        (FUNCPTR)(DoTask),
-                        150);  // priority
-  task->Start();
-}
-
-int Do(log_level level, const char *format, ...) {
-  log_crio_message msg;
-  msg.time = Timer::GetFPGATimestamp();
-  msg.level = level;
-  msg.sequence = __sync_fetch_and_add(&sequence, 1);
-
-  const char *continued = "...";
-  const size_t size = sizeof(msg.message) - strlen(continued);
-  va_list ap;
-  va_start(ap, format);
-  const int ret = vsnprintf(msg.message, size, format, ap);
-  va_end(ap);
-
-  if (ret < 0) {
-    fprintf(stderr, "logging: error: vsnprintf failed with %d (%s)\n",
-            errno, strerror(errno));
-    return -1;
-  } else if (static_cast<uintmax_t>(ret) >= static_cast<uintmax_t>(size)) {
-    // overwrite the NULL at the end of the existing one and
-    // copy in the one on the end of continued
-    memcpy(&msg.message[size - 1], continued, strlen(continued) + 1);
-  }
-  if (msgQSend(queue, reinterpret_cast<char *>(&msg), sizeof(msg),
-               NO_WAIT, MSG_PRI_NORMAL) == ERROR) {
-    fprintf(stderr, "logging: warning: sending message '%s'"
-            " failed with %d (%s)", msg.message, errno, strerror(errno));
-    return -1;
-  }
-
-  if (level == FATAL) {
-    aos::Die("%s", msg.message);
-  }
-
-  return 0;
-}
-
-}  // namespace logging
-}  // namespace aos
diff --git a/aos/crio/logging/crio_logging.h b/aos/crio/logging/crio_logging.h
deleted file mode 100644
index c3dbf2a..0000000
--- a/aos/crio/logging/crio_logging.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef AOS_CRIO_CRIO_LOGGING_LOGGING_H_
-#define AOS_CRIO_CRIO_LOGGING_LOGGING_H_
-
-#ifndef AOS_COMMON_LOGGING_LOGGING_H_
-#error This file may only be #included through common/logging/logging.h!!!
-#endif
-
-#undef extern
-#undef const
-#undef ERROR
-
-#include <msgQLib.h>
-#include <stdint.h>
-
-//#define LOG(level, fmt, args...) printf(STRINGIFY(level) ": " fmt, ##args)
-#define LOG(level, fmt, args...) \
-    ::aos::logging::Do(level, \
-                       LOG_SOURCENAME ": " STRINGIFY(__LINE__) ": " fmt, \
-                       ##args)
-//#define LOG(...)
-
-namespace aos {
-namespace logging {
-
-// Initialize internal variables and start up the task that sends the logs to
-// the atom. Must be called before Do.
-void Start();
-// The function that the LOG macro actually calls. Queues up a message for the
-// task to send. Start must be called before this function is.
-int Do(log_level level, const char *format, ...)
-    __attribute__((format(printf, 2, 3)));
-
-}  // namespace logging
-}  // namespace aos
-
-#endif  // AOS_CRIO_CRIO_LOGGING_LOGGING_H_
diff --git a/aos/crio/messages/DriverStationDisplay.h b/aos/crio/messages/DriverStationDisplay.h
deleted file mode 100644
index 59d97b5..0000000
--- a/aos/crio/messages/DriverStationDisplay.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef AOS_CRIO_DRIVER_STATION_DISPLAY_H_
-#define AOS_CRIO_DRIVER_STATION_DISPLAY_H_
-
-#include <stdarg.h>
-
-#include "WPILib/DriverStationLCD.h"
-
-namespace aos {
-
-class DriverStationDisplay {
- public:
-  static void Send(int line, const char *fmt, ...)
-      __attribute__((format(printf, 2, 3))) {
-        DriverStationLCD::Line ds_line;
-        switch (line) {
-          case 0:
-            ds_line = DriverStationLCD::kMain_Line6;
-            break;
-          case 1:
-            ds_line = DriverStationLCD::kUser_Line1;
-            break;
-          case 2:
-            ds_line = DriverStationLCD::kUser_Line2;
-            break;
-          case 3:
-            ds_line = DriverStationLCD::kUser_Line3;
-            break;
-          case 4:
-            ds_line = DriverStationLCD::kUser_Line4;
-            break;
-          case 5:
-            ds_line = DriverStationLCD::kUser_Line5;
-            break;
-          case 6:
-            ds_line = DriverStationLCD::kUser_Line6;
-            break;
-          default:
-            printf("illegal line number %hhd\n", line);
-            return;
-        }
-        va_list args;
-        va_start(args, fmt);
-        DriverStationLCD::GetInstance()->VPrintfLine(ds_line, fmt, args);
-        va_end(args);
-        DriverStationLCD::GetInstance()->UpdateLCD();
-      }
-};
-
-} // namespace aos
-
-#endif
diff --git a/aos/crio/motor_server/CRIOControlLoopRunner.cpp b/aos/crio/motor_server/CRIOControlLoopRunner.cpp
deleted file mode 100644
index 1971dc1..0000000
--- a/aos/crio/motor_server/CRIOControlLoopRunner.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "CRIOControlLoopRunner.h"
-
-#include "aos/aos_core.h"
-#include "aos/crio/shared_libs/interrupt_bridge.h"
-#include "aos/crio/motor_server/MotorOutput.h"
-#include "aos/crio/motor_server/MotorServer.h"
-
-using ::aos::control_loops::SerializableControlLoop;
-
-namespace aos {
-namespace crio {
-
-bool CRIOControlLoopRunner::started_ = false;
-std::vector<SerializableControlLoop *> CRIOControlLoopRunner::loops_;
-Mutex CRIOControlLoopRunner::loops_lock;
-
-void CRIOControlLoopRunner::Start() {
-  if (started_) {
-    LOG(WARNING, "not going to Start twice!!\n");
-    return;
-  }
-  started_ = true;
-
-  // TODO(aschuh): Hold on to a handle to this...
-  (new WDInterruptNotifier<void>(Notify))->StartPeriodic(0.01);
-}
-
-void CRIOControlLoopRunner::AddControlLoop(SerializableControlLoop *loop) {
-  MutexLocker control_loop_goals_locker(&loops_lock);
-  loops_.push_back(loop);
-  MotorServer::RegisterControlLoopGoal(loop);
-}
-
-void CRIOControlLoopRunner::Notify(void *) {
-  // TODO(aschuh): Too many singletons/static classes!
-  SensorOutputs::UpdateAll();
-  // sensors get read first so it doesn't really matter if this takes a little bit
-  {
-    MutexLocker control_loop_goals_locker(
-        &MotorServer::control_loop_goals_lock);
-    for (auto it = loops_.begin(); it != loops_.end(); ++it) {
-      (*it)->Iterate();
-    }
-  }
-  MotorOutput::RunIterationAll();
-  MotorServer::WriteOutputs();
-}
-
-}  // namespace crio
-}  // namespace aos
diff --git a/aos/crio/motor_server/CRIOControlLoopRunner.h b/aos/crio/motor_server/CRIOControlLoopRunner.h
deleted file mode 100644
index efed120..0000000
--- a/aos/crio/motor_server/CRIOControlLoopRunner.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef AOS_CRIO_MOTOR_SERVER_CRIO_CONTROL_LOOP_RUNNER_H_
-#define AOS_CRIO_MOTOR_SERVER_CRIO_CONTROL_LOOP_RUNNER_H_
-
-#include <vector>
-#include <semLib.h>
-
-#include "aos/common/control_loop/ControlLoop.h"
-#include "aos/common/mutex.h"
-
-namespace aos {
-namespace crio {
-
-// Runs crio-side control loops. Completely static because there is no reason
-// for multiple ones and it gets rid of the problem of passing an instance
-// around.
-class CRIOControlLoopRunner {
- public:
-  // Spawns a new Task that loops forever.
-  // No other functions should be called before this one returns.
-  static void Start();
-
-  // Adds a control loop to run.
-  // This class takes control of the instance.
-  static void AddControlLoop(control_loops::SerializableControlLoop *loop);
-
- private:
-  static bool started_;
-
-  static std::vector<control_loops::SerializableControlLoop *> loops_;
-  static Mutex loops_lock;
-
-  // Gets called by a WDInterruptNotifier on 0.01 second intervals.
-  static void Notify(void *);
-};
-
-
-}  // namespace crio
-}  // namespace aos
-
-#endif
diff --git a/aos/crio/motor_server/ControlLoopGoals.h b/aos/crio/motor_server/ControlLoopGoals.h
deleted file mode 100644
index f22c0a2..0000000
--- a/aos/crio/motor_server/ControlLoopGoals.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef AOS_CRIO_MOTOR_SERVER_CONTROL_LOOP_GOAL_H_
-#define AOS_CRIO_MOTOR_SERVER_CONTROL_LOOP_GOAL_H_
-
-#include <vector>
-#include <semLib.h>
-
-namespace aos {
-
-// This class is used to keep track of all the control loop goals. It exists
-// because of several bugs discovered in the std::map implementation.
-class ControlLoopGoals {
- public:
-  struct Goal {
-    const char *const name;
-    const size_t length;
-    void (*const zero)();
-    void (*const ntoh)(const char *);
-    Goal(const char *name, size_t length, void (*zero)(), void (*ntoh)(const char *)) :
-        name(name), length(length), zero(zero), ntoh(ntoh) {}
-  };
-
- private:
-  std::vector<Goal *> goals_;
-
- public:
-  ControlLoopGoals() {}
-  void Add(const char *name, size_t length, void (*zero)(), void (*ntoh)(const char *)) {
-    char *storage = new char[10];
-    memcpy(storage, name, sizeof(storage));
-    goals_.push_back(new Goal(storage, length, zero, ntoh));
-  }
-  const Goal *Get(const char *name) {
-    for (auto it = goals_.begin(); it != goals_.end(); ++it) {
-      if (memcmp((*it)->name, name, sizeof((*it)->name)) == 0) {
-        return *it;
-      }
-    }
-    return NULL;
-  }
-};
-
-} // namespace aos
-
-#endif
diff --git a/aos/crio/motor_server/MotorControllerOutput.cpp b/aos/crio/motor_server/MotorControllerOutput.cpp
deleted file mode 100644
index a0897b4..0000000
--- a/aos/crio/motor_server/MotorControllerOutput.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#include "aos/crio/motor_server/MotorControllerOutput.h"
-
-#include "aos/aos_core.h"
-#include "aos/common/byteorder.h"
-#include "aos/common/commonmath.h"
-
-namespace aos {
-
-void LinearizedVictor::Set(float speed, UINT8 syncGroup) {
-  speed_ = speed;
-  Victor::Set(Linearize(speed), syncGroup);
-}
-
-float LinearizedVictor::Get() {
-  return speed_;
-}
-
-void LinearizedVictor::Disable() {
-  Victor::Disable();
-  speed_ = 0.0;
-}
-
-double LinearizedVictor::Linearize(double goal_speed) {
-  // These values were derived by putting the robot up on blocks, and driving it
-  // at various speeds.  The power required to drive at these speeds was then
-  // recorded and fit with gnuplot.
-  const double deadband_value = 0.082;
-  // If we are outside the range such that the motor is actually moving,
-  // subtract off the constant offset from the deadband.  This makes the
-  // function odd and intersect the origin, making the fitting easier to do.
-  if (goal_speed > deadband_value) {
-    goal_speed -= deadband_value;
-  } else if (goal_speed < -deadband_value) {
-    goal_speed += deadband_value;
-  } else {
-    goal_speed = 0.0;
-  }
-  goal_speed = goal_speed / (1.0 - deadband_value);
-
-  double goal_speed2 = goal_speed * goal_speed;
-  double goal_speed3 = goal_speed2 * goal_speed;
-  double goal_speed4 = goal_speed3 * goal_speed;
-  double goal_speed5 = goal_speed4 * goal_speed;
-  double goal_speed6 = goal_speed5 * goal_speed;
-  double goal_speed7 = goal_speed6 * goal_speed;
-
-  // Constants for the 5th order polynomial
-  double victor_fit_e1  = 0.437239;
-  double victor_fit_c1  = -1.56847;
-  double victor_fit_a1  = (- (125.0 * victor_fit_e1  + 125.0
-                              * victor_fit_c1 - 116.0) / 125.0);
-  double answer_5th_order = (victor_fit_a1 * goal_speed5
-                             + victor_fit_c1 * goal_speed3
-                             + victor_fit_e1 * goal_speed);
-
-  // Constants for the 7th order polynomial
-  double victor_fit_c2 = -5.46889;
-  double victor_fit_e2 = 2.24214;
-  double victor_fit_g2 = -0.042375;
-  double victor_fit_a2 = (- (125.0 * (victor_fit_c2 + victor_fit_e2
-                                      + victor_fit_g2) - 116.0) / 125.0);
-  double answer_7th_order = (victor_fit_a2 * goal_speed7
-                             + victor_fit_c2 * goal_speed5
-                             + victor_fit_e2 * goal_speed3
-                             + victor_fit_g2 * goal_speed);
-
-
-  // Average the 5th and 7th order polynomials, and add a bit of linear power in
-  // as well.  The average turns out to nicely fit the data in gnuplot with nice
-  // smooth curves, and the linear power gives it a bit more punch at low speeds
-  // again.  Stupid victors.
-  double answer =  0.85 * 0.5 * (answer_7th_order + answer_5th_order)
-      + .15 * goal_speed * (1.0 - deadband_value);
-
-  // Add the deadband power back in to make it so that the motor starts moving
-  // when any power is applied.  This is what the fitting assumes.
-  if (answer > 0.001) {
-    answer += deadband_value;
-  } else if (answer < -0.001) {
-    answer -= deadband_value;
-  }
-
-  return Clip(answer, -1.0, 1.0);
-}
-
-bool MotorControllerOutput::ReadValue(ByteBuffer &buff) {
-  const float val = buff.read_float();
-  if (val == (1.0 / 0.0)) {
-    return false;
-  }
-  value = val;
-  return true;
-}
-void MotorControllerOutput::SetValue() {
-  output.Set(value);
-}
-void MotorControllerOutput::NoValue() {
-  // this is NOT a Set(0.0); it's the same as when the robot is disabled
-  output.Disable();
-}
-
-} // namespace aos
-
diff --git a/aos/crio/motor_server/MotorControllerOutput.h b/aos/crio/motor_server/MotorControllerOutput.h
deleted file mode 100644
index 41c3546..0000000
--- a/aos/crio/motor_server/MotorControllerOutput.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef AOS_CRIO_MOTOR_SERVER_MOTOR_CONTROLLER_OUTPUT_H_
-#define AOS_CRIO_MOTOR_SERVER_MOTOR_CONTROLLER_OUTPUT_H_
-
-#include "aos/crio/motor_server/OutputDevice.h"
-
-#include "aos/crio/Talon.h"
-
-#include "WPILib/SpeedController.h"
-#include "WPILib/Jaguar.h"
-#include "WPILib/CANJaguar.h"
-#include "WPILib/Victor.h"
-
-namespace aos {
-
-// LinearizedVictor is a Victor that transforms the set values to linearize the
-// hardware's response curve.
-class LinearizedVictor : public Victor {
- public:
-  explicit LinearizedVictor(uint32_t channel) : Victor(channel), speed_(0) {}
-  virtual void Set(float speed, UINT8 syncGroup=0);
-  virtual float Get();
-  virtual void Disable();
-
-  // Returns the linearized motor power to apply to get the motor to go at the
-  // provided goal_speed.
-  static double Linearize(double goal_speed);
-
- private:
-  // The speed last sent to the Victor.
-  float speed_;
-};
-
-class MotorControllerOutput : public OutputDevice {
- private:
-  SpeedController &output;
- protected:
-  double value;
-  MotorControllerOutput(SpeedController *output) : OutputDevice(), output(*output) {
-    value = 0.0;
-  }
-  // TODO(brians) add virtual destructor?
-
-  virtual bool ReadValue(ByteBuffer &buff);
-  virtual void SetValue();
-  virtual void NoValue();
-};
-
-class JaguarOutput : public MotorControllerOutput {
- public:
-  JaguarOutput(uint32_t port) : MotorControllerOutput(new Jaguar(port)) {}
-};
-class CANJaguarOutput : public MotorControllerOutput {
- public:
-  CANJaguarOutput(uint32_t port) : MotorControllerOutput(new CANJaguar(port)) {}
-};
-class VictorOutput : public MotorControllerOutput {
- public:
-  VictorOutput(uint32_t port) 
-      : MotorControllerOutput(new LinearizedVictor(port)) {}
-};
-class TalonOutput : public MotorControllerOutput {
- public:
-  TalonOutput(uint32_t port) : MotorControllerOutput(new Talon(port)) {}
-};
-
-}  // namespace aos
-
-#endif
diff --git a/aos/crio/motor_server/MotorOutput.cpp b/aos/crio/motor_server/MotorOutput.cpp
deleted file mode 100644
index f2e9925..0000000
--- a/aos/crio/motor_server/MotorOutput.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "MotorOutput.h"
-
-namespace aos {
-
-SEM_ID MotorOutput::lock = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
-std::vector<MotorOutput *> MotorOutput::instances;
-
-void MotorOutput::Run() {
-  semTake(lock, WAIT_FOREVER);
-  instances.push_back(this);
-  semGive(lock);
-}
-void MotorOutput::RunIterationAll() {
-  semTake(lock, WAIT_FOREVER);
-  for (auto it = instances.begin(); it != instances.end(); ++it) {
-    (*it)->RunIteration();
-  }
-  semGive(lock);
-}
-
-} // namespace aos
-
diff --git a/aos/crio/motor_server/MotorOutput.h b/aos/crio/motor_server/MotorOutput.h
deleted file mode 100644
index af7c803..0000000
--- a/aos/crio/motor_server/MotorOutput.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef AOS_CRIO_MOTOR_SERVER_MOTOR_OUTPUT_H_
-#define AOS_CRIO_MOTOR_SERVER_MOTOR_OUTPUT_H_
-
-#include <vector>
-#include <semLib.h>
-
-namespace aos {
-
-// The place where the outputs from crio control loops get written out to the
-// motors.
-class MotorOutput {
- public:
-  // Call RunIteration on all instances that have been Run.
-  static void RunIterationAll();
-  void Run();
- protected:
-  // Write the outputs from crio control loops to wherever they go.
-  virtual void RunIteration() = 0;
- private:
-  static std::vector<MotorOutput *> instances;
-  static SEM_ID lock;
-};
-
-} // namespace aos
-
-#endif
-
diff --git a/aos/crio/motor_server/MotorServer.cpp b/aos/crio/motor_server/MotorServer.cpp
deleted file mode 100644
index 77a0579..0000000
--- a/aos/crio/motor_server/MotorServer.cpp
+++ /dev/null
@@ -1,227 +0,0 @@
-#include "aos/crio/motor_server/MotorServer.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "usrLib.h"
-#include "aos/common/inttypes.h"
-
-#include "WPILib/Timer.h"
-#include "WPILib/Task.h"
-
-#include "aos/aos_core.h"
-#include "aos/crio/motor_server/MotorControllerOutput.h"
-#include "aos/crio/motor_server/SolenoidOutput.h"
-#include "aos/common/Configuration.h"
-
-namespace aos {
-namespace crio {
-
-ByteBuffer MotorServer::buff(4096);
-DriverStationLCD *MotorServer::ds_lcd(NULL);
-int MotorServer::count(0);
-ReceiveSocket *MotorServer::sock(NULL);
-SEM_ID MotorServer::motorSync = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
-OutputDevice *MotorServer::output_devices[256][kMaxOutputDeviceNumber];
-Mutex MotorServer::control_loop_goals_lock;
-::std::map<uint32_t,
-           control_loops::SerializableControlLoop *> MotorServer::loops;
-Task *MotorServer::tcpTask;
-void MotorServer::Start() {
-  sock = new ReceiveSocket(NetworkPort::kMotors);
-
-  memset(output_devices, 0x00, sizeof(output_devices));
-
-  tcpTask = new Task("MRLoop",
-                     reinterpret_cast<FUNCPTR>(RunReaderTask),
-                     WORK_PRIORITY);
-
-  tcpTask->Start();
-}
-
-void MotorServer::ProcessBuf() {
-  semTake(motorSync, WAIT_FOREVER);
-  bool cont = true;
-  while (true) {
-    if (!cont) {
-      LOG(WARNING, "Malformed Packet\n");
-      goto end;
-    }
-    switch (const int value = buff.read_char()) {
-      case 'g':
-        cont = ProcessControlLoopGoal();
-        break;
-      case 'd':
-        cont = ProcessDSLine();
-        break;
-      case -1:
-        goto end;
-      default:
-        cont = ProcessOutputDevice(value);
-        break;
-    }
-  }
-end:
-  ++count;
-  semGive(motorSync);
-}
-bool MotorServer::ProcessOutputDevice(const int type) {
-  const int id = buff.read_char(); // 1-indexed
-  if (id < 1 || id > static_cast<ssize_t>(kMaxOutputDeviceNumber)) {
-    if (id != -1) {
-      LOG(ERROR, "illegal OutputDevice id %d\n", id);
-    }
-    return false;
-  }
-
-  if (output_devices[type][id - 1] == NULL) {
-    switch (type) {
-      case 'v':
-        output_devices[type][id - 1] = new VictorOutput(id);
-        break;
-      case 'j':
-        output_devices[type][id - 1] = new JaguarOutput(id);
-        break;
-      case 'c':
-        output_devices[type][id - 1] = new CANJaguarOutput(id);
-        break;
-      case 't':
-        output_devices[type][id - 1] = new TalonOutput(id);
-        break;
-      case 's':
-        output_devices[type][id - 1] = new SolenoidOutput(id);
-        break;
-      default:
-        LOG(ERROR, "unrecognized OutputDevice type %d\n", type);
-        return false;
-    }
-  }
-  return output_devices[type][id - 1]->ReadValue(buff);
-}
-
-bool MotorServer::ProcessDSLine() {
-  int line = buff.read_char();
-  if (line == -1) {
-    return false;
-  }
-  // TODO(brians): Subfunction
-  DriverStationLCD::Line ds_line;
-  switch (line) {
-    case 0:
-      ds_line = DriverStationLCD::kMain_Line6;
-      break;
-    case 1:
-      ds_line = DriverStationLCD::kUser_Line1;
-      break;
-    case 2:
-      ds_line = DriverStationLCD::kUser_Line2;
-      break;
-    case 3:
-      ds_line = DriverStationLCD::kUser_Line3;
-      break;
-    case 4:
-      ds_line = DriverStationLCD::kUser_Line4;
-      break;
-    case 5:
-      ds_line = DriverStationLCD::kUser_Line5;
-      break;
-    case 6:
-      ds_line = DriverStationLCD::kUser_Line6;
-      break;
-    default:
-      LOG(ERROR, "illegal line number %hhd\n", line);
-      return false;
-  }
-  // TODO(brians) see if this mess with not creating the DriverStationLCD for a
-  // bit is actually needed
-  static int ds_lcd_counts = 0; // to prevent crashes at startup
-  if (ds_lcd == NULL) {
-    if (ds_lcd_counts < 100) {
-      ++ds_lcd_counts;
-    } else {
-      ++ds_lcd_counts;
-      ds_lcd = DriverStationLCD::GetInstance();
-    }
-  }
-  char buf[DriverStationLCD::kLineLength];
-  buff.read_string(buf, sizeof(buf));
-  buf[sizeof(buf) - 1] = 0;
-  if (ds_lcd != NULL) {
-    ds_lcd->PrintfLine(ds_line, "%s", buf);
-  }
-  return true;
-}
-
-void MotorServer::RegisterControlLoopGoal(
-    control_loops::SerializableControlLoop *control_loop) {
-  uint32_t unique_id = control_loop->UniqueID();
-
-  bool replaced;
-  {
-    MutexLocker control_loop_goals_locker(&control_loop_goals_lock);
-    replaced = !InsertIntoMap(&loops, unique_id, control_loop);
-  }
-  if (replaced) {
-    LOG(ERROR, "Replaced a key for unique id 0x%"PRIx32"\n", unique_id);
-  }
-}
-
-bool MotorServer::ProcessControlLoopGoal() {
-  // Read back a uint32_t with the hash.
-  uint32_t hash;
-  if (!buff.read_uint32(&hash)) return false;
-  MutexLocker control_loop_goals_locker(&control_loop_goals_lock);
-
-  control_loops::SerializableControlLoop *loop;
-  if (!GetFromMap(loops, hash, &loop)) {
-    return false;
-  }
-  const size_t length = loop->SeralizedSize();
-  char *const goal_bytes = buff.get_bytes(length);
-  if (goal_bytes == NULL) {
-    return false;
-  } else {
-    loop->Deserialize(goal_bytes);
-  }
-  return true;
-}
-
-void MotorServer::RunReaderTask() {
-  while (true) {
-    if (buff.recv_from_sock(sock)) {
-      ProcessBuf();
-    }
-  }
-}
-void MotorServer::WriteOutputs() {
-  static int last_count = 0, bad_counts = 0;
-  semTake(motorSync, WAIT_FOREVER);
-  if (last_count != count) {
-    bad_counts = 0;
-  } else {
-    ++bad_counts;
-  }
-  last_count = count;
-  // both loops iterate over all elements of output_devices by indexing off the
-  // end of output_devices[0]
-  if (bad_counts > 2) {
-    LOG(WARNING, "no new values. stopping all outputs\n");
-    for (size_t i = 0; i < sizeof(output_devices) / sizeof(output_devices[0][0]); ++i) {
-      if (output_devices[0][i] != NULL) {
-        output_devices[0][i]->NoValue();
-      }
-    }
-  } else {
-    for (size_t i = 0; i < sizeof(output_devices) / sizeof(output_devices[0][0]); ++i) {
-      if (output_devices[0][i] != NULL) {
-        output_devices[0][i]->SetValue();
-      }
-    }
-  }
-  if (ds_lcd != NULL) {
-    ds_lcd->UpdateLCD();
-  }
-  semGive(motorSync);
-}
-
-}  // namespace crio
-}  // namespace aos
diff --git a/aos/crio/motor_server/MotorServer.h b/aos/crio/motor_server/MotorServer.h
deleted file mode 100644
index 0126663..0000000
--- a/aos/crio/motor_server/MotorServer.h
+++ /dev/null
@@ -1,87 +0,0 @@
-#ifndef AOS_CRIO_MOTOR_SERVER_MOTOR_SERVER_H_
-#define AOS_CRIO_MOTOR_SERVER_MOTOR_SERVER_H_
-
-#include <vxWorks.h>
-#include <timers.h>
-#include <string.h>
-#include "WPILib/Task.h"
-#include "WPILib/Victor.h"
-#include "WPILib/Jaguar.h"
-#include "WPILib/Solenoid.h"
-#include "sockLib.h"
-#include <inetLib.h>
-#include <stdio.h>
-#include <selectLib.h>
-#include <stdlib.h>
-#include <time.h>
-#include <map>
-#include <string>
-
-#include "WPILib/DriverStationLCD.h"
-
-#include "aos/common/control_loop/ControlLoop.h"
-#include "aos/common/inttypes.h"
-#include "aos/common/messages/QueueHolder.h"
-#include "aos/common/mutex.h"
-#include "aos/common/network/ReceiveSocket.h"
-#include "aos/common/network/SendSocket.h"
-#include "aos/crio/motor_server/ControlLoopGoals.h"
-#include "aos/crio/motor_server/OutputDevice.h"
-#include "aos/crio/motor_server/SensorSender.h"
-#include "aos/crio/shared_libs/ByteBuffer.h"
-#include "aos/map_utils.h"
-
-namespace aos {
-namespace crio {
-
-class CRIOControlLoopRunner;
-class MotorServer {
- public:
-  static void Start();
-
-  // Adds the given control loop's goal queue to the list of ones to process.
-  static void RegisterControlLoopGoal(
-      control_loops::SerializableControlLoop *control_loop);
-
-  static const int32_t WORK_PRIORITY = 100;
-
- private:
-  friend class CRIOControlLoopRunner;
-  // Counter for how many times new values come in. Used to stop all the
-  // outputs if values stop.
-  // Would take days to overflow.
-  static int count;
-  static SEM_ID motorSync;
-  // Gets called by CRIOControlLoopRunner every 10ms after it runs all of the
-  // control loops.
-  static void WriteOutputs();
-
-  static void RunReaderTask();
-  static Task *tcpTask;
-  static ReceiveSocket *sock;
-  static ByteBuffer buff;
-
-  static DriverStationLCD *ds_lcd;
-  static bool ProcessDSLine();
-
-  static const size_t kMaxOutputDeviceNumber = 10;
-  static OutputDevice *output_devices[256][kMaxOutputDeviceNumber];
-  static bool ProcessOutputDevice(const int type);
-
-  // Go through the whole buffer and call the appropriate Process* methods to
-  // process each part.
-  static void ProcessBuf();
-
-  static bool ProcessControlLoopGoal();
-  // Locked whenever adding/using the control loop goals maps.
-  // Also used by CRIOControlLoopRunner while modifying any of the data
-  // structures.  Used by both of them while reading/writing from
-  // the goal queues.
-  static Mutex control_loop_goals_lock;
-  static ::std::map<uint32_t, control_loops::SerializableControlLoop *> loops;
-};
-
-}  // namespace crio
-}  // namespace aos
-
-#endif
diff --git a/aos/crio/motor_server/OutputDevice.h b/aos/crio/motor_server/OutputDevice.h
deleted file mode 100644
index 0789a68..0000000
--- a/aos/crio/motor_server/OutputDevice.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef __CRIO_MOTOR_SERVER_OUTPUT_DEVICE_H_
-#define __CRIO_MOTOR_SERVER_OUTPUT_DEVICE_H_
-
-#include <stdint.h>
-#include "aos/crio/shared_libs/ByteBuffer.h"
-
-namespace aos {
-
-class OutputDevice {
- protected:
-  OutputDevice() {
-  }
- public:
-  // Reads the value out of buff and stores it somewhere for SetValue to use.
-  // Returns whether or not it successfully read a whole value out of buff.
-  virtual bool ReadValue(ByteBuffer &buff) = 0;
-  // Actually sets the output device to the value saved by ReadValue.
-  virtual void SetValue() = 0;
-  // Gets called when no values come in for a while.
-  virtual void NoValue() = 0;
-};
-
-} // namespace aos
-
-#endif
-
diff --git a/aos/crio/motor_server/SensorOutput-tmpl.h b/aos/crio/motor_server/SensorOutput-tmpl.h
deleted file mode 100644
index d6b8b69..0000000
--- a/aos/crio/motor_server/SensorOutput-tmpl.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "aos/common/input/SensorInput.h"
-
-namespace aos {
-
-template<class Values> std::vector<SensorOutput<Values> *> SensorOutput<Values>::output_running_;
-template<class Values> void SensorOutput<Values>::Run() {
-  semTake(lock_, WAIT_FOREVER);
-  output_running_.push_back(this);
-  outputs_running_.push_back(this);
-  semGive(lock_);
-}
-
-template<class Values> void SensorOutput<Values>::RunIterationAll(Values &vals) {
-  semTake(lock_, WAIT_FOREVER);
-  for (auto it = output_running_.begin(); it != output_running_.end(); ++it) {
-    (*it)->RunIteration(vals);
-  }
-  semGive(lock_);
-}
-template<class Values> void SensorOutput<Values>::Update() {
-  Values vals;
-  RunIteration(vals);
-  SensorInput<Values>::RunIterationAll(vals);
-}
-
-} // namespace aos
-
diff --git a/aos/crio/motor_server/SensorOutput.cpp b/aos/crio/motor_server/SensorOutput.cpp
deleted file mode 100644
index b887885..0000000
--- a/aos/crio/motor_server/SensorOutput.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "aos/crio/motor_server/SensorOutput.h"
-
-namespace aos {
-
-SEM_ID SensorOutputs::lock_ = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
-std::vector<SensorOutputs *> SensorOutputs::outputs_running_;
-
-void SensorOutputs::UpdateAll() {
-  semTake(lock_, WAIT_FOREVER);
-  for (auto it = outputs_running_.begin(); it != outputs_running_.end(); ++it) {
-    (*it)->Update();
-  }
-  semGive(lock_);
-}
-
-} // namespace aos
-
diff --git a/aos/crio/motor_server/SensorOutput.h b/aos/crio/motor_server/SensorOutput.h
deleted file mode 100644
index 9e30cb9..0000000
--- a/aos/crio/motor_server/SensorOutput.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef AOS_CRIO_MOTOR_SERVER_SENSOR_OUTPUT_H_
-#define AOS_CRIO_MOTOR_SERVER_SENSOR_OUTPUT_H_
-
-#include <semLib.h>
-#include <vector>
-
-namespace aos {
-
-// Keeps track of instances of all instantiations.
-class SensorOutputs {
- public:
-  // Calls RunIteration on all instances and then runs all SensorInput
-  // subclasses for that type.
-  static void UpdateAll();
- private:
-  static SEM_ID lock_;
-  static std::vector<SensorOutputs *> outputs_running_;
- protected:
-  // Calls RunIteration with a temporary Values instance and then runs all
-  // SensorInput subclasses with the same Values type.
-  virtual void Update() = 0;
-};
-
-// Class for implementing crio code that reads sensor values and puts them into
-// the sensor struct.
-template<class Values> class SensorOutput : public SensorOutputs {
- protected:
-  // Fills out vals with the current data.
-  // May not be called at anything close to consistent intervals and may be
-  // called simultaneously with different arguments, so it must be reentrant.
-  virtual void RunIteration(Values &vals) = 0;
- public:
-  // Sets it up so that RunIteration will get called when appropriate.
-  void Run();
-
-  // Calls RunIteration on all instances with vals.
-  static void RunIterationAll(Values &vals);
- private:
-  static std::vector<SensorOutput<Values> *> output_running_;
-  virtual void Update();
-};
-
-} // namespace aos
-
-#include "SensorOutput-tmpl.h"
-
-#endif
-
diff --git a/aos/crio/motor_server/SensorSender-tmpl.h b/aos/crio/motor_server/SensorSender-tmpl.h
deleted file mode 100644
index 93fe73d..0000000
--- a/aos/crio/motor_server/SensorSender-tmpl.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "WPILib/Task.h"
-#include "WPILib/Timer.h"
-#include "aos/crio/motor_server/SensorOutput.h"
-#include "aos/common/network/SendSocket.h"
-#include "aos/common/Configuration.h"
-
-namespace aos {
-
-template<class Values> void SensorSender<Values>::Run() {
-  SendSocket sock(NetworkPort::kSensors,
-                  configuration::GetIPAddress(configuration::NetworkDevice::kAtom));
-  Values vals;
-  while (true) {
-    Wait(0.0015);
-    SensorOutput<Values>::RunIterationAll(vals);
-    sock.Send(&vals, sizeof(vals));
-  }
-}
-
-} // namespace aos
-
diff --git a/aos/crio/motor_server/SensorSender.h b/aos/crio/motor_server/SensorSender.h
deleted file mode 100644
index 135e1fa..0000000
--- a/aos/crio/motor_server/SensorSender.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef __CRIO_SENSOR_SENDER_H_
-#define __CRIO_SENSOR_SENDER_H_
-
-namespace aos {
-
-// A class that handles sending all of the sensor values to the atom.
-// Designed for an instantiation (aos::SensorSender<X>) to be AOS_RUN_FORKed,
-// NOT a subclass.
-// Values is the type of the struct that will get sent out over the network.
-// Note: it should the same as the instance of TODO(brians) on the atom and any
-// SensorOutput instances that you want to feed into an instance of this.
-template<class Values> class SensorSender {
-	public:
-   // Loops forever.
-   void Run();
-};
-
-} // namespace aos
-
-#include "SensorSender-tmpl.h"
-
-#endif
-
diff --git a/aos/crio/motor_server/SolenoidOutput.h b/aos/crio/motor_server/SolenoidOutput.h
deleted file mode 100644
index 6a6c838..0000000
--- a/aos/crio/motor_server/SolenoidOutput.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef __CRIO_MOTOR_SERVER_SOLENOID_OUTPUT_H_
-#define __CRIO_MOTOR_SERVER_SOLENOID_OUTPUT_H_
-
-#include "aos/crio/motor_server/OutputDevice.h"
-
-namespace aos {
-
-class SolenoidOutput : public OutputDevice {
- private:
-  Solenoid solenoid;
-  bool value;
- public:
-  SolenoidOutput(uint32_t port) : OutputDevice(), solenoid(port), value(false) {
-  }
- protected:
-  virtual bool ReadValue(ByteBuffer &buff) {
-    const int on = buff.read_char();
-    if (on != 0 && on != 1) {
-      if (on != -1) {
-        LOG(ERROR, "illegal solenoid value %d\n", on);
-      }
-      return false;
-    }
-    value = on;
-    return true;
-  }
-  virtual void SetValue() {
-    solenoid.Set(value);
-  }
-  virtual void NoValue() {
-    // leave the solenoid in its previous state
-  }
-};
-
-} // namespace aos
-
-#endif
-
diff --git a/aos/crio/motor_server/victor_drive.rb b/aos/crio/motor_server/victor_drive.rb
deleted file mode 100644
index 7de9706..0000000
--- a/aos/crio/motor_server/victor_drive.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-require "socket"
-$sock = UDPSocket.new()
-$sock.connect("10.59.71.2",9123)
-def short(val)
-	val += 1.0
-	if(val < 0)
-		val = 0
-	end
-	val = (val * 256 * 128).to_i
-	v1 = val / 256
-	v2 = val % 256
-	if(v1 > 255)
-		v1 = 255
-		v2 = 255
-	end
-	return(v1.chr + v2.chr)
-end
-def jaguar(port,val)
-	$sock.send("j#{port.chr}#{short(val)}",0)
-end
-trap(2) do
-	jaguar(4,0)
-	jaguar(3,0)
-	exit!
-end
-while true
-	jaguar(4,Math.cos(Time.now.to_f))
-	jaguar(3,Math.cos(Time.now.to_f))
-	sleep(0.01)
-end
diff --git a/aos/crio/queue-tmpl.h b/aos/crio/queue-tmpl.h
deleted file mode 100644
index 94bc100..0000000
--- a/aos/crio/queue-tmpl.h
+++ /dev/null
@@ -1,57 +0,0 @@
-namespace aos {
-
-// The easiest way to hack this together is to have the scoped msg pointer not
-// manage the pointer, since it is a pointer to the only msg in the queue.
-template <class T>
-bool ScopedMessagePtr<T>::Send() {
-  msg_->SetTimeToNow();
-  reset();
-  return true;
-}
-
-template <class T>
-bool ScopedMessagePtr<T>::SendBlocking() {
-  msg_->SetTimeToNow();
-  reset();
-  return true;
-}
-
-template <class T>
-void ScopedMessagePtr<T>::reset(T *msg) {
-  msg_ = msg;
-}
-
-template <class T>
-void Queue<T>::Init() {}
-
-template <class T>
-bool Queue<T>::FetchNext() {
-  Init();
-  return true;
-}
-
-template <class T>
-bool Queue<T>::FetchNextBlocking() {
-  Init();
-  return true;
-}
-
-template <class T>
-bool Queue<T>::FetchLatest() {
-  Init();
-  return true;
-}
-
-template <class T>
-ScopedMessagePtr<T> Queue<T>::MakeMessage() {
-  Init();
-  return ScopedMessagePtr<T>(&msg_);
-}
-
-template <class T>
-aos::MessageBuilder<T> Queue<T>::MakeWithBuilder() {
-  Init();
-  return aos::MessageBuilder<T>(&msg_);
-}
-
-}  // namespace aos
diff --git a/aos/crio/queue_test.cc b/aos/crio/queue_test.cc
deleted file mode 100644
index 39609bc..0000000
--- a/aos/crio/queue_test.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-#include <unistd.h>
-
-#include <memory>
-
-#include "gtest/gtest.h"
-#define __TEST_VXWORKS__
-#include "aos/common/test_queue.q.h"
-
-using ::aos::time::Time;
-
-namespace aos {
-namespace common {
-namespace testing {
-
-class CRIOQueueTest : public ::testing::Test {
- protected:
-  // Create a new instance of the test queue that is fresh.
-  ::aos::Queue<TestingMessage> my_test_queue;
-
-  CRIOQueueTest() : my_test_queue(".aos.common.testing.test_queue") {}
-};
-
-// Tests that we can send a message with the message pointer and get it back.
-TEST_F(CRIOQueueTest, SendMessage) {
-  ScopedMessagePtr<TestingMessage> msg = my_test_queue.MakeMessage();
-  msg->test_bool = true;
-  msg->test_int = 0x971;
-  msg.Send();
-
-  my_test_queue.FetchLatest();
-  EXPECT_TRUE(my_test_queue->test_bool);
-  EXPECT_EQ(0x971, my_test_queue->test_int);
-}
-
-// Tests that we can send a message with the builder and get it back.
-TEST_F(CRIOQueueTest, SendWithBuilder) {
-  my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
-
-  my_test_queue.FetchLatest();
-  EXPECT_EQ(true, my_test_queue->test_bool);
-  EXPECT_EQ(0x971, my_test_queue->test_int);
-  EXPECT_EQ(true, my_test_queue.IsNewerThanMS(10000));
-}
-
-// Tests that various pointer deref functions at least seem to work.
-TEST_F(CRIOQueueTest, PointerDeref) {
-  my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
-
-  my_test_queue.FetchLatest();
-  const TestingMessage *msg_ptr = my_test_queue.get();
-  ASSERT_NE(static_cast<TestingMessage*>(NULL), msg_ptr);
-  EXPECT_EQ(0x971, msg_ptr->test_int);
-  EXPECT_EQ(msg_ptr, &(*my_test_queue));
-}
-
-// Tests that FetchLatest skips a missing message.
-TEST_F(CRIOQueueTest, FetchLatest) {
-  my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x254).Send();
-  my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
-
-  my_test_queue.FetchLatest();
-  EXPECT_EQ(0x971, my_test_queue->test_int);
-}
-
-// Tests that age makes some sense.
-TEST_F(CRIOQueueTest, Age) {
-  my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
-
-  my_test_queue.FetchLatest();
-  EXPECT_TRUE(my_test_queue.IsNewerThanMS(100));
-  const Time age = my_test_queue.Age();
-  EXPECT_EQ(0, age.sec());
-  EXPECT_GE(100000000, age.nsec());
-}
-
-
-class CRIOMessageTest : public ::testing::Test {
- public:
-  TestingMessage msg;
-};
-
-TEST_F(CRIOMessageTest, Zeroing) {
-  msg.test_bool = true;
-  msg.test_int = 0x254;
-  msg.SetTimeToNow();
-
-  msg.Zero();
-
-  EXPECT_FALSE(msg.test_bool);
-  EXPECT_EQ(0, msg.test_int);
-  EXPECT_EQ(0, msg.sent_time.sec());
-  EXPECT_EQ(0, msg.sent_time.nsec());
-}
-
-TEST_F(CRIOMessageTest, Size) {
-  EXPECT_EQ(static_cast<size_t>(13), msg.Size());
-}
-
-TEST_F(CRIOMessageTest, Serialize) {
-  char serialized_data[msg.Size()];
-  msg.test_bool = true;
-  msg.test_int = 0x254;
-  msg.SetTimeToNow();
-
-  msg.Serialize(serialized_data);
-
-  TestingMessage new_msg;
-  new_msg.Deserialize(serialized_data);
-
-  EXPECT_EQ(msg.test_bool, new_msg.test_bool);
-  EXPECT_EQ(msg.test_int, new_msg.test_int);
-  EXPECT_EQ(msg.sent_time, new_msg.sent_time);
-}
-
-TEST_F(CRIOMessageTest, SetNow) {
-  msg.SetTimeToNow();
-  EXPECT_LE(msg.sent_time - Time::Now(), Time::InMS(20));
-}
-
-}  // namespace testing
-}  // namespace common
-}  // namespace aos
diff --git a/aos/crio/shared_libs/ByteBuffer.h b/aos/crio/shared_libs/ByteBuffer.h
deleted file mode 100644
index b5c4902..0000000
--- a/aos/crio/shared_libs/ByteBuffer.h
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef __CRIO_SHARED_LIBS_BYTE_BUFFER_H_
-#define __CRIO_SHARED_LIBS_BYTE_BUFFER_H_
-
-#include "aos/common/network/ReceiveSocket.h"
-#include <algorithm>
-
-namespace aos {
-
-class ByteBuffer {
- public:
-   int m_size;
-   int m_length;
-   int m_i;
-   char *m_buffer;
-   bool recv_from_sock(ReceiveSocket *sock) {
-     m_length = sock->Recv(m_buffer, m_size, 40000);
-     if (m_length < 0) {
-       m_length = 0;
-     }
-     m_i = 0;
-     return m_length != 0;
-   }
-   ByteBuffer(int size) {
-     m_buffer = new char(size);
-     m_size = size;
-   }
-   ~ByteBuffer() {
-     delete m_buffer;
-   }
-   // Reads an uint32_t into *number and returns true on success.  *number is
-   // unmodified on failure.
-   bool read_uint32(uint32_t *number) {
-     uint32_t vals[4];
-     if (m_i + 4 > m_length) {
-       m_i = m_length;
-       return false;
-     }
-     for (int i = 0; i < 4; ++i) {
-       vals[i] = read_char();
-     }
-     *number = vals[3] + (vals[2] << 8) + (vals[1] << 16) + (vals[0] << 24);
-     return true;
-   }
-   float read_float() {
-     if (m_i + 4 <= m_length) {
-       float r;
-       memcpy(&r, &m_buffer[m_i], 4);
-       m_i += 4;
-       return r;
-     } else {
-       return 1.0 / 0.0;
-     }
-   }
-   int read_char() {
-     if (m_i < m_length) {
-       int val = m_buffer[m_i];
-       m_i ++;
-       return val;
-     } else {
-       return -1;
-     }
-   }
-
-   int read_string(char *buf, size_t max_len) {
-     int data_len = read_char();
-     if (data_len <= 0) {
-       return -1;
-     }
-     size_t to_read = std::min<size_t>(static_cast<uint8_t>(data_len), max_len);
-     memcpy(buf, &m_buffer[m_i], to_read);
-     m_i += to_read;
-     return 0;
-   }
-   // Returns success or not.
-   bool read_bytes(void *buf, size_t bytes) {
-     if (m_length - m_i < static_cast<ssize_t>(bytes)) return false;
-     memcpy(buf, &m_buffer[m_i], bytes);
-     m_i += bytes;
-     return true;
-   }
-   char *get_bytes(size_t number) {
-     if (m_length - m_i < static_cast<ssize_t>(number)) return NULL;
-     m_i += number;
-     return &m_buffer[m_i - number];
-   }
-};
-
-} // namespace aos
-
-#endif
-
diff --git a/aos/crio/shared_libs/interrupt_bridge-tmpl.h b/aos/crio/shared_libs/interrupt_bridge-tmpl.h
deleted file mode 100644
index cc00ab8..0000000
--- a/aos/crio/shared_libs/interrupt_bridge-tmpl.h
+++ /dev/null
@@ -1,241 +0,0 @@
-#include <sysLib.h>
-#include <usrLib.h>
-#include <sigevent.h>
-
-#include "WPILib/Task.h"
-
-#include "aos/common/logging/logging.h"
-#include "aos/common/time.h"
-
-extern "C" {
-// A really simple function implemented in a .c file because the header that
-// declares the variable doesn't work in C++.
-// Returns the value of the global variable excExtendedVectors declared by
-// <usrConfig.h>.
-int aos_getExcExtendedVectors();
-}
-
-namespace aos {
-namespace crio {
-
-// Conceptually a TimerNotifier*[]. Used by the signal handler so that it can
-// figure out which instance it's supposed to be using.
-// Doesn't need a lock because a value is put in here before the signal handler
-// is set up, so everything that might have concurrency issues will be reads
-// which will happen after the set to each index.
-// Declared like this instead of as an actual array because its size might be
-// determined dynamically (SIGRTMAX and SIGRTMIN can be function calls).
-extern void **const timer_notifiers;
-
-template<typename T>
-InterruptBridge<T>::InterruptBridge(Handler handler,
-                              T *param, int priority)
-    : handler_(handler),
-      param_(param),
-      task_(new Task("_NotifierLooper", reinterpret_cast<FUNCPTR>(HandlerLoop),
-                     priority)),
-      sem_(semBCreate(SEM_Q_PRIORITY, SEM_EMPTY)) {
-  // Basically, makes sure that it does -mlongcall for calling interrupt handler
-  // functions.
-  // See <http://www.vxdev.com/docs/vx55man/vxworks/ppc/powerpc.html#91321> for
-  // details about why this is important.
-  if (!aos_getExcExtendedVectors()) {
-    LOG(FATAL, "extended-call interrupts are not enabled\n");
-  }
-}
-
-template<typename T>
-InterruptBridge<T>::~InterruptBridge() {
-  // Can't call Stop() because that calls StopNotifications(), which is virtual,
-  // so you can't call it after the subclass's destructor has run.
-  semDelete(sem_);
-}
-
-template<typename T>
-void InterruptBridge<T>::StartTask() {
-  // The inner cast to InterruptBridge<T>* is so that Loop knows what to
-  // cast the void* to (the implementation of polymorphism means that
-  // casting the pointer might actually change its value).
-  task_->Start(reinterpret_cast<UINT32>(
-          static_cast<InterruptBridge<T> *>(this)));
-}
-
-template<typename T>
-void InterruptBridge<T>::Stop() {
-  StopNotifications();
-  task_->Stop();
-}
-
-template<typename T>
-void InterruptBridge<T>::HandlerLoop(void *self_in) {
-  InterruptBridge<T> *const self = static_cast<InterruptBridge<T> *>(self_in);
-  while (true) {
-    semTake(self->sem_, WAIT_FOREVER);
-    self->handler_(self->param_);
-  }
-}
-
-template<typename T>
-PeriodicNotifier<T>::PeriodicNotifier(
-    typename InterruptBridge<T>::Handler handler,
-    T *param, int priority)
-    : InterruptBridge<T>(handler, param, priority) {}
-
-template<typename T>
-void PeriodicNotifier<T>::StartPeriodic(double period) {
-  this->StartTask();
-  StartNotifications(period);
-}
-
-template<typename T>
-TimerNotifier<T>::TimerNotifier(typename InterruptBridge<T>::Handler handler,
-                                T *param, int unique, int priority)
-    : PeriodicNotifier<T>(handler, param, priority),
-      signal_(SIGRTMIN + unique) {
-  timer_notifiers[signal_] = static_cast<void *>(this);
-
-  struct sigaction sa;
-  sa.sa_flags = 0;
-  sa.sa_handler = StaticNotify;
-  sigemptyset(&sa.sa_mask);
-  if (sigaction(signal_, &sa, &old_sa_) != OK) {
-    LOG(FATAL, "sigaction(%d, %p, %p) failed with %d: %s\n",
-        signal_, &sa, &old_sa_, errno, strerror(errno));
-  }
-
-  sigevent event;
-  event.sigev_notify = SIGEV_TASK_SIGNAL;
-  event.sigev_signo = signal_;
-  event.sigev_value.sival_ptr = this;
-  if (timer_create(CLOCK_REALTIME, &event, &timer_) != OK) {
-    LOG(FATAL, "timer_create(CLOCK_REALTIME, %p, %p) failed with %d: %s\n",
-        &event, &timer_, errno, strerror(errno));
-  }
-}
-
-template<typename T>
-TimerNotifier<T>::~TimerNotifier() {
-  if (timer_delete(timer_) != OK) {
-    LOG(FATAL, "timer_delete(%p) failed with %d: %s\n", timer_,
-        errno, strerror(errno));
-  }
-  if (sigaction(signal_, &old_sa_, NULL) != OK) {
-    LOG(FATAL, "sigaction(%d, %p, NULL) failed with %d: %s\n",
-        signal_, &old_sa_, errno, strerror(errno));
-  }
-  StopNotifications();
-}
-
-template<typename T>
-void TimerNotifier<T>::StartNotifications(double period) {
-  itimerspec timer_spec;
-  timer_spec.it_value.tv_sec = 0;
-  timer_spec.it_value.tv_nsec = 1;  // 0 would mean to disarm the timer
-  timer_spec.it_interval = time::Time::InSeconds(period).ToTimespec();
-  if (timer_settime(timer_, 0, &timer_spec, NULL) != OK) {
-    LOG(FATAL, "timer_settime(%p, 0, %p, NULL) failed with %d: %s\n",
-        timer_, &timer_spec, errno, strerror(errno));
-  }
-}
-
-template<typename T>
-void TimerNotifier<T>::StopNotifications() {
-  timer_cancel(timer_);
-}
-
-template<typename T>
-WDInterruptNotifier<T>::WDInterruptNotifier(
-    typename InterruptBridge<T>::Handler handler, T *param, int priority)
-    : PeriodicNotifier<T>(handler, param, priority), wd_(wdCreate()) {
-  if (wd_ == NULL) {
-    LOG(FATAL, "wdCreate() failed with %d: %s\n", errno, strerror(errno));
-  }
-}
-
-template<typename T>
-WDInterruptNotifier<T>::~WDInterruptNotifier() {
-  if (wdDelete(wd_) != OK) {
-    LOG(FATAL, "wdDelete(%p) failed with %d: %s\n",
-        wd_, errno, strerror(errno));
-  }
-  StopNotifications();
-}
-
-template<typename T>
-void WDInterruptNotifier<T>::StartNotifications(double period) {
-  delay_ = time::Time::InSeconds(period).ToTicks();
-
-  if (wdStart(wd_,
-              1,  // run it really soon
-              (FUNCPTR)StaticNotify,
-              (UINT32)this) != OK) {
-    LOG(FATAL, "wdStart(%p) failed with %d: %s", wd_, errno, strerror(errno));
-  }
-}
-
-template<typename T>
-void WDInterruptNotifier<T>::StopNotifications() {
-  wdCancel(wd_);
-}
-
-// THESE GET CALLED AT INTERRUPT LEVEL. BE CAREFUL CHANGING THEM!!
-//
-// It might be tempting to use floating point math here, but DON'T!
-//
-// Also, do NOT use 64-bit integers (at least not without checking the assembly
-// code again). GCC optimizes those using the floating point registers (see
-// <http://compgroups.net/comp.os.vxworks/int64-where-gcc-ppc-and-vxworks-don-t-play-we/1110156>
-// for an example of that being a problem).
-//
-// The assembly code comments are in there to make looking at assembly code
-// dumps to verify that there aren't any floating point instructions easier.
-// brians did that on 10/14/12 to his then-uncommited code and didn't find any.
-// For future reference, here is a list of powerpc instruction mnemonics (what
-// g++ -S gives) that do not involve any floating point:
-//   lwz
-//   lis
-//   mflr
-//   la
-//   stwu
-//   stw
-//   mr
-//   mtctr
-//   bctrl
-//   addi
-//   mtlr
-//   blr
-//   cmpwi
-//   bne
-//   li
-#define ASM_COMMENT(str) __asm__("# " str)
-template<typename T>
-void WDInterruptNotifier<T>::StaticNotify(void *self_in) {
-  ASM_COMMENT("beginning of WDInterruptNotifier::StaticNotify");
-  WDInterruptNotifier<T> *const self =
-      static_cast<WDInterruptNotifier<T> *>(self_in);
-  wdStart(self->wd_,
-          self->delay_,
-          (FUNCPTR)StaticNotify,
-          (UINT32)self);  // call the same thing again
-  self->Notify();
-  ASM_COMMENT("end of WDInterruptNotifier::StaticNotify");
-}
-
-template<typename T>
-void TimerNotifier<T>::StaticNotify(int signum) {
-  ASM_COMMENT("beginning of TimerNotifier::StaticNotify");
-  TimerNotifier<T> *const self =
-      static_cast<TimerNotifier<T> *>(timer_notifiers[signum]);
-  self->Notify();
-  ASM_COMMENT("end of TimerNotifier::StaticNotify");
-}
-
-template<typename T>
-void InterruptBridge<T>::Notify() {
-  ASM_COMMENT("beginning of InterruptBridge::Notify");
-  semGive(sem_);
-  ASM_COMMENT("end of InterruptBridge::Notify");
-}
-
-}  // namespace crio
-}  // namespace aos
diff --git a/aos/crio/shared_libs/interrupt_bridge.cc b/aos/crio/shared_libs/interrupt_bridge.cc
deleted file mode 100644
index a905c55..0000000
--- a/aos/crio/shared_libs/interrupt_bridge.cc
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "aos/crio/shared_libs/interrupt_bridge.h"
-
-namespace aos {
-namespace crio {
-
-void **const timer_notifiers = new void *[SIGRTMAX - SIGRTMIN];
-
-}  // namespace crio
-}  // namespace aos
diff --git a/aos/crio/shared_libs/interrupt_bridge.h b/aos/crio/shared_libs/interrupt_bridge.h
deleted file mode 100644
index 85ecd0f..0000000
--- a/aos/crio/shared_libs/interrupt_bridge.h
+++ /dev/null
@@ -1,140 +0,0 @@
-#ifndef AOS_CRIO_SHARED_LIBS_INTERRUPT_BRIDGE_H_
-#define AOS_CRIO_SHARED_LIBS_INTERRUPT_BRIDGE_H_
-
-#include <wdLib.h>
-#include <semLib.h>
-#include <timers.h>
-#include <signal.h>
-
-#include "aos/common/scoped_ptr.h"
-
-#include "aos/aos_core.h"
-
-class Task;
-
-namespace aos {
-namespace crio {
-
-// Handles creating a separate Task at a high priority with a semaphore to
-// link it to something else that provides timing information (likely in an ISR
-// context).
-template<typename T>
-class InterruptBridge {
- public:
-  // The default priority. Here as a constant for subclasses to use as a default
-  // too.
-  static const int kDefaultPriority = 96;
-  typedef void (*Handler)(T *param);
-
-  // Stops calling the handler at all until a Start function is called again.
-  void Stop();
-
- protected:
-  // < 95 priority does not work, and < 100 isn't guaranteed to work
-  InterruptBridge(Handler handler, T *param, int priority);
-  // Subclasses should call StopNotifications.
-  virtual ~InterruptBridge();
-
-  // Subclasses should call this whenever the Notifier triggers.
-  // It is safe to call from an ISR.
-  void Notify();
-  // Starts the actual Task.
-  void StartTask();
-
- private:
-  const Handler handler_;
-  T *const param_;
-
-  // Subclasses should do whatever they have to to stop calling Notify().
-  virtual void StopNotifications() = 0;
-
-  // The function that the Task runs.
-  // Loops forever, waiting for sem_ and then calling handler_.
-  static void HandlerLoop(void *self_in);
-  const scoped_ptr<Task> task_;
-  // For synchronizing between the Task and Notify().
-  SEM_ID sem_;
-  DISALLOW_COPY_AND_ASSIGN(InterruptBridge<T>);
-};
-
-// An accurate version of WPILib's Notifier class.
-template<typename T>
-class PeriodicNotifier : public InterruptBridge<T> {
- public:
-  // Period is how much (in seconds) to wait between running the handler.
-  void StartPeriodic(double period);
-
- protected:
-  PeriodicNotifier(typename InterruptBridge<T>::Handler handler, T *param,
-                   int priority);
-  virtual ~PeriodicNotifier() {}
-
- private:
-  virtual void StopNotifications() = 0;
-  // Subclasses should do whatever they have to to start calling Notify() every
-  // period seconds.
-  virtual void StartNotifications(double period) = 0;
-};
-
-// This one works accurately, but it has the potential to drift over time.
-// It has only sysClockRateGet() resolution.
-template<typename T>
-class WDInterruptNotifier : public PeriodicNotifier<T> {
- public:
-  WDInterruptNotifier(typename InterruptBridge<T>::Handler handler,
-                      T *param = NULL,
-                      int priority = InterruptBridge<T>::kDefaultPriority);
-  virtual ~WDInterruptNotifier();
-
- private:
-  // The argument is the general callback parameter which will be a pointer to
-  // an instance. This function calls Notify() on that instance.
-  static void StaticNotify(void *self_in);
-  virtual void StopNotifications();
-  virtual void StartNotifications(double period);
-
-  WDOG_ID wd_;
-  int delay_;  // what to pass to wdStart
-  DISALLOW_COPY_AND_ASSIGN(WDInterruptNotifier<T>);
-};
-
-// Vxworks (really really) should take care of making sure that this one
-// doesn't drift over time, but IT DOESN'T!! Brian found the implementation
-// online (file timerLib.c), and it's just doing the same thing as
-// WDInterruptNotifier, except with extra conversions and overhead to implement
-// the POSIX standard. There really is no reason to use this.
-// It has only sysClockRateGet() resolution.
-template<typename T>
-class TimerNotifier : public PeriodicNotifier<T> {
- public:
-  // unique should be different for all instances created in the same Task. It
-  // can range from 0 to (SIGRTMAX - SIGRTMIN). This instance will use the
-  // signal (SIGRTMIN + unique), so nothing else should use that signal.
-  TimerNotifier(typename InterruptBridge<T>::Handler handler,
-                T *param = NULL,
-                int unique = 0,
-                int priority = InterruptBridge<T>::kDefaultPriority);
-  virtual ~TimerNotifier();
-
- private:
-  // The first argument is the signal number that is being triggered. This
-  // function looks up a pointer to an instance in timer_notifiers using that
-  // and calls Notify() on that instance.
-  static void StaticNotify(int signum);
-  virtual void StopNotifications();
-  virtual void StartNotifications(double period);
-
-  timer_t timer_;
-  // Which signal timer_ will notify on.
-  const int signal_;
-  // What the action for signal_ was before we started messing with it.
-  struct sigaction old_sa_;
-  DISALLOW_COPY_AND_ASSIGN(TimerNotifier<T>);
-};
-
-}  // namespace crio
-}  // namespace aos
-
-#include "aos/crio/shared_libs/interrupt_bridge-tmpl.h"
-
-#endif  // AOS_CRIO_SHARED_LIBS_INTERRUPT_BRIDGE_H_
diff --git a/aos/crio/shared_libs/interrupt_bridge_c.c b/aos/crio/shared_libs/interrupt_bridge_c.c
deleted file mode 100644
index 7a74ea1..0000000
--- a/aos/crio/shared_libs/interrupt_bridge_c.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <vxWorksCommon.h> // or else it blows up...
-// This header ends up trying to #include a header which declares a struct with
-// a member named "delete". This means that it can not be used from code
-// compiled with the C++ compiler.
-#include <usrConfig.h>
-
-int aos_getExcExtendedVectors(void) {
-	return excExtendedVectors;
-}
diff --git a/aos/crio/shared_libs/interrupt_bridge_demo.cc b/aos/crio/shared_libs/interrupt_bridge_demo.cc
deleted file mode 100644
index d7e66be..0000000
--- a/aos/crio/shared_libs/interrupt_bridge_demo.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-#include "aos/crio/shared_libs/interrupt_bridge.h"
-
-#include <unistd.h>
-
-#include "WPILib/Timer.h"
-
-#include "aos/aos_core.h"
-#include "aos/common/time.h"
-
-using aos::time::Time;
-
-namespace aos {
-namespace crio {
-
-class InterruptBridgeTest {
- public:
-  void Run(double seconds) {
-    int interruptVal = 1;
-    WDInterruptNotifier<int> interrupt(Notify, &interruptVal);
-    interrupt.StartPeriodic(0.01);
-    int timerVal = 2;
-    TimerNotifier<int> timer(Notify, &timerVal);
-    time::SleepFor(Time::InSeconds(0.005));  // get them offset by ~180 degrees
-    timer.StartPeriodic(0.01);
-    time::SleepFor(Time::InSeconds(seconds));
-  }
- private:
-  static void Notify(int *value) {
-    printf("notified %f,%d\n", Timer::GetFPGATimestamp(), *value);
-  }
-};
-
-}  // namespace crio
-}  // namespace aos
-
-// Designed to be called from the vxworks shell if somebody wants to run this.
-extern "C" int interrupt_bridge_demo(int seconds) {
-  if (seconds == 0) {
-    printf("arguments: number of seconds\n");
-    return -1;
-  }
-  aos::crio::InterruptBridgeTest runner;
-  runner.Run(seconds);
-  return 0;
-}
diff --git a/aos/crio/shared_libs/interrupt_notifier-tmpl.h b/aos/crio/shared_libs/interrupt_notifier-tmpl.h
deleted file mode 100644
index 819e552..0000000
--- a/aos/crio/shared_libs/interrupt_notifier-tmpl.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <intLib.h>
-#include <logLib.h>
-
-namespace aos {
-namespace crio {
-
-template<typename T>
-InterruptNotifier<T>::InterruptNotifier(
-    Handler handler,
-    InterruptableSensorBase *sensor, T *param)
-    : handler_(handler), param_(param), sensor_(sensor) {
-  sensor_->RequestInterrupts(StaticNotify, this);
-}
-
-template<typename T>
-InterruptNotifier<T>::~InterruptNotifier() {
-  sensor_->CancelInterrupts();
-}
-
-template<typename T>
-void InterruptNotifier<T>::Start() {
-  sensor_->EnableInterrupts();
-}
-
-template<typename T>
-void InterruptNotifier<T>::StopNotifications() {
-  sensor_->DisableInterrupts();
-}
-
-template<typename T>
-void InterruptNotifier<T>::StaticNotify(uint32_t, void *self_in) {
-  if (intContext()) {  // if we are in an actual ISR
-    logMsg(const_cast<char *>("WPILib is calling callbacks"
-                              " in actual ISRs now!!\n"),
-           0, 0, 0, 0, 0, 0);
-    return;
-  }
-  InterruptNotifier<T> *const self =
-      static_cast<InterruptNotifier<T> *>(self_in);
-  self->handler_(self->param_);
-}
-
-}  // namespace crio
-}  // namespace aos
diff --git a/aos/crio/shared_libs/interrupt_notifier.h b/aos/crio/shared_libs/interrupt_notifier.h
deleted file mode 100644
index 8334f86..0000000
--- a/aos/crio/shared_libs/interrupt_notifier.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef AOS_CRIO_SHARED_LIBS_INTERRUPT_NOTIFIER_H_
-#define AOS_CRIO_SHARED_LIBS_INTERRUPT_NOTIFIER_H_
-
-#include "WPILib/InterruptableSensorBase.h"
-
-namespace aos {
-namespace crio {
-
-// An InterruptBridge that notifies based on interrupts from a WPILib
-// InterruptableSensorBase object (which DigitalInput is an example of).
-// Not actually a subclass because WPILib appears to not really use actual
-// interrupts.
-template<typename T>
-class InterruptNotifier {
- public:
-  typedef void (*Handler)(T *param);
-
-  // This object will hold a reference to sensor, but will not free it. This
-  // object will take ownership of everything related to interrupts for sensor
-  // (ie this constructor will call sensor->RequestInterrupts).
-  // Interrupts should be cancelled (the state InterruptableSensorBases are
-  // constructed in) when this constructor is called.
-  // Any setup of sensor that is required should happen before Start() is
-  // called, but after this constructor (ie SetUpSourceEdge).
-  InterruptNotifier(Handler handler,
-                    InterruptableSensorBase *sensor,
-                    T *param = NULL);
-  virtual ~InterruptNotifier();
-
-  // Starts calling the handler whenever the interrupt triggers.
-  void Start();
-
- private:
-  // The only docs that seem to exist on the first arg is that it's named
-  // interruptAssertedMask in WPILib/ChipObject/tInterruptManager.h.
-  // The second arg is the general callback parameter which will be a pointer to
-  // an instance. This function calls Notify() on that instance.
-  static void StaticNotify(uint32_t, void *self_in);
-  virtual void StopNotifications();
-
-  const Handler handler_;
-  T *const param_;
-
-  InterruptableSensorBase *const sensor_;
-  DISALLOW_COPY_AND_ASSIGN(InterruptNotifier<T>);
-};
-
-}  // namespace crio
-}  // namespace aos
-
-#include "aos/crio/shared_libs/interrupt_notifier-tmpl.h"
-
-#endif  // AOS_CRIO_SHARED_LIBS_INTERRUPT_NOTIFIER_H_
diff --git a/aos/crio/shared_libs/mutex.cpp b/aos/crio/shared_libs/mutex.cpp
deleted file mode 100644
index 35ac4e3..0000000
--- a/aos/crio/shared_libs/mutex.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#include "aos/common/mutex.h"
-
-#include <semLib.h>
-
-namespace aos {
-
-Mutex::Mutex() : impl_(semBCreate(SEM_Q_PRIORITY, SEM_FULL)) {
-  if (impl_ == NULL) {
-    LOG(FATAL, 
-        "semBCreate(SEM_Q_PRIORITY, SEM_FULL) failed because of %d: %s\n",
-        errno, strerror(errno)); 
-  }
-}
-
-Mutex::~Mutex() {
-  if (semDelete(impl_) != 0) {
-    LOG(FATAL, "semDelete(%p) failed because of %d: %s\n",
-        impl_, errno, strerror(errno));
-  }
-}
-
-void Mutex::Lock() {
-  if (semTake(impl_, WAIT_FOREVER) != 0) {
-    LOG(FATAL, "semTake(%p, WAIT_FOREVER) failed because of %d: %s\n",
-        impl_, errno, strerror(errno));
-  }
-}
-
-void Mutex::Unlock() {
-  if (semGive(impl_) != 0) {
-    LOG(FATAL, "semGive(%p) failed because of %d: %s\n",
-        impl_, errno, strerror(errno));
-  }
-}
-
-bool Mutex::TryLock() {
-  if (semTake(impl_, NO_WAIT) == 0) {
-    return true;
-  }
-  // The semLib documention is wrong about what the errno will be.
-  if (errno != S_objLib_OBJ_UNAVAILABLE) {
-    LOG(FATAL, "semTake(%p, WAIT_FOREVER) failed because of %d: %s\n",
-        impl_, errno, strerror(errno));
-  }
-  return false;
-}
-
-}  // namespace aos
diff --git a/aos/externals/.gitignore b/aos/externals/.gitignore
deleted file mode 100644
index 3417a33..0000000
--- a/aos/externals/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-/ctemplate-2.2-prefix/
-/ctemplate-2.2.tar.gz
-/ctemplate-2.2/
-/eigen-3.0.5.tar.bz2
-/eigen-3.0.5/
-/gccdist.zip
-/gccdist/
-/gtest-1.6.0-p1/
-/gtest-1.6.0.zip
-/gyp-1488/
-/javacv-0.2-bin.zip
-/javacv-bin/
-/jpeg-8d/
-/jpegsrc.v8d.tar.gz
-/libjpeg/
-/ninja/
-/one-jar-boot-0.97.jar
diff --git a/aos/externals/WPILib/WPILib.a b/aos/externals/WPILib/WPILib.a
index 57584f3..27cc22f 100644
--- a/aos/externals/WPILib/WPILib.a
+++ b/aos/externals/WPILib/WPILib.a
Binary files differ
diff --git a/aos/externals/WPILib/WPILib/ADXL345_I2C.cpp b/aos/externals/WPILib/WPILib/ADXL345_I2C.cpp
index aafd502..9cce2c2 100644
--- a/aos/externals/WPILib/WPILib/ADXL345_I2C.cpp
+++ b/aos/externals/WPILib/WPILib/ADXL345_I2C.cpp
@@ -73,7 +73,7 @@
  */
 ADXL345_I2C::AllAxes ADXL345_I2C::GetAccelerations()
 {
-	AllAxes data = {0.0};
+	AllAxes data = {0.0, 0.0, 0.0};
 	int16_t rawData[3];
 	if (m_i2c)
 	{
diff --git a/aos/externals/WPILib/WPILib/ADXL345_SPI.cpp b/aos/externals/WPILib/WPILib/ADXL345_SPI.cpp
index d6f0dfd..8d279b0 100644
--- a/aos/externals/WPILib/WPILib/ADXL345_SPI.cpp
+++ b/aos/externals/WPILib/WPILib/ADXL345_SPI.cpp
@@ -157,7 +157,7 @@
  */
 ADXL345_SPI::AllAxes ADXL345_SPI::GetAccelerations()
 {
-	AllAxes data = {0.0};
+	AllAxes data = {0.0, 0.0, 0.0};
 	int16_t rawData[3];
 	if (m_spi)
 	{
diff --git a/aos/externals/WPILib/WPILib/AnalogChannel.cpp b/aos/externals/WPILib/WPILib/AnalogChannel.cpp
index d6e5896..d8b55ff 100644
--- a/aos/externals/WPILib/WPILib/AnalogChannel.cpp
+++ b/aos/externals/WPILib/WPILib/AnalogChannel.cpp
@@ -39,9 +39,9 @@
 	}
 
 	snprintf(buf, 64, "Analog Input %d (Module: %d)", channel, moduleNumber);
-	if (channels->Allocate((moduleNumber - 1) * kAnalogChannels + channel - 1, buf) == ~0ul)
+	if (channels->Allocate((moduleNumber - 1) * kAnalogChannels +
+                         channel - 1, buf, this) == ~0ul)
 	{
-		CloneError(channels);
 		return;
 	}
 	m_channel = channel;
@@ -88,7 +88,8 @@
  */
 AnalogChannel::~AnalogChannel()
 {
-	channels->Free((m_module->GetNumber() - 1) * kAnalogChannels + m_channel - 1);
+	channels->Free((m_module->GetNumber() - 1) * kAnalogChannels + m_channel - 1,
+                 this);
 }
 
 /**
@@ -290,7 +291,7 @@
  * This will be added to all values returned to the user.
  * @param initialValue The value that the accumulator should start from when reset.
  */
-void AnalogChannel::SetAccumulatorInitialValue(INT64 initialValue)
+void AnalogChannel::SetAccumulatorInitialValue(int64_t initialValue)
 {
 	if (StatusIsFatal()) return;
 	m_accumulatorOffset = initialValue;
@@ -359,7 +360,7 @@
  * 
  * @return The 64-bit value accumulated since the last Reset().
  */
-INT64 AnalogChannel::GetAccumulatorValue()
+int64_t AnalogChannel::GetAccumulatorValue()
 {
 	if (StatusIsFatal()) return 0;
 	if (m_accumulator == NULL)
@@ -368,7 +369,7 @@
 		return 0;
 	}
 	tRioStatusCode localStatus = NiFpga_Status_Success;
-	INT64 value = m_accumulator->readOutput_Value(&localStatus) + m_accumulatorOffset;
+	int64_t value = m_accumulator->readOutput_Value(&localStatus) + m_accumulatorOffset;
 	wpi_setError(localStatus);
 	return value;
 }
@@ -404,7 +405,7 @@
  * @param value Pointer to the 64-bit accumulated output.
  * @param count Pointer to the number of accumulation cycles.
  */
-void AnalogChannel::GetAccumulatorOutput(INT64 *value, uint32_t *count)
+void AnalogChannel::GetAccumulatorOutput(int64_t *value, uint32_t *count)
 {
 	if (StatusIsFatal()) return;
 	if (m_accumulator == NULL)
diff --git a/aos/externals/WPILib/WPILib/AnalogChannel.h b/aos/externals/WPILib/WPILib/AnalogChannel.h
index 6bf0a5c..153640a 100644
--- a/aos/externals/WPILib/WPILib/AnalogChannel.h
+++ b/aos/externals/WPILib/WPILib/AnalogChannel.h
@@ -58,13 +58,13 @@
 
 	bool IsAccumulatorChannel();
 	void InitAccumulator();
-	void SetAccumulatorInitialValue(INT64 value);
+	void SetAccumulatorInitialValue(int64_t value);
 	void ResetAccumulator();
 	void SetAccumulatorCenter(int32_t center);
 	void SetAccumulatorDeadband(int32_t deadband);
-	INT64 GetAccumulatorValue();
+	int64_t GetAccumulatorValue();
 	uint32_t GetAccumulatorCount();
-	void GetAccumulatorOutput(INT64 *value, uint32_t *count);
+	void GetAccumulatorOutput(int64_t *value, uint32_t *count);
 	void SetVoltageForPID(bool shouldUseVoltageForPID);
 	
 	double PIDGet();
@@ -81,7 +81,7 @@
 	uint32_t m_channel;
 	AnalogModule *m_module;
 	tAccumulator *m_accumulator;
-	INT64 m_accumulatorOffset;
+	int64_t m_accumulatorOffset;
 	bool m_shouldUseVoltageForPID;
 	
 	ITable *m_table;
diff --git a/aos/externals/WPILib/WPILib/AnalogModule.cpp b/aos/externals/WPILib/WPILib/AnalogModule.cpp
index cab794c..9fd829b 100644
--- a/aos/externals/WPILib/WPILib/AnalogModule.cpp
+++ b/aos/externals/WPILib/WPILib/AnalogModule.cpp
@@ -14,7 +14,8 @@
 const long AnalogModule::kDefaultOversampleBits;
 const long AnalogModule::kDefaultAverageBits;
 constexpr float AnalogModule::kDefaultSampleRate;
-SEM_ID AnalogModule::m_registerWindowSemaphore = NULL;
+// Needs to be global since the protected resource spans both module singletons.
+ReentrantSemaphore AnalogModule::m_registerWindowSemaphore;
 
 /**
  * Get an instance of an Analog Module.
@@ -71,12 +72,6 @@
 		SetAverageBits(i + 1, kDefaultAverageBits);
 		SetOversampleBits(i + 1, kDefaultOversampleBits);
 	}
-
-	if (m_registerWindowSemaphore == NULL)
-	{
-		// Needs to be global since the protected resource spans both module singletons.
-		m_registerWindowSemaphore = semMCreate(SEM_Q_PRIORITY | SEM_DELETE_SAFE | SEM_INVERSION_SAFE);
-	}
 }
 
 /**
diff --git a/aos/externals/WPILib/WPILib/AnalogModule.h b/aos/externals/WPILib/WPILib/AnalogModule.h
index 090476f..9b98c60 100644
--- a/aos/externals/WPILib/WPILib/AnalogModule.h
+++ b/aos/externals/WPILib/WPILib/AnalogModule.h
@@ -48,7 +48,7 @@
 	virtual ~AnalogModule();
 
 private:
-	static SEM_ID m_registerWindowSemaphore;
+	static ReentrantSemaphore m_registerWindowSemaphore;
 
 	uint32_t GetNumActiveChannels();
 	uint32_t GetNumChannelsToActivate();
diff --git a/aos/externals/WPILib/WPILib/AnalogTrigger.cpp b/aos/externals/WPILib/WPILib/AnalogTrigger.cpp
index 11de75f..fff2365 100644
--- a/aos/externals/WPILib/WPILib/AnalogTrigger.cpp
+++ b/aos/externals/WPILib/WPILib/AnalogTrigger.cpp
@@ -21,10 +21,9 @@
 void AnalogTrigger::InitTrigger(uint8_t moduleNumber, uint32_t channel)
 {
 	Resource::CreateResourceObject(&triggers, tAnalogTrigger::kNumSystems);
-	uint32_t index = triggers->Allocate("Analog Trigger");
+	uint32_t index = triggers->Allocate("Analog Trigger", this);
 	if (index == ~0ul)
 	{
-		CloneError(triggers);
 		return;
 	}
 	m_index = (uint8_t)index;
@@ -74,7 +73,7 @@
 
 AnalogTrigger::~AnalogTrigger()
 {
-	triggers->Free(m_index);
+	triggers->Free(m_index, this);
 	delete m_trigger;
 }
 
diff --git a/aos/externals/WPILib/WPILib/AnalogTriggerOutput.cpp b/aos/externals/WPILib/WPILib/AnalogTriggerOutput.cpp
index 47b91d8..415e3f9 100644
--- a/aos/externals/WPILib/WPILib/AnalogTriggerOutput.cpp
+++ b/aos/externals/WPILib/WPILib/AnalogTriggerOutput.cpp
@@ -41,8 +41,10 @@
 	{
 	case kInWindow:
 		result = m_trigger->m_trigger->readOutput_InHysteresis(m_trigger->m_index, &localStatus);
+		break;
 	case kState:
 		result = m_trigger->m_trigger->readOutput_OverLimit(m_trigger->m_index, &localStatus);
+		break;
 	case kRisingPulse:
 	case kFallingPulse:
 		wpi_setWPIError(AnalogTriggerPulseOutputError);
@@ -75,20 +77,3 @@
 {
 	return true;
 }
-
-/**
- * Request interrupts asynchronously on this analog trigger output.
- * TODO: Hardware supports interrupts on Analog Trigger outputs... WPILib should too
- */
-void AnalogTriggerOutput::RequestInterrupts(tInterruptHandler handler, void *param)
-{
-}
-
-/**
- * Request interrupts synchronously on this analog trigger output.
- * TODO: Hardware supports interrupts on Analog Trigger outputs... WPILib should too
- */
-void AnalogTriggerOutput::RequestInterrupts()
-{
-}
-
diff --git a/aos/externals/WPILib/WPILib/AnalogTriggerOutput.h b/aos/externals/WPILib/WPILib/AnalogTriggerOutput.h
index 4533ad5..83e4450 100644
--- a/aos/externals/WPILib/WPILib/AnalogTriggerOutput.h
+++ b/aos/externals/WPILib/WPILib/AnalogTriggerOutput.h
@@ -42,6 +42,7 @@
 {
 	friend class AnalogTrigger;
 public:
+  // kRisingPulse and kFallingPulse don't seem to work with RequestInterrupts.
 	typedef enum {kInWindow=0, kState=1, kRisingPulse=2, kFallingPulse=3} Type;
 	
 	virtual ~AnalogTriggerOutput();
@@ -51,8 +52,6 @@
 	virtual uint32_t GetChannelForRouting();
 	virtual uint32_t GetModuleForRouting();
 	virtual bool GetAnalogTriggerForRouting();
-	virtual void RequestInterrupts(tInterruptHandler handler, void *param=NULL); ///< Asynchronus handler version.
-	virtual void RequestInterrupts();		///< Synchronus Wait version.
 protected:
 	AnalogTriggerOutput(AnalogTrigger *trigger, Type outputType);
 
diff --git a/aos/externals/WPILib/WPILib/CANJaguar.cpp b/aos/externals/WPILib/WPILib/CANJaguar.cpp
index a5767e9..bafa8a1 100644
--- a/aos/externals/WPILib/WPILib/CANJaguar.cpp
+++ b/aos/externals/WPILib/WPILib/CANJaguar.cpp
@@ -1224,7 +1224,7 @@
 
 void CANJaguar::GetDescription(char *desc)
 {
-	sprintf(desc, "CANJaguar ID %d", m_deviceNumber);
+	snprintf(desc, 64, "CANJaguar ID %d", m_deviceNumber);
 }
 
 /**
diff --git a/aos/externals/WPILib/WPILib/ChipObject/tSystemInterface.h b/aos/externals/WPILib/WPILib/ChipObject/tSystemInterface.h
index 46786e8..d5008e1 100644
--- a/aos/externals/WPILib/WPILib/ChipObject/tSystemInterface.h
+++ b/aos/externals/WPILib/WPILib/ChipObject/tSystemInterface.h
@@ -12,9 +12,9 @@
    tSystemInterface(){}
    virtual ~tSystemInterface(){}
 
-   virtual const uint16_t getExpectedFPGAVersion()=0;
-   virtual const uint32_t getExpectedFPGARevision()=0;
-   virtual const uint32_t * const getExpectedFPGASignature()=0;
+   virtual uint16_t getExpectedFPGAVersion()=0;
+   virtual uint32_t getExpectedFPGARevision()=0;
+   virtual uint32_t * getExpectedFPGASignature()=0;
    virtual void getHardwareFpgaSignature(uint32_t *guid_ptr, tRioStatusCode *status)=0;
    virtual uint32_t getLVHandle(tRioStatusCode *status)=0;
    virtual uint32_t getHandle()=0;
diff --git a/aos/externals/WPILib/WPILib/Counter.cpp b/aos/externals/WPILib/WPILib/Counter.cpp
index 8fe1022..bf77743 100644
--- a/aos/externals/WPILib/WPILib/Counter.cpp
+++ b/aos/externals/WPILib/WPILib/Counter.cpp
@@ -21,10 +21,9 @@
 {
 	m_table = NULL;
 	Resource::CreateResourceObject(&counters, tCounter::kNumSystems);
-	uint32_t index = counters->Allocate("Counter");
+	uint32_t index = counters->Allocate("Counter", this);
 	if (index == ~0ul)
 	{
-		CloneError(counters);
 		return;
 	}
 	m_index = index;
@@ -184,7 +183,7 @@
 	}
 	delete m_counter;
 	m_counter = NULL;
-	counters->Free(m_index);
+	counters->Free(m_index, this);
 }
 
 /**
diff --git a/aos/externals/WPILib/WPILib/Dashboard.cpp b/aos/externals/WPILib/WPILib/Dashboard.cpp
index 0b60c35..b21cd7c 100644
--- a/aos/externals/WPILib/WPILib/Dashboard.cpp
+++ b/aos/externals/WPILib/WPILib/Dashboard.cpp
@@ -29,7 +29,7 @@
 {
 	m_userStatusData = new char[kMaxDashboardDataSize];
 	m_localBuffer = new char[kMaxDashboardDataSize];
-	m_localPrintBuffer = new char[kMaxDashboardDataSize * 2];
+	m_localPrintBuffer = new char[kLocalPrintBufferSize];
 	m_localPrintBuffer[0] = 0;
 	m_packPtr = m_localBuffer;
 	m_printSemaphore = semMCreate(SEM_Q_PRIORITY | SEM_DELETE_SAFE | SEM_INVERSION_SAFE);
@@ -275,7 +275,7 @@
 	va_start (args, writeFmt);
 	{
 		Synchronized sync(m_printSemaphore);
-		vsprintf(m_localPrintBuffer + strlen(m_localPrintBuffer), writeFmt, args);
+		vsnprintf(m_localPrintBuffer + strlen(m_localPrintBuffer), kLocalPrintBufferSize - strlen(m_localPrintBuffer), writeFmt, args);
 		size = strlen(m_localPrintBuffer);
 	}
 	if (size > kMaxDashboardDataSize)
diff --git a/aos/externals/WPILib/WPILib/Dashboard.h b/aos/externals/WPILib/WPILib/Dashboard.h
index f80b274..bcd8f7b 100644
--- a/aos/externals/WPILib/WPILib/Dashboard.h
+++ b/aos/externals/WPILib/WPILib/Dashboard.h
@@ -50,6 +50,7 @@
 	void Flush() {}
 private:
 	static const int32_t kMaxDashboardDataSize = USER_STATUS_DATA_SIZE - sizeof(uint32_t) * 3 - sizeof(uint8_t); // 13 bytes needed for 3 size parameters and the sequence number
+  static const size_t kLocalPrintBufferSize = kMaxDashboardDataSize * 2;
 
 	// Usage Guidelines...
 	DISALLOW_COPY_AND_ASSIGN(Dashboard);
diff --git a/aos/externals/WPILib/WPILib/DigitalInput.cpp b/aos/externals/WPILib/WPILib/DigitalInput.cpp
index fed5710..0caaba7 100644
--- a/aos/externals/WPILib/WPILib/DigitalInput.cpp
+++ b/aos/externals/WPILib/WPILib/DigitalInput.cpp
@@ -10,9 +10,6 @@
 #include "Resource.h"
 #include "WPIErrors.h"
 
-// TODO: This is not a good place for this...
-Resource *interruptsResource = NULL;
-
 /**
  * Create an instance of a DigitalInput.
  * Creates a digital input given a slot and channel. Common creation routine
@@ -22,7 +19,6 @@
 {
 	m_table = NULL;
 	char buf[64];
-	Resource::CreateResourceObject(&interruptsResource, tInterrupt::kNumSystems);
 	if (!CheckDigitalModule(moduleNumber))
 	{
 		snprintf(buf, 64, "Digital Module %d", moduleNumber);
@@ -71,12 +67,6 @@
 DigitalInput::~DigitalInput()
 {
 	if (StatusIsFatal()) return;
-	if (m_manager != NULL)
-	{
-		delete m_manager;
-		delete m_interrupt;
-		interruptsResource->Free(m_interruptIndex);
-	}
 	m_module->FreeDIO(m_channel);
 }
 
@@ -123,83 +113,6 @@
 	return false;
 }
 
-/**
- * Request interrupts asynchronously on this digital input.
- * @param handler The address of the interrupt handler function of type tInterruptHandler that
- * will be called whenever there is an interrupt on the digitial input port.
- * Request interrupts in synchronus mode where the user program interrupt handler will be
- * called when an interrupt occurs.
- * The default is interrupt on rising edges only.
- */
-void DigitalInput::RequestInterrupts(tInterruptHandler handler, void *param)
-{
-	if (StatusIsFatal()) return;
-	uint32_t index = interruptsResource->Allocate("Async Interrupt");
-	if (index == ~0ul)
-	{
-		CloneError(interruptsResource);
-		return;
-	}
-	m_interruptIndex = index;
-
-	 // Creates a manager too
-	AllocateInterrupts(false);
-
-	tRioStatusCode localStatus = NiFpga_Status_Success;
-	m_interrupt->writeConfig_WaitForAck(false, &localStatus);
-	m_interrupt->writeConfig_Source_AnalogTrigger(GetAnalogTriggerForRouting(), &localStatus);
-	m_interrupt->writeConfig_Source_Channel(GetChannelForRouting(), &localStatus);
-	m_interrupt->writeConfig_Source_Module(GetModuleForRouting(), &localStatus);
-	SetUpSourceEdge(true, false);
-
-	m_manager->registerHandler(handler, param, &localStatus);
-	wpi_setError(localStatus);
-}
-
-/**
- * Request interrupts synchronously on this digital input.
- * Request interrupts in synchronus mode where the user program will have to explicitly
- * wait for the interrupt to occur.
- * The default is interrupt on rising edges only.
- */
-void DigitalInput::RequestInterrupts()
-{
-	if (StatusIsFatal()) return;
-	uint32_t index = interruptsResource->Allocate("Sync Interrupt");
-	if (index == ~0ul)
-	{
-		CloneError(interruptsResource);
-		return;
-	}
-	m_interruptIndex = index;
-
-	AllocateInterrupts(true);
-
-	tRioStatusCode localStatus = NiFpga_Status_Success;
-	m_interrupt->writeConfig_Source_AnalogTrigger(GetAnalogTriggerForRouting(), &localStatus);
-	m_interrupt->writeConfig_Source_Channel(GetChannelForRouting(), &localStatus);
-	m_interrupt->writeConfig_Source_Module(GetModuleForRouting(), &localStatus);
-	SetUpSourceEdge(true, false);
-	wpi_setError(localStatus);
-}
-
-void DigitalInput::SetUpSourceEdge(bool risingEdge, bool fallingEdge)
-{
-	if (StatusIsFatal()) return;
-	if (m_interrupt == NULL)
-	{
-		wpi_setWPIErrorWithContext(NullParameter, "You must call RequestInterrupts before SetUpSourceEdge");
-		return;
-	}
-	tRioStatusCode localStatus = NiFpga_Status_Success;
-	if (m_interrupt != NULL)
-	{
-		m_interrupt->writeConfig_RisingEdge(risingEdge, &localStatus);
-		m_interrupt->writeConfig_FallingEdge(fallingEdge, &localStatus);
-	}
-	wpi_setError(localStatus);
-}
-
 void DigitalInput::UpdateTable() {
 	if (m_table != NULL) {
 		m_table->PutBoolean("Value", Get());
diff --git a/aos/externals/WPILib/WPILib/DigitalInput.h b/aos/externals/WPILib/WPILib/DigitalInput.h
index 8c7e988..b9d77f7 100644
--- a/aos/externals/WPILib/WPILib/DigitalInput.h
+++ b/aos/externals/WPILib/WPILib/DigitalInput.h
@@ -32,11 +32,6 @@
 	virtual uint32_t GetModuleForRouting();
 	virtual bool GetAnalogTriggerForRouting();
 	
-	// Interruptable Interface
-	virtual void RequestInterrupts(tInterruptHandler handler, void *param=NULL); ///< Asynchronus handler version.
-	virtual void RequestInterrupts();		///< Synchronus Wait version.
-	void SetUpSourceEdge(bool risingEdge, bool fallingEdge);
-
 	void UpdateTable();
 	void StartLiveWindowMode();
 	void StopLiveWindowMode();
diff --git a/aos/externals/WPILib/WPILib/DigitalModule.cpp b/aos/externals/WPILib/WPILib/DigitalModule.cpp
index c2844d8..61fa6f6 100644
--- a/aos/externals/WPILib/WPILib/DigitalModule.cpp
+++ b/aos/externals/WPILib/WPILib/DigitalModule.cpp
@@ -64,7 +64,7 @@
 	if (m_fpgaDIO->readLoopTiming(&localStatus) != kExpectedLoopTiming)
 	{
 		char err[128];
-		sprintf(err, "DIO LoopTiming: %d, expecting: %lu\n", m_fpgaDIO->readLoopTiming(&localStatus), kExpectedLoopTiming);
+		snprintf(err, sizeof(err), "DIO LoopTiming: %d, expecting: %lu\n", m_fpgaDIO->readLoopTiming(&localStatus), kExpectedLoopTiming);
 		wpi_setWPIErrorWithContext(LoopTimingError, err);
 	}
 	
@@ -159,18 +159,7 @@
  */
 void DigitalModule::SetRelayForward(uint32_t channel, bool on)
 {
-	tRioStatusCode localStatus = NiFpga_Status_Success;
-	CheckRelayChannel(channel);
-	{
-		Synchronized sync(m_relaySemaphore);
-		uint8_t forwardRelays = m_fpgaDIO->readSlowValue_RelayFwd(&localStatus);
-		if (on)
-			forwardRelays |= 1 << (channel - 1);
-		else
-			forwardRelays &= ~(1 << (channel - 1));
-		m_fpgaDIO->writeSlowValue_RelayFwd(forwardRelays, &localStatus);
-	}
-	wpi_setError(localStatus);
+  SetRelaysForward(1 << (channel - 1), on ? 0xFF : 0x00);
 }
 
 /**
@@ -180,18 +169,47 @@
  */
 void DigitalModule::SetRelayReverse(uint32_t channel, bool on)
 {
-	tRioStatusCode localStatus = NiFpga_Status_Success;
-	CheckRelayChannel(channel);
-	{
-		Synchronized sync(m_relaySemaphore);
-		uint8_t reverseRelays = m_fpgaDIO->readSlowValue_RelayRev(&localStatus);
-		if (on)
-			reverseRelays |= 1 << (channel - 1);
-		else
-			reverseRelays &= ~(1 << (channel - 1));
-		m_fpgaDIO->writeSlowValue_RelayRev(reverseRelays, &localStatus);
-	}
-	wpi_setError(localStatus);
+  SetRelaysReverse(1 << (channel - 1), on ? 0xFF : 0x00);
+}
+
+/**
+ * Set the state of multiple relays at the same time.
+ * For both parameters, 0b100000000 is channel 1 and 0b00000001 is channel 8.
+ * @param mask which relays to set
+ * @param values what to set the relays to
+ */
+void DigitalModule::SetRelaysForward(uint8_t mask, uint8_t values) {
+  tRioStatusCode localStatus = NiFpga_Status_Success;
+  {
+    Synchronized sync(m_relaySemaphore);
+    uint8_t current = m_fpgaDIO->readSlowValue_RelayFwd(&localStatus);
+    // Clearr all of the bits that we're messing with first.
+    current &= ~mask;
+    // Then set only the ones that are supposed to be set.
+    current |= (mask & values);
+    m_fpgaDIO->writeSlowValue_RelayFwd(current, &localStatus);
+  }
+  wpi_setError(localStatus);
+}
+
+/**
+ * Set the state of multiple relays at the same time.
+ * For both parameters, 0b100000000 is channel 1 and 0b00000001 is channel 8.
+ * @param mask which relays to set
+ * @param values what to set the relays to
+ */
+void DigitalModule::SetRelaysReverse(uint8_t mask, uint8_t values) {
+  tRioStatusCode localStatus = NiFpga_Status_Success;
+  {
+    Synchronized sync(m_relaySemaphore);
+    uint8_t current = m_fpgaDIO->readSlowValue_RelayRev(&localStatus);
+    // Clearr all of the bits that we're messing with first.
+    current &= ~mask;
+    // Then set only the ones that are supposed to be set.
+    current |= (mask & values);
+    m_fpgaDIO->writeSlowValue_RelayRev(current, &localStatus);
+  }
+  wpi_setError(localStatus);
 }
 
 /**
@@ -253,7 +271,8 @@
 {
 	char buf[64];
 	snprintf(buf, 64, "DIO %d (Module %d)", channel, m_moduleNumber);
-	if (DIOChannels->Allocate(kDigitalChannels * (m_moduleNumber - 1) + channel - 1, buf) == ~0ul) return false;
+	if (DIOChannels->Allocate(kDigitalChannels * (m_moduleNumber - 1) +
+                            channel - 1, buf, this) == ~0ul) return false;
 	tRioStatusCode localStatus = NiFpga_Status_Success;
 	{
 		Synchronized sync(m_digitalSemaphore);
@@ -281,7 +300,29 @@
  */
 void DigitalModule::FreeDIO(uint32_t channel)
 {
-	DIOChannels->Free(kDigitalChannels * (m_moduleNumber - 1) + channel - 1);
+	DIOChannels->Free(kDigitalChannels * (m_moduleNumber - 1) + channel - 1,
+                    this);
+}
+
+/**
+ * Write multiple digital I/O bits to the FPGA at the same time.
+ * For both parameters, 0x0001 is channel 16 and 0x8000 is channel 1.
+ *
+ * @param mask Which bits to modify.
+ * @param values What to set all of the bits in mask to.
+ */
+void DigitalModule::SetDIOs(uint16_t mask, uint16_t values) {
+  tRioStatusCode localStatus = NiFpga_Status_Success;
+  {
+    Synchronized sync(m_digitalSemaphore);
+    uint16_t current = m_fpgaDIO->readDO(&localStatus);
+    // Clear all of the bits that we're messing with first.
+    current &= ~mask;
+    // Then set only the ones that are supposed to be set.
+    current |= (mask & values);
+    m_fpgaDIO->writeDO(current, &localStatus);
+  }
+  wpi_setError(localStatus);
 }
 
 /**
@@ -291,29 +332,9 @@
  * @param channel The Digital I/O channel
  * @param value The state to set the digital channel (if it is configured as an output)
  */
-void DigitalModule::SetDIO(uint32_t channel, short value)
+void DigitalModule::SetDIO(uint32_t channel, bool value)
 {
-	if (value != 0 && value != 1)
-	{
-		wpi_setWPIError(NonBinaryDigitalValue);
-		if (value != 0)
-			value = 1;
-	}
-	tRioStatusCode localStatus = NiFpga_Status_Success;
-	{
-		Synchronized sync(m_digitalSemaphore);
-		uint16_t currentDIO = m_fpgaDIO->readDO(&localStatus);
-		if(value == 0)
-		{
-			currentDIO = currentDIO & ~(1 << RemapDigitalChannel(channel - 1));
-		}
-		else if (value == 1)
-		{
-			currentDIO = currentDIO | (1 << RemapDigitalChannel(channel - 1));
-		} 
-		m_fpgaDIO->writeDO(currentDIO, &localStatus);
-	}
-	wpi_setError(localStatus);
+  SetDIOs(1 << RemapDigitalChannel(channel - 1), value ? 0xFFFF : 0x0000);
 }
 
 /**
@@ -426,7 +447,7 @@
 
 /**
  * Allocate a DO PWM Generator.
- * Allocate PWM generators so that they are not accidently reused.
+ * Allocate PWM generators so that they are not accidentally reused.
  * 
  * @return PWM Generator refnum
  */
@@ -434,7 +455,7 @@
 {
 	char buf[64];
 	snprintf(buf, 64, "DO_PWM (Module: %d)", m_moduleNumber);
-	return DO_PWMGenerators[(m_moduleNumber - 1)]->Allocate(buf);
+	return DO_PWMGenerators[(m_moduleNumber - 1)]->Allocate(buf, this);
 }
 
 /**
@@ -445,7 +466,7 @@
 void DigitalModule::FreeDO_PWM(uint32_t pwmGenerator)
 {
 	if (pwmGenerator == ~0ul) return;
-	DO_PWMGenerators[(m_moduleNumber - 1)]->Free(pwmGenerator);
+	DO_PWMGenerators[(m_moduleNumber - 1)]->Free(pwmGenerator, this);
 }
 
 /**
@@ -466,7 +487,7 @@
 }
 
 /**
- * Configure which DO channel the PWM siganl is output on
+ * Configure which DO channel the PWM signal is output on
  * 
  * @param pwmGenerator The generator index reserved by AllocateDO_PWM()
  * @param channel The Digital Output channel to output on
diff --git a/aos/externals/WPILib/WPILib/DigitalModule.h b/aos/externals/WPILib/WPILib/DigitalModule.h
index 2231f1c..86189b9 100644
--- a/aos/externals/WPILib/WPILib/DigitalModule.h
+++ b/aos/externals/WPILib/WPILib/DigitalModule.h
@@ -29,13 +29,16 @@
 	void SetPWMPeriodScale(uint32_t channel, uint32_t squelchMask);
 	void SetRelayForward(uint32_t channel, bool on);
 	void SetRelayReverse(uint32_t channel, bool on);
+  void SetRelaysForward(uint8_t mask, uint8_t values);
+  void SetRelaysReverse(uint8_t mask, uint8_t values);
 	bool GetRelayForward(uint32_t channel);
 	uint8_t GetRelayForward();
 	bool GetRelayReverse(uint32_t channel);
 	uint8_t GetRelayReverse();
 	bool AllocateDIO(uint32_t channel, bool input);
 	void FreeDIO(uint32_t channel);
-	void SetDIO(uint32_t channel, short value);
+  void SetDIOs(uint16_t mask, uint16_t values);
+	void SetDIO(uint32_t channel, bool value);
 	bool GetDIO(uint32_t channel);
 	uint16_t GetDIO();
 	bool GetDIODirection(uint32_t channel);
diff --git a/aos/externals/WPILib/WPILib/DigitalOutput.cpp b/aos/externals/WPILib/WPILib/DigitalOutput.cpp
index 6e71041..06b9c48 100644
--- a/aos/externals/WPILib/WPILib/DigitalOutput.cpp
+++ b/aos/externals/WPILib/WPILib/DigitalOutput.cpp
@@ -215,10 +215,9 @@
 void DigitalOutput::RequestInterrupts(tInterruptHandler handler, void *param)
 {
 	if (StatusIsFatal()) return;
-	uint32_t index = interruptsResource->Allocate("Sync Interrupt");
+	uint32_t index = interruptsResource->Allocate("Sync Interrupt", this);
 	if (index == ~0ul)
 	{
-		CloneError(interruptsResource);
 		return;
 	}
 	m_interruptIndex = index;
@@ -246,10 +245,9 @@
 void DigitalOutput::RequestInterrupts()
 {
 	if (StatusIsFatal()) return;
-	uint32_t index = interruptsResource->Allocate("Sync Interrupt");
+	uint32_t index = interruptsResource->Allocate("Sync Interrupt", this);
 	if (index == ~0ul)
 	{
-		CloneError(interruptsResource);
 		return;
 	}
 	m_interruptIndex = index;
diff --git a/aos/externals/WPILib/WPILib/DigitalSource.cpp b/aos/externals/WPILib/WPILib/DigitalSource.cpp
index 40cc75c..00244e4 100644
--- a/aos/externals/WPILib/WPILib/DigitalSource.cpp
+++ b/aos/externals/WPILib/WPILib/DigitalSource.cpp
@@ -5,10 +5,100 @@
 /*----------------------------------------------------------------------------*/
 
 #include "DigitalSource.h"
+#include "Resource.h"
+#include "WPIErrors.h"
+
+Resource *interruptsResource = NULL;
+
+DigitalSource::DigitalSource()
+{
+	Resource::CreateResourceObject(&interruptsResource, tInterrupt::kNumSystems);
+}
 
 /**
  * DigitalSource destructor.
  */
 DigitalSource::~DigitalSource()
 {
+	if (m_manager != NULL)
+	{
+		delete m_manager;
+		delete m_interrupt;
+		interruptsResource->Free(m_interruptIndex, this);
+	}
+}
+
+/**
+ * Request interrupts asynchronously on this digital input.
+ * @param handler The address of the interrupt handler function of type tInterruptHandler that
+ * will be called whenever there is an interrupt on the digitial input port.
+ * Request interrupts in synchronus mode where the user program interrupt handler will be
+ * called when an interrupt occurs.
+ * The default is interrupt on rising edges only.
+ */
+void DigitalSource::RequestInterrupts(tInterruptHandler handler, void *param)
+{
+	if (StatusIsFatal()) return;
+	uint32_t index = interruptsResource->Allocate("Async Interrupt", this);
+	if (index == ~0ul)
+	{
+		return;
+	}
+	m_interruptIndex = index;
+
+	 // Creates a manager too
+	AllocateInterrupts(false);
+
+	tRioStatusCode localStatus = NiFpga_Status_Success;
+	m_interrupt->writeConfig_WaitForAck(false, &localStatus);
+	m_interrupt->writeConfig_Source_AnalogTrigger(GetAnalogTriggerForRouting(), &localStatus);
+	m_interrupt->writeConfig_Source_Channel(GetChannelForRouting(), &localStatus);
+	m_interrupt->writeConfig_Source_Module(GetModuleForRouting(), &localStatus);
+	SetUpSourceEdge(true, false);
+
+	m_manager->registerHandler(handler, param, &localStatus);
+	wpi_setError(localStatus);
+}
+
+/**
+ * Request interrupts synchronously on this digital input.
+ * Request interrupts in synchronus mode where the user program will have to explicitly
+ * wait for the interrupt to occur.
+ * The default is interrupt on rising edges only.
+ */
+void DigitalSource::RequestInterrupts()
+{
+	if (StatusIsFatal()) return;
+	uint32_t index = interruptsResource->Allocate("Sync Interrupt", this);
+	if (index == ~0ul)
+	{
+		return;
+	}
+	m_interruptIndex = index;
+
+	AllocateInterrupts(true);
+
+	tRioStatusCode localStatus = NiFpga_Status_Success;
+	m_interrupt->writeConfig_Source_AnalogTrigger(GetAnalogTriggerForRouting(), &localStatus);
+	m_interrupt->writeConfig_Source_Channel(GetChannelForRouting(), &localStatus);
+	m_interrupt->writeConfig_Source_Module(GetModuleForRouting(), &localStatus);
+	SetUpSourceEdge(true, false);
+	wpi_setError(localStatus);
+}
+
+void DigitalSource::SetUpSourceEdge(bool risingEdge, bool fallingEdge)
+{
+	if (StatusIsFatal()) return;
+	if (m_interrupt == NULL)
+	{
+		wpi_setWPIErrorWithContext(NullParameter, "You must call RequestInterrupts before SetUpSourceEdge");
+		return;
+	}
+	tRioStatusCode localStatus = NiFpga_Status_Success;
+	if (m_interrupt != NULL)
+	{
+		m_interrupt->writeConfig_RisingEdge(risingEdge, &localStatus);
+		m_interrupt->writeConfig_FallingEdge(fallingEdge, &localStatus);
+	}
+	wpi_setError(localStatus);
 }
diff --git a/aos/externals/WPILib/WPILib/DigitalSource.h b/aos/externals/WPILib/WPILib/DigitalSource.h
index a3f7b23..d5d7e7d 100644
--- a/aos/externals/WPILib/WPILib/DigitalSource.h
+++ b/aos/externals/WPILib/WPILib/DigitalSource.h
@@ -19,12 +19,14 @@
 class DigitalSource: public InterruptableSensorBase
 {
 public:
+ DigitalSource();
 	virtual ~DigitalSource();
 	virtual uint32_t GetChannelForRouting() = 0;
 	virtual uint32_t GetModuleForRouting() = 0;
 	virtual bool GetAnalogTriggerForRouting() = 0;
-	virtual void RequestInterrupts(tInterruptHandler handler, void *param) = 0;
-	virtual void RequestInterrupts() = 0;
+	virtual void RequestInterrupts(tInterruptHandler handler, void *param);
+	virtual void RequestInterrupts();
+	void SetUpSourceEdge(bool risingEdge, bool fallingEdge);
 };
 
 #endif
diff --git a/aos/externals/WPILib/WPILib/DoubleSolenoid.cpp b/aos/externals/WPILib/WPILib/DoubleSolenoid.cpp
index e1e432d..19ef5b7 100644
--- a/aos/externals/WPILib/WPILib/DoubleSolenoid.cpp
+++ b/aos/externals/WPILib/WPILib/DoubleSolenoid.cpp
@@ -38,15 +38,15 @@
 	Resource::CreateResourceObject(&m_allocated, tSolenoid::kNumDO7_0Elements * kSolenoidChannels);
 
 	snprintf(buf, 64, "Solenoid %d (Module %d)", m_forwardChannel, m_moduleNumber);
-	if (m_allocated->Allocate((m_moduleNumber - 1) * kSolenoidChannels + m_forwardChannel - 1, buf) == ~0ul)
+	if (m_allocated->Allocate((m_moduleNumber - 1) * kSolenoidChannels +
+                            m_forwardChannel - 1, buf, this) == ~0ul)
 	{
-		CloneError(m_allocated);
 		return;
 	}
 	snprintf(buf, 64, "Solenoid %d (Module %d)", m_reverseChannel, m_moduleNumber);
-	if (m_allocated->Allocate((m_moduleNumber - 1) * kSolenoidChannels + m_reverseChannel - 1, buf) == ~0ul)
+	if (m_allocated->Allocate((m_moduleNumber - 1) * kSolenoidChannels +
+                            m_reverseChannel - 1, buf, this) == ~0ul)
 	{
-		CloneError(m_allocated);
 		return;
 	}
 	m_forwardMask = 1 << (m_forwardChannel - 1);
@@ -91,11 +91,10 @@
  */
 DoubleSolenoid::~DoubleSolenoid()
 {
-	if (CheckSolenoidModule(m_moduleNumber))
-	{
-		m_allocated->Free((m_moduleNumber - 1) * kSolenoidChannels + m_forwardChannel - 1);
-		m_allocated->Free((m_moduleNumber - 1) * kSolenoidChannels + m_reverseChannel - 1);
-	}
+	m_allocated->Free((m_moduleNumber - 1) * kSolenoidChannels +
+                    m_forwardChannel - 1, this);
+	m_allocated->Free((m_moduleNumber - 1) * kSolenoidChannels +
+                    m_reverseChannel - 1, this);
 }
 
 /**
diff --git a/aos/externals/WPILib/WPILib/DoubleSolenoid.h b/aos/externals/WPILib/WPILib/DoubleSolenoid.h
index 91315d7..09c8c90 100644
--- a/aos/externals/WPILib/WPILib/DoubleSolenoid.h
+++ b/aos/externals/WPILib/WPILib/DoubleSolenoid.h
@@ -38,7 +38,7 @@
 	ITable * GetTable();
 
 private:
-	virtual void InitSolenoid();
+	void InitSolenoid();
 
 	uint32_t m_forwardChannel; ///< The forward channel on the module to control.
 	uint32_t m_reverseChannel; ///< The reverse channel on the module to control.
diff --git a/aos/externals/WPILib/WPILib/DriverStation.cpp b/aos/externals/WPILib/WPILib/DriverStation.cpp
index 676ce77..dfd92c0 100644
--- a/aos/externals/WPILib/WPILib/DriverStation.cpp
+++ b/aos/externals/WPILib/WPILib/DriverStation.cpp
@@ -19,8 +19,8 @@
 const uint32_t DriverStation::kBatteryChannel;
 const uint32_t DriverStation::kJoystickPorts;
 const uint32_t DriverStation::kJoystickAxes;
-constexpr float DriverStation::kUpdatePeriod;
 DriverStation* DriverStation::m_instance = NULL;
+ReentrantSemaphore DriverStation::m_instanceSemaphore;
 uint8_t DriverStation::m_updateNumber = 0;
 
 /**
@@ -58,32 +58,7 @@
 
 	m_waitForDataSem = semBCreate (SEM_Q_PRIORITY, SEM_EMPTY);
 
-	m_controlData = new FRCCommonControlData;
-
-	// initialize packet number and control words to zero;
-	m_controlData->packetIndex = 0;
-	m_controlData->control = 0;
-
-	// set all joystick axis values to neutral; buttons to OFF
-	m_controlData->stick0Axis1 = m_controlData->stick0Axis2 = m_controlData->stick0Axis3 = 0;
-	m_controlData->stick1Axis1 = m_controlData->stick1Axis2 = m_controlData->stick1Axis3 = 0;
-	m_controlData->stick2Axis1 = m_controlData->stick2Axis2 = m_controlData->stick2Axis3 = 0;
-	m_controlData->stick3Axis1 = m_controlData->stick3Axis2 = m_controlData->stick3Axis3 = 0;
-	m_controlData->stick0Axis4 = m_controlData->stick0Axis5 = m_controlData->stick0Axis6 = 0;
-	m_controlData->stick1Axis4 = m_controlData->stick1Axis5 = m_controlData->stick1Axis6 = 0;
-	m_controlData->stick2Axis4 = m_controlData->stick2Axis5 = m_controlData->stick2Axis6 = 0;
-	m_controlData->stick3Axis4 = m_controlData->stick3Axis5 = m_controlData->stick3Axis6 = 0;
-	m_controlData->stick0Buttons = 0;
-	m_controlData->stick1Buttons = 0;
-	m_controlData->stick2Buttons = 0;
-	m_controlData->stick3Buttons = 0;
-
-	// initialize the analog and digital data.
-	m_controlData->analog1 = 0;
-	m_controlData->analog2 = 0;
-	m_controlData->analog3 = 0;
-	m_controlData->analog4 = 0;
-	m_controlData->dsDigitalIn = 0;
+	m_controlData = new FRCCommonControlData();
 
 	m_batteryChannel = new AnalogChannel(kBatteryModuleNumber, kBatteryChannel);
 
@@ -97,6 +72,7 @@
 
 DriverStation::~DriverStation()
 {
+  Synchronized sync(m_instanceSemaphore);
 	m_task.Stop();
 	semDelete(m_statusDataSemaphore);
 	delete m_batteryChannel;
@@ -106,6 +82,15 @@
 	// Unregister our semaphore.
 	setNewDataSem(0);
 	semDelete(m_packetDataAvailableSem);
+  semDelete(m_newControlData);
+}
+
+/**
+ * Gets a read lock on all of the data. Be careful with this; holding one of
+ * these locks prevents any new data from being read.
+ */
+RWLock::Locker DriverStation::GetDataReadLock() {
+  return RWLock::Locker(&m_dataLock, false);
 }
 
 void DriverStation::InitTask(DriverStation *ds)
@@ -113,6 +98,9 @@
 	ds->Run();
 }
 
+/**
+ * Gets called in a separate task to deal with actually reading any new data.
+ */
 void DriverStation::Run()
 {
 	int period = 0;
@@ -128,14 +116,17 @@
 			MotorSafetyHelper::CheckMotors();
 			period = 0;
 		}
-		if (m_userInDisabled)
-			FRC_NetworkCommunication_observeUserProgramDisabled();
-		if (m_userInAutonomous)
-			FRC_NetworkCommunication_observeUserProgramAutonomous();
-        if (m_userInTeleop)
-            FRC_NetworkCommunication_observeUserProgramTeleop();
-        if (m_userInTest)
-            FRC_NetworkCommunication_observeUserProgramTest();
+    {
+      RWLock::Locker userStateLocker(&m_userStateLock, false);
+		  if (m_userInDisabled)
+			  FRC_NetworkCommunication_observeUserProgramDisabled();
+		  if (m_userInAutonomous)
+			  FRC_NetworkCommunication_observeUserProgramAutonomous();
+      if (m_userInTeleop)
+        FRC_NetworkCommunication_observeUserProgramTeleop();
+      if (m_userInTest)
+        FRC_NetworkCommunication_observeUserProgramTest();
+    }
 	}
 }
 
@@ -144,6 +135,7 @@
  */
 DriverStation* DriverStation::GetInstance()
 {
+  Synchronized sync(m_instanceSemaphore);
 	if (m_instance == NULL)
 	{
 		m_instance = new DriverStation();
@@ -152,14 +144,18 @@
 }
 
 /**
- * Copy data from the DS task for the user.
- * If no new data exists, it will just be returned, otherwise
- * the data will be copied from the DS polling loop.
+ * Copy data from the DS task for the rest of the code to use.
  */
 void DriverStation::GetData()
 {
 	static bool lastEnabled = false;
-	getCommonControlData(m_controlData, WAIT_FOREVER);
+  {
+    // Only have to lock right around reading the data because we're the only
+    // task that ever modifies it.
+    RWLock::Locker write_lock(&m_dataLock, true);
+	  // Have to const_cast away the volatile and the const.
+	  getCommonControlData(const_cast<FRCCommonControlData *>(m_controlData), WAIT_FOREVER);
+  }
 	if (!lastEnabled && IsEnabled()) 
 	{
 		// If starting teleop, assume that autonomous just took up 15 seconds
@@ -177,7 +173,7 @@
 }
 
 /**
- * Copy status data from the DS task for the user.
+ * Copy status data to the DS task from the user.
  */
 void DriverStation::SetData()
 {
@@ -308,6 +304,7 @@
 	if (channel < 1 || channel > 4)
 		wpi_setWPIErrorWithContext(ParameterOutOfRange, "channel must be between 1 and 4");
 
+	// TODO: Fix the lack of thread safety here (for reported_mask).
 	static uint8_t reported_mask = 0;
 	if (!(reported_mask & (1 >> channel)))
 	{
@@ -340,6 +337,7 @@
 	if (channel < 1 || channel > 8)
 		wpi_setWPIErrorWithContext(ParameterOutOfRange, "channel must be between 1 and 8");
 
+	// TODO: Fix the lack of thread safety here (for reported_mask).
 	static uint8_t reported_mask = 0;
 	if (!(reported_mask & (1 >> channel)))
 	{
@@ -364,6 +362,8 @@
 	if (channel < 1 || channel > 8)
 		wpi_setWPIErrorWithContext(ParameterOutOfRange, "channel must be between 1 and 8");
 
+	// TODO: Fix the lack of thread safety here (for both reported_mask and
+  // m_digitalOut).
 	static uint8_t reported_mask = 0;
 	if (!(reported_mask & (1 >> channel)))
 	{
@@ -388,35 +388,76 @@
 	return ((m_digitalOut >> (channel-1)) & 0x1) ? true : false;;
 }
 
+/**
+ * @return Whether or not the robot is currently enabled by the field controls.
+ */
 bool DriverStation::IsEnabled()
 {
 	return m_controlData->enabled;
 }
 
+/**
+ * @return Whether or not the robot is currently disabled by the field controls.
+ */
 bool DriverStation::IsDisabled()
 {
 	return !m_controlData->enabled;
 }
 
+/**
+ * Determines if the robot is currently in autonomous mode. Does not check
+ * whether the robot is enabled.
+ * @return Whether or not the robot is currently in autonomous mode.
+ */
 bool DriverStation::IsAutonomous()
 {
 	return m_controlData->autonomous;
 }
 
+/**
+ * Determines if the robot is currently in teleoperated mode. Does not check
+ * whether the robot is enabled.
+ * @return Whether or not the robot is currently in teleoperated mode.
+ */
 bool DriverStation::IsOperatorControl()
 {
+  RWLock::Locker data_locker(GetDataReadLock());
 	return !(m_controlData->autonomous || m_controlData->test);
 }
 
+/**
+ * Determines if the robot is currently in test mode. Does not check
+ * whether the robot is enabled.
+ * @return Whether or not the robot is currently in test mode.
+ */
 bool DriverStation::IsTest()
 {
 	return m_controlData->test;
 }
 
 /**
+ * @return What state the robot is currently in.
+ */
+DriverStation::FMSState DriverStation::GetCurrentState() {
+  RWLock::Locker data_locker(GetDataReadLock());
+  if (IsDisabled()) {
+    return FMSState::kDisabled;
+    // Or else it must be enabled (for all of the other ones).
+  } else if (IsAutonomous()) {
+    return FMSState::kAutonomous;
+  } else if (IsTest()) {
+    return FMSState::kTestMode;
+  } else {  // IsOperatorControl() has to return true now
+    return FMSState::kTeleop;
+  }
+}
+
+/**
  * Has a new control packet from the driver station arrived since the last time this function was called?
  * Warning: If you call this function from more than one place at the same time,
- * you will not get the get the intended behavior
+ * you will not get the get the intended behavior unless that behavior is
+ * exactly 1 of the places that you call it from getting a true after a packet
+ * arrives.
  * @return True if the control data has been updated since the last call.
  */
 bool DriverStation::IsNewControlData()
@@ -437,7 +478,6 @@
 /**
  * Return the DS packet number.
  * The packet number is the index of this set of data returned by the driver station.
- * Each time new data is received, the packet number (included with the sent data) is returned.
  * @return The driver station packet number
  */
 uint32_t DriverStation::GetPacketNumber()
@@ -447,13 +487,14 @@
 
 /**
  * Return the alliance that the driver station says it is on.
- * This could return kRed or kBlue
  * @return The Alliance enum
  */
 DriverStation::Alliance DriverStation::GetAlliance()
 {
-	if (m_controlData->dsID_Alliance == 'R') return kRed;
-	if (m_controlData->dsID_Alliance == 'B') return kBlue;
+  // Read it first to make sure that it doesn't change in between the checks.
+  char alliance = m_controlData->dsID_Alliance;
+	if (alliance == 'R') return kRed;
+	if (alliance == 'B') return kBlue;
 	wpi_assert(false);
 	return kInvalid;
 }
@@ -465,8 +506,9 @@
  */
 uint32_t DriverStation::GetLocation()
 {
-	wpi_assert ((m_controlData->dsID_Position >= '1') && (m_controlData->dsID_Position <= '3'));
-	return m_controlData->dsID_Position - '0';
+  char position = m_controlData->dsID_Position;
+	wpi_assert ((position >= '1') && (position <= '3'));
+	return position - '0';
 }
 
 /**
diff --git a/aos/externals/WPILib/WPILib/DriverStation.h b/aos/externals/WPILib/WPILib/DriverStation.h
index 3cf686c..cc00819 100644
--- a/aos/externals/WPILib/WPILib/DriverStation.h
+++ b/aos/externals/WPILib/WPILib/DriverStation.h
@@ -11,6 +11,9 @@
 #include "DriverStationEnhancedIO.h"
 #include "SensorBase.h"
 #include "Task.h"
+#include "Synchronized.h"
+#include "RWLock.h"
+#include "Base.h"
 
 struct FRCCommonControlData;
 class AnalogChannel;
@@ -23,14 +26,35 @@
 public:
 	enum Alliance {kRed, kBlue, kInvalid};
 
-	virtual ~DriverStation();
+  // Represents all of the states that FMS thinks of a robot as being in.
+  // NOTE: All of the ones except kDisabled mean that the robot is enabled too.
+  enum FMSState {
+    kDisabled,
+    kAutonomous,
+    kTeleop,
+    kTestMode,
+  };
+
 	static DriverStation *GetInstance();
 
+  RWLock::Locker GetDataReadLock();
+
 	static const uint32_t kBatteryModuleNumber = 1;
 	static const uint32_t kBatteryChannel = 8;
 	static const uint32_t kJoystickPorts = 4;
 	static const uint32_t kJoystickAxes = 6;
 
+  /**
+   * Returns the pointer to all of the data. This pointer will never change, but
+   * its contents will, so make sure to GetDataReadLock() if you want to make
+   * sure that it doesn't change while you're using it.
+   *
+   * You may NOT modify the contents!
+   */
+  const volatile struct FRCCommonControlData *GetControlData() {
+    return m_controlData;
+  }
+
 	float GetStickAxis(uint32_t stick, uint32_t axis);
 	short GetStickButtons(uint32_t stick);
 
@@ -41,9 +65,10 @@
 
 	bool IsEnabled();
 	bool IsDisabled();
-    bool IsAutonomous();
+  bool IsAutonomous();
 	bool IsOperatorControl();
-    bool IsTest();
+  bool IsTest();
+  FMSState GetCurrentState();
 	bool IsNewControlData();
 	bool IsFMSAttached();
 
@@ -93,23 +118,49 @@
      *   for diagnostic purposes only
      * @param entering If true, starting test code; if false, leaving test code */
     void InTest(bool entering) {m_userInTest=entering;}
+  /**
+   * Get a pointer to the lock used for the data set by the In* methods.
+   * Creating write locks on this is useful if you want to atomically modify the
+   * information about what code you claim to be executing.
+   * @return A pointer to the lock. Be aware that the code that looks at this
+   * state (using a read lock) runs after the code that reads new packets and
+   * must finish before a new one can be read.
+   * @see #InDisabled(bool)
+   * @see #InAutonomous(bool)
+   * @see #InOperatorControl(bool)
+   * @see #InTest(bool)
+   */
+  RWLock *GetUserStateLock() { return &m_userStateLock; }
 
 protected:
 	DriverStation();
+	virtual ~DriverStation();
 
 	void GetData();
 	void SetData();
 
 private:
-	static void InitTask(DriverStation *ds);
 	static DriverStation *m_instance;
+  static ReentrantSemaphore m_instanceSemaphore;
 	static uint8_t m_updateNumber;
 	///< TODO: Get rid of this and use the semaphore signaling
 	static constexpr float kUpdatePeriod = 0.02;
 
+	static void InitTask(DriverStation *ds);
 	void Run();
 
-	struct FRCCommonControlData *m_controlData;
+  // Volatile because it gets modified by GetData() in a separate task. Be
+  // careful using values out of here (2-byte and 4-byte accesses are safe as
+  // long as they're aligned, which all of the ones in here should be). If you
+  // need consistent data, use m_dataLock.
+  // Const because it should never be modifed except by getCommonControlData,
+  // and that call has to const_cast away the volatile anyways.
+  const volatile struct FRCCommonControlData *m_controlData;
+  // A lock for *m_controlData.
+  // Read (not write) RWLock::Lockers for this get given out to users so that
+  // they can prevent updates to the data while they are doing stuff with it.
+  RWLock m_dataLock;
+
 	uint8_t m_digitalOut;
 	AnalogChannel *m_batteryChannel;
 	SEM_ID m_statusDataSemaphore;
@@ -118,15 +169,24 @@
 	Dashboard m_dashboardLow;
 	DashboardBase* m_dashboardInUseHigh;  // the current dashboard packers in use
 	DashboardBase* m_dashboardInUseLow;
+  // Used to indicate when there is new control data available for
+  // IsNewControlData(). A semaphore instead of just a bool to avoid race
+  // conditions resulting in missed packets.
 	SEM_ID m_newControlData;
 	SEM_ID m_packetDataAvailableSem;
 	DriverStationEnhancedIO m_enhancedIO;
+  // Always empty. Gets semFlushed when there is new data available so that
+  // multiple tasks waiting for it can be woken at the same time.
 	SEM_ID m_waitForDataSem;
 	double m_approxMatchTimeOffset;
+
+  RWLock m_userStateLock;
 	bool m_userInDisabled;
 	bool m_userInAutonomous;
     bool m_userInTeleop;
     bool m_userInTest;
+
+  DISALLOW_COPY_AND_ASSIGN(DriverStation);
 };
 
 #endif
diff --git a/aos/externals/WPILib/WPILib/DriverStationLCD.h b/aos/externals/WPILib/WPILib/DriverStationLCD.h
index b36af83..ebdf6bc 100644
--- a/aos/externals/WPILib/WPILib/DriverStationLCD.h
+++ b/aos/externals/WPILib/WPILib/DriverStationLCD.h
@@ -25,7 +25,6 @@
 	static const int32_t kNumLines = 6;
 	enum Line {kMain_Line6=0, kUser_Line1=0, kUser_Line2=1, kUser_Line3=2, kUser_Line4=3, kUser_Line5=4, kUser_Line6=5};
 
-	virtual ~DriverStationLCD();
 	static DriverStationLCD *GetInstance();
 
 	void UpdateLCD();
@@ -38,6 +37,7 @@
 
 protected:
 	DriverStationLCD();
+	virtual ~DriverStationLCD();
 
 private:
 	static void InitTask(DriverStationLCD *ds);
diff --git a/aos/externals/WPILib/WPILib/Encoder.cpp b/aos/externals/WPILib/WPILib/Encoder.cpp
index 8e3fd8a..941b8cc 100644
--- a/aos/externals/WPILib/WPILib/Encoder.cpp
+++ b/aos/externals/WPILib/WPILib/Encoder.cpp
@@ -28,48 +28,38 @@
 	m_table = NULL;
 	m_encodingType = encodingType;
 	tRioStatusCode localStatus = NiFpga_Status_Success;
-	switch (encodingType)
-	{
-		case k4X:
+  if (encodingType == k4X) {
+		Resource::CreateResourceObject(&quadEncoders, tEncoder::kNumSystems);
+		uint32_t index = quadEncoders->Allocate("4X Encoder", this);
+		if (index == ~0ul)
 		{
-			Resource::CreateResourceObject(&quadEncoders, tEncoder::kNumSystems);
-			uint32_t index = quadEncoders->Allocate("4X Encoder");
-			if (index == ~0ul)
-			{
-				CloneError(quadEncoders);
-				return;
-			}
-			if (m_aSource->StatusIsFatal())
-			{
-				CloneError(m_aSource);
-				return;
-			}
-			if (m_bSource->StatusIsFatal())
-			{
-				CloneError(m_bSource);
-				return;
-			}
-			m_index = index;
-			m_encoder = tEncoder::create(m_index, &localStatus);
-			m_encoder->writeConfig_ASource_Module(m_aSource->GetModuleForRouting(), &localStatus);
-			m_encoder->writeConfig_ASource_Channel(m_aSource->GetChannelForRouting(), &localStatus);
-			m_encoder->writeConfig_ASource_AnalogTrigger(m_aSource->GetAnalogTriggerForRouting(), &localStatus);
-			m_encoder->writeConfig_BSource_Module(m_bSource->GetModuleForRouting(), &localStatus);
-			m_encoder->writeConfig_BSource_Channel(m_bSource->GetChannelForRouting(), &localStatus);
-			m_encoder->writeConfig_BSource_AnalogTrigger(m_bSource->GetAnalogTriggerForRouting(), &localStatus);
-			m_encoder->strobeReset(&localStatus);
-			m_encoder->writeConfig_Reverse(reverseDirection, &localStatus);
-			m_encoder->writeTimerConfig_AverageSize(4, &localStatus);
-			m_counter = NULL;
-			break;
+			return;
 		}
-		case k1X:
-		case k2X:
+		if (m_aSource->StatusIsFatal())
 		{
-			m_counter = new Counter(m_encodingType, m_aSource, m_bSource, reverseDirection);
-			m_index = m_counter->GetIndex();
-			break;
+			CloneError(m_aSource);
+			return;
 		}
+		if (m_bSource->StatusIsFatal())
+		{
+			CloneError(m_bSource);
+			return;
+		}
+		m_index = index;
+		m_encoder = tEncoder::create(m_index, &localStatus);
+		m_encoder->writeConfig_ASource_Module(m_aSource->GetModuleForRouting(), &localStatus);
+		m_encoder->writeConfig_ASource_Channel(m_aSource->GetChannelForRouting(), &localStatus);
+		m_encoder->writeConfig_ASource_AnalogTrigger(m_aSource->GetAnalogTriggerForRouting(), &localStatus);
+		m_encoder->writeConfig_BSource_Module(m_bSource->GetModuleForRouting(), &localStatus);
+		m_encoder->writeConfig_BSource_Channel(m_bSource->GetChannelForRouting(), &localStatus);
+		m_encoder->writeConfig_BSource_AnalogTrigger(m_bSource->GetAnalogTriggerForRouting(), &localStatus);
+		m_encoder->strobeReset(&localStatus);
+		m_encoder->writeConfig_Reverse(reverseDirection, &localStatus);
+		m_encoder->writeTimerConfig_AverageSize(4, &localStatus);
+		m_counter = NULL;
+  } else {
+		m_counter = new Counter(m_encodingType, m_aSource, m_bSource, reverseDirection);
+		m_index = m_counter->GetIndex();
 	}
 	m_distancePerPulse = 1.0;
 	m_pidSource = kDistance;
@@ -200,7 +190,7 @@
 	}
 	else
 	{
-		quadEncoders->Free(m_index);
+		quadEncoders->Free(m_index, this);
 		delete m_encoder;
 	}
 }
diff --git a/aos/externals/WPILib/WPILib/Error.cpp b/aos/externals/WPILib/WPILib/Error.cpp
index 8dd18f2..11399ca 100644
--- a/aos/externals/WPILib/WPILib/Error.cpp
+++ b/aos/externals/WPILib/WPILib/Error.cpp
@@ -26,8 +26,32 @@
 Error::~Error()
 {}
 
-void Error::Clone(Error &error)
+/**
+ * Clones another error into this if this is currently clear. If not, does
+ * nothing.
+ * This is necessary because just using "if (!IsClear()) Clone(error)" has a
+ * race condition which this method does not.
+ * Cloning 2 errors into each other at the same time can lead to deadlocks!
+ */
+void Error::CloneIfClear(const Error &error) {
+  Synchronized sync(m_semaphore);
+  if (IsClear()) {
+    DoClone(error);
+  }
+}
+
+/**
+ * Clones another error into this object.
+ * Cloning 2 errors into each other at the same time can lead to deadlocks!
+ */
+void Error::Clone(const Error &error) {
+  Synchronized sync(m_semaphore);
+  DoClone(error);
+}
+
+void Error::DoClone(const Error &error)
 {
+  Synchronized sync(error.m_semaphore);
 	m_code = error.m_code;
 	m_message = error.m_message;
 	m_filename = error.m_filename;
@@ -37,17 +61,19 @@
 	m_timestamp = error.m_timestamp;
 }
 
+bool Error::IsClear() const { return GetCode() == 0; }
+
 Error::Code Error::GetCode() const
 {	return m_code;  }
 
-const char * Error::GetMessage() const
-{	return m_message.c_str();  }
+std::string Error::GetMessage() const
+{	return m_message;  }
 
-const char * Error::GetFilename() const
-{	return m_filename.c_str();  }
+std::string Error::GetFilename() const
+{	return m_filename;  }
 
-const char * Error::GetFunction() const
-{	return m_function.c_str();  }
+std::string Error::GetFunction() const
+{	return m_function;  }
 
 uint32_t Error::GetLineNumber() const
 {	return m_lineNumber;  }
@@ -58,8 +84,10 @@
 double Error::GetTime() const
 {	return m_timestamp;  }
 
-void Error::Set(Code code, const char* contextMessage, const char* filename, const char* function, uint32_t lineNumber, const ErrorBase* originatingObject)
-{
+void Error::Set(Code code, const char* contextMessage, const char* filename,
+                const char* function, uint32_t lineNumber,
+                const ErrorBase* originatingObject)  {
+  Synchronized sync(m_semaphore);
 	m_code = code;
 	m_message = contextMessage;
 	m_filename = filename;
@@ -70,39 +98,40 @@
 
 	Report();
 
-	if (m_suspendOnErrorEnabled) taskSuspend(0);
+	if (m_suspendOnErrorEnabled) taskSuspend(0 /*self*/);
 }
 
-void Error::Report()
+void Error::Report() const
 {
 	// Error string buffers
-	char *error = new char[256];
-	char *error_with_code = new char[256];
+	char error[256];
+	char error_with_code[256];
 
 	// Build error strings
-	if (m_code != -1)
+	if (m_code != -1 && m_code != 1)
 	{
-		snprintf(error, 256, "%s: status = %d (0x%08X) %s ...in %s() in %s at line %d\n",
-				m_code < 0 ? "ERROR" : "WARNING", (int32_t)m_code, (uint32_t)m_code, m_message.c_str(),
-				m_function.c_str(), m_filename.c_str(), m_lineNumber);
-		sprintf(error_with_code,"<Code>%ld %s", (int32_t)m_code, error);
+		snprintf(error, sizeof(error),
+             "%s: status = %d (0x%08X) %s ...in %s() in %s at line %d\n",
+				     m_code < 0 ? "ERROR" : "WARNING", (int32_t)m_code,
+             (uint32_t)m_code, m_message.c_str(),
+				     m_function.c_str(), m_filename.c_str(), m_lineNumber);
+		snprintf(error_with_code, sizeof(error_with_code),
+             "<Code>%ld %s", (int32_t)m_code, error);
 	} else {
-		snprintf(error, 256, "ERROR: %s ...in %s() in %s at line %d\n", m_message.c_str(),
-				m_function.c_str(), m_filename.c_str(), m_lineNumber);
-		strcpy(error_with_code, error);
+		snprintf(error, sizeof(error),
+             "%s: %s ...in %s() in %s at line %d\n",
+             m_code < 0 ? "ERROR" : "WARNING", m_message.c_str(),
+				     m_function.c_str(), m_filename.c_str(), m_lineNumber);
+		strncpy(error_with_code, error, sizeof(error_with_code));
 	}
 	// TODO: Add logging to disk
 
 	// Send to the DriverStation
 	setErrorData(error_with_code, strlen(error_with_code), 100);
 
-	delete [] error_with_code;
-
 	// Print to console
 	printf("\n\n>>>>%s", error);
 
-	delete [] error;
-
 	if (m_stackTraceEnabled)
 	{
 		printf("-----------<Stack Trace>----------------\n");
@@ -112,6 +141,7 @@
 
 void Error::Clear()
 {
+  Synchronized sync(m_semaphore);
 	m_code = 0;
 	m_message = "";
 	m_filename = "";
diff --git a/aos/externals/WPILib/WPILib/Error.h b/aos/externals/WPILib/WPILib/Error.h
index 8dbe910..6ded992 100644
--- a/aos/externals/WPILib/WPILib/Error.h
+++ b/aos/externals/WPILib/WPILib/Error.h
@@ -10,37 +10,55 @@
 #include "Base.h"
 #include "ChipObject/NiRio.h"
 #include <string>
-#include <vxWorks.h>
+#include "Synchronized.h"
 
 //  Forward declarations
 class ErrorBase;
 
 /**
- * Error object represents a library error.
+ * Represents an error or warning.
+ *
+ * All methods that can change instance data are protected by a lock so
+ * that it is safe to call any methods from multiple tasks at the same time.
  */
 class Error
 {
 public:
+  // -1 is other error, 1 is other warning.
 	typedef tRioStatusCode Code;
 
 	Error();
 	~Error();
-	void Clone(Error &error);
-	Code GetCode() const;
-	const char *GetMessage() const;
-	const char *GetFilename() const;
-	const char *GetFunction() const;
-	uint32_t GetLineNumber() const;
-	const ErrorBase* GetOriginatingObject() const;
-	double GetTime() const;
+
+	void CloneIfClear(const Error &error);
+  void Clone(const Error &error);
 	void Clear();
 	void Set(Code code, const char* contextMessage, const char* filename,
 		const char *function, uint32_t lineNumber, const ErrorBase* originatingObject);
+
+  bool IsClear() const;
+	Code GetCode() const;
+  // Have to return by value to avoid race conditions using the result for all
+  // of these methods.
+  std::string GetMessage() const;
+  std::string GetFilename() const;
+  std::string GetFunction() const;
+	uint32_t GetLineNumber() const;
+	const ErrorBase* GetOriginatingObject() const;
+	double GetTime() const;
+
+  // Enable or disable printing out a stack trace on the console whenever there
+  // is an error.
 	static void EnableStackTrace(bool enable) { m_stackTraceEnabled=enable; }
+  // Enable or disable having any task that gets an error suspend itself.
 	static void EnableSuspendOnError(bool enable) { m_suspendOnErrorEnabled=enable; }
 
 private:
-	void Report();
+  // Deals with notifying other code of this error.
+	void Report() const;
+  // Actually implements cloning.
+  // Does not lock m_semaphore, so callers must.
+  void DoClone(const Error &error);
 
 	Code m_code;
 	std::string m_message;
@@ -49,6 +67,10 @@
 	uint32_t m_lineNumber;
 	const ErrorBase* m_originatingObject;
 	double m_timestamp;
+  // Used for protecting all modifications to instance data.
+  // This means that all non-const methods should lock this for (at least most)
+  // of their implementations!
+  ReentrantSemaphore m_semaphore;
 
 	static bool m_stackTraceEnabled;
 	static bool m_suspendOnErrorEnabled;
diff --git a/aos/externals/WPILib/WPILib/ErrorBase.cpp b/aos/externals/WPILib/WPILib/ErrorBase.cpp
index 0be1293..8f717b9 100644
--- a/aos/externals/WPILib/WPILib/ErrorBase.cpp
+++ b/aos/externals/WPILib/WPILib/ErrorBase.cpp
@@ -15,8 +15,8 @@
 #include <sysSymTbl.h>
 #include <cstdio>
 
-SEM_ID ErrorBase::_globalErrorMutex = semMCreate(SEM_Q_PRIORITY | SEM_DELETE_SAFE | SEM_INVERSION_SAFE);
 Error ErrorBase::_globalError;
+
 /**
  * @brief Initialize the instance status to 0 for now.
  */
@@ -27,15 +27,10 @@
 {}
 
 /**
- * @brief Retrieve the current error.
- * Get the current error information associated with this sensor.
+ * @brief Retrieve the error associated this object.
+ * Get the error information associated with this sensor.
  */
-Error& ErrorBase::GetError()
-{
-	return m_error;
-}
-
-const Error& ErrorBase::GetError() const
+Error& ErrorBase::GetError() const
 {
 	return m_error;
 }
@@ -49,7 +44,10 @@
 }
 
 /**
- * @brief Set error information associated with a C library call that set an error to the "errno" global variable.
+ * @brief Set error information associated with a C library call that set an
+ * error to the "errno" "global variable" (it's really a macro that calls a
+ * function under VxWorks so that it's thread safe).
+ * Will still set an error even if errno is 0.
  * 
  * @param contextMessage A custom message from the code that set the error.
  * @param filename Filename of the error source
@@ -63,7 +61,7 @@
 	int errNo = errnoGet();
 	if (errNo == 0)
 	{
-		sprintf(err, "OK: %s", contextMessage);
+		snprintf(err, sizeof(err), "OK: %s", contextMessage);
 	}
 	else
 	{
@@ -72,24 +70,21 @@
 		SYM_TYPE ptype;
 		symFindByValue(statSymTbl, errNo, statName, &pval, &ptype);
 		if (pval != errNo)
-			snprintf(err, 256, "Unknown errno 0x%08X: %s", errNo, contextMessage);
+			snprintf(err, sizeof(err), "Unknown errno 0x%08X: %s", errNo, contextMessage);
 		else
-			snprintf(err, 256, "%s (0x%08X): %s", statName, errNo, contextMessage);
+			snprintf(err, sizeof(err), "%s (0x%08X): %s", statName, errNo, contextMessage);
 		delete [] statName;
 	}
 
 	//  Set the current error information for this object.
 	m_error.Set(-1, err, filename, function, lineNumber, this);
 
-	// Update the global error if there is not one already set.
-	Synchronized mutex(_globalErrorMutex);
-	if (_globalError.GetCode() == 0) {
-		_globalError.Clone(m_error);
-	}
+  _globalError.CloneIfClear(m_error);
 }
 
 /**
  * @brief Set the current error information associated from the nivision Imaq API.
+ * Does nothing of success is > 0.
  * 
  * @param success The return from the function
  * @param contextMessage A custom message from the code that set the error.
@@ -102,21 +97,18 @@
 	//  If there was an error
 	if (success <= 0) {
 		char err[256];
-		sprintf(err, "%s: %s", contextMessage, imaqGetErrorText(imaqGetLastError()));
+		snprintf(err, sizeof(err), "%s: %s", contextMessage, imaqGetErrorText(imaqGetLastError()));
 
 		//  Set the current error information for this object.
 		m_error.Set(imaqGetLastError(), err, filename, function, lineNumber, this);
 
-		// Update the global error if there is not one already set.
-		Synchronized mutex(_globalErrorMutex);
-		if (_globalError.GetCode() == 0) {
-			_globalError.Clone(m_error);
-		}
+    _globalError.CloneIfClear(m_error);
 	}
 }
 
 /**
- * @brief Set the current error information associated with this sensor.
+ * @brief Set the current error information associated with this object.
+ * Does nothing if code is 0.
  * 
  * @param code The error code
  * @param contextMessage A custom message from the code that set the error.
@@ -132,16 +124,12 @@
 		//  Set the current error information for this object.
 		m_error.Set(code, contextMessage, filename, function, lineNumber, this);
 
-		// Update the global error if there is not one already set.
-		Synchronized mutex(_globalErrorMutex);
-		if (_globalError.GetCode() == 0) {
-			_globalError.Clone(m_error);
-		}
+    _globalError.CloneIfClear(m_error);
 	}
 }
 
 /**
- * @brief Set the current error information associated with this sensor.
+ * @brief Set the current error information associated with this object.
  * 
  * @param errorMessage The error message from WPIErrors.h
  * @param contextMessage A custom message from the code that set the error.
@@ -153,19 +141,15 @@
 		const char* filename, const char* function, uint32_t lineNumber) const
 {
 	char err[256];
-	sprintf(err, "%s: %s", errorMessage, contextMessage);
+	snprintf(err, sizeof(err), "%s: %s", errorMessage, contextMessage);
 
 	//  Set the current error information for this object.
 	m_error.Set(-1, err, filename, function, lineNumber, this);
 
-	// Update the global error if there is not one already set.
-	Synchronized mutex(_globalErrorMutex);
-	if (_globalError.GetCode() == 0) {
-		_globalError.Clone(m_error);
-	}
+  _globalError.CloneIfClear(m_error);
 }
 
-void ErrorBase::CloneError(ErrorBase *rhs) const
+void ErrorBase::CloneError(const ErrorBase *rhs) const
 {
 	m_error.Clone(rhs->GetError());
 }
@@ -180,37 +164,49 @@
 	return m_error.GetCode() < 0;
 }
 
+/**
+ * @brief Set the current global error information.
+ * Does nothing if code is 0.
+ * TODO: think about getting rid of this because nothing uses it any more
+ *
+ * @param code The error code
+ * @param contextMessage A custom message from the code that set the error.
+ * @param filename Filename of the error source
+ * @param function Function of the error source
+ * @param lineNumber Line number of the error source
+ */
 void ErrorBase::SetGlobalError(Error::Code code, const char *contextMessage,
 		const char* filename, const char* function, uint32_t lineNumber)
 {
-	//  If there was an error
-	if (code != 0) {
-		Synchronized mutex(_globalErrorMutex);
-
-		//  Set the current error information for this object.
-		_globalError.Set(code, contextMessage, filename, function, lineNumber, NULL);
-	}
+  if (code != 0) {
+	  //  Set the current error information for this object.
+	  _globalError.Set(code, contextMessage, filename, function, lineNumber, NULL);
+  }
 }
 
+/**
+ * @brief Set the current global error information.
+ *
+ * @param errorMessage The error message from WPIErrors.h
+ * @param contextMessage A custom message from the code that set the error.
+ * @param filename Filename of the error source
+ * @param function Function of the error source
+ * @param lineNumber Line number of the error source
+ */
 void ErrorBase::SetGlobalWPIError(const char *errorMessage, const char *contextMessage,
         const char* filename, const char* function, uint32_t lineNumber)
 {
 	char err[256];
-	sprintf(err, "%s: %s", errorMessage, contextMessage);
+	snprintf(err, sizeof(err), "%s: %s", errorMessage, contextMessage);
 
-	Synchronized mutex(_globalErrorMutex);
-	if (_globalError.GetCode() != 0) {
-		_globalError.Clear();
-	}
 	_globalError.Set(-1, err, filename, function, lineNumber, NULL);
 }
 
 /**
-  * Retrieve the current global error.    
+  * Retrieve the global error.
 */
-Error& ErrorBase::GetGlobalError()
+const Error& ErrorBase::GetGlobalError()
 {
-	Synchronized mutex(_globalErrorMutex);
 	return _globalError;
 }
 
diff --git a/aos/externals/WPILib/WPILib/ErrorBase.h b/aos/externals/WPILib/WPILib/ErrorBase.h
index 2e73b10..7ccac2d 100644
--- a/aos/externals/WPILib/WPILib/ErrorBase.h
+++ b/aos/externals/WPILib/WPILib/ErrorBase.h
@@ -10,59 +10,86 @@
 #include "Base.h"
 #include "ChipObject/NiRio.h"
 #include "Error.h"
-#include <semLib.h>
-#include <vxWorks.h>
 
-#define wpi_setErrnoErrorWithContext(context)   (this->SetErrnoError((context), __FILE__, __FUNCTION__, __LINE__))
-#define wpi_setErrnoError()   (wpi_setErrnoErrorWithContext(""))
-#define wpi_setImaqErrorWithContext(code, context)   (this->SetImaqError((code), (context), __FILE__, __FUNCTION__, __LINE__))
-#define wpi_setErrorWithContext(code, context)   (this->SetError((code), (context), __FILE__, __FUNCTION__, __LINE__))
+// Helper macros to fill in the context information for you. See the
+// documentation for the methods that they call for details.
+#define wpi_setErrnoErrorWithContext(context) \
+    (this->SetErrnoError((context), __FILE__, __FUNCTION__, __LINE__))
+#define wpi_setErrnoError() \
+    (wpi_setErrnoErrorWithContext(""))
+#define wpi_setImaqErrorWithContext(code, context) \
+    (this->SetImaqError((code), (context), __FILE__, __FUNCTION__, __LINE__))
+#define wpi_setErrorWithContext(code, context) \
+        (this->SetError((code), (context), __FILE__, __FUNCTION__, __LINE__))
 #define wpi_setError(code)   (wpi_setErrorWithContext(code, ""))
-#define wpi_setStaticErrorWithContext(object, code, context)   (object->SetError((code), (context), __FILE__, __FUNCTION__, __LINE__))
-#define wpi_setStaticError(object, code)   (wpi_setStaticErrorWithContext(object, code, ""))
-#define wpi_setGlobalErrorWithContext(code, context)   (ErrorBase::SetGlobalError((code), (context), __FILE__, __FUNCTION__, __LINE__))
+#define wpi_setStaticErrorWithContext(object, code, context) \
+        (object->SetError((code), (context), __FILE__, __FUNCTION__, __LINE__))
+#define wpi_setStaticError(object, code) \
+    (wpi_setStaticErrorWithContext(object, code, ""))
+#define wpi_setGlobalErrorWithContext(code, context) \
+        (ErrorBase::SetGlobalError((code), (context), \
+                                   __FILE__, __FUNCTION__, __LINE__))
 #define wpi_setGlobalError(code)   (wpi_setGlobalErrorWithContext(code, ""))
-#define wpi_setWPIErrorWithContext(error, context)   (this->SetWPIError((wpi_error_s_##error), (context), __FILE__, __FUNCTION__, __LINE__))
+#define wpi_setWPIErrorWithContext(error, context) \
+        (this->SetWPIError((wpi_error_s_##error), (context), \
+                           __FILE__, __FUNCTION__, __LINE__))
 #define wpi_setWPIError(error)   (wpi_setWPIErrorWithContext(error, ""))
-#define wpi_setStaticWPIErrorWithContext(object, error, context)   (object->SetWPIError((wpi_error_s_##error), (context), __FILE__, __FUNCTION__, __LINE__))
-#define wpi_setStaticWPIError(object, error)   (wpi_setStaticWPIErrorWithContext(object, error, ""))
-#define wpi_setGlobalWPIErrorWithContext(error, context)   (ErrorBase::SetGlobalWPIError((wpi_error_s_##error), (context), __FILE__, __FUNCTION__, __LINE__))
-#define wpi_setGlobalWPIError(error)   (wpi_setGlobalWPIErrorWithContext(error, ""))
+#define wpi_setStaticWPIErrorWithContext(object, error, context) \
+        (object->SetWPIError((wpi_error_s_##error), (context), \
+                             __FILE__, __FUNCTION__, __LINE__))
+#define wpi_setStaticWPIError(object, error) \
+    (wpi_setStaticWPIErrorWithContext(object, error, ""))
+#define wpi_setGlobalWPIErrorWithContext(error, context) \
+        (ErrorBase::SetGlobalWPIError((wpi_error_s_##error), (context), \
+                                      __FILE__, __FUNCTION__, __LINE__))
+#define wpi_setGlobalWPIError(error) \
+    (wpi_setGlobalWPIErrorWithContext(error, ""))
 
 /**
  * Base class for most objects.
  * ErrorBase is the base class for most objects since it holds the generated error
  * for that object. In addition, there is a single instance of a global error object
+ *
+ * BE AWARE: This does include a mutable instance variable! This means that even
+ * if you make an object const it's not really. However, all modification to
+ * that instance variable is protected by a semaphore, so it does not create any
+ * thread safety issues.
+ *
+ * All of the Set*Error methods will update the global error if there is nothing
+ * there already.
  */
 class ErrorBase
 {
-//TODO: Consider initializing instance variables and cleanup in destructor
 public:
+	ErrorBase();
 	virtual ~ErrorBase();
-	virtual Error& GetError();
-	virtual const Error& GetError() const;
-	virtual void SetErrnoError(const char *contextMessage,
+
+	Error& GetError() const;
+	void SetErrnoError(const char *contextMessage,
 		const char* filename, const char* function, uint32_t lineNumber) const;
-	virtual void SetImaqError(int success, const char *contextMessage,
+	void SetImaqError(int success, const char *contextMessage,
         const char* filename, const char* function, uint32_t lineNumber) const;
-	virtual void SetError(Error::Code code, const char *contextMessage,
+	void SetError(Error::Code code, const char *contextMessage,
 		const char* filename, const char* function, uint32_t lineNumber) const;
-	virtual void SetWPIError(const char *errorMessage, const char *contextMessage,
+	void SetWPIError(const char *errorMessage, const char *contextMessage,
 		const char* filename, const char* function, uint32_t lineNumber) const;
-	virtual void CloneError(ErrorBase *rhs) const;
-	virtual void ClearError() const;
-	virtual bool StatusIsFatal() const;
+	void CloneError(const ErrorBase *rhs) const;
+	void ClearError() const;
+	bool StatusIsFatal() const;
 	static void SetGlobalError(Error::Code code, const char *contextMessage,
 		const char* filename, const char* function, uint32_t lineNumber);
 	static void SetGlobalWPIError(const char *errorMessage, const char *contextMessage,
 		const char* filename, const char* function, uint32_t lineNumber);
-	static Error& GetGlobalError();
+	static const Error& GetGlobalError();
+
 protected:
+  // This mutable is safe because Error guarantees that all modifications are
+  // protected with an internal lock.
 	mutable Error m_error;
-	// TODO: Replace globalError with a global list of all errors.
-	static SEM_ID _globalErrorMutex;
+	// TODO: Replace globalError with a global list of all errors, but make sure
+  // that it's thread safe.
 	static Error _globalError;
-	ErrorBase();
+
 private:
 	DISALLOW_COPY_AND_ASSIGN(ErrorBase);
 };
diff --git a/aos/externals/WPILib/WPILib/Global.cpp b/aos/externals/WPILib/WPILib/Global.cpp
new file mode 100644
index 0000000..23c29ec
--- /dev/null
+++ b/aos/externals/WPILib/WPILib/Global.cpp
@@ -0,0 +1,155 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#include "Global.h"
+#include "Utility.h"
+
+Global *Global::instance;
+ReentrantSemaphore Global::instance_lock;
+
+Global *Global::GetInstance() {
+  Synchronized sync(instance_lock);
+  if (instance == NULL) {
+    instance = new Global();
+  }
+  return instance;
+}
+
+Global::Global() {
+	tRioStatusCode status = NiFpga_Status_Success;
+	global_.reset(tGlobal::create(&status));
+  wpi_setError(status);
+
+  AddToSingletonList();
+}
+
+Global::~Global() {
+  Synchronized sync(instance_lock);
+  instance = NULL;
+}
+
+/**
+ * Return the FPGA Version number.
+ * For now, expect this to be competition year.
+ * @return FPGA Version number.
+ */
+uint16_t Global::GetFPGAVersion()
+{
+	tRioStatusCode status = NiFpga_Status_Success;
+	uint16_t version = global_->readVersion(&status);
+	wpi_setError(status);
+	return version;
+}
+
+/**
+ * Return the FPGA Revision number.
+ * The format of the revision is 3 numbers.
+ * The 12 most significant bits are the Major Revision.
+ * the next 8 bits are the Minor Revision.
+ * The 12 least significant bits are the Build Number.
+ * @return FPGA Revision number.
+ */
+uint32_t Global::GetFPGARevision()
+{
+	tRioStatusCode status = NiFpga_Status_Success;
+	uint32_t revision = global_->readRevision(&status);
+	wpi_setError(status);
+	return revision;
+}
+
+/**
+ * Read the microsecond-resolution timer on the FPGA.
+ *
+ * @return The current time in microseconds according to the FPGA (since FPGA reset).
+ */
+uint32_t Global::GetFPGATime()
+{
+	tRioStatusCode status = NiFpga_Status_Success;
+	uint32_t time = global_->readLocalTime(&status);
+	wpi_setError(status);
+	return time;
+}
+
+// RT hardware access functions exported from ni_emb.out
+extern "C"
+{
+	int32_t UserSwitchInput(int32_t nSwitch);
+	int32_t LedInput(int32_t led);
+	int32_t LedOutput(int32_t led, int32_t value);
+}
+
+/**
+ * Read the value of the USER1 DIP switch on the cRIO.
+ */
+int32_t Global::GetRIOUserSwitch()
+{
+	int32_t switchValue = UserSwitchInput(0);
+	wpi_assert(switchValue >= 0);
+	return switchValue > 0;
+}
+
+/**
+ * Set the state of the USER1 status LED on the cRIO.
+ */
+void Global::SetRIOUserLED(uint32_t state)
+{
+	LedOutput(0, state > 0);
+}
+
+/**
+ * Get the current state of the USER1 status LED on the cRIO.
+ * @return The curent state of the USER1 LED.
+ */
+int32_t Global::GetRIOUserLED()
+{
+	return LedInput(0);
+}
+
+/**
+ * Toggle the state of the USER1 status LED on the cRIO.
+ * @return The new state of the USER1 LED.
+ */
+int32_t Global::ToggleRIOUserLED()
+{
+  Synchronized sync(led_toggle_lock_);
+	int32_t ledState = !GetRIOUserLED();
+	SetRIOUserLED(ledState);
+	return ledState;
+}
+
+/**
+ * Set the state of the FPGA status LED on the cRIO.
+ */
+void Global::SetRIO_FPGA_LED(uint32_t state)
+{
+	tRioStatusCode status = NiFpga_Status_Success;
+	global_->writeFPGA_LED(state, &status);
+	wpi_setError(status);
+}
+
+/**
+ * Get the current state of the FPGA status LED on the cRIO.
+ * @return The curent state of the FPGA LED.
+ */
+int32_t Global::GetRIO_FPGA_LED()
+{
+	tRioStatusCode status = NiFpga_Status_Success;
+	bool ledValue = global_->readFPGA_LED(&status);
+	wpi_setError(status);
+	return ledValue;
+}
+
+/**
+ * Toggle the state of the FPGA status LED on the cRIO.
+ * @return The new state of the FPGA LED.
+ */
+int32_t Global::ToggleRIO_FPGA_LED()
+{
+  Synchronized sync(led_toggle_lock_);
+	int32_t ledState = !GetRIO_FPGA_LED();
+	SetRIO_FPGA_LED(ledState);
+	return ledState;
+}
diff --git a/aos/externals/WPILib/WPILib/Global.h b/aos/externals/WPILib/WPILib/Global.h
new file mode 100644
index 0000000..869de50
--- /dev/null
+++ b/aos/externals/WPILib/WPILib/Global.h
@@ -0,0 +1,42 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#include <memory>
+
+#include "SensorBase.h"
+#include "Synchronized.h"
+#include "ChipObject.h"
+
+#ifndef WPILIB_GLOBAL_H_
+#define WPILIB_GLOBAL_H_
+
+class Global : public SensorBase {
+ public:
+  static Global *GetInstance();
+
+  uint16_t GetFPGAVersion();
+  uint32_t GetFPGARevision();
+  uint32_t GetFPGATime();
+  int32_t GetRIOUserSwitch();
+  void SetRIOUserLED(uint32_t state);
+  int32_t GetRIOUserLED();
+  int32_t ToggleRIOUserLED();
+  void SetRIO_FPGA_LED(uint32_t state);
+  int32_t GetRIO_FPGA_LED();
+  int32_t ToggleRIO_FPGA_LED();
+
+ private:
+  Global();
+  ~Global();
+
+  static Global *instance;
+  static ReentrantSemaphore instance_lock;
+
+  ::std::auto_ptr<tGlobal> global_;
+  ReentrantSemaphore led_toggle_lock_;
+};
+
+#endif  // WPILIB_GLOBAL_H_
diff --git a/aos/externals/WPILib/WPILib/Gyro.cpp b/aos/externals/WPILib/WPILib/Gyro.cpp
index 6f52559..af69cf3 100644
--- a/aos/externals/WPILib/WPILib/Gyro.cpp
+++ b/aos/externals/WPILib/WPILib/Gyro.cpp
@@ -52,7 +52,7 @@
 	m_analog->InitAccumulator();
 	Wait(kCalibrationSampleTime);
 
-	INT64 value;
+	int64_t value;
 	uint32_t count;
 	m_analog->GetAccumulatorOutput(&value, &count);
 
@@ -156,11 +156,11 @@
  */
 float Gyro::GetAngle( void )
 {
-	INT64 rawValue;
+	int64_t rawValue;
 	uint32_t count;
 	m_analog->GetAccumulatorOutput(&rawValue, &count);
 
-	INT64 value = rawValue - (INT64)((float)count * m_offset);
+	int64_t value = rawValue - (int64_t)((float)count * m_offset);
 
 	double scaledValue = value * 1e-9 * (double)m_analog->GetLSBWeight() * (double)(1 << m_analog->GetAverageBits()) /
 		(m_analog->GetModule()->GetSampleRate() * m_voltsPerDegreePerSecond);
diff --git a/aos/externals/WPILib/WPILib/IterativeRobot.cpp b/aos/externals/WPILib/WPILib/IterativeRobot.cpp
index fd03577..c3220cf 100644
--- a/aos/externals/WPILib/WPILib/IterativeRobot.cpp
+++ b/aos/externals/WPILib/WPILib/IterativeRobot.cpp
@@ -61,7 +61,7 @@
 
 /**
  * Get the period for the periodic functions.
- * Returns 0.0 if configured to syncronize with DS control data packets.
+ * Returns 0.0 if configured to synchronize with DS control data packets.
  * @return Period of the periodic function calls
  */
 double IterativeRobot::GetPeriod()
@@ -87,8 +87,7 @@
  * 
  * This specific StartCompetition() implements "main loop" behavior like that of the FRC
  * control system in 2008 and earlier, with a primary (slow) loop that is
- * called periodically, and a "fast loop" (a.k.a. "spin loop") that is 
- * called as fast as possible with no delay between calls. 
+ * called periodically.
  */
 void IterativeRobot::StartCompetition()
 {
diff --git a/aos/externals/WPILib/WPILib/LiveWindow/LiveWindow.cpp b/aos/externals/WPILib/WPILib/LiveWindow/LiveWindow.cpp
index 536e728..a2ecbc6 100644
--- a/aos/externals/WPILib/WPILib/LiveWindow/LiveWindow.cpp
+++ b/aos/externals/WPILib/WPILib/LiveWindow/LiveWindow.cpp
@@ -4,6 +4,7 @@
 #include <sstream>
 
 LiveWindow* LiveWindow::m_instance = NULL;
+ReentrantSemaphore LiveWindow::m_instanceLock;
 
 /**
  * Get an instance of the LiveWindow main class
@@ -12,6 +13,7 @@
  */
 LiveWindow * LiveWindow::GetInstance()
 {
+  Synchronized sync(m_instanceLock);
 	if (m_instance == NULL)
 	{
 		m_instance = new LiveWindow();
@@ -25,10 +27,12 @@
  */
 LiveWindow::LiveWindow()
 {
+#if 0
 	m_enabled = false;
 	m_liveWindowTable = NetworkTable::GetTable("LiveWindow");
 	m_statusTable = m_liveWindowTable->GetSubTable("~STATUS~");
 	m_scheduler = Scheduler::GetInstance();
+#endif
 }
 
 /**
@@ -37,6 +41,7 @@
  */
 void LiveWindow::SetEnabled(bool enabled)
 {
+#if 0
 	if (m_enabled == enabled)
 		return;
 	if (enabled)
@@ -67,6 +72,7 @@
 	}
 	m_enabled = enabled;
 	m_statusTable->PutBoolean("LW Enabled", m_enabled);
+#endif
 }
 
 LiveWindow::~LiveWindow()
@@ -82,9 +88,11 @@
 void LiveWindow::AddSensor(const char *subsystem, const char *name,
 		LiveWindowSendable *component)
 {
+#if 0
 	m_components[component].subsystem = subsystem;
 	m_components[component].name = name;
 	m_components[component].isSensor = true;
+#endif
 }
 
 /**
@@ -96,9 +104,11 @@
 void LiveWindow::AddActuator(const char *subsystem, const char *name,
 		LiveWindowSendable *component)
 {
+#if 0
 	m_components[component].subsystem = subsystem;
 	m_components[component].name = name;
 	m_components[component].isSensor = false;
+#endif
 }
 
 /**
@@ -106,6 +116,7 @@
  */
 void LiveWindow::AddSensor(std::string type, int module, int channel, LiveWindowSendable *component)
 {
+#if 0
 	std::ostringstream oss;
 	oss << type << "[" << module << "," << channel << "]";
 	std::string types(oss.str());
@@ -115,6 +126,7 @@
 	AddSensor("Ungrouped", cc, component);
 	if (std::find(m_sensors.begin(), m_sensors.end(), component) == m_sensors.end())
 		m_sensors.push_back(component);
+#endif
 }
 
 /**
@@ -122,6 +134,7 @@
  */
 void LiveWindow::AddActuator(std::string type, int module, int channel, LiveWindowSendable *component)
 {
+#if 0
 	std::ostringstream oss;
 	oss << type << "[" << module << "," << channel << "]";
 	std::string types(oss.str());
@@ -129,6 +142,7 @@
 	types.copy(cc, types.size());
 	cc[types.size()]='\0';
 	AddActuator("Ungrouped", cc, component);
+#endif
 }
 
 /**
@@ -138,10 +152,12 @@
  */
 void LiveWindow::UpdateValues()
 {
+#if 0
 	for (unsigned int i = 0; i < m_sensors.size(); i++)
 	{
 		m_sensors[i]->UpdateTable();
 	}
+#endif
 }
 
 /**
@@ -150,10 +166,12 @@
  */
 void LiveWindow::Run()
 {
+#if 0
 	if (m_enabled)
 	{
 		UpdateValues();
 	}
+#endif
 }
 
 /**
@@ -165,6 +183,7 @@
  */
 void LiveWindow::InitializeLiveWindowComponents()
 {
+#if 0
 	for (std::map<LiveWindowSendable *, LiveWindowComponent>::iterator it =
 			m_components.begin(); it != m_components.end(); ++it)
 	{
@@ -185,5 +204,6 @@
 			m_sensors.push_back(component);
 		}
 	}
+#endif
 }
 
diff --git a/aos/externals/WPILib/WPILib/LiveWindow/LiveWindow.h b/aos/externals/WPILib/WPILib/LiveWindow/LiveWindow.h
index ca05c1b..2b103f7 100644
--- a/aos/externals/WPILib/WPILib/LiveWindow/LiveWindow.h
+++ b/aos/externals/WPILib/WPILib/LiveWindow/LiveWindow.h
@@ -4,22 +4,31 @@
 #include "LiveWindow/LiveWindowSendable.h"
 #include "tables/ITable.h"
 #include "Commands/Scheduler.h"
+#include "Synchronized.h"
 #include <vector>
 #include <map>
 
 struct LiveWindowComponent
 {
+#if 0
 	std::string subsystem;
 	std::string name;
 	bool isSensor;
+#endif
 
 	LiveWindowComponent()
 	{}//WTF?
 	LiveWindowComponent(std::string subsystem, std::string name, bool isSensor)
 	{
+#if 0
 		this->subsystem = subsystem;
 		this->name = name;
 		this->isSensor = isSensor;
+#else
+    (void)subsystem;
+    (void)name;
+    (void)isSensor;
+#endif
 	}
 };
 
@@ -38,7 +47,7 @@
 	void AddSensor(std::string type, int module, int channel, LiveWindowSendable *component);
 	void AddActuator(std::string type, int module, int channel, LiveWindowSendable *component);
 	
-	bool IsEnabled() { return m_enabled; }
+	bool IsEnabled() { return false; }
 	void SetEnabled(bool enabled);
 
 protected:
@@ -50,10 +59,14 @@
 	void Initialize();
 	void InitializeLiveWindowComponents();
 	
+#if 0
 	std::vector<LiveWindowSendable *> m_sensors;
 	std::map<LiveWindowSendable *, LiveWindowComponent> m_components;
 	
+#endif
 	static LiveWindow *m_instance;
+  static ReentrantSemaphore m_instanceLock;
+#if 0
 	ITable *m_liveWindowTable;
 	ITable *m_statusTable;
 	
@@ -61,6 +74,7 @@
 	
 	bool m_enabled;
 	bool m_firstTime;
+#endif
 };
 
 #endif
diff --git a/aos/externals/WPILib/WPILib/Module.cpp b/aos/externals/WPILib/WPILib/Module.cpp
index 823205e..727fda3 100644
--- a/aos/externals/WPILib/WPILib/Module.cpp
+++ b/aos/externals/WPILib/WPILib/Module.cpp
@@ -8,6 +8,9 @@
 #include "AnalogModule.h"
 #include "DigitalModule.h"
 //#include "SolenoidModule.h"
+#include "Utility.h"
+
+ReentrantSemaphore Module::m_semaphore;
 
 Module* Module::m_modules[kMaxModules] = {NULL};
 
@@ -21,6 +24,7 @@
 	: m_moduleType (type)
 	, m_moduleNumber (number)
 {
+  Synchronized sync(m_semaphore);
 	m_modules[ToIndex(type, number)] = this;
 }
 
@@ -29,6 +33,7 @@
  */
 Module::~Module()
 {
+  m_modules[ToIndex(m_moduleType, m_moduleNumber)] = NULL;
 }
 
 /**
@@ -39,6 +44,7 @@
  */
 Module* Module::GetModule(nLoadOut::tModuleType type, uint8_t number)
 {
+  Synchronized sync(m_semaphore);
 	if (m_modules[ToIndex(type, number)] == NULL)
 	{
 		switch(type)
@@ -70,7 +76,20 @@
  */
 uint8_t Module::ToIndex(nLoadOut::tModuleType type, uint8_t number)
 {
-	if (number == 0 || number > kMaxModuleNumber) return 0;
-	if (type < nLoadOut::kModuleType_Analog || type > nLoadOut::kModuleType_Solenoid) return 0;
+	if (number == 0 || number > kMaxModuleNumber) {
+    char buf[64];
+    snprintf(buf, sizeof(buf), "Trying to get index for invalid module %d",
+             static_cast<int>(number));
+    wpi_assertWithMessage(false, buf);
+    return 0;
+  }
+	if (type < nLoadOut::kModuleType_Analog ||
+      type > nLoadOut::kModuleType_Solenoid) {
+    char buf[64];
+    snprintf(buf, sizeof(buf), "Trying to get index for invalid module type %d",
+             static_cast<int>(type));
+    wpi_assertWithMessage(false, buf);
+    return 0;
+  }
 	return (type * kMaxModuleNumber) + (number - 1);
 }
diff --git a/aos/externals/WPILib/WPILib/Module.h b/aos/externals/WPILib/WPILib/Module.h
index 4cc3d91..390d77a 100644
--- a/aos/externals/WPILib/WPILib/Module.h
+++ b/aos/externals/WPILib/WPILib/Module.h
@@ -9,6 +9,7 @@
 
 #include "SensorBase.h"
 #include "NetworkCommunication/LoadOut.h"
+#include "Synchronized.h"
 
 #define kMaxModules	(nLoadOut::kModuleType_Solenoid * kMaxModuleNumber + (kMaxModuleNumber - 1))
 
@@ -20,7 +21,7 @@
 	static Module *GetModule(nLoadOut::tModuleType type, uint8_t number);
 
 protected:
-	explicit Module(nLoadOut::tModuleType type, uint8_t number);
+	Module(nLoadOut::tModuleType type, uint8_t number);
 	virtual ~Module();
 
 	nLoadOut::tModuleType m_moduleType; ///< The type of module represented.
@@ -29,6 +30,7 @@
 private:
 	static uint8_t ToIndex(nLoadOut::tModuleType type, uint8_t number);
 	static Module* m_modules[kMaxModules];
+  static ReentrantSemaphore m_semaphore;
 };
 
 #endif
diff --git a/aos/externals/WPILib/WPILib/MotorSafety.h b/aos/externals/WPILib/WPILib/MotorSafety.h
index 15481d8..a13ac38 100644
--- a/aos/externals/WPILib/WPILib/MotorSafety.h
+++ b/aos/externals/WPILib/WPILib/MotorSafety.h
@@ -16,6 +16,7 @@
 	virtual void StopMotor() = 0;
 	virtual void SetSafetyEnabled(bool enabled) = 0;
 	virtual bool IsSafetyEnabled() = 0;
+  // May write to the first 64 bytes of desc.
 	virtual void GetDescription(char *desc) = 0;
 };
 
diff --git a/aos/externals/WPILib/WPILib/NetworkCommunication/FRCComm.h b/aos/externals/WPILib/WPILib/NetworkCommunication/FRCComm.h
index 6afba2b..80f91a9 100644
--- a/aos/externals/WPILib/WPILib/NetworkCommunication/FRCComm.h
+++ b/aos/externals/WPILib/WPILib/NetworkCommunication/FRCComm.h
@@ -120,7 +120,7 @@
 	uint16_t analog3;
 	uint16_t analog4;
 
-	UINT64 cRIOChecksum;
+	uint64_t cRIOChecksum;
 	uint32_t FPGAChecksum0;
 	uint32_t FPGAChecksum1;
 	uint32_t FPGAChecksum2;
diff --git a/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobot.cpp b/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobot.cpp
new file mode 100644
index 0000000..1e92caf
--- /dev/null
+++ b/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobot.cpp
@@ -0,0 +1,485 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#include "WPILib/NetworkRobot/NetworkRobot.h"
+
+#include <sockLib.h>
+#include <stdint.h>
+#include <selectLib.h>
+#include <assert.h>
+
+#include "WPILib/Utility.h"
+#include "WPILib/WPIErrors.h"
+#include "WPILib/SensorBase.h"
+#include "WPILib/Timer.h"
+
+const double NetworkRobot::kDisableTime = 0.15;
+
+NetworkRobot::NetworkRobot(uint16_t receive_port, const char *sender_address,
+                           uint16_t send_port, const char *receiver_address)
+    : receive_port_(receive_port), sender_address_(sender_address),
+      send_port_(send_port), receiver_address_(receiver_address),
+      receive_socket_(-1), send_socket_(-1),
+      joystick_values_(),
+      send_task_("DS_Send", reinterpret_cast<FUNCPTR>(StaticSendLoop)),
+      last_received_timestamp_(0.0),
+      last_sent_state_valid_(false),
+      digital_modules_(), solenoid_bases_(),
+      allocated_digital_outputs_() {
+}
+
+NetworkRobot::~NetworkRobot() {
+  // Nothing we can really do about any errors for either of these.
+  if (receive_socket_ != -1) {
+    close(receive_socket_);
+  }
+  if (send_socket_ != -1) {
+    close(send_socket_);
+  }
+
+  for (size_t module = 0;
+       module < sizeof(solenoid_bases_) / sizeof(solenoid_bases_[0]);
+       ++module) {
+    delete solenoid_bases_[module];
+  }
+  for (size_t module = 0;
+       module < sizeof(digital_modules_) / sizeof(digital_modules_[0]);
+       ++module) {
+    for (int i = 0; i < 16; ++i) {
+      if (allocated_digital_outputs_[module] & (1 << i)) {
+        digital_modules_[module]->FreeDIO(15 - i);
+      }
+    }
+  }
+}
+
+bool NetworkRobot::FillinInAddr(const char *const_ip, in_addr *inet_address) {
+  // A copy of the passed in address string because vxworks has the function
+  // signature without the const and I don't really trust it not to do something
+  // weird and change it.
+  // The size is the maximum length of an IP address (including the terminating
+  // NUL) (ie "123.456.789.123").
+  char non_const_ip[3 + 1 + 3 + 1 + 3 + 1 + 3 + 1];
+  size_t ip_length = strlen(const_ip);
+  if (ip_length >= sizeof(non_const_ip)) {
+    char buf[128];
+    snprintf(buf, sizeof(buf), "IP address '%s' is %zd bytes long"
+             " but should only be %zd", const_ip,
+             ip_length, sizeof(non_const_ip) - 1);
+    wpi_setErrorWithContext(-1, buf);
+    return false;
+  }
+  memcpy(non_const_ip, const_ip, ip_length + 1);
+  errno = 0;
+  if (inet_aton(non_const_ip, inet_address) != 0) {
+    char buf[64];
+    snprintf(buf, sizeof(buf), "inet_aton(%s)", const_ip);
+    wpi_setErrnoErrorWithContext(buf);
+    return false;
+  }
+  return true;
+}
+
+void NetworkRobot::StartCompetition() {
+  // Multiplied by 2 to give ourselves plenty of time to get around to feeding
+  // it before it completely cuts out everything.
+  m_watchdog.SetExpiration(kDisableTime * 2);
+
+  // This outer loop is so that it will retry after encountering any errors.
+  while (true) {
+    if (sender_address_ != NULL) {
+      CreateReceiveSocket();
+      if (!FillinInAddr(sender_address_, &expected_sender_address_)) return;
+    }
+
+    if (receiver_address_ != NULL) {
+      CreateSendSocket();
+    }
+
+    if (sender_address_ != NULL) {
+      // We only need to do it in a separate task if we're doing both parts.
+      if (receiver_address_ != NULL) {
+        send_task_.Start(reinterpret_cast<uintptr_t>(this));
+      }
+
+      while (!StatusIsFatal()) {
+        if ((Timer::GetPPCTimestamp() - last_received_timestamp_) >
+            kDisableTime) {
+          StopOutputs();
+        }
+        ReceivePacket();
+      }
+      StopOutputs();
+    } else {
+      SendLoop();
+    }
+
+    Cleanup();
+  }
+}
+
+void NetworkRobot::StopOutputs() {
+  for (size_t module = 0;
+       module < sizeof(digital_modules_) / sizeof(digital_modules_[0]);
+       ++module) {
+    DigitalModule *digital_module = digital_modules_[module];
+
+    if (digital_module != NULL) {
+      for (int i = 0; i < 10; ++i) {
+        // 0 means stop sending anything.
+        digital_module->SetPWM(i + 1, 0);
+      }
+
+      // Turn off all of the ones that we're responsible for.
+      digital_module->SetDIOs(allocated_digital_outputs_[module], 0);
+
+      // Turn off all of the relays (both directions).
+      digital_module->SetRelaysForward(0xFF, 0);
+      digital_module->SetRelaysReverse(0xFF, 0);
+    }
+  }
+
+  // Can't do anything intelligent with solenoids. Turning them off can be just
+  // as dangerous as leaving them on, so just leave them alone.
+
+  // We took care of it, so we don't want the watchdog to permanently disable
+  // everything.
+  m_watchdog.Feed();
+}
+
+void NetworkRobot::Cleanup() {
+  send_task_.Stop();
+
+  if (receive_socket_ != -1) {
+    if (close(receive_socket_) == ERROR) {
+      char buf[64];
+      snprintf(buf, sizeof(buf), "close(%d)", receive_socket_);
+      wpi_setErrnoErrorWithContext(buf);
+    }
+    receive_socket_ = -1;
+  }
+  if (send_socket_ != -1) {
+    if (close(send_socket_) == ERROR) {
+      char buf[64];
+      snprintf(buf, sizeof(buf), "close(%d)", send_socket_);
+      wpi_setErrnoErrorWithContext(buf);
+    }
+    send_socket_ = -1;
+  }
+
+  ClearError();
+}
+
+bool NetworkRobot::WaitForData() {
+  assert(kDisableTime < 1.0);
+
+  struct timeval timeout;
+  timeout.tv_sec = 0;
+  timeout.tv_usec = kDisableTime *
+      1000.0 /*seconds to mseconds*/ *
+      1000.0 /*mseconds to useconds*/ + 0.5;
+
+  fd_set fds;
+  FD_ZERO(&fds);
+  FD_SET(receive_socket_, &fds);
+
+  int ret = select(receive_socket_ + 1,
+                   &fds,  // read fds
+                   NULL,  // write fds
+                   NULL,  // exception fds (not supported)
+                   &timeout);
+  if (ret == 0) {
+    // timeout
+    return false;
+  } else if (ret == 1) {
+    return true;
+  } else if (ret != -1) {
+    char buf[64];
+    snprintf(buf, sizeof(buf), "select returned %d", ret);
+    wpi_setErrorWithContext(-1, buf);
+    return false;
+  } else {
+    wpi_setErrnoErrorWithContext("waiting until the socket has data");
+    return false;
+  }
+}
+
+void NetworkRobot::ReceivePacket() {
+  if (!WaitForData()) return;
+
+  char buffer[sizeof(motors_) + buffers::kOverhead];
+  union {
+    sockaddr addr;
+    sockaddr_in in;
+  } sender_address;
+  int sender_address_length = sizeof(sender_address);
+  int received = recvfrom(receive_socket_,
+                          buffer,
+                          sizeof(buffer),
+                          0,
+                          &sender_address.addr,
+                          &sender_address_length);
+  if (received == -1) {
+    if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR ||
+        errno == ETIMEDOUT) {
+      // All of these are various kinds of timing out.
+      return;
+    }
+    wpi_setErrnoErrorWithContext("recvfrom on motor value socket");
+    return;
+  }
+  assert(static_cast<size_t>(sender_address_length) >=
+         sizeof(sender_address.in));
+  if (sender_address.in.sin_addr.s_addr !=
+      expected_sender_address_.s_addr) {
+    char address[INET_ADDR_LEN];
+    inet_ntoa_b(sender_address.in.sin_addr, address);
+    char buf[64];
+    snprintf(buf, sizeof(buf), "Received packet from wrong IP %s", address);
+    wpi_setErrorWithContext(1, buf);
+    return;
+  }
+
+  if (motors_.DeserializeFrom(buffer, sizeof(buffer))) {
+    ProcessPacket();
+  } else {
+    char buf[64];
+    snprintf(buf, sizeof(buf), "Deserializing from %d byte buffer",
+             sizeof(buffer));
+    wpi_setErrorWithContext(1, buf);
+    return;
+  }
+}
+
+void NetworkRobot::ProcessPacket() {
+  int8_t digital_number = motors_.digital_module;
+  if (digital_number != -1) {
+    if (digital_number == 0) {
+      digital_number = SensorBase::GetDefaultDigitalModule();
+    }
+    if (digital_number < 1 ||
+        digital_number > static_cast<int32_t>(SensorBase::kDigitalModules)) {
+      char buf[64];
+      snprintf(buf, sizeof(buf), "Got Digital Module %d",
+               static_cast<int>(digital_number));
+      wpi_setWPIErrorWithContext(ModuleIndexOutOfRange, buf);
+      return;
+    }
+    DigitalModule *digital_module = digital_modules_[digital_number - 1];
+    if (digital_module == NULL) {
+      digital_module = digital_modules_[digital_number - 1] =
+          DigitalModule::GetInstance(digital_number);
+      for (int i = 0; i < 10; ++i) {
+        digital_module->SetPWMPeriodScale(i + 1, 0);
+      }
+    }
+
+    for (int i = 0; i < 10; ++i) {
+      digital_module->SetPWM(i + 1, motors_.pwm_outputs[i]);
+    }
+
+    uint16_t old_allocated = allocated_digital_outputs_[digital_number - 1];
+    // Have to keep track of which ones we've (de)allocated as we go through in
+    // case we have trouble allocating one of them in the middle.
+    for (int i = 0; i < 16; ++i) {
+      // If we have it allocated and this packet says we shouldn't.
+      if ((old_allocated & (1 << i)) &&
+          !(motors_.digital_output_enables & (1 << i))) {
+        digital_module->FreeDIO(15 - i);
+        allocated_digital_outputs_[digital_number - 1] &= ~(1 << i);
+      // If this packet says we should have it allocated and we don't.
+      } else if ((motors_.digital_output_enables & (1 << i)) &&
+                 !(old_allocated & (1 << i))) {
+        if (!digital_module->AllocateDIO(15 - i, false /*input*/)) return;
+        allocated_digital_outputs_[digital_number - 1] |= 1 << i;
+      }
+    }
+    wpi_assertEqual(allocated_digital_outputs_[digital_number - 1],
+                    motors_.digital_output_enables);
+    digital_module->SetDIOs(motors_.digital_output_enables,
+                            motors_.digital_output_values);
+
+    if (motors_.pressure_switch_channel != 0 &&
+        motors_.compressor_channel != 0) {
+      digital_module->SetRelayForward(motors_.compressor_channel,
+                                      !digital_module->GetDIO(
+                                          motors_.pressure_switch_channel));
+    }
+  }
+
+  int8_t solenoid_number = motors_.solenoid_module;
+  if (solenoid_number != -1) {
+    if (solenoid_number == 0) {
+      solenoid_number = SensorBase::GetDefaultSolenoidModule();
+    }
+    if (solenoid_number < 1 ||
+        solenoid_number > static_cast<int32_t>(SensorBase::kSolenoidModules)) {
+      char buf[64];
+      snprintf(buf, sizeof(buf), "Got Solenoid Module %d",
+               static_cast<int>(solenoid_number));
+      wpi_setWPIErrorWithContext(ModuleIndexOutOfRange, buf);
+      return;
+    }
+    SolenoidBase *solenoid_base = solenoid_bases_[solenoid_number - 1];
+    if (solenoid_base == NULL) {
+      solenoid_base = solenoid_bases_[solenoid_number - 1] =
+          new SolenoidBase(solenoid_number);
+    }
+
+    solenoid_base->SetAll(motors_.solenoid_values);
+  }
+
+  // This code can only assume that whatever is sending it values received the
+  // most recent state that it sent out.
+  if (last_sent_state_valid_) {
+    // Don't have to synchronize with writing the last sent state too because
+    // it's ok if we're 1 cycle off. It would just be bad if we reported not
+    // being in any state or in 2 states at once.
+    RWLock::Locker state_locker(m_ds->GetUserStateLock(), true);
+    const DriverStation::FMSState state = last_sent_state_;
+    m_ds->InDisabled(state == DriverStation::FMSState::kDisabled);
+    m_ds->InAutonomous(state == DriverStation::FMSState::kAutonomous);
+    m_ds->InOperatorControl(state == DriverStation::FMSState::kTeleop);
+    m_ds->InTest(state == DriverStation::FMSState::kTestMode);
+  }
+
+  m_watchdog.Feed();
+  last_received_timestamp_ = Timer::GetPPCTimestamp();
+}
+
+void NetworkRobot::SendLoop() {
+  while (!StatusIsFatal()) {
+    m_ds->WaitForData();
+
+    {
+      RWLock::Locker data_locker(m_ds->GetDataReadLock());
+      // Get a pointer to the data and then cast away the volatile because it's
+      // annoying to propagate it all over and it's unnecessary here because
+      // we have a lock on the data so it's not going to change.
+      const FRCCommonControlData *data =
+          const_cast<const FRCCommonControlData *>(m_ds->GetControlData());
+      CopyStickValues(0, data->stick0Axes, data->stick0Buttons);
+      CopyStickValues(1, data->stick1Axes, data->stick1Buttons);
+      CopyStickValues(2, data->stick2Axes, data->stick2Buttons);
+      CopyStickValues(3, data->stick3Axes, data->stick3Buttons);
+
+      joystick_values_.control_packet_index = data->packetIndex;
+
+      joystick_values_.team_number = data->teamID;
+      joystick_values_.alliance = data->dsID_Alliance;
+      joystick_values_.position = data->dsID_Position;
+
+      joystick_values_.control.set_test_mode(data->test);
+      joystick_values_.control.set_fms_attached(data->fmsAttached);
+      joystick_values_.control.set_autonomous(data->autonomous);
+      joystick_values_.control.set_enabled(data->enabled);
+
+      last_sent_state_ = m_ds->GetCurrentState();
+      last_sent_state_valid_ = true;
+    }
+    ++joystick_values_.index;
+
+    char buffer[sizeof(joystick_values_) + buffers::kOverhead];
+    ssize_t size = joystick_values_.SerializeTo(buffer, sizeof(buffer));
+    if (size <= 0) {
+      char buf[64];
+      snprintf(buf, sizeof(buf),
+               "Serializing joystick values into %d byte buffer",
+               sizeof(buffer));
+      wpi_setErrorWithContext(-1, buf);
+      return;
+    }
+    ssize_t sent = send(send_socket_, buffer, size, 0);
+    if (sent != size) {
+      if (sent == -1) {
+        if (errno == EINTR || errno == ENOBUFS) {
+          // These are all errors that just mean it didn't manage to send this
+          // time.
+          continue;
+        } else {
+          wpi_setErrnoErrorWithContext("send to joystick output socket");
+          return;
+        }
+      } else {
+        char buf[64];
+        snprintf(buf, sizeof(buf), "Wanted to send %d bytes but only sent %d",
+                 size, sent);
+        wpi_setErrorWithContext(1, buf);
+        continue;
+      }
+    }
+  }
+}
+
+void NetworkRobot::CopyStickValues(int number,
+                                   const int8_t (&axes)[6],
+                                   uint16_t buttons) {
+  for (int i = 0; i < 6; ++i) {
+    joystick_values_.joysticks[number].axes[i] = axes[i];
+  }
+  joystick_values_.joysticks[number].buttons = buttons;
+}
+
+void NetworkRobot::CreateReceiveSocket() {
+  wpi_assertEqual(receive_socket_, -1);
+
+  receive_socket_ = socket(AF_INET, SOCK_DGRAM, 0);
+  if (receive_socket_ < 0) {
+    wpi_setErrnoErrorWithContext("Creating UDP Socket");
+    receive_socket_ = -1;
+    return;
+  }
+
+  union {
+    sockaddr_in in;
+    sockaddr addr;
+  } address;
+  memset(&address, 0, sizeof(address));
+  address.in.sin_family = AF_INET;
+  address.in.sin_port = receive_port_;
+  address.in.sin_addr.s_addr = INADDR_ANY;
+  if (bind(receive_socket_, &address.addr, sizeof(address.addr)) == ERROR) {
+    char buf[64];
+    snprintf(buf, sizeof(buf), "Binding Socket to 0.0.0.0:%d", receive_port_);
+    wpi_setErrnoErrorWithContext(buf);
+    return;
+  }
+
+  int on = 1;
+  errno = 0;
+  if (ioctl(receive_socket_, FIONBIO, reinterpret_cast<int>(&on)) < 0) {
+    wpi_setErrnoErrorWithContext("Setting Socket to Non-Blocking Mode");
+    return;
+  }
+}
+
+void NetworkRobot::CreateSendSocket() {
+  wpi_assertEqual(send_socket_, -1);
+
+  send_socket_ = socket(AF_INET, SOCK_DGRAM, 0);
+  if (send_socket_ < 0) {
+    wpi_setErrnoErrorWithContext("Creating UDP Socket");
+    send_socket_ = -1;
+    return;
+  }
+
+  union {
+    sockaddr_in in;
+    sockaddr addr;
+  } address;
+  memset(&address, 0, sizeof(address));
+  address.in.sin_family = AF_INET;
+  address.in.sin_port = send_port_;
+  if (!FillinInAddr(receiver_address_, &address.in.sin_addr)) return;
+
+  if (connect(send_socket_, &address.addr, sizeof(address.addr)) == ERROR) {
+    char buf[64];
+    snprintf(buf, sizeof(buf), "Connecting Socket to %s:%d",
+             receiver_address_, send_port_);
+    wpi_setErrnoErrorWithContext(buf);
+    return;
+  }
+}
diff --git a/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobot.h b/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobot.h
new file mode 100644
index 0000000..7b1e05b
--- /dev/null
+++ b/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobot.h
@@ -0,0 +1,140 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#ifndef WPILIB_NETWORK_ROBOT_NETWORK_ROBOT_H_
+#define WPILIB_NETWORK_ROBOT_NETWORK_ROBOT_H_
+
+#include <inetLib.h>
+
+#include "WPILib/NetworkRobot/NetworkRobotValues.h"
+#include "WPILib/RobotBase.h"
+#include "WPILib/Base.h"
+#include "WPILib/DigitalModule.h"
+#include "WPILib/ErrorBase.h"
+#include "WPILib/SolenoidBase.h"
+#include "WPILib/Task.h"
+#include "WPILib/DriverStation.h"
+
+// A simple implementation of receiving motor values over UDP and sending
+// joystick data back out.
+// Deals with turning a compressor on and off at the same time.
+// You should not try to change any of the outputs on any of the modules that
+// you have this class control outside of this class.
+// This class takes care of disabling outputs when no packets are received in
+// kDisableTime and feeding the Watchdog correctly.
+//
+// The receiving interface consists of receiving NetworkRobotMotors structs on
+// a given UDP port from a given sender address. Each time a set of motor values
+// is received, this class will update all output values.
+//
+// The sending interface consists of sending NetworkRobotJoysticks structs on a
+// given UDP port to a given sender address. Each time a new Driver's Station
+// packet is received from the FMS code this class will send out another packet
+// with the new values.
+class NetworkRobot : public RobotBase, public ErrorBase {
+ protected:
+  // Does not take ownership of *sender_address or *receiver_address.
+  // A NULL for either address means to not do anything with that part (sending
+  // or receiving).
+  NetworkRobot(uint16_t receive_port, const char *sender_address,
+               uint16_t send_port, const char *receiver_address);
+  virtual ~NetworkRobot();
+
+  // Called when a valid packet has been received into motors_.
+  // Subclasses can override if they want to do more, however they still need to
+  // call this implementation.
+  virtual void ProcessPacket();
+
+  // Called when no packet has been received for too long and it's time to stop
+  // everything.
+  // Subclasses can override if they want to do more, however they still need to
+  // call this implementation.
+  virtual void StopOutputs();
+
+ private:
+  // How long between packets we wait until we disable all of the outputs (in
+  // seconds).
+  // Must stay less than 1 second with the current implementation.
+  static const double kDisableTime;
+
+  // Deals with calling inet_aton and passing any errors on to the logging
+  // system. A helper is necessary here because inet_aton is normally just kind
+  // of annoying to deal with, but under vxworks, you have to make a copy of the
+  // string before doing anything with it etc etc so it's really complicated.
+  // Returns whether or not it was successful. If it returns false, then an
+  // error will have already been recorded.
+  bool FillinInAddr(const char *const_ip, in_addr *inet_address);
+
+  virtual void StartCompetition();
+
+  // Cleans everything up after the main loop encounters an error so that it can
+  // try again.
+  void Cleanup();
+
+  // Waits for receive_socket_ to become readable for up to kDisableTime.
+  // Returns whether or not there is readable data available.
+  bool WaitForData();
+
+  // Attempts to receive a packet (with WaitForData()) and calls ProcessPacket()
+  // if it's a good one.
+  void ReceivePacket();
+
+  // Gets run in its own task to take DS data and send it out.
+  void SendLoop();
+  static void StaticSendLoop(void *self) {
+    static_cast<NetworkRobot *>(self)->SendLoop();
+  }
+
+  // Sets receive_socket_ to an opened socket listening on receive_port_ to UDP
+  // packets from sender_address_.
+  void CreateReceiveSocket();
+  // Sets send_socket_ to an opened socket sending UDP packets on send_port_ to
+  // receiver_address_.
+  void CreateSendSocket();
+
+  const uint16_t receive_port_;
+  const char *const sender_address_;
+  struct in_addr expected_sender_address_;
+
+  const uint16_t send_port_;
+  const char *const receiver_address_;
+
+  int receive_socket_;
+  NetworkRobotMotors motors_;
+
+  int send_socket_;
+  NetworkRobotJoysticks joystick_values_;
+  // A task set up to run StaticSendLoop (aka SendLoop()).
+  // Only actually gets used if we're going to do both parts (sending and
+  // receiving).
+  Task send_task_;
+
+  // Helper function to copy all of the data for a single joystick into
+  // joystick_values_.
+  // axes and buttons get copied into joystick_values_.joysticks[number].
+  void CopyStickValues(int number, const int8_t (&axes)[6], uint16_t buttons);
+
+  // Using Timer::GetPPCTimestamp() values.
+  double last_received_timestamp_;
+
+  // What the last state we sent out was.
+  // Kept track of so that we can more accurately report it back.
+  DriverStation::FMSState last_sent_state_;
+  bool last_sent_state_valid_;
+
+  // Ownership of the pointers stored here stays in DigitalModule.
+  DigitalModule *digital_modules_[2];
+  // This object owns pointers stored here.
+  SolenoidBase *solenoid_bases_[2];
+
+  // A bitmask of all of the digital outputs that we have currently allocated.
+  // In hardware order.
+  uint16_t allocated_digital_outputs_[2];
+
+  DISALLOW_COPY_AND_ASSIGN(NetworkRobot);
+};
+
+#endif  // WPILIB_NETWORK_ROBOT_NETWORK_ROBOT_H_
diff --git a/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.cpp b/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.cpp
new file mode 100644
index 0000000..57760ab
--- /dev/null
+++ b/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.cpp
@@ -0,0 +1,140 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#include "WPILib/NetworkRobot/NetworkRobotValues.h"
+
+#include <string.h>
+
+namespace buffers {
+namespace {
+
+uint32_t CalculateHashValue(const char *data, size_t size) {
+  uint32_t hash_value = 0;
+  for (size_t i = 0; i < size; ++i) {
+    hash_value = (((hash_value << 8) & 0xFF00) + (data[i] & 0xFF)) % 0x04C11DB7;
+  }
+  return hash_value;
+}
+
+}  // namespace
+
+bool Read::Check() {
+  if (data_size_ < kOverhead) return false;
+
+  current_index_ = 0;
+  uint32_t size = Read32();
+  uint32_t hash = Read32();
+
+  if (data_size_ < size) return false;
+
+  uint32_t expected = CalculateHashValue(data_ + kOverhead, size - kOverhead);
+  return hash == expected;
+}
+
+bool Read::ReadCorrectAmount() {
+  if (overrun()) return false;
+
+  size_t read = current_index_;
+
+  current_index_ = 0;
+  uint32_t size = Read32();
+  current_index_ = kOverhead;
+
+  return read == size;
+}
+
+ssize_t Write::Finalize() {
+  if (overrun()) return -1;
+
+  uint32_t size = current_index_;
+  uint32_t hash = CalculateHashValue(data_ + kOverhead, size - kOverhead);
+
+  current_index_ = 0;
+  Write32(size);
+  Write32(hash);
+
+  return size;
+}
+
+}  // namespace buffers
+
+ssize_t NetworkRobotMotors::SerializeTo(char *data, size_t data_size) const {
+  buffers::Write buffer(data, data_size);
+
+  buffer.Write8(digital_module);
+  for (size_t i = 0; i < sizeof(pwm_outputs) / sizeof(pwm_outputs[0]); ++i) {
+    buffer.Write8(pwm_outputs[i]);
+  }
+  buffer.Write16(digital_output_enables);
+  buffer.Write16(digital_output_values);
+  buffer.Write8(pressure_switch_channel);
+  buffer.Write8(compressor_channel);
+  buffer.Write8(solenoid_module);
+  buffer.Write8(solenoid_values);
+
+  return buffer.Finalize();
+}
+
+bool NetworkRobotMotors::DeserializeFrom(const char *data, size_t data_size) {
+  buffers::Read buffer(data, data_size);
+  if (!buffer.Check()) return false;
+
+  digital_module = buffer.Read8();
+  for (size_t i = 0; i < sizeof(pwm_outputs) / sizeof(pwm_outputs[0]); ++i) {
+    pwm_outputs[i] = buffer.Read8();
+  }
+  digital_output_enables = buffer.Read16();
+  digital_output_values = buffer.Read16();
+  pressure_switch_channel = buffer.Read8();
+  compressor_channel = buffer.Read8();
+  solenoid_module = buffer.Read8();
+  solenoid_values = buffer.Read8();
+
+  return buffer.ReadCorrectAmount();
+}
+
+ssize_t NetworkRobotJoysticks::SerializeTo(char *data, size_t data_size) const {
+  buffers::Write buffer(data, data_size);
+
+  for (size_t i = 0; i < sizeof(joysticks) / sizeof(joysticks[0]); ++i) {
+    buffer.Write16(joysticks[i].buttons);
+    for (size_t ii = 0;
+         ii < sizeof(joysticks[0].axes) / sizeof(joysticks[0].axes[0]);
+         ++ii) {
+      buffer.Write8(joysticks[i].axes[ii]);
+    }
+  }
+  buffer.Write16(control_packet_index);
+  buffer.Write16(index);
+  buffer.Write16(team_number);
+  buffer.Write8(alliance);
+  buffer.Write8(position);
+  buffer.Write8(control.bits);
+
+  return buffer.Finalize();
+}
+
+bool NetworkRobotJoysticks::DeserializeFrom(const char *data, size_t data_size) {
+  buffers::Read buffer(data, data_size);
+  if (!buffer.Check()) return false;
+
+  for (size_t i = 0; i < sizeof(joysticks) / sizeof(joysticks[0]); ++i) {
+    joysticks[i].buttons = buffer.Read16();
+    for (size_t ii = 0;
+         ii < sizeof(joysticks[0].axes) / sizeof(joysticks[0].axes[0]);
+         ++ii) {
+      joysticks[i].axes[ii] = buffer.Read8();
+    }
+  }
+  control_packet_index = buffer.Read16();
+  index = buffer.Read16();
+  team_number = buffer.Read16();
+  alliance = buffer.Read8();
+  position = buffer.Read8();
+  control.bits = buffer.Read8();
+
+  return buffer.ReadCorrectAmount();
+}
diff --git a/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.h b/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.h
new file mode 100644
index 0000000..c8a6117
--- /dev/null
+++ b/aos/externals/WPILib/WPILib/NetworkRobot/NetworkRobotValues.h
@@ -0,0 +1,280 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#ifndef WPILIB_NETWORK_ROBOT_NETWORK_ROBOT_VALUES_H_
+#define WPILIB_NETWORK_ROBOT_NETWORK_ROBOT_VALUES_H_
+
+#include <stdint.h>
+#include <arpa/inet.h>
+
+// This file needs to not have any dependencies on any other parts of WPILib so
+// that it can be #included by other code (like that which sends these values).
+// All multi-byte values are sent over the network in big endian (network)
+// byte order.
+//
+// The structures get run through a Serialize phase to avoid byte-order,
+// padding, etc compatibility problems.
+
+// Provides a convenient way to serialize/deserialize data.
+// The serialized format consists of a 4-byte size (of everything, including the
+// size and hash value), a 4-byte hash value, and then all of the actual data.
+namespace buffers {
+// The number of extra bytes needed on top of what the actual data takes.
+// Code should use this constant in case other information is added to the
+// start (or end).
+static const size_t kOverhead = 4 + 4;
+
+// Allows reading data out of a buffer.
+// Instances are not safe for concurrent use.
+//
+// To make writing code easier, the Read* methods simply return 0 on overrun.
+// Users should check at the end (see overrun()) to see if all of the data that
+// they read is valid.
+class Read {
+ public:
+  // Does not take ownership of data, but the object will use it throughout its
+  // lifetime.
+  Read(const char *data, size_t data_size)
+      : data_(data), data_size_(data_size), current_index_(kOverhead) {}
+
+  // Returns whether there is enough data according to the size recorded with
+  // the data and the hash value is correct.
+  // Will reset the current read position to the beginning of the data unless
+  // overrun() is true.
+  bool Check();
+
+  // Returns whether or not the correct amount of data (according to the size
+  // stored at the start) was read.
+  // Will reset the current read position to the beginning of the data unless
+  // overrun() is true.
+  bool ReadCorrectAmount();
+
+  uint8_t Read8() {
+    current_index_ += 1;
+    if (overrun()) return 0;
+    return data_[current_index_ - 1];
+  }
+  uint16_t Read16() {
+    current_index_ += 2;
+    if (overrun()) return 0;
+    union {
+      uint16_t value;
+      uint8_t bytes[2];
+    } value;
+    value.bytes[0] = data_[current_index_ - 2];
+    value.bytes[1] = data_[current_index_ - 1];
+    return ntohs(value.value);
+  }
+  uint32_t Read32() {
+    current_index_ += 4;
+    if (overrun()) return 0;
+    union {
+      uint32_t value;
+      uint8_t bytes[4];
+    } value;
+    value.bytes[0] = data_[current_index_ - 4];
+    value.bytes[1] = data_[current_index_ - 3];
+    value.bytes[2] = data_[current_index_ - 2];
+    value.bytes[3] = data_[current_index_ - 1];
+    return ntohl(value.value);
+  }
+
+  // Returns whether or not we ran over the end.
+  bool overrun() const { return current_index_ > data_size_; }
+
+ private:
+  // Where we are reading or writing from. Not owned by this object.
+  const char *const data_;
+  const size_t data_size_;
+
+  // The index of the next read/write to data_.
+  size_t current_index_;
+};
+
+// Allows writing data into a buffer.
+// Instances are not safe for concurrent use.
+//
+// To make writing code easier, the Write* methods simply do nothing on overrun.
+// Users should check at the end (see overrun()) to see if all of the data that
+// they write actually got written.
+class Write {
+ public:
+  Write(char *data, size_t data_size)
+      : data_(data), data_size_(data_size), current_index_(kOverhead) {}
+
+  // Fills in the hash value and size at the beginning and returns the number of
+  // bytes used.
+  // Afterwards, further writes will go to the beginning of the data again.
+  // Returns the number of bytes used (including kOverhead at the beginning) or
+  // -1 if writing too much data was attempted.
+  ssize_t Finalize();
+
+  void Write8(uint8_t value) {
+    current_index_ += 1;
+    if (overrun()) return;
+    data_[current_index_ - 1] = value;
+  }
+  void Write16(uint16_t value) {
+    current_index_ += 2;
+    if (overrun()) return;
+    union {
+      uint16_t value;
+      uint8_t bytes[2];
+    } flipped;
+    flipped.value = htons(value);
+    data_[current_index_ - 2] = flipped.bytes[0];
+    data_[current_index_ - 1] = flipped.bytes[1];
+  }
+  void Write32(uint32_t value) {
+    current_index_ += 4;
+    if (overrun()) return;
+    union {
+      uint32_t value;
+      uint8_t bytes[4];
+    } flipped;
+    flipped.value = htonl(value);
+    data_[current_index_ - 4] = flipped.bytes[0];
+    data_[current_index_ - 3] = flipped.bytes[1];
+    data_[current_index_ - 2] = flipped.bytes[2];
+    data_[current_index_ - 1] = flipped.bytes[3];
+  }
+
+  // Returns whether or not we ran over the end.
+  bool overrun() const { return current_index_ > data_size_; }
+
+ private:
+  // Where we are reading or writing from. Not owned by this object.
+  char *const data_;
+  const size_t data_size_;
+
+  // The index of the next read/write to data_.
+  size_t current_index_;
+};
+
+}  // namespace buffers
+
+// Contains motor and other output values.
+// All channel and module numbers are 1-based like usual.
+struct NetworkRobotMotors {
+  // Which digital module this packet has values for (1 or 2).
+  // 0 means the default one and -1 means to not update any one.
+  int8_t digital_module;
+  // Raw values for all 10 PWM outputs.
+  uint8_t pwm_outputs[10];
+
+  // Bitmasks for enabling digital outputs and what values to set them to.
+  // See DigitalModule::SetDIOs for which bit is which.
+  uint16_t digital_output_enables;
+  uint16_t digital_output_values;
+
+  // Channels for a presssure switch and compressor to turn on and off based on
+  // the value from it.
+  // Whatever compressor channel is sent will be updated with the value from the
+  // corresponding pressure switch channel when the packet is received.
+  // 0 means to not do anything.
+  uint8_t pressure_switch_channel, compressor_channel;
+
+  // Which solenoid module this packet has values for (1 or 2).
+  // 0 means the default one and -1 means to not update any one.
+  int8_t solenoid_module;
+  // 1 bit for each solenoid output.
+  uint8_t solenoid_values;
+
+  // Serializes this object into data (which must be a buffer with at least
+  // data_size bytes in it).
+  // data_size should be at least sizeof(*this) + buffers::kOverhead to make sure
+  // that it is big enough.
+  // See DeserializeFrom to decode data back into an instance of this class.
+  // Returns the number of bytes of data that were used or -1 if data_size is
+  // too small.
+  ssize_t SerializeTo(char *data, size_t data_size) const;
+  // Deserializes data into this object (which must be a buffer of at least
+  // data_size bytes).
+  // data should be (all of) the data written by SerializeTo.
+  // Returns whether or not the hash value etc information in data matched (if
+  // false, the members of this object may or may not have been modified).
+  bool DeserializeFrom(const char *data, size_t data_size);
+};
+
+// The structure that the cRIO sends out with joystick positions etc.
+struct NetworkRobotJoysticks {
+  // A structure that stores the information about a joystick and instances for
+  // each of the 4 joysticks.
+  struct Joystick {
+    // Bitmask of the button values.
+    // The LSB is button 1 and only a maximum of 12 are supported.
+    uint16_t buttons;
+    // Raw values for each of the 6 joystick axes.
+    // The range of values depends on the joystick.
+    int8_t axes[6];
+  } joysticks[4];
+
+  // The index number from the DS.
+  uint16_t control_packet_index;
+  // An index for this structure. Gets incremented by 1 for each one of these
+  // structures that is sent.
+  uint16_t index;
+
+  // The team number that the DS is configured for.
+  uint16_t team_number;
+  // Which alliance the robot is on. Should be 'R' or 'B'.
+  char alliance;
+  // Which position the DS is in on the field. Should be '1', '2', or '3'.
+  char position;
+
+  // A structure that efficiently stores the control data bits from the DS and
+  // has methods for safely and easily getting and setting them and an instance
+  // of it for actually sending the information.
+  // Not just a C bitfield because those are a mess for portability.
+  struct ControlInformation {
+    bool test_mode() const { return GetBit(kTestMode); }
+    void set_test_mode(bool value) { SetBit(kTestMode, value); }
+    bool fms_attached() const { return GetBit(kFmsAttached); }
+    void set_fms_attached(bool value) { SetBit(kFmsAttached, value); }
+    bool autonomous() const { return GetBit(kAutonomous); }
+    void set_autonomous(bool value) { SetBit(kAutonomous, value); }
+    bool enabled() const { return GetBit(kEnabled); }
+    void set_enabled(bool value) { SetBit(kEnabled, value); }
+
+   private:
+    // Constants for which bit is which.
+    static const int kTestMode = 0;
+    static const int kFmsAttached = 1;
+    static const int kAutonomous = 2;
+    static const int kEnabled = 3;
+
+    bool GetBit(int bit) const {
+      return bits & (1 << bit);
+    }
+    void SetBit(int bit, bool value) {
+      uint8_t mask = 1 << bit;
+      bits &= ~mask;
+      bits |= (mask & (value ? 0xFF : 0x00));
+    }
+
+    // So that it can access bits directly for Serialize/Deserialize.
+    friend class NetworkRobotJoysticks;
+
+    uint8_t bits;
+  } control;
+
+  // Serializes this object into data (which must be a buffer with at least
+  // data_size bytes in it).
+  // data_size should be at least sizeof(*this) + buffers::kOverhead to make sure
+  // that it is big enough.
+  // See DeserializeFrom to decode data back into an instance of this class.
+  // Returns the number of bytes of data that were used or -1 if data_size is
+  // too small.
+  ssize_t SerializeTo(char *data, size_t data_size) const;
+  // Deserializes data into this object (which must be a buffer of at least
+  // data_size bytes).
+  // data should be (all of) the data written by SerializeTo.
+  // Returns whether or not the hash value etc information in data matched (if
+  // false, the members of this object may or may not have been modified).
+  bool DeserializeFrom(const char *data, size_t data_size);
+};
+
+#endif  // WPILIB_NETWORK_ROBOT_NETWORK_ROBOT_VALUES_H_
diff --git a/aos/externals/WPILib/WPILib/PWM.cpp b/aos/externals/WPILib/WPILib/PWM.cpp
index 3fea407..a95489b 100644
--- a/aos/externals/WPILib/WPILib/PWM.cpp
+++ b/aos/externals/WPILib/WPILib/PWM.cpp
@@ -44,9 +44,9 @@
 	}
 
 	snprintf(buf, 64, "PWM %d (Module: %d)", channel, moduleNumber);
-	if (allocated->Allocate((moduleNumber - 1) * kPwmChannels + channel - 1, buf) == ~0ul)
+	if (allocated->Allocate((moduleNumber - 1) * kPwmChannels + channel - 1,
+                          buf, this) == ~0ul)
 	{
-		CloneError(allocated);
 		return;
 	}
 	m_channel = channel;
@@ -94,7 +94,8 @@
 	if (m_module)
 	{
 		m_module->SetPWM(m_channel, kPwmDisabled);
-		allocated->Free((m_module->GetNumber() - 1) * kPwmChannels + m_channel - 1);
+		allocated->Free((m_module->GetNumber() - 1) * kPwmChannels + m_channel - 1,
+                    this);
 	}
 }
 
diff --git a/aos/externals/WPILib/WPILib/RWLock.cpp b/aos/externals/WPILib/WPILib/RWLock.cpp
new file mode 100644
index 0000000..16b77de
--- /dev/null
+++ b/aos/externals/WPILib/WPILib/RWLock.cpp
@@ -0,0 +1,322 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#include <taskLib.h>
+#include <intLib.h>
+#include <assert.h>
+#include <tickLib.h>
+
+#include "RWLock.h"
+
+// A wrapper for assert that allows it to be easily turned off just in this
+// file. That configuration is recommended for normal use because it means less
+// code that gets executed with the scheduler locked.
+#if 1
+#define rwlock_assert(expression) assert(expression)
+// A macro to easily assert that some expression (possibly with side effects)
+// is 0.
+#define rwlock_assert_success(expression) do { \
+  int ret = (expression); \
+  assert(ret == 0); \
+} while (false)
+#else
+#define rwlock_assert(expression) ((void)0)
+#define rwlock_assert_success(expression) ((void)(expression))
+#endif
+
+/**
+ * Class that locks the scheduler and then unlocks it in the destructor.
+ */
+class TaskSchedulerLocker {
+ public:
+  TaskSchedulerLocker() {
+    rwlock_assert_success(taskLock());
+  }
+  ~TaskSchedulerLocker() {
+    rwlock_assert_success(taskUnlock());
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerLocker);
+};
+
+RWLock::Locker::Locker(RWLock *lock, bool write)
+  : lock_(lock), num_(lock_->Lock(write)) {
+}
+
+RWLock::Locker::Locker(const Locker &other)
+  : lock_(other.lock_), num_(lock_->AddLock()) {
+}
+
+RWLock::Locker::~Locker() {
+  lock_->Unlock(num_);
+}
+
+// RWLock is implemented by just locking the scheduler while doing anything
+// because that is the only way under vxworks to do much of anything atomically.
+
+RWLock::RWLock()
+  : number_of_write_locks_(0),
+    number_of_writers_pending_(0),
+    number_of_readers_(0),
+    reader_tasks_(),
+    read_ready_(semBCreate(SEM_Q_PRIORITY, SEM_EMPTY)),
+    write_ready_(semBCreate(SEM_Q_PRIORITY, SEM_EMPTY)) {
+  rwlock_assert(read_ready_ != NULL);
+  rwlock_assert(write_ready_ != NULL);
+}
+
+RWLock::~RWLock() {
+  // Make sure that nobody else currently has a lock or will ever be able to.
+  Lock(true);
+
+  rwlock_assert_success(semDelete(read_ready_));
+  rwlock_assert_success(semDelete(write_ready_));
+}
+
+int RWLock::Lock(bool write) {
+  assert(!intContext());
+
+  int current_task = taskIdSelf();
+  // It's safe to do this check up here (outside of locking the scheduler)
+  // because we only care whether the current task is in there or not and that
+  // can't be changed because it's the task doing the checking.
+  bool current_task_holds_already = TaskOwns(current_task);
+
+  TaskSchedulerLocker scheduler_locker;
+
+  taskSafe();
+
+  // We can't be reading and writing at the same time.
+  rwlock_assert(!((number_of_write_locks_ > 0) && (number_of_readers_ > 0)));
+
+  if (write) {
+    assert(!current_task_holds_already);
+    // If somebody else already has it locked.
+    // Don't have to worry about another task getting scheduled after
+    // write_ready_ gets given because nobody else (except another writer, which
+    // would just block on it) will do anything while there are pending
+    // writer(s).
+    if ((number_of_readers_ > 0) || (number_of_write_locks_ > 0)) {
+      ++number_of_writers_pending_;
+      // Wait for it to be our turn.
+      rwlock_assert_success(semTake(write_ready_, WAIT_FOREVER));
+      --number_of_writers_pending_;
+    } else {
+      rwlock_assert(number_of_writers_pending_ == 0);
+    }
+    rwlock_assert((number_of_write_locks_ == 0) && (number_of_readers_ == 0));
+    number_of_write_locks_ = 1;
+    return 0;
+  } else {  // read
+    // While there are one or more writers active or waiting.
+    // Has to be a loop in case a writer gets scheduled between the time
+    // read_ready_ gets flushed and we run.
+    while ((number_of_write_locks_ > 0) || (number_of_writers_pending_ > 0)) {
+      // Wait for the writer(s) to finish.
+      rwlock_assert_success(semTake(read_ready_, WAIT_FOREVER));
+    }
+
+    int num = number_of_readers_;
+    number_of_readers_ = num + 1;
+    assert(num < kMaxReaders);
+    rwlock_assert(reader_tasks_[num] == 0);
+    reader_tasks_[num] = current_task;
+    rwlock_assert((number_of_write_locks_ == 0) && (number_of_readers_ > 0));
+    return num;
+  }
+}
+
+void RWLock::Unlock(int num) {
+  assert(!intContext());
+  TaskSchedulerLocker scheduler_locker;
+
+  taskUnsafe();
+
+  // We have to be reading or writing right now, but not both.
+  rwlock_assert((number_of_write_locks_ > 0) != (number_of_readers_ > 0));
+
+  if (number_of_write_locks_ > 0) {  // we're currently writing
+    rwlock_assert(num == 0);
+    --number_of_write_locks_;
+    rwlock_assert((number_of_write_locks_ >= 0) &&
+                  (number_of_writers_pending_ >= 0));
+    // If we were the last one.
+    if (number_of_write_locks_ == 0) {
+      // If there are no other tasks waiting to write (because otherwise they
+      // need to get priority over any readers).
+      if (number_of_writers_pending_ == 0) {
+        // Wake up any waiting readers.
+        rwlock_assert_success(semFlush(read_ready_));
+      } else {
+        // Wake up a waiting writer.
+        // Not a problem if somebody else already did this before the waiting
+        // writer got a chance to take it because it'll do nothing and return
+        // success.
+        rwlock_assert_success(semGive(write_ready_));
+      }
+    }
+  } else {  // we're curently reading
+    rwlock_assert(reader_tasks_[num] == taskIdSelf());
+    reader_tasks_[num] = 0;
+    --number_of_readers_;
+    rwlock_assert(number_of_readers_ >= 0 &&
+                  (number_of_writers_pending_ >= 0));
+    // If we were the last one.
+    if (number_of_readers_ == 0) {
+      // If there are any writers waiting for a chance to go.
+      if (number_of_writers_pending_ > 0) {
+        // Wake a waiting writer.
+        // Not a problem if somebody else already did this before the waiting
+        // writer got a chance to take it because it'll still return success.
+        rwlock_assert_success(semGive(write_ready_));
+      }
+    }
+  }
+}
+
+int RWLock::AddLock() {
+  assert(!intContext());
+  // TODO: Replace this with just atomically incrementing the right number once
+  // we start using a GCC new enough to have the nice atomic builtins.
+  // That will be safe because whether we're currently reading or writing can't
+  // change in the middle of this.
+  TaskSchedulerLocker scheduler_locker;
+
+  // We have to be reading or writing right now, but not both.
+  rwlock_assert((number_of_write_locks_ > 0) != (number_of_readers_ > 0));
+
+  if (number_of_write_locks_ > 0) {  // we're currently writing
+    ++number_of_write_locks_;
+    return 0;
+  } else {  // we're currently reading
+    return number_of_readers_++;
+  }
+}
+
+bool RWLock::TaskOwns(int task_id) {
+  for (size_t i = 0;
+       i < sizeof(reader_tasks_) / sizeof(reader_tasks_[0]);
+       ++i) {
+    if (reader_tasks_[i] == task_id) return true;
+  }
+  return false;
+}
+
+#include <stdint.h>
+
+#include "Task.h"
+
+namespace {
+namespace testing {
+
+// It's kind of hard to test for race conditions because (by definition) they
+// only happen with really specific (and uncommon) timing. However, what tests
+// can cover is "normal" functioning (locking/unlocking by multiple tasks).
+
+// How long to wait until "everything" will be done doing whatever it's going
+// to.
+const int kSettleTicks = 10;
+
+void SetUp() {
+}
+
+void TearDown() {
+}
+
+struct LockerConfig {
+  RWLock *const lock;
+  const bool write;
+
+  const int delay_ticks;
+
+  bool started;
+  bool locked;
+  bool done;
+  bool unlocked;
+
+  LockerConfig(RWLock *lock, bool write, int delay_ticks = kSettleTicks)
+      : lock(lock), write(write), delay_ticks(delay_ticks),
+        started(false), locked(false), done(false), unlocked(false) {}
+};
+void LockerTask(LockerConfig *config) {
+  config->started = true;
+  {
+    RWLock::Locker locker(config->lock, config->write);
+    config->locked = true;
+    taskDelay(config->delay_ticks);
+    config->done = true;
+  }
+  config->unlocked = true;
+}
+
+// A basic test to make sure that 2 readers can get to it at the same time.
+// Mostly just to make sure that the test setup etc works.
+bool TwoReaders() {
+  Task one("R1", reinterpret_cast<FUNCPTR>(LockerTask));
+  Task two("R2", reinterpret_cast<FUNCPTR>(LockerTask));
+  RWLock lock;
+
+  LockerConfig one_config(&lock, false), two_config(&lock, false);
+  one.Start(reinterpret_cast<uintptr_t>(&one_config));
+  two.Start(reinterpret_cast<uintptr_t>(&two_config));
+  while (!one_config.locked) taskDelay(1);
+  assert(!one_config.done);
+  while (!two_config.locked) taskDelay(1);
+  if (one_config.done) {
+    printf("It took too long for the second one to lock.\n");
+    return false;
+  }
+  return true;
+}
+
+// Makes sure that everything works correctly even if a task is deleted while
+// a lock is held.
+bool DeleteWhileLocked() {
+  Task reader("reader", reinterpret_cast<FUNCPTR>(LockerTask));
+  Task writer("writer", reinterpret_cast<FUNCPTR>(LockerTask));
+  static const unsigned int kDelayTicks = 15;
+  RWLock lock;
+
+  LockerConfig reader_config(&lock, false, kDelayTicks);
+  LockerConfig writer_config(&lock, true, kDelayTicks);
+
+  ULONG start = tickGet();
+  reader.Start(reinterpret_cast<uintptr_t>(&reader_config));
+  while (!reader_config.locked) taskDelay(1);
+  writer.Start(reinterpret_cast<uintptr_t>(&writer_config));
+  reader.Stop();
+  if (tickGet() - start < kDelayTicks) {
+    printf("Reader stopped too quickly.\n");
+    return false;
+  }
+
+  while (!writer_config.done) taskDelay(1);
+  if (tickGet() - start < kDelayTicks * 2) {
+    printf("Writer finished too quickly.\n");
+    return false;
+  }
+  return true;
+}
+
+#define RUN_TEST(name) do { \
+  SetUp(); \
+  bool test_succeeded = name(); \
+  TearDown(); \
+  if (!test_succeeded) successful = false; \
+} while (false)
+extern "C" int rwlock_test() {
+  bool successful = true;
+
+  RUN_TEST(TwoReaders);
+  RUN_TEST(DeleteWhileLocked);
+
+  return successful ? 0 : -1;
+}
+#undef RUN_TEST
+
+}  // namespace testing
+}  // namespace
diff --git a/aos/externals/WPILib/WPILib/RWLock.h b/aos/externals/WPILib/WPILib/RWLock.h
new file mode 100644
index 0000000..4ad64c8
--- /dev/null
+++ b/aos/externals/WPILib/WPILib/RWLock.h
@@ -0,0 +1,127 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#ifndef WPILIB_DATA_LOCK_H_
+#define WPILIB_DATA_LOCK_H_
+
+#include <semLib.h>
+
+#include "Base.h"
+
+/**
+ * Represents a read/write lock on using some shared data so that it will not
+ * be modified by any other tasks while code is using it.
+ *
+ * See <http://en.wikipedia.org/wiki/Readers-writer_lock> for an overview of how
+ * this can be used.
+ *
+ * In this implementation, if there are any writers pending, then any new
+ * attempts to acquire read locks will wait until all writers are done unless a
+ * read lock is already held by that same task.
+ *
+ * While a lock is held, the task holding it can not be deleted.
+ */
+class RWLock {
+ public:
+  /**
+   * Represents an actual lock on the shared data. The destructor will free it.
+   *
+   * Intended to be used as an automatic (or local) variable so that the
+   * compiler will ensure that the destructor gets called no matter how the
+   * scope is exited.
+   *
+   * While it is possible to use new/delete to dynamically allocate an instance,
+   * the constructor and destructor still MUST still be called from the same
+   * task.
+   *
+   * Has a copy constructor which allows "copying" the lock that is held. Does
+   * not have an assignment operator because assigning a lock doesn't make much
+   * sense.
+   */
+  class Locker {
+   public:
+    /**
+     * @param write Whether to create a writer lock (creates a reader lock
+     * otherwise).
+     */
+    Locker(RWLock *lock, bool write);
+
+    /**
+     * Creates another lock of the same type. They can both be released
+     * (destructed) independently.
+     * NOTE: This does allow creating multiple write locks that are held at the
+     * same time.
+     */
+    Locker(const Locker &other);
+
+    /**
+     * Unlocks the lock.
+     */
+    ~Locker();
+
+   private:
+    RWLock *const lock_;
+    const int num_;
+
+    void operator=(const Locker &);
+  };
+
+  /**
+   * The maximum number of read locks that can be held at the same time.
+   */
+  static const int kMaxReaders = 64;
+
+  RWLock();
+  /**
+   * Waits until there are no more read or write locks held.
+   */
+  ~RWLock();
+
+ private:
+  // The number of write locks that are currently held.
+  int number_of_write_locks_;
+  // How many tasks are currently waiting to get a write lock.
+  // Each count in here corresponds to a task that is blocked on write_ready_.
+  int number_of_writers_pending_;
+
+  // How many read locks are currently held.
+  int number_of_readers_;
+
+  // The task ID of the task holding each read lock.
+  int reader_tasks_[kMaxReaders];
+
+  // Always locked. Gets semFlushed when readers are allowed to take the lock
+  // (after all writers are done).
+  SEM_ID read_ready_;
+  // Locked almost all of the time. Pending writers (who have to update
+  // number_of_writers_pending_) block locking this and it gets unlocked when it
+  // is time for one of them to go.
+  SEM_ID write_ready_;
+
+  // Acquires the appropriate kind of lock.
+  // Returns a value that must be passed to the corresponding Unlock call.
+  int Lock(bool write);
+  // Unlocks 1 lock.
+  // Does not need to know whether it is read or write because only one type of
+  // lock can be held at a time.
+  // num must be the return value from the corresponding Lock/AddLock call.
+  void Unlock(int num);
+  // Increments the lock count by 1.
+  // There must be at least 1 lock held during the execution of this method.
+  // Use the regular Unlock() to unlock a lock acquired this way.
+  // This is not the same as Lock(current_type) because this is the only way to
+  // acquire multiple write locks at the same time.
+  // Returns a value that must be passed to the corresponding Unlock call.
+  int AddLock();
+  // Checks whether task_id is in reader_tasks_.
+  bool TaskOwns(int task_id);
+
+  friend class Locker;
+
+  DISALLOW_COPY_AND_ASSIGN(RWLock);
+};
+
+#endif  // WPILIB_DATA_LOCK_H_
diff --git a/aos/externals/WPILib/WPILib/Relay.cpp b/aos/externals/WPILib/WPILib/Relay.cpp
index 1f28a64..1e319c0 100644
--- a/aos/externals/WPILib/WPILib/Relay.cpp
+++ b/aos/externals/WPILib/WPILib/Relay.cpp
@@ -44,9 +44,9 @@
 	if (m_direction == kBothDirections || m_direction == kForwardOnly)
 	{
 		snprintf(buf, 64, "Forward Relay %d (Module: %d)", m_channel, moduleNumber);
-		if (relayChannels->Allocate(((moduleNumber - 1) * kRelayChannels + m_channel - 1) * 2, buf) == ~0ul)
+		if (relayChannels->Allocate(((moduleNumber - 1) * kRelayChannels +
+                                 m_channel - 1) * 2, buf, this) == ~0ul)
 		{
-			CloneError(relayChannels);
 			return;
 		}
 
@@ -55,9 +55,9 @@
 	if (m_direction == kBothDirections || m_direction == kReverseOnly)
 	{
 		snprintf(buf, 64, "Reverse Relay %d (Module: %d)", m_channel, moduleNumber);
-		if (relayChannels->Allocate(((moduleNumber - 1) * kRelayChannels + m_channel - 1) * 2 + 1, buf) == ~0ul)
+		if (relayChannels->Allocate(((moduleNumber - 1) * kRelayChannels
+                                 + m_channel - 1) * 2 + 1, buf, this) == ~0ul)
 		{
-			CloneError(relayChannels);
 			return;
 		}
 
@@ -106,11 +106,13 @@
 
 	if (m_direction == kBothDirections || m_direction == kForwardOnly)
 	{
-		relayChannels->Free(((m_module->GetNumber() - 1) * kRelayChannels + m_channel - 1) * 2);
+		relayChannels->Free(((m_module->GetNumber() - 1) *
+                         kRelayChannels + m_channel - 1) * 2, this);
 	}
 	if (m_direction == kBothDirections || m_direction == kReverseOnly)
 	{
-		relayChannels->Free(((m_module->GetNumber() - 1) * kRelayChannels + m_channel - 1) * 2 + 1);
+		relayChannels->Free(((m_module->GetNumber() - 1) *
+                         kRelayChannels + m_channel - 1) * 2 + 1, this);
 	}
 }
 
diff --git a/aos/externals/WPILib/WPILib/Resource.cpp b/aos/externals/WPILib/WPILib/Resource.cpp
index 858d239..a5a763e 100644
--- a/aos/externals/WPILib/WPILib/Resource.cpp
+++ b/aos/externals/WPILib/WPILib/Resource.cpp
@@ -6,7 +6,6 @@
 
 #include "Resource.h"
 #include "WPIErrors.h"
-#include "ErrorBase.h"
 
 ReentrantSemaphore Resource::m_createLock;
 
@@ -28,6 +27,7 @@
 
 /**
  * Factory method to create a Resource allocation-tracker *if* needed.
+ * Handles the necessary synchronization internally.
  *
  * @param r -- address of the caller's Resource pointer. If *r == NULL, this
  *    will construct a Resource and make *r point to it. If *r != NULL, i.e.
@@ -59,7 +59,7 @@
  * When a resource is requested, mark it allocated. In this case, a free resource value
  * within the range is located and returned after it is marked allocated.
  */
-uint32_t Resource::Allocate(const char *resourceDesc)
+uint32_t Resource::Allocate(const char *resourceDesc, const ErrorBase *error)
 {
 	Synchronized sync(m_allocateLock);
 	for (uint32_t i=0; i < m_size; i++)
@@ -70,7 +70,7 @@
 			return i;
 		}
 	}
-	wpi_setWPIErrorWithContext(NoAvailableResources, resourceDesc);
+	wpi_setStaticWPIErrorWithContext(error, NoAvailableResources, resourceDesc);
 	return ~0ul;
 }
 
@@ -79,17 +79,18 @@
  * The user requests a specific resource value, i.e. channel number and it is verified
  * unallocated, then returned.
  */
-uint32_t Resource::Allocate(uint32_t index, const char *resourceDesc)
+uint32_t Resource::Allocate(uint32_t index, const char *resourceDesc,
+                            const ErrorBase *error)
 {
 	Synchronized sync(m_allocateLock);
 	if (index >= m_size)
 	{
-		wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, resourceDesc);
+		wpi_setStaticWPIErrorWithContext(error, ChannelIndexOutOfRange, resourceDesc);
 		return ~0ul;
 	}
 	if ( m_isAllocated[index] )
 	{
-		wpi_setWPIErrorWithContext(ResourceAlreadyAllocated, resourceDesc);
+		wpi_setStaticWPIErrorWithContext(error, ResourceAlreadyAllocated, resourceDesc);
 		return ~0ul;
 	}
 	m_isAllocated[index] = true;
@@ -102,18 +103,18 @@
  * After a resource is no longer needed, for example a destructor is called for a channel assignment
  * class, Free will release the resource value so it can be reused somewhere else in the program.
  */
-void Resource::Free(uint32_t index)
+void Resource::Free(uint32_t index, const ErrorBase *error)
 {
 	Synchronized sync(m_allocateLock);
 	if (index == ~0ul) return;
 	if (index >= m_size)
 	{
-		wpi_setWPIError(NotAllocated);
+		wpi_setStaticWPIError(error, NotAllocated);
 		return;
 	}
 	if (!m_isAllocated[index])
 	{
-		wpi_setWPIError(NotAllocated);
+		wpi_setStaticWPIError(error, NotAllocated);
 		return;
 	}
 	m_isAllocated[index] = false;
diff --git a/aos/externals/WPILib/WPILib/Resource.h b/aos/externals/WPILib/WPILib/Resource.h
index 52220bb..daac57b 100644
--- a/aos/externals/WPILib/WPILib/Resource.h
+++ b/aos/externals/WPILib/WPILib/Resource.h
@@ -19,15 +19,18 @@
  * The Resource class does not allocate the hardware channels or other
  * resources; it just tracks which indices were marked in use by
  * Allocate and not yet freed by Free.
+ *
+ * Several methods require an ErrorBase* so that they can report any errors.
  */
-class Resource : public ErrorBase
+class Resource
 {
 public:
 	virtual ~Resource();
 	static void CreateResourceObject(Resource **r, uint32_t elements);
-	uint32_t Allocate(const char *resourceDesc);
-	uint32_t Allocate(uint32_t index, const char *resourceDesc);
-	void Free(uint32_t index);
+	uint32_t Allocate(const char *resourceDesc, const ErrorBase *error);
+	uint32_t Allocate(uint32_t index, const char *resourceDesc,
+                    const ErrorBase *error);
+	void Free(uint32_t index, const ErrorBase *error);
 
 private:
 	explicit Resource(uint32_t size);
diff --git a/aos/externals/WPILib/WPILib/RobotBase.cpp b/aos/externals/WPILib/WPILib/RobotBase.cpp
index a9ec2ee..2be15c2 100644
--- a/aos/externals/WPILib/WPILib/RobotBase.cpp
+++ b/aos/externals/WPILib/WPILib/RobotBase.cpp
@@ -24,6 +24,8 @@
 
 void RobotBase::setInstance(RobotBase* robot)
 {
+  // No point in synchronization here because it's private and it only gets
+  // called from robotTask.
 	wpi_assert(m_instance == NULL);
 	m_instance = robot;
 }
@@ -35,8 +37,9 @@
 
 /**
  * Constructor for a generic robot program.
- * User code should be placed in the constuctor that runs before the Autonomous or Operator
- * Control period starts. The constructor will run to completion before Autonomous is entered.
+ * User code that should run before the Autonomous or Operator Control period
+ * starts should be placed in the subclass constructor.
+ * The constructor must finish before Autonomous can be entered.
  * 
  * This must be used to ensure that the communications code starts. In the future it would be
  * nice to put this code into it's own task that loads on boot so ensure that it runs.
@@ -50,7 +53,7 @@
 
 /**
  * Free the resources for a RobotBase class.
- * This includes deleting all classes that might have been allocated as Singletons to they
+ * This includes deleting all classes that might have been allocated as Singletons so they
  * would never be deleted except here.
  */
 RobotBase::~RobotBase()
@@ -100,7 +103,7 @@
 }
 
 /**
- * Determine if the robot is currently in Autnomous mode.
+ * Determine if the robot is currently in Autonomous mode.
  * @return True if the robot is currently operating Autonomously as determined by the field controls.
  */
 bool RobotBase::IsAutonomous()
@@ -140,9 +143,10 @@
  */
 void RobotBase::robotTask(FUNCPTR factory, Task *task)
 {
-	RobotBase::setInstance((RobotBase*)factory());
-	RobotBase::getInstance().m_task = task;
-	RobotBase::getInstance().StartCompetition();
+  RobotBase *instance = (RobotBase*)factory();
+  instance->m_task = task;
+  RobotBase::setInstance(instance);
+  instance->StartCompetition();
 }
 
 void RobotBase::WriteVersionString() {
@@ -156,10 +160,12 @@
 /**
  * 
  * Start the robot code.
- * This function starts the robot code running by spawning a task. Currently tasks seemed to be
- * started by LVRT without setting the VX_FP_TASK flag so floating point context is not saved on
- * interrupts. Therefore the program experiences hard to debug and unpredictable results. So the
- * LVRT code starts this function, and it, in turn, starts the actual user program.
+ * This function starts the robot code running by spawning a task. Currently
+ * tasks seem to be started by LVRT without setting the VX_FP_TASK flag which
+ * means that the floating point registers are not saved on interrupts and task
+ * switches. That causes the program to experience hard to debug and
+ * unpredictable results, so the LVRT code starts this function, so that it, in
+ * turn, can start the actual user program.
  */
 void RobotBase::startRobotTask(FUNCPTR factory)
 {
@@ -214,8 +220,7 @@
 /**
  * This class exists for the sole purpose of getting its destructor called when the module unloads.
  * Before the module is done unloading, we need to delete the RobotBase derived singleton.  This should delete
- * the other remaining singletons that were registered.  This should also stop all tasks that are using
- * the Task class.
+ * the other remaining singletons that were registered.
  */
 class RobotDeleter
 {
diff --git a/aos/externals/WPILib/WPILib/RobotBase.h b/aos/externals/WPILib/WPILib/RobotBase.h
index 2915669..e587089 100644
--- a/aos/externals/WPILib/WPILib/RobotBase.h
+++ b/aos/externals/WPILib/WPILib/RobotBase.h
@@ -13,6 +13,11 @@
 
 class DriverStation;
 
+/**
+ * This macro will set up the given class (which must be a (direct or indirect)
+ * RobotBase subclass) so that when the user code is loaded, it will be
+ * instantiated and StartCompetition() will be called on the instance.
+ */
 #define START_ROBOT_CLASS(_ClassName_) \
 	RobotBase *FRC_userClassFactory() \
 	{ \
@@ -28,17 +33,14 @@
 
 /**
  * Implement a Robot Program framework.
- * The RobotBase class is intended to be subclassed by a user creating a robot program.
- * Overridden Autonomous() and OperatorControl() methods are called at the appropriate time
- * as the match proceeds. In the current implementation, the Autonomous code will run to
- * completion before the OperatorControl code could start. In the future the Autonomous code
- * might be spawned as a task, then killed at the end of the Autonomous period.
+ * The RobotBase class is intended to be subclassed by a user creating a robot
+ * program, possibly indirectly through one of the subclasses included in this
+ * library.
  */
 class RobotBase {
 	friend class RobotDeleter;
 public:
 	static RobotBase &getInstance();
-	static void setInstance(RobotBase* robot);
 
 	bool IsEnabled();
 	bool IsDisabled();
@@ -49,7 +51,6 @@
 	bool IsNewDataAvailable();
 	Watchdog &GetWatchdog();
 	static void startRobotTask(FUNCPTR factory);
-	static void robotTask(FUNCPTR factory, Task *task);
 
 protected:
 	virtual ~RobotBase();
@@ -57,6 +58,9 @@
 	RobotBase();
 	static void WriteVersionString();
 
+	static void setInstance(RobotBase* robot);
+	static void robotTask(FUNCPTR factory, Task *task);
+
 	Task *m_task;
 	Watchdog m_watchdog;
 	DriverStation *m_ds;
diff --git a/aos/externals/WPILib/WPILib/RobotDrive.cpp b/aos/externals/WPILib/WPILib/RobotDrive.cpp
index 547d6bf..4f6b4b6 100644
--- a/aos/externals/WPILib/WPILib/RobotDrive.cpp
+++ b/aos/externals/WPILib/WPILib/RobotDrive.cpp
@@ -725,7 +725,7 @@
 
 void RobotDrive::GetDescription(char *desc)
 {
-	sprintf(desc, "RobotDrive");
+	snprintf(desc, 64, "RobotDrive");
 }
 
 void RobotDrive::StopMotor()
diff --git a/aos/externals/WPILib/WPILib/SafePWM.cpp b/aos/externals/WPILib/WPILib/SafePWM.cpp
index aedf0b6..d0ddb8b 100644
--- a/aos/externals/WPILib/WPILib/SafePWM.cpp
+++ b/aos/externals/WPILib/WPILib/SafePWM.cpp
@@ -100,7 +100,7 @@
 
 void SafePWM::GetDescription(char *desc)
 {
-	sprintf(desc, "PWM %ld on module %ld", GetChannel(), GetModuleNumber());
+	snprintf(desc, 64, "PWM %ld on module %ld", GetChannel(), GetModuleNumber());
 }
 
 /**
diff --git a/aos/externals/WPILib/WPILib/SensorBase.cpp b/aos/externals/WPILib/WPILib/SensorBase.cpp
index 51736b6..82f15c4 100644
--- a/aos/externals/WPILib/WPILib/SensorBase.cpp
+++ b/aos/externals/WPILib/WPILib/SensorBase.cpp
@@ -7,7 +7,6 @@
 #include "SensorBase.h"
 
 #include "NetworkCommunication/LoadOut.h"
-#include "WPIErrors.h"
 
 const uint32_t SensorBase::kSystemClockTicksPerMicrosecond;
 const uint32_t SensorBase::kDigitalChannels;
@@ -18,11 +17,11 @@
 const uint32_t SensorBase::kSolenoidModules;
 const uint32_t SensorBase::kPwmChannels;
 const uint32_t SensorBase::kRelayChannels;
-const uint32_t SensorBase::kChassisSlots;
 SensorBase *SensorBase::m_singletonList = NULL;
+ReentrantSemaphore SensorBase::m_singletonListSemaphore;
 
 /**
- * Creates an instance of the sensor base and gets an FPGA handle
+ * Creates an instance of SensorBase.
  */
 SensorBase::SensorBase()
 {
@@ -36,27 +35,31 @@
 }
 
 /**
- * Add sensor to the singleton list.
- * Add this sensor to the list of singletons that need to be deleted when
- * the robot program exits. Each of the sensors on this list are singletons,
- * that is they aren't allocated directly with new, but instead are allocated
- * by the static GetInstance method. As a result, they are never deleted when
- * the program exits. Consequently these sensors may still be holding onto
- * resources and need to have their destructors called at the end of the program.
+ * @brief Add sensor to the singleton list.
+ * Add this object to the list of singletons that need to be deleted when
+ * the robot program exits. Each of the objects on this list are singletons,
+ * that is they aren't allocated directly by user code, but instead are
+ * allocated by (for example) a static GetInstance method. Because of this, they
+ * need some way to be freed when the module is unloaded so that they can free
+ * any resources that they are holding on to.
+ * @see #DeleteSingletons()
  */
 void SensorBase::AddToSingletonList()
 {
+  Synchronized sync(m_singletonListSemaphore);
 	m_nextSingleton = m_singletonList;
 	m_singletonList = this;
 }
 
 /**
- * Delete all the singleton classes on the list.
- * All the classes that were allocated as singletons need to be deleted so
+ * @brief Delete all the singleton objects on the list.
+ * All the objects that were allocated as singletons need to be deleted so
  * their resources can be freed.
+ * @see #AddToSingletonList()
  */
 void SensorBase::DeleteSingletons()
 {
+  Synchronized sync(m_singletonListSemaphore);
 	for (SensorBase *next = m_singletonList; next != NULL;)
 	{
 		SensorBase *tmp = next;
diff --git a/aos/externals/WPILib/WPILib/SensorBase.h b/aos/externals/WPILib/WPILib/SensorBase.h
index 044029f..58e3977 100644
--- a/aos/externals/WPILib/WPILib/SensorBase.h
+++ b/aos/externals/WPILib/WPILib/SensorBase.h
@@ -7,20 +7,19 @@
 #ifndef SENSORBASE_H_
 #define SENSORBASE_H_
 
-#include "ChipObject/NiRio.h"
 #include "ErrorBase.h"
 #include <stdio.h>
 #include "Base.h"
+#include "Synchronized.h"
 
 /**
  * Base class for all sensors.
  * Stores most recent status information as well as containing utility functions for checking
- * channels and error processing.
+ * channels.
  */
 class SensorBase: public ErrorBase {
 public:
 	SensorBase();
-	virtual ~SensorBase();
 	static void DeleteSingletons();
 	static uint32_t GetDefaultAnalogModule() { return 1; }
 	static uint32_t GetDefaultDigitalModule() { return 1; }
@@ -36,6 +35,9 @@
 	static bool CheckAnalogChannel(uint32_t channel);
 	static bool CheckSolenoidChannel(uint32_t channel);
 
+  // NOT vxworks system clock ticks (returned by sysClkRateGet() from sysLib).
+  // TODO: Document what this actually is (has something to do with FPGA times).
+  // 40kHz clock?
 	static const uint32_t kSystemClockTicksPerMicrosecond = 40;
 	static const uint32_t kDigitalChannels = 14;
 	static const uint32_t kAnalogChannels = 8;
@@ -45,14 +47,19 @@
 	static const uint32_t kSolenoidModules = 2;
 	static const uint32_t kPwmChannels = 10;
 	static const uint32_t kRelayChannels = 8;
-	static const uint32_t kChassisSlots = 8;
+
 protected:
 	void AddToSingletonList();
+  // Subclasses that don't use the singleton list mechanism should make this
+  // public, but ones that do should keep it protected so that users can not
+  // delete the singleton instance(s).
+	virtual ~SensorBase();
 
 private:
 	DISALLOW_COPY_AND_ASSIGN(SensorBase);
 	static SensorBase *m_singletonList;
 	SensorBase *m_nextSingleton;
+  static ReentrantSemaphore m_singletonListSemaphore;
 };
 
 
diff --git a/aos/externals/WPILib/WPILib/SimpleRobot.h b/aos/externals/WPILib/WPILib/SimpleRobot.h
index d963805..88143a6 100644
--- a/aos/externals/WPILib/WPILib/SimpleRobot.h
+++ b/aos/externals/WPILib/WPILib/SimpleRobot.h
@@ -11,6 +11,10 @@
 
 /**
  * @todo If this is going to last until release, it needs a better name.
+ * Overridden Autonomous() and OperatorControl() methods are called at the appropriate time
+ * as the match proceeds. In the current implementation, the Autonomous code will run to
+ * completion before the OperatorControl code could start. In the future the Autonomous code
+ * might be spawned as a task, then killed at the end of the Autonomous period.
  */
 class SimpleRobot: public RobotBase
 {
diff --git a/aos/externals/WPILib/WPILib/Solenoid.cpp b/aos/externals/WPILib/WPILib/Solenoid.cpp
index f49d59a..20aab19 100644
--- a/aos/externals/WPILib/WPILib/Solenoid.cpp
+++ b/aos/externals/WPILib/WPILib/Solenoid.cpp
@@ -31,9 +31,10 @@
 	Resource::CreateResourceObject(&m_allocated, tSolenoid::kNumDO7_0Elements * kSolenoidChannels);
 
 	snprintf(buf, 64, "Solenoid %d (Module: %d)", m_channel, m_moduleNumber);
-	if (m_allocated->Allocate((m_moduleNumber - 1) * kSolenoidChannels + m_channel - 1, buf) == ~0ul)
+	if (m_allocated->Allocate((m_moduleNumber - 1) * kSolenoidChannels
+                            + m_channel - 1,
+                            buf, this) == ~0ul)
 	{
-		CloneError(m_allocated);
 		return;
 	}
 
@@ -73,7 +74,8 @@
 {
 	if (CheckSolenoidModule(m_moduleNumber))
 	{
-		m_allocated->Free((m_moduleNumber - 1) * kSolenoidChannels + m_channel - 1);
+		m_allocated->Free((m_moduleNumber - 1) * kSolenoidChannels + m_channel - 1,
+                      this);
 	}
 }
 
diff --git a/aos/externals/WPILib/WPILib/SolenoidBase.cpp b/aos/externals/WPILib/WPILib/SolenoidBase.cpp
index d5765c6..58c0430 100644
--- a/aos/externals/WPILib/WPILib/SolenoidBase.cpp
+++ b/aos/externals/WPILib/WPILib/SolenoidBase.cpp
@@ -50,7 +50,7 @@
 }
 
 /**
- * Set the value of a solenoid.
+ * Set the value of 1 or more solenoids at the same time.
  * 
  * @param value The value you want to set on the module.
  * @param mask The channels you want to be affected.
@@ -63,8 +63,9 @@
 		Synchronized sync(m_semaphore);
 		uint8_t currentValue = m_fpgaSolenoidModule->readDO7_0(m_moduleNumber - 1, &localStatus);
 		// Zero out the values to change
-		currentValue = currentValue & ~mask;
-		currentValue = currentValue | (value & mask);
+		currentValue &= ~mask;
+    // Actually set the values.
+		currentValue |= value & mask;
 		m_fpgaSolenoidModule->writeDO7_0(m_moduleNumber - 1, currentValue, &localStatus);
 	}
 	wpi_setError(localStatus);
diff --git a/aos/externals/WPILib/WPILib/SolenoidBase.h b/aos/externals/WPILib/WPILib/SolenoidBase.h
index ea2fb43..3b1a5cb 100644
--- a/aos/externals/WPILib/WPILib/SolenoidBase.h
+++ b/aos/externals/WPILib/WPILib/SolenoidBase.h
@@ -15,17 +15,25 @@
 /**
  * SolenoidBase class is the common base class for the Solenoid and
  * DoubleSolenoid classes.
+ * It also supports getting and setting the values of all solenoids on a given
+ * module at the same time directly.
  */
 class SolenoidBase : public SensorBase {
 public:
+	explicit SolenoidBase(uint8_t moduleNumber);
 	virtual ~SolenoidBase();
+
+	void Set(uint8_t value, uint8_t mask);
+
 	uint8_t GetAll();
+  /**
+   * Set the value of all of the solenoids at the same time.
+   *
+   * @param value The values you want to set all of the solenoids to.
+   */
+  void SetAll(uint8_t value) { Set(value, 0xFF); }
 
 protected:
-	explicit SolenoidBase(uint8_t moduleNumber);
-	void Set(uint8_t value, uint8_t mask);
-	virtual void InitSolenoid() = 0;
-
 	uint32_t m_moduleNumber; ///< Slot number where the module is plugged into the chassis.
 	static Resource *m_allocated;
 
diff --git a/aos/externals/WPILib/WPILib/Synchronized.cpp b/aos/externals/WPILib/WPILib/Synchronized.cpp
index eb17318..fd133b5 100644
--- a/aos/externals/WPILib/WPILib/Synchronized.cpp
+++ b/aos/externals/WPILib/WPILib/Synchronized.cpp
@@ -20,7 +20,7 @@
 	semTake(m_semaphore, WAIT_FOREVER);
 }
 
-Synchronized::Synchronized(ReentrantSemaphore& semaphore)
+Synchronized::Synchronized(const ReentrantSemaphore& semaphore)
 {
 	m_semaphore = semaphore.m_semaphore;
 	semTake(m_semaphore, WAIT_FOREVER);
diff --git a/aos/externals/WPILib/WPILib/Synchronized.h b/aos/externals/WPILib/WPILib/Synchronized.h
index 28cfbc3..4e44b0e 100644
--- a/aos/externals/WPILib/WPILib/Synchronized.h
+++ b/aos/externals/WPILib/WPILib/Synchronized.h
@@ -27,11 +27,15 @@
  *
  * This class is safe to use in static variables because it does not depend on
  * any other C++ static constructors or destructors.
+ *
+ * The instance methods are marked const because using this class from multiple
+ * threads at once is safe and they don't actually modify the value of any of
+ * the instance variables.
  */
 class ReentrantSemaphore
 {
 public:
-	explicit ReentrantSemaphore() {
+	ReentrantSemaphore() {
 		m_semaphore = semMCreate(SEM_Q_PRIORITY | SEM_DELETE_SAFE);
 	}
 	~ReentrantSemaphore() {
@@ -42,7 +46,7 @@
 	 * Lock the semaphore, blocking until it's available.
 	 * @return 0 for success, -1 for error. If -1, the error will be in errno.
 	 */
-	int take() {
+	int take() const {
 		return semTake(m_semaphore, WAIT_FOREVER);
 	}
 
@@ -50,7 +54,7 @@
 	 * Unlock the semaphore.
 	 * @return 0 for success, -1 for error. If -1, the error will be in errno.
 	 */
-	int give() {
+	int give() const {
 		return semGive(m_semaphore);
 	}
 
@@ -83,8 +87,8 @@
 {
 public:
 	explicit Synchronized(SEM_ID);
-	explicit Synchronized(ReentrantSemaphore&);
-	virtual ~Synchronized();
+	explicit Synchronized(const ReentrantSemaphore&);
+	~Synchronized();
 private:
 	SEM_ID m_semaphore;
 
diff --git a/aos/externals/WPILib/WPILib/Task.cpp b/aos/externals/WPILib/WPILib/Task.cpp
index 018c95b..c159202 100644
--- a/aos/externals/WPILib/WPILib/Task.cpp
+++ b/aos/externals/WPILib/WPILib/Task.cpp
@@ -18,6 +18,7 @@
 
 /**
  * Create but don't launch a task.
+ * Does not use any floating point registers.
  * @param name The name of the task.  "FRC_" will be prepended to the task name.
  * @param function The address of the function to run as the new task.
  * @param priority The VxWorks priority for the task.
@@ -38,6 +39,9 @@
 	nUsageReporting::report(nUsageReporting::kResourceType_Task, instances, 0, m_taskName);
 }
 
+/**
+ * Does not use any floating point registers.
+ */
 Task::~Task()
 {
 	if (m_taskID != kInvalidTaskID) Stop();
@@ -47,18 +51,20 @@
 
 /**
  * Starts this task.
- * If it is already running or unable to start, it fails and returns false.
+ * Does not use any floating point registers.
+ * @return true on success
  */
 bool Task::Start(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4, 
 		uint32_t arg5, uint32_t arg6, uint32_t arg7, uint32_t arg8, uint32_t arg9)
 {
+  // Don't have to lock m_prioritySemaphore because this code isn't changing it.
 	m_taskID = taskSpawn(m_taskName,
 						m_priority,
 						VX_FP_TASK,							// options
 						m_stackSize,						// stack size
 						m_function,							// function to start
-						arg0, arg1, arg2, arg3, arg4,	// parameter 1 - pointer to this class
-						arg5, arg6, arg7, arg8, arg9);// additional unused parameters
+						arg0, arg1, arg2, arg3, arg4,	// parameters to pass to m_function
+						arg5, arg6, arg7, arg8, arg9);// additional parameters
 	bool ok = HandleError(m_taskID);
 	if (!ok) m_taskID = kInvalidTaskID;
 	return ok;
@@ -66,8 +72,7 @@
 
 /**
  * Restarts a running task.
- * If the task isn't started, it starts it.
- * @return false if the task is running and we are unable to kill the previous instance
+ * @return true on success
  */
 bool Task::Restart()
 {
@@ -75,15 +80,20 @@
 }
 
 /**
- * Kills the running task.
- * @returns true on success false if the task doesn't exist or we are unable to kill it.
+ * Makes sure that the task is not running.
+ * @returns true on success
  */
 bool Task::Stop()
 {
 	bool ok = true;
 	if (Verify())
 	{
-		ok = HandleError(taskDelete(m_taskID));
+    STATUS result = taskDelete(m_taskID);
+    // If it got deleted between the Verify() and the taskDelete then it's not
+    // an actual error.
+    if (errno != S_objLib_OBJ_DELETED) {
+		  ok = HandleError(result);
+    }
 	}
 	m_taskID = kInvalidTaskID;
 	return ok;
@@ -109,7 +119,7 @@
 
 /**
  * Pauses a running task.
- * Returns true on success, false if unable to pause or the task isn't running.
+ * Returns true on success
  */
 bool Task::Suspend()
 {
@@ -118,7 +128,7 @@
 
 /**
  * Resumes a paused task.
- * Returns true on success, false if unable to resume or if the task isn't running/paused.
+ * Returns true on success
  */
 bool Task::Resume()
 {
@@ -131,6 +141,7 @@
  */
 bool Task::Verify()
 {
+  if (m_taskID == kInvalidTaskID) return false;
 	return taskIdVerify(m_taskID) == OK;
 }
 
@@ -140,6 +151,7 @@
  */
 int32_t Task::GetPriority()
 {
+  Synchronized sync(m_prioritySemaphore);
 	if (HandleError(taskPriorityGet(m_taskID, &m_priority)))
 		return m_priority;
 	else
@@ -155,6 +167,7 @@
  */
 bool Task::SetPriority(int32_t priority)
 {
+  Synchronized sync(m_prioritySemaphore);
 	m_priority = priority;
 	return HandleError(taskPrioritySet(m_taskID, m_priority));
 }
@@ -181,6 +194,7 @@
 
 /**
  * Handles errors generated by task related code.
+ * @return Whether or not this result is considered successful.
  */
 bool Task::HandleError(STATUS results)
 {
diff --git a/aos/externals/WPILib/WPILib/Task.h b/aos/externals/WPILib/WPILib/Task.h
index 712204e..dbd9295 100644
--- a/aos/externals/WPILib/WPILib/Task.h
+++ b/aos/externals/WPILib/WPILib/Task.h
@@ -9,10 +9,14 @@
 
 #include "ErrorBase.h"
 #include <vxWorks.h>
+#include "Synchronized.h"
 
 /**
- * WPI task is a wrapper for the native Task object.
- * All WPILib tasks are managed by a static task manager for simplified cleanup.
+ * WPI task is a wrapper for a native VxWorks task.
+ *
+ * Some functions (documented) are guaranteed not to use any floating point so
+ * that it is safe to use them from tasks that do not have the VX_FP_TASK flag
+ * set (like during startup).
  **/
 class Task : public ErrorBase
 {
@@ -47,6 +51,7 @@
 	int32_t m_taskID;
 	uint32_t m_stackSize;
 	int m_priority;
+  ReentrantSemaphore m_prioritySemaphore;
 	bool HandleError(STATUS results);
 	DISALLOW_COPY_AND_ASSIGN(Task);
 };
diff --git a/aos/externals/WPILib/WPILib/Timer.cpp b/aos/externals/WPILib/WPILib/Timer.cpp
index 26b2096..576858e 100644
--- a/aos/externals/WPILib/WPILib/Timer.cpp
+++ b/aos/externals/WPILib/WPILib/Timer.cpp
@@ -12,6 +12,7 @@
 
 #include "Synchronized.h"
 #include "Utility.h"
+#include "Global.h"
 
 /**
  * Pause the task for a specified time.
@@ -180,14 +181,14 @@
 {
 	// FPGA returns the timestamp in microseconds
 	// Call the helper GetFPGATime() in Utility.cpp
-	return GetFPGATime() * 1.0e-6;
+	return Global::GetInstance()->GetFPGATime() * 1.0e-6;
 }
 
 // Internal function that reads the PPC timestamp counter.
 extern "C"
 {
 	uint32_t niTimestamp32(void);
-	UINT64 niTimestamp64(void);
+	uint64_t niTimestamp64(void);
 }
 
 /*
diff --git a/aos/externals/WPILib/WPILib/Utility.cpp b/aos/externals/WPILib/WPILib/Utility.cpp
index 61d25e1..2ace5da 100644
--- a/aos/externals/WPILib/WPILib/Utility.cpp
+++ b/aos/externals/WPILib/WPILib/Utility.cpp
@@ -7,34 +7,34 @@
 #include "Utility.h"
 
 #include "NetworkCommunication/FRCComm.h"
-#include "ChipObject.h"
 #include "Task.h"
 #include <dbgLib.h>
 #include <stdio.h>
+#include <taskLib.h>
 #include <sysSymTbl.h>
 #include "nivision.h"
 
-#define DBG_DEMANGLE_PRINT_LEN 256  /* Num chars of demangled names to print */
+#define DBG_DEMANGLE_PRINT_LEN MAX_SYS_SYM_LEN  /* Num chars of demangled names to print */
 
 extern "C"
 {
 	extern char * cplusDemangle (char *source, char *dest, int32_t n);
 }
 
-char *wpi_getLabel(UINT addr, int32_t *found)
+void wpi_getLabel(UINT addr, char *label, int32_t *found)
 {
 	int pVal;
 	SYM_TYPE pType;
 	char name[MAX_SYS_SYM_LEN + 1];
-	static char label[DBG_DEMANGLE_PRINT_LEN + 1 + 11];
-	bzero(label, DBG_DEMANGLE_PRINT_LEN + 1 + 11);
+  static const size_t kLabelSize = DBG_DEMANGLE_PRINT_LEN + 1 + 11;
+	bzero(label, kLabelSize);
 
 	if (symFindByValue(sysSymTbl, addr, name, &pVal, &pType) == OK)
 	{
-		cplusDemangle(name, label, sizeof(label) - 11);
+		cplusDemangle(name, label, kLabelSize - 11);
 		if ((UINT)pVal != addr)
 		{
-			sprintf(&label[strlen(label)], "+0x%04x", addr-pVal);
+			snprintf(label + strlen(label), kLabelSize - strlen(label), "+0x%04x", addr-pVal);
 			if (found) *found = 2;
 		}
 		else
@@ -44,11 +44,9 @@
 	}
 	else
 	{
-		sprintf(label, "0x%04x", addr);
+		snprintf(label, kLabelSize, "0x%04x", addr);
 		if (found) *found = 0;
 	}
-
-	return label;
 }
 /*
 static void wpiTracePrint(INSTR *caller, int32_t func, int32_t nargs, int32_t *args, int32_t taskId, BOOL isKernelAdrs)
@@ -56,15 +54,16 @@
 	char buf [MAX_SYS_SYM_LEN * 2];
 	int32_t ix;
 	int32_t len = 0;
-	len += sprintf (&buf [len], "%s <%#010x>: ", wpi_getLabel((UINT)caller), (int32_t)caller);
-	len += sprintf (&buf [len], "%s <%#010x> (", wpi_getLabel((UINT)func), func);
+	len += snprintf (&buf [len], sizeof(buf) - len, "%s <%#010x>: ", wpi_getLabel((UINT)caller), (int32_t)caller);
+	len += snprintf (&buf [len], sizeof(buf) - len, "%s <%#010x> (", wpi_getLabel((UINT)func), func);
 	for (ix = 0; ix < nargs; ix++)
 	{
-		if (ix != 0)
-			len += sprintf (&buf [len], ", ");
-		len += sprintf (&buf [len], "%#x", args [ix]);
+		if (ix != 0) {
+			len += snprintf (&buf [len], sizeof(buf) - len, ", ");
+    }
+		len += snprintf (&buf [len], sizeof(buf) - len, "%#x", args [ix]);
 	}
-	len += sprintf (&buf [len], ")\n");
+	len += snprintf (&buf [len], sizeof(buf) - len, ")\n");
 
 	printf(buf);
 }
@@ -77,7 +76,8 @@
 	int32_t nameFound = 0;
 	int32_t params = 0;
 	int32_t totalnargs = nargs;
-	char *funcName = wpi_getLabel((UINT)func, &nameFound);
+  char funcName[DBG_DEMANGLE_PRINT_LEN + 1 + 11];
+	wpi_getLabel((UINT)func, funcName, &nameFound);
 	// Ignore names that are not exact symbol address matches.
 	if (nameFound != 1) return;
 
@@ -107,23 +107,24 @@
 	}
 	char *funcNameEnd = strchr(funcName, '(');
 	*funcNameEnd = 0;
-	len += sprintf (&buf [len], funcName);
+	len += snprintf (buf + len, sizeof(buf) - len, funcName);
 
 	// If this is a member function, print out the this pointer value.
 	if (totalnargs - params == 1)
 	{
-		len += sprintf (&buf [len], "<this=%#lx>", args [0]);
+		len += snprintf (&buf [len], sizeof(buf) - len, "<this=%#lx>", args [0]);
 	}
 
 	// Print out the argument values.
-	len += sprintf (&buf [len], "(");
+	len += snprintf (buf + len, sizeof(buf) - len, "(");
 	for (ix = totalnargs - params; ix < nargs; ix++)
 	{
-		if (ix != totalnargs - params)
-			len += sprintf (&buf [len], ", ");
-		len += sprintf (&buf [len], "%#lx", args [ix]);
+		if (ix != totalnargs - params) {
+			len += snprintf (&buf [len], sizeof(buf) - len, ", ");
+    }
+		len += snprintf (&buf [len], sizeof(buf) - len, "%#lx", args [ix]);
 	}
-	len += sprintf (&buf [len], ")\n");
+	len += snprintf (buf + len, sizeof(buf) - len, ")\n");
 
 	printf(buf);
 }
@@ -135,7 +136,11 @@
 
 static int32_t wpiStackTask(int32_t taskId)
 {
-	taskDelay(1);
+  // Make sure it's suspended in spite of any scheduler weirdness or whatever.
+  while (!taskIsSuspended(taskId)) {
+	  taskDelay(1);
+  }
+
 	//tt(taskId);
 
 	REG_SET regs;
@@ -212,10 +217,10 @@
 		// If an error message was specified, include it
 		// Build error string
 		if(message != NULL) {
-			sprintf(error, "Assertion failed: \"%s\", \"%s\" failed in %s() in %s at line %ld\n", 
+			snprintf(error, sizeof(error), "Assertion failed: \"%s\", \"%s\" failed in %s() in %s at line %ld\n",
 							 message, conditionText, funcName, fileName, lineNumber);
 		} else {
-			sprintf(error, "Assertion failed: \"%s\" in %s() in %s at line %ld\n", 
+			snprintf(error, sizeof(error), "Assertion failed: \"%s\" in %s() in %s at line %ld\n",
 							 conditionText, funcName, fileName, lineNumber);
 		}
 		
@@ -248,10 +253,10 @@
 	// If an error message was specified, include it
 	// Build error string
 	if(message != NULL) {
-		sprintf(error, "Assertion failed: \"%s\", \"%d\" %s \"%d\" in %s() in %s at line %ld\n", 
+		snprintf(error, sizeof(error), "Assertion failed: \"%s\", \"%d\" %s \"%d\" in %s() in %s at line %ld\n",
 						 message, valueA, equalityType, valueB, funcName, fileName, lineNumber);
 	} else {
-		sprintf(error, "Assertion failed: \"%d\" %s \"%d\" in %s() in %s at line %ld\n", 
+		snprintf(error, sizeof(error), "Assertion failed: \"%d\" %s \"%d\" in %s() in %s at line %ld\n",
 						 valueA, equalityType, valueB, funcName, fileName, lineNumber);
 	}
 	
@@ -302,137 +307,3 @@
 	}
 	return valueA != valueB;
 }
-
-
-/**
- * Return the FPGA Version number.
- * For now, expect this to be competition year.
- * @return FPGA Version number.
- */
-uint16_t GetFPGAVersion()
-{
-	tRioStatusCode status = 0;
-	tGlobal *global = tGlobal::create(&status);
-	uint16_t version = global->readVersion(&status);
-	delete global;
-	wpi_setGlobalError(status);
-	return version;
-}
-
-/**
- * Return the FPGA Revision number.
- * The format of the revision is 3 numbers.
- * The 12 most significant bits are the Major Revision.
- * the next 8 bits are the Minor Revision.
- * The 12 least significant bits are the Build Number.
- * @return FPGA Revision number.
- */
-uint32_t GetFPGARevision()
-{
-	tRioStatusCode status = 0;
-	tGlobal *global = tGlobal::create(&status);
-	uint32_t revision = global->readRevision(&status);
-	delete global;
-	wpi_setGlobalError(status);
-	return revision;
-}
-
-/**
- * Read the microsecond-resolution timer on the FPGA.
- * 
- * @return The current time in microseconds according to the FPGA (since FPGA reset).
- */
-uint32_t GetFPGATime()
-{
-	tRioStatusCode status = 0;
-	tGlobal *global = tGlobal::create(&status);
-	uint32_t time = global->readLocalTime(&status);
-	delete global;
-	wpi_setGlobalError(status);
-	return time;
-}
-
-// RT hardware access functions exported from ni_emb.out
-extern "C"
-{
-	int32_t UserSwitchInput(int32_t nSwitch);
-	int32_t LedInput(int32_t led);
-	int32_t LedOutput(int32_t led, int32_t value);
-}
-
-/**
- * Read the value of the USER1 DIP switch on the cRIO.
- */
-int32_t GetRIOUserSwitch()
-{
-	int32_t switchValue = UserSwitchInput(0);
-	wpi_assert(switchValue >= 0);
-	return switchValue > 0;
-}
-
-/**
- * Set the state of the USER1 status LED on the cRIO.
- */
-void SetRIOUserLED(uint32_t state)
-{
-	LedOutput(0, state > 0);
-}
-
-/**
- * Get the current state of the USER1 status LED on the cRIO.
- * @return The curent state of the USER1 LED.
- */
-int32_t GetRIOUserLED()
-{
-	return LedInput(0);
-}
-
-/**
- * Toggle the state of the USER1 status LED on the cRIO.
- * @return The new state of the USER1 LED.
- */
-int32_t ToggleRIOUserLED()
-{
-	int32_t ledState = !GetRIOUserLED();
-	SetRIOUserLED(ledState);
-	return ledState;
-}
-
-/**
- * Set the state of the FPGA status LED on the cRIO.
- */
-void SetRIO_FPGA_LED(uint32_t state)
-{
-	tRioStatusCode status = 0;
-	tGlobal *global = tGlobal::create(&status);
-	global->writeFPGA_LED(state, &status);
-	wpi_setGlobalError(status);
-	delete global;
-}
-
-/**
- * Get the current state of the FPGA status LED on the cRIO.
- * @return The curent state of the FPGA LED.
- */
-int32_t GetRIO_FPGA_LED()
-{
-	tRioStatusCode status = 0;
-	tGlobal *global = tGlobal::create(&status);
-	bool ledValue = global->readFPGA_LED(&status);
-	wpi_setGlobalError(status);
-	delete global;
-	return ledValue;
-}
-
-/**
- * Toggle the state of the FPGA status LED on the cRIO.
- * @return The new state of the FPGA LED.
- */
-int32_t ToggleRIO_FPGA_LED()
-{
-	int32_t ledState = !GetRIO_FPGA_LED();
-	SetRIO_FPGA_LED(ledState);
-	return ledState;
-}
-
-
diff --git a/aos/externals/WPILib/WPILib/Utility.h b/aos/externals/WPILib/WPILib/Utility.h
index 4347652..bb6d0d0 100644
--- a/aos/externals/WPILib/WPILib/Utility.h
+++ b/aos/externals/WPILib/WPILib/Utility.h
@@ -22,20 +22,10 @@
 bool wpi_assertEqual_impl(int valueA, int valueB, const char *message, const char *fileName,uint32_t lineNumber, const char *funcName);
 bool wpi_assertNotEqual_impl(int valueA, int valueB, const char *message, const char *fileName,uint32_t lineNumber, const char *funcName);
 
-char *wpi_getLabel(UINT addr, int32_t *found = NULL);
+// Will use up to (DBG_DEMANGLE_PRINT_LEN + 1 + 11) of label.
+void wpi_getLabel(UINT addr, char *label, int32_t *found = NULL);
 void wpi_selfTrace();
 void wpi_suspendOnAssertEnabled(bool enabled);
 void wpi_stackTraceOnAssertEnable(bool enabled);
 
-uint16_t GetFPGAVersion();
-uint32_t GetFPGARevision();
-uint32_t GetFPGATime();
-int32_t GetRIOUserSwitch();
-void SetRIOUserLED(uint32_t state);
-int32_t GetRIOUserLED();
-int32_t ToggleRIOUserLED();
-void SetRIO_FPGA_LED(uint32_t state);
-int32_t GetRIO_FPGA_LED();
-int32_t ToggleRIO_FPGA_LED();
-
 #endif // UTILITY_H_
diff --git a/aos/externals/WPILib/WPILib/networktables2/stream/FDIOStream.cpp b/aos/externals/WPILib/WPILib/networktables2/stream/FDIOStream.cpp
index d0dd657..da8e13d 100644
--- a/aos/externals/WPILib/WPILib/networktables2/stream/FDIOStream.cpp
+++ b/aos/externals/WPILib/WPILib/networktables2/stream/FDIOStream.cpp
@@ -11,8 +11,13 @@
 
 #include <errno.h>
 #include <stdlib.h>
-#include <iolib.h>
+#ifdef _WRS_KERNEL
+#include <ioLib.h>
 #include <selectLib.h>
+#else
+#include <unistd.h>
+#include <sys/time.h>
+#endif
 #include <string.h>
 #include <stdio.h>
 
diff --git a/aos/externals/gyp.patch b/aos/externals/gyp.patch
index 9019406..b09b67d 100644
--- a/aos/externals/gyp.patch
+++ b/aos/externals/gyp.patch
@@ -1,7 +1,7 @@
 diff -rupN before/pylib/gyp/input.py after/pylib/gyp/input.py
 --- before/pylib/gyp/input.py	2012-11-20 16:38:09.394784918 -0800
 +++ after/pylib/gyp/input.py	2012-11-20 16:39:10.527105964 -0800
-@@ -2156,17 +2156,6 @@ def ValidateSourcesInTarget(target, targ
+@@ -2412,17 +2412,6 @@ def ValidateSourcesInTarget(target, targ
      basename = os.path.basename(name)  # Don't include extension.
      basenames.setdefault(basename, []).append(source)
  
@@ -11,10 +11,10 @@
 -      error += '  %s: %s\n' % (basename, ' '.join(files))
 -
 -  if error:
--    print ('static library %s has several files with the same basename:\n' %
--           target + error + 'Some build systems, e.g. MSVC08, '
--           'cannot handle that.')
--    raise KeyError, 'Duplicate basenames in sources section, see list above'
+-    print('static library %s has several files with the same basename:\n' %
+-          target + error + 'Some build systems, e.g. MSVC08, '
+-          'cannot handle that.')
+-    raise GypError('Duplicate basenames in sources section, see list above')
 -
  
  def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules):
diff --git a/aos/vim/act.vim b/aos/vim/act.vim
deleted file mode 100644
index b541ac2..0000000
--- a/aos/vim/act.vim
+++ /dev/null
@@ -1,134 +0,0 @@
-" Vim syntax file
-" Language:	ACT c generation lang
-" Maintainer:	FRC Team 971 <spartanrobotics.org>
-" Last Change:	sometime
-
-" Quit when a (custom) syntax file was already loaded
-if exists("b:current_syntax")
-  finish
-endif
-
-syn keyword	cTodo		contained TODO FIXME XXX
-
-" It's easy to accidentally add a space after a backslash that was intended
-" for line continuation.  Some compilers allow it, which makes it
-" unpredicatable and should be avoided.
-syn match	cBadContinuation contained "\\\s\+$"
-
-" cCommentGroup allows adding matches for special things in comments
-syn cluster	cCommentGroup	contains=cTodo,cBadContinuation
-
-" This should be before cErrInParen to avoid problems with #define ({ xxx })
-if exists("c_curly_error")
-  syntax match cCurlyError "}"
-  syntax region	cBlock		start="{" end="}" contains=ALLBUT,cCurlyError,@cParenGroup,cErrInParen,cCppParen,cErrInBracket,cCppBracket,cCppString,@Spell fold
-else
-  syntax region	cBlock		start="{" end="}" transparent fold
-endif
-
-
-
-if exists("c_comment_strings")
-  " A comment can contain cString, cCharacter and cNumber.
-  " But a "*/" inside a cString in a cComment DOES end the comment!  So we
-  " need to use a special type of cString: cCommentString, which also ends on
-  " "*/", and sees a "*" at the start of the line as comment again.
-  " Unfortunately this doesn't very well work for // type of comments :-(
-  syntax match	cCommentSkip	contained "^\s*\*\($\|\s\+\)"
-  syntax region cCommentString	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=cSpecial,cCommentSkip
-  syntax region cComment2String	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=cSpecial
-  syntax region  cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cComment2String,cCharacter,cNumbersCom,cSpaceError,@Spell
-  if exists("c_no_comment_fold")
-    " Use "extend" here to have preprocessor lines not terminate halfway a
-    " comment.
-    syntax region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell extend
-  else
-    syntax region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell fold extend
-  endif
-else
-  syn region	cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cSpaceError,@Spell
-  if exists("c_no_comment_fold")
-    syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell extend
-  else
-    syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold extend
-  endif
-endif
-" keep a // comment separately, it terminates a preproc. conditional
-syntax match	cCommentError	display "\*/"
-syntax match	cCommentStartError display "/\*"me=e-1 contained
-
-syn keyword	cType		int long short char void
-syn keyword	cType		signed unsigned float double
-if !exists("c_no_ansi") || exists("c_ansi_typedefs")
-  syn keyword   cType		size_t ssize_t off_t wchar_t ptrdiff_t sig_atomic_t fpos_t
-  syn keyword   cType		clock_t time_t va_list jmp_buf FILE DIR div_t ldiv_t
-  syn keyword   cType		mbstate_t wctrans_t wint_t wctype_t
-endif
-if !exists("c_no_c99") " ISO C99
-  syn keyword	cType		bool complex
-  syn keyword	cType		int8_t int16_t int32_t int64_t
-  syn keyword	cType		uint8_t uint16_t uint32_t uint64_t
-  syn keyword	cType		int_least8_t int_least16_t int_least32_t int_least64_t
-  syn keyword	cType		uint_least8_t uint_least16_t uint_least32_t uint_least64_t
-  syn keyword	cType		int_fast8_t int_fast16_t int_fast32_t int_fast64_t
-  syn keyword	cType		uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
-  syn keyword	cType		intptr_t uintptr_t
-  syn keyword	cType		intmax_t uintmax_t
-endif
-" syn keyword	cStructure	struct union enum typedef
-
-syn keyword cType args status action_name async_queue has priority
-
-
-" Define the default highlighting.
-" Only used when an item doesn't have highlighting yet
-hi def link cFormat		cSpecial
-hi def link cCppString		cString
-hi def link cCommentL		cComment
-hi def link cCommentStart	cComment
-hi def link cLabel		Label
-hi def link cUserLabel		Label
-hi def link cConditional	Conditional
-hi def link cRepeat		Repeat
-hi def link cCharacter		Character
-hi def link cSpecialCharacter	cSpecial
-hi def link cNumber		Number
-hi def link cOctal		Number
-hi def link cOctalZero		PreProc	 " link this to Error if you want
-hi def link cFloat		Float
-hi def link cOctalError		cError
-hi def link cParenError		cError
-hi def link cErrInParen		cError
-hi def link cErrInBracket	cError
-hi def link cCommentError	cError
-hi def link cCommentStartError	cError
-hi def link cSpaceError		cError
-hi def link cSpecialError	cError
-hi def link cCurlyError		cError
-hi def link cOperator		Operator
-hi def link cStructure		Structure
-hi def link cStorageClass	StorageClass
-hi def link cInclude		Include
-hi def link cPreProc		PreProc
-hi def link cDefine		Macro
-hi def link cIncluded		cString
-hi def link cError		Error
-hi def link cStatement		Statement
-hi def link cPreCondit		PreCondit
-hi def link cType		Type
-hi def link cConstant		Constant
-hi def link cCommentString	cString
-hi def link cComment2String	cString
-hi def link cCommentSkip	cComment
-hi def link cString		String
-hi def link cComment		Comment
-hi def link cSpecial		SpecialChar
-hi def link cTodo		Todo
-hi def link cBadContinuation	Error
-hi def link cCppSkip		cCppOut
-hi def link cCppOut2		cCppOut
-hi def link cCppOut		Comment
-
-let b:current_syntax = "act"
-
-" vim: ts=8
diff --git a/bbb_cape/schematic/.gitignore b/bbb_cape/schematic/.gitignore
new file mode 100644
index 0000000..89e5079
--- /dev/null
+++ b/bbb_cape/schematic/.gitignore
@@ -0,0 +1,7 @@
+\#*.sch#
+*.sch~
+*.sym~
+*.pcb-
+*.net
+*.fp-
+*.pcb.bak*
diff --git a/bbb_cape/schematic/adc_buffer.sch b/bbb_cape/schematic/adc_buffer.sch
new file mode 100644
index 0000000..e3f7f98
--- /dev/null
+++ b/bbb_cape/schematic/adc_buffer.sch
@@ -0,0 +1,433 @@
+v 20110115 2
+C 41600 49800 1 0 0 quad_opamp-2.sym
+{
+T 42200 50400 5 10 0 0 0 0 1
+device=QUAD_OPAMP
+T 41800 50700 5 10 1 1 0 0 1
+refdes=U2
+T 44000 52100 5 10 0 0 0 0 1
+footprint=SO14
+T 41800 52300 5 10 0 0 0 0 1
+symversion=0.1
+T 41600 49800 5 10 0 0 0 0 1
+slot=1
+T 41600 49800 5 10 0 0 0 0 1
+pn=MCP604-E/SL
+}
+C 41600 47300 1 0 0 quad_opamp-2.sym
+{
+T 42200 47900 5 10 0 0 0 0 1
+device=QUAD_OPAMP
+T 41800 48200 5 10 1 1 0 0 1
+refdes=U2
+T 44000 49600 5 10 0 0 0 0 1
+footprint=SO14
+T 41800 49800 5 10 0 0 0 0 1
+symversion=0.1
+T 41600 47300 5 10 0 0 0 0 1
+slot=2
+T 41600 47300 5 10 0 0 0 0 1
+pn=MCP604-E/SL
+}
+C 41600 44700 1 0 0 quad_opamp-2.sym
+{
+T 42200 45300 5 10 0 0 0 0 1
+device=QUAD_OPAMP
+T 41800 45600 5 10 1 1 0 0 1
+refdes=U2
+T 44000 47000 5 10 0 0 0 0 1
+footprint=SO14
+T 41800 47200 5 10 0 0 0 0 1
+symversion=0.1
+T 41600 44700 5 10 0 0 0 0 1
+slot=3
+T 41600 44700 5 10 0 0 0 0 1
+pn=MCP604-E/SL
+}
+C 41600 42000 1 0 0 quad_opamp-2.sym
+{
+T 42200 42600 5 10 0 0 0 0 1
+device=QUAD_OPAMP
+T 41800 42900 5 10 1 1 0 0 1
+refdes=U2
+T 44000 44300 5 10 0 0 0 0 1
+footprint=SO14
+T 41800 44500 5 10 0 0 0 0 1
+symversion=0.1
+T 41600 42000 5 10 0 0 0 0 1
+slot=4
+T 41600 42000 5 10 0 0 0 0 1
+pn=MCP604-E/SL
+}
+N 41600 50400 41500 50400 4
+N 41500 50400 41500 51000 4
+N 41500 51000 42800 51000 4
+N 42800 51000 42800 50200 4
+N 41600 47900 41500 47900 4
+N 41500 47900 41500 48500 4
+N 41500 48500 42800 48500 4
+N 42800 48500 42800 47700 4
+N 41600 45300 41500 45300 4
+N 41500 45300 41500 45900 4
+N 41500 45900 42800 45900 4
+N 42800 45900 42800 45100 4
+N 41500 42600 41600 42600 4
+N 41500 42600 41500 43200 4
+N 41500 43200 42800 43200 4
+N 42800 43200 42800 42400 4
+C 40600 49900 1 0 0 in-1.sym
+{
+T 40600 50200 5 10 0 0 0 0 1
+device=INPUT
+T 40600 50200 5 10 1 1 0 0 1
+refdes=IN1
+}
+C 40600 42100 1 0 0 in-1.sym
+{
+T 40600 42400 5 10 0 0 0 0 1
+device=INPUT
+T 40600 42400 5 10 1 1 0 0 1
+refdes=IN4
+}
+C 40600 44800 1 0 0 in-1.sym
+{
+T 40600 45100 5 10 0 0 0 0 1
+device=INPUT
+T 40600 45100 5 10 1 1 0 0 1
+refdes=IN3
+}
+C 40600 47400 1 0 0 in-1.sym
+{
+T 40600 47700 5 10 0 0 0 0 1
+device=INPUT
+T 40600 47700 5 10 1 1 0 0 1
+refdes=IN2
+}
+C 42000 52000 1 270 0 in-1.sym
+{
+T 42300 52000 5 10 0 0 270 0 1
+device=INPUT
+T 42200 51900 5 10 1 1 270 0 1
+refdes=VCC
+}
+C 42200 40400 1 90 0 in-1.sym
+{
+T 41900 40400 5 10 0 0 90 0 1
+device=INPUT
+T 42000 40300 5 10 1 1 90 0 1
+refdes=GND
+}
+C 45700 50100 1 0 0 out-1.sym
+{
+T 45700 50400 5 10 0 0 0 0 1
+device=OUTPUT
+T 45700 50300 5 10 1 1 0 0 1
+refdes=OUT1
+}
+C 45700 47600 1 0 0 out-1.sym
+{
+T 45700 47900 5 10 0 0 0 0 1
+device=OUTPUT
+T 45700 47800 5 10 1 1 0 0 1
+refdes=OUT2
+}
+C 45700 45000 1 0 0 out-1.sym
+{
+T 45700 45300 5 10 0 0 0 0 1
+device=OUTPUT
+T 45700 45200 5 10 1 1 0 0 1
+refdes=OUT3
+}
+C 45700 42300 1 0 0 out-1.sym
+{
+T 45700 42600 5 10 0 0 0 0 1
+device=OUTPUT
+T 45700 42500 5 10 1 1 0 0 1
+refdes=OUT4
+}
+N 41600 50000 41200 50000 4
+N 41600 47500 41200 47500 4
+N 41600 44900 41200 44900 4
+N 41600 42200 41200 42200 4
+N 42100 41000 42100 42000 4
+N 42100 51400 42100 50600 4
+C 47400 49700 1 90 0 capacitor-1.sym
+{
+T 46700 49900 5 10 0 0 90 0 1
+device=CAPACITOR
+T 47000 50000 5 10 1 1 90 0 1
+refdes=C5
+T 46500 49900 5 10 0 0 90 0 1
+symversion=0.1
+T 47400 50300 5 10 1 1 270 0 1
+value=0.1 uF
+T 47400 49700 5 10 0 0 270 0 1
+footprint=0603
+T 47400 49700 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 42100 51300 47200 51300 4
+N 47200 51300 47200 50600 4
+N 47200 49700 47200 41200 4
+C 44300 49200 1 90 0 capacitor-1.sym
+{
+T 43600 49400 5 10 0 0 90 0 1
+device=CAPACITOR
+T 43900 49500 5 10 1 1 90 0 1
+refdes=C1
+T 43400 49400 5 10 0 0 90 0 1
+symversion=0.1
+T 44300 49800 5 10 1 1 270 0 1
+value=0.1 uF
+T 44300 49200 5 10 0 0 270 0 1
+footprint=0603
+T 44300 49200 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 43100 50100 1 0 0 resistor-1.sym
+{
+T 43400 50500 5 10 0 0 0 0 1
+device=RESISTOR
+T 43300 50400 5 10 1 1 0 0 1
+refdes=R1
+T 43100 50100 5 10 0 0 0 0 1
+footprint=0603
+T 43100 49900 5 10 1 1 0 0 1
+value=5 kohms
+T 43100 50100 5 10 0 1 0 0 1
+pn=CRCW06034K99FKEAHP
+}
+N 42600 50200 43100 50200 4
+N 44000 50200 45700 50200 4
+N 44100 50200 44100 50100 4
+N 42100 49800 42100 49000 4
+N 42100 49000 47200 49000 4
+N 44100 49000 44100 49200 4
+C 43100 47600 1 0 0 resistor-1.sym
+{
+T 43400 48000 5 10 0 0 0 0 1
+device=RESISTOR
+T 43300 47900 5 10 1 1 0 0 1
+refdes=R2
+T 43100 47600 5 10 0 0 0 0 1
+footprint=0603
+T 43100 47400 5 10 1 1 0 0 1
+value=5 kohms
+T 43100 47600 5 10 0 1 0 0 1
+pn=CRCW06034K99FKEAHP
+}
+N 44100 47700 44100 47600 4
+N 44100 46500 44100 46700 4
+C 44300 46700 1 90 0 capacitor-1.sym
+{
+T 43900 47000 5 10 1 1 90 0 1
+refdes=C2
+T 43600 46900 5 10 0 0 90 0 1
+device=CAPACITOR
+T 43400 46900 5 10 0 0 90 0 1
+symversion=0.1
+T 44300 47300 5 10 1 1 270 0 1
+value=0.1 uF
+T 44300 46700 5 10 0 0 270 0 1
+footprint=0603
+T 44300 46700 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 42600 47700 43100 47700 4
+N 44000 47700 45700 47700 4
+N 42100 46500 47200 46500 4
+N 42100 46500 42100 47300 4
+C 43100 45000 1 0 0 resistor-1.sym
+{
+T 43400 45400 5 10 0 0 0 0 1
+device=RESISTOR
+T 43300 45300 5 10 1 1 0 0 1
+refdes=R3
+T 43100 45000 5 10 0 0 0 0 1
+footprint=0603
+T 43100 44800 5 10 1 1 0 0 1
+value=5 kohms
+T 43100 45000 5 10 0 1 0 0 1
+pn=CRCW06034K99FKEAHP
+}
+N 44100 45100 44100 45000 4
+N 44100 43900 44100 44100 4
+C 44300 44100 1 90 0 capacitor-1.sym
+{
+T 43900 44400 5 10 1 1 90 0 1
+refdes=C3
+T 43600 44300 5 10 0 0 90 0 1
+device=CAPACITOR
+T 43400 44300 5 10 0 0 90 0 1
+symversion=0.1
+T 44300 44700 5 10 1 1 270 0 1
+value=0.1 uF
+T 44300 44100 5 10 0 0 270 0 1
+footprint=0603
+T 44300 44100 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 42600 45100 43100 45100 4
+N 44000 45100 45700 45100 4
+N 42100 43900 47200 43900 4
+N 42100 43900 42100 44700 4
+C 43100 42300 1 0 0 resistor-1.sym
+{
+T 43400 42700 5 10 0 0 0 0 1
+device=RESISTOR
+T 43300 42600 5 10 1 1 0 0 1
+refdes=R4
+T 43100 42300 5 10 0 0 0 0 1
+footprint=0603
+T 43100 42100 5 10 1 1 0 0 1
+value=5 kohms
+T 43100 42300 5 10 0 1 0 0 1
+pn=CRCW06034K99FKEAHP
+}
+N 44100 42400 44100 42300 4
+N 44100 41200 44100 41400 4
+C 44300 41400 1 90 0 capacitor-1.sym
+{
+T 43900 41700 5 10 1 1 90 0 1
+refdes=C4
+T 43600 41600 5 10 0 0 90 0 1
+device=CAPACITOR
+T 43400 41600 5 10 0 0 90 0 1
+symversion=0.1
+T 44300 42000 5 10 1 1 270 0 1
+value=0.1 uF
+T 44300 41400 5 10 0 0 270 0 1
+footprint=0603
+T 44300 41400 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 42600 42400 43100 42400 4
+N 44000 42400 45700 42400 4
+C 45200 50300 1 90 0 resistor-1.sym
+{
+T 44800 50600 5 10 0 0 90 0 1
+device=RESISTOR
+T 44900 50500 5 10 1 1 90 0 1
+refdes=R5
+T 45200 50300 5 10 0 0 90 0 1
+footprint=0603
+T 45400 50300 5 10 1 1 90 0 1
+value=6.65 kohms
+T 45200 50300 5 10 0 1 90 0 1
+pn=CRCW06036K65FKEA
+}
+C 45200 49200 1 90 0 resistor-1.sym
+{
+T 44800 49500 5 10 0 0 90 0 1
+device=RESISTOR
+T 44900 49400 5 10 1 1 90 0 1
+refdes=R6
+T 45200 49200 5 10 0 0 90 0 1
+footprint=0603
+T 45400 49200 5 10 1 1 90 0 1
+value=6.65 kohms
+T 45200 49200 5 10 0 1 90 0 1
+pn=CRCW06036K65FKEA
+}
+C 45200 47800 1 90 0 resistor-1.sym
+{
+T 44800 48100 5 10 0 0 90 0 1
+device=RESISTOR
+T 44900 48000 5 10 1 1 90 0 1
+refdes=R7
+T 45200 47800 5 10 0 0 90 0 1
+footprint=0603
+T 45400 47800 5 10 1 1 90 0 1
+value=6.65 kohms
+T 45200 47800 5 10 0 1 90 0 1
+pn=CRCW06036K65FKEA
+}
+C 45200 46700 1 90 0 resistor-1.sym
+{
+T 44800 47000 5 10 0 0 90 0 1
+device=RESISTOR
+T 44900 46900 5 10 1 1 90 0 1
+refdes=R8
+T 45200 46700 5 10 0 0 90 0 1
+footprint=0603
+T 45400 46700 5 10 1 1 90 0 1
+value=6.65 kohms
+T 45200 46700 5 10 0 1 90 0 1
+pn=CRCW06036K65FKEA
+}
+C 45200 45200 1 90 0 resistor-1.sym
+{
+T 44800 45500 5 10 0 0 90 0 1
+device=RESISTOR
+T 44900 45400 5 10 1 1 90 0 1
+refdes=R9
+T 45200 45200 5 10 0 0 90 0 1
+footprint=0603
+T 45400 45200 5 10 1 1 90 0 1
+value=6.65 kohms
+T 45200 45200 5 10 0 1 90 0 1
+pn=CRCW06036K65FKEA
+}
+C 45200 44100 1 90 0 resistor-1.sym
+{
+T 44800 44400 5 10 0 0 90 0 1
+device=RESISTOR
+T 44900 44300 5 10 1 1 90 0 1
+refdes=R10
+T 45200 44100 5 10 0 0 90 0 1
+footprint=0603
+T 45400 44100 5 10 1 1 90 0 1
+value=6.65 kohms
+T 45200 44100 5 10 0 1 90 0 1
+pn=CRCW06036K65FKEA
+}
+C 45200 42500 1 90 0 resistor-1.sym
+{
+T 44800 42800 5 10 0 0 90 0 1
+device=RESISTOR
+T 44900 42700 5 10 1 1 90 0 1
+refdes=R11
+T 45200 42500 5 10 0 0 90 0 1
+footprint=0603
+T 45400 42500 5 10 1 1 90 0 1
+value=6.65 kohms
+T 45200 42500 5 10 0 1 90 0 1
+pn=CRCW06036K65FKEA
+}
+C 45200 41400 1 90 0 resistor-1.sym
+{
+T 44800 41700 5 10 0 0 90 0 1
+device=RESISTOR
+T 44900 41600 5 10 1 1 90 0 1
+refdes=R12
+T 45200 41400 5 10 0 0 90 0 1
+footprint=0603
+T 45400 41400 5 10 1 1 90 0 1
+value=6.65 kohms
+T 45200 41400 5 10 0 1 90 0 1
+pn=CRCW06036K65FKEA
+}
+N 45100 51200 45100 51300 4
+N 45100 50300 45100 50200 4
+N 45100 50200 45100 50100 4
+N 45100 49200 45100 49000 4
+N 45100 47800 45100 47700 4
+N 45100 47700 45100 47600 4
+N 45100 48700 45100 48800 4
+N 42100 48800 46700 48800 4
+N 42100 48800 42100 48100 4
+N 47200 41200 42100 41200 4
+N 45100 46700 45100 46500 4
+N 45100 44100 45100 43900 4
+N 45100 45200 45100 45100 4
+N 45100 45100 45100 45000 4
+N 45100 46100 45100 46200 4
+N 42100 46200 46700 46200 4
+N 42100 46200 42100 45500 4
+N 45100 41400 45100 41200 4
+N 45100 42500 45100 42400 4
+N 45100 42400 45100 42300 4
+N 45100 43400 45100 43500 4
+N 42100 43500 46700 43500 4
+N 42100 43500 42100 42800 4
+N 46700 43500 46700 51300 4
diff --git a/bbb_cape/schematic/cape-main.sch b/bbb_cape/schematic/cape-main.sch
new file mode 100644
index 0000000..8bf601e
--- /dev/null
+++ b/bbb_cape/schematic/cape-main.sch
@@ -0,0 +1,1544 @@
+v 20110115 2
+C 41800 40100 1 0 0 STM32F2-1.sym
+{
+T 54900 51800 5 10 0 1 0 0 1
+device=STM32F2
+T 52200 53000 5 10 0 1 0 0 1
+footprint=LQFP64_10
+T 43500 52200 5 10 1 1 0 0 1
+refdes=U6
+T 41800 40100 5 10 0 1 0 0 1
+pn=STM32F205RGT6
+}
+C 50500 53100 1 180 0 digital-input-x4-1.sym
+{
+T 49200 51600 5 10 0 1 180 0 1
+device=digital-input-x4
+T 50100 51500 5 10 1 1 180 0 1
+source=encoder inputs x2.sch
+T 48500 51200 5 10 1 1 180 0 1
+refdes=X2
+}
+C 50500 45000 1 180 0 digital-input-x4-1.sym
+{
+T 49200 43500 5 10 0 1 180 0 1
+device=digital-input-x4
+T 50100 43400 5 10 1 1 180 0 1
+source=encoder inputs x2.sch
+T 48500 43100 5 10 1 1 180 0 1
+refdes=X4
+}
+N 45300 52600 47900 52600 4
+N 45300 52200 47900 52200 4
+N 47900 52200 47900 52300 4
+N 45300 51800 46800 51800 4
+N 46800 51800 46800 52000 4
+N 46800 52000 47900 52000 4
+N 45300 51400 47000 51400 4
+N 47000 51400 47000 51700 4
+N 47000 51700 47900 51700 4
+C 50500 47600 1 180 0 digital-input-x4-1.sym
+{
+T 49200 46100 5 10 0 1 180 0 1
+device=digital-input-x4
+T 50100 46000 5 10 1 1 180 0 1
+source=encoder inputs x2.sch
+T 48500 45700 5 10 1 1 180 0 1
+refdes=X3
+}
+N 45300 43400 47000 43400 4
+N 47000 43400 47000 43600 4
+N 47000 43600 47900 43600 4
+N 47900 43900 46800 43900 4
+N 46800 43900 46800 43800 4
+N 46800 43800 45300 43800 4
+N 45300 44200 47900 44200 4
+N 45300 49400 47000 49400 4
+N 47000 49400 47000 47100 4
+N 47000 47100 47900 47100 4
+N 47900 46800 46800 46800 4
+N 46800 46200 46800 46800 4
+N 46800 46200 45300 46200 4
+N 47900 46200 47000 46200 4
+N 47000 46200 47000 45000 4
+N 47000 45000 45300 45000 4
+C 37000 51200 1 0 0 digital-input-x4-1.sym
+{
+T 38300 52700 5 10 0 1 0 0 1
+device=digital-input-x4
+T 37400 52800 5 10 1 1 0 0 1
+source=encoder inputs x2.sch
+T 39000 53100 5 10 1 1 0 0 1
+refdes=X1
+}
+N 39600 52600 41800 52600 4
+N 41800 52200 40500 52200 4
+N 40500 52200 40500 52300 4
+N 40500 52300 39600 52300 4
+N 41800 50200 40700 50200 4
+N 40700 50200 40700 52000 4
+N 40700 52000 39600 52000 4
+N 39600 51700 40500 51700 4
+N 40500 51700 40500 49800 4
+N 40500 49800 41800 49800 4
+C 16100 54800 1 0 0 regulator-1.sym
+{
+T 15000 55500 5 10 0 1 0 0 1
+device=regulator
+T 16900 56100 5 10 1 1 0 0 1
+refdes=X14
+T 16100 55900 5 10 1 1 0 0 1
+source=simple switcher 5V.sch
+}
+C 33400 54500 1 0 0 regulator-1.sym
+{
+T 32300 55200 5 10 0 1 0 0 1
+device=regulator
+T 34200 55800 5 10 1 1 0 0 1
+refdes=X16
+T 33400 55600 5 10 1 1 0 0 1
+source=simple switcher 5V.sch
+}
+C 18300 35800 1 0 0 beaglebone-1.sym
+{
+T 26700 54800 5 10 1 1 0 6 1
+refdes=U8
+T 22500 45650 5 10 0 0 0 0 1
+device=BEAGLEBOND BLACK CAPE
+T 22500 45850 5 10 0 0 0 0 1
+footprint=beaglebone
+T 22000 54100 5 10 0 1 0 0 1
+pn=PRPC023DAAN-RC x2; SSQ-105-03-G-S
+}
+N 33900 48400 33900 54700 4
+N 33900 52600 37000 52600 4
+N 34900 48100 34900 54700 4
+N 34900 52300 37000 52300 4
+C 36800 51300 1 90 0 3.3V-plus-1.sym
+C 36500 52100 1 270 0 gnd-1.sym
+N 36800 52000 37000 52000 4
+N 37000 51700 36800 51700 4
+N 36800 51700 36800 51500 4
+N 50500 52000 52000 52000 4
+N 52000 41600 52000 54000 4
+{
+T 51500 41600 5 10 1 1 0 0 1
+netname=SVCC
+}
+N 52000 54000 35600 54000 4
+N 35600 54000 35600 53700 4
+N 35600 53700 34900 53700 4
+N 50500 51700 52200 51700 4
+N 52200 41300 52200 54200 4
+{
+T 52200 41600 5 10 1 1 0 0 1
+netname=SGND
+}
+N 52200 54200 35400 54200 4
+N 35400 54200 35400 53900 4
+N 35400 53900 33900 53900 4
+N 50500 46500 52000 46500 4
+N 52000 43400 58800 43400 4
+N 50500 46200 52200 46200 4
+N 50500 43600 52200 43600 4
+C 50700 53000 1 270 0 3.3V-plus-1.sym
+C 51000 52200 1 90 0 gnd-1.sym
+N 50700 52800 50500 52800 4
+N 50500 52800 50500 52600 4
+N 50700 52300 50500 52300 4
+C 50700 47500 1 270 0 3.3V-plus-1.sym
+C 51000 46700 1 90 0 gnd-1.sym
+N 50700 47300 50500 47300 4
+N 50500 47300 50500 47100 4
+N 50700 46800 50500 46800 4
+C 50700 44900 1 270 0 3.3V-plus-1.sym
+C 51000 44100 1 90 0 gnd-1.sym
+N 50700 44700 50500 44700 4
+N 50500 44700 50500 44500 4
+N 50700 44200 50500 44200 4
+N 49200 45000 51800 45000 4
+N 51800 42800 51800 53800 4
+{
+T 51300 42800 5 10 1 1 0 0 1
+netname=DIFFA
+}
+N 51800 53800 35800 53800 4
+N 34400 51200 38300 51200 4
+N 49200 47600 49200 47700 4
+N 49200 47700 51800 47700 4
+N 49200 53100 49200 53800 4
+C 34500 51400 1 90 0 resistor-1.sym
+{
+T 34100 51700 5 10 0 0 90 0 1
+device=RESISTOR
+T 34200 51600 5 10 1 1 90 0 1
+refdes=R10
+T 34500 51400 5 10 0 0 90 0 1
+footprint=0603
+T 34700 51400 5 10 1 1 90 0 1
+value=500 ohms
+T 34500 51400 5 10 0 1 0 0 1
+pn=ERJ-3EKF4990V
+}
+C 35500 51400 1 90 0 resistor-1.sym
+{
+T 35100 51700 5 10 0 0 90 0 1
+device=RESISTOR
+T 35200 51600 5 10 1 1 90 0 1
+refdes=R12
+T 35500 51400 5 10 0 0 90 0 1
+footprint=0603
+T 35700 51400 5 10 1 1 90 0 1
+value=500 ohms
+T 35500 51400 5 10 0 1 0 0 1
+pn=ERJ-3EKF4990V
+}
+N 35800 53800 35800 51200 4
+N 34400 52300 34400 52600 4
+N 34400 51400 34400 51200 4
+N 35400 51400 35400 51200 4
+C 50500 50800 1 180 0 digital-input-x4-1.sym
+{
+T 49200 49300 5 10 0 1 180 0 1
+device=digital-input-x4
+T 50100 49200 5 10 1 1 180 0 1
+source=digital inputs x4.sch
+T 48500 48900 5 10 1 1 180 0 1
+refdes=X5
+}
+N 45300 49800 47000 49800 4
+N 47000 49800 47000 50000 4
+N 47000 50000 47900 50000 4
+N 45300 48200 47200 48200 4
+N 47200 48200 47200 49700 4
+N 47200 49700 47900 49700 4
+N 47900 49400 47400 49400 4
+N 47400 47800 47400 49400 4
+N 47400 47800 45300 47800 4
+C 50500 42700 1 180 0 digital-input-x4-1.sym
+{
+T 49200 41200 5 10 0 1 180 0 1
+device=digital-input-x4
+T 50100 41100 5 10 1 1 180 0 1
+source=digital inputs x4.sch
+T 48500 40800 5 10 1 1 180 0 1
+refdes=X7
+}
+N 47900 41600 46800 41600 4
+N 46800 41600 46800 42200 4
+N 46800 42200 45300 42200 4
+N 45300 42600 47000 42600 4
+N 47000 42600 47000 41900 4
+N 47000 41900 47900 41900 4
+N 47900 42200 47200 42200 4
+N 47200 42200 47200 43000 4
+N 47200 43000 45300 43000 4
+N 41800 46600 34500 46600 4
+N 34500 46600 34500 39100 4
+N 34500 39100 47200 39100 4
+N 47200 39100 47200 41300 4
+N 47200 41300 47900 41300 4
+C 37000 47000 1 0 0 digital-input-x4-1.sym
+{
+T 38300 48500 5 10 0 1 0 0 1
+device=digital-input-x4
+T 37400 48600 5 10 1 1 0 0 1
+source=digital inputs x4.sch
+T 39000 48900 5 10 1 1 0 0 1
+refdes=X6
+}
+N 41800 51000 40900 51000 4
+N 40900 51000 40900 48400 4
+N 40900 48400 39600 48400 4
+N 41800 50600 41100 50600 4
+N 41100 50600 41100 48000 4
+N 41100 48000 39600 48000 4
+N 39600 47400 40900 47400 4
+N 40900 47400 40900 47000 4
+N 40900 47000 41800 47000 4
+N 41800 47400 41100 47400 4
+N 41100 47400 41100 47600 4
+N 41100 47600 39600 47600 4
+N 38300 47000 35800 47000 4
+N 35800 47000 35800 51200 4
+C 36800 47100 1 90 0 3.3V-plus-1.sym
+C 36500 47900 1 270 0 gnd-1.sym
+N 36800 47800 37000 47800 4
+N 37000 47500 36800 47500 4
+N 36800 47500 36800 47300 4
+N 37000 48100 34900 48100 4
+N 37000 48400 33900 48400 4
+C 50700 50700 1 270 0 3.3V-plus-1.sym
+C 51000 49900 1 90 0 gnd-1.sym
+N 50700 50500 50500 50500 4
+N 50500 50500 50500 50300 4
+N 50700 50000 50500 50000 4
+C 50700 42600 1 270 0 3.3V-plus-1.sym
+C 51000 41800 1 90 0 gnd-1.sym
+N 50700 42400 50500 42400 4
+N 50500 42400 50500 42200 4
+N 50700 41900 50500 41900 4
+N 50500 41300 52200 41300 4
+N 50500 41600 52000 41600 4
+N 50500 49400 52200 49400 4
+N 50500 49700 52000 49700 4
+N 49200 50800 49200 50900 4
+N 49200 50900 51800 50900 4
+N 49200 42700 49200 42800 4
+N 49200 42800 51800 42800 4
+N 17600 52300 17600 55000 4
+N 17600 52700 18400 52700 4
+N 18400 52300 17600 52300 4
+N 16600 53900 16600 55000 4
+N 16600 54300 18400 54300 4
+N 18400 53900 16600 53900 4
+C 16500 53600 1 0 0 gnd-1.sym
+C 27400 54900 1 180 0 gnd-1.sym
+N 27300 53900 27300 54600 4
+N 27300 54300 27000 54300 4
+N 27300 53900 27000 53900 4
+N 13100 50700 18400 50700 4
+C 37700 45900 1 0 0 capacitor-1.sym
+{
+T 37900 46600 5 10 0 0 0 0 1
+device=CAPACITOR
+T 37900 46400 5 10 1 1 0 0 1
+refdes=C4
+T 37900 46800 5 10 0 0 0 0 1
+symversion=0.1
+T 37700 45900 5 10 0 0 0 0 1
+footprint=0603
+T 37900 45700 5 10 1 1 0 0 1
+value=18 pF
+T 37700 45900 5 10 0 1 0 0 1
+pn=VJ0603A180JXACW1BC
+}
+C 37700 44700 1 0 0 capacitor-1.sym
+{
+T 37900 45400 5 10 0 0 0 0 1
+device=CAPACITOR
+T 37900 45200 5 10 1 1 0 0 1
+refdes=C5
+T 37900 45600 5 10 0 0 0 0 1
+symversion=0.1
+T 37700 44700 5 10 0 0 0 0 1
+footprint=0603
+T 37900 44500 5 10 1 1 0 0 1
+value=18 pF
+T 37700 44700 5 10 0 1 0 0 1
+pn=VJ0603A180JXACW1BC
+}
+N 41800 45800 39400 45800 4
+N 39400 45800 39400 46100 4
+N 38600 46100 39400 46100 4
+N 38900 46100 38900 45900 4
+N 38900 45000 38900 44900 4
+N 38600 44900 39500 44900 4
+N 39500 44900 39500 45400 4
+N 39500 45400 41800 45400 4
+C 37500 44400 1 0 0 gnd-1.sym
+N 37700 46100 37600 46100 4
+N 37600 44700 37600 46100 4
+N 37600 44900 37700 44900 4
+C 38500 46400 1 270 0 crystal.sym
+{
+T 39000 46200 5 10 0 0 270 0 1
+device=CRYSTAL
+T 39200 45600 5 10 1 1 270 0 1
+refdes=U9
+T 39200 46200 5 10 0 0 270 0 1
+symversion=0.1
+T 38500 46400 5 10 0 0 0 0 1
+footprint=ABMM2
+T 38500 46400 5 10 0 1 0 0 1
+pn=ABMM-8.000MHZ-B2-T
+}
+N 38700 45000 38500 45000 4
+N 38500 45000 38500 45900 4
+N 37600 45500 38500 45500 4
+N 38500 45900 38700 45900 4
+C 42200 56300 1 0 0 ADXRS453-1.sym
+{
+T 42800 58100 5 10 0 1 0 0 1
+footprint=SO16W
+T 43200 59500 5 10 0 1 0 0 1
+device=ADXRS453
+T 43700 58900 5 10 1 1 0 0 1
+refdes=U2
+T 42200 56300 5 10 0 1 0 0 1
+pn=ADXRS453
+}
+C 45600 56700 1 0 0 inductor-1.sym
+{
+T 45800 57200 5 10 0 0 0 0 1
+device=INDUCTOR
+T 45800 57000 5 10 1 1 0 0 1
+refdes=L2
+T 45800 57400 5 10 0 0 0 0 1
+symversion=0.1
+T 45600 56700 5 10 0 0 0 0 1
+footprint=1812
+T 45700 56600 5 10 1 1 0 0 1
+value=470 uH
+T 45600 56700 5 10 0 1 0 0 1
+pn=LQH43MN471J03L
+}
+C 42000 58200 1 180 0 capacitor-1.sym
+{
+T 41800 57500 5 10 0 0 180 0 1
+device=CAPACITOR
+T 41700 57800 5 10 1 1 180 0 1
+refdes=C2
+T 41800 57300 5 10 0 0 180 0 1
+symversion=0.1
+T 41400 58200 5 10 1 1 0 0 1
+value=1 uF
+T 42000 58200 5 10 0 0 0 0 1
+footprint=0603
+T 42000 58200 5 10 0 1 0 0 1
+pn=VJ0603V105MXQPW1BC
+}
+C 36700 56600 1 0 0 TC1262-1.sym
+{
+T 28700 60900 5 10 0 1 0 0 1
+footprint=SOT223
+T 38200 57500 5 10 0 1 0 0 1
+device=TC1262
+T 38100 57400 5 10 1 1 0 0 1
+refdes=U4
+T 36700 56600 5 10 0 1 0 0 1
+pn=TC1262-3.3VDB
+}
+N 36000 56200 36000 57500 4
+N 36000 57100 36700 57100 4
+C 36100 56700 1 0 0 3.3V-plus-1.sym
+N 36300 56700 36300 56500 4
+N 36300 56500 36500 56500 4
+N 36500 56500 36500 56800 4
+N 36500 56800 36700 56800 4
+C 38800 56400 1 0 0 gnd-1.sym
+N 38800 57100 38900 57100 4
+N 38900 56700 38900 57100 4
+N 38800 56800 38900 56800 4
+N 44300 56800 45600 56800 4
+N 45500 56800 45500 56500 4
+N 45500 56500 45400 56500 4
+N 44500 56500 44300 56500 4
+C 42000 56100 1 0 0 gnd-1.sym
+C 44300 55000 1 0 0 gnd-1.sym
+C 40800 57100 1 0 0 gnd-1.sym
+C 44700 56900 1 0 0 gnd-1.sym
+N 42100 56400 42100 57700 4
+N 42100 56500 42200 56500 4
+N 42100 56800 42200 56800 4
+N 42000 58000 42200 58000 4
+N 41100 58000 40900 58000 4
+N 40900 57400 40900 58900 4
+N 42200 58300 41900 58300 4
+N 41900 58300 41900 58400 4
+N 41900 58400 40900 58400 4
+N 42200 57700 42100 57700 4
+N 42200 57400 42100 57400 4
+N 42100 56800 42100 57100 4
+N 42100 57100 42200 57100 4
+C 42000 59100 1 180 0 capacitor-1.sym
+{
+T 41800 58400 5 10 0 0 180 0 1
+device=CAPACITOR
+T 41700 58700 5 10 1 1 180 0 1
+refdes=C3
+T 41800 58200 5 10 0 0 180 0 1
+symversion=0.1
+T 41400 59100 5 10 1 1 0 0 1
+value=1 uF
+T 42000 59100 5 10 0 0 0 0 1
+footprint=0603
+T 42000 59100 5 10 0 1 0 0 1
+pn=VJ0603V105MXQPW1BC
+}
+N 41100 58900 40900 58900 4
+N 42000 58900 42100 58900 4
+N 42100 58900 42100 58600 4
+N 42100 58600 42200 58600 4
+N 44300 57400 46600 57400 4
+N 46600 57400 46600 56800 4
+N 46500 56800 49500 56800 4
+N 44300 57100 44600 57100 4
+N 44600 57100 44600 57300 4
+N 44600 57300 44800 57300 4
+N 44800 57200 44800 57300 4
+N 44300 57700 45100 57700 4
+N 44300 58000 44900 58000 4
+N 44300 58300 44700 58300 4
+N 44300 58600 44500 58600 4
+C 44600 55500 1 90 0 capacitor-1.sym
+{
+T 43900 55700 5 10 0 0 90 0 1
+device=CAPACITOR
+T 44200 55800 5 10 1 1 90 0 1
+refdes=C6
+T 43700 55700 5 10 0 0 90 0 1
+symversion=0.1
+T 44600 56100 5 10 1 1 270 0 1
+value=1 uF
+T 44600 55500 5 10 0 0 270 0 1
+footprint=0603
+T 44600 55500 5 10 0 1 0 0 1
+pn=VJ0603V105MXQPW1BC
+}
+N 44400 56500 44400 56400 4
+N 44400 55500 44400 55300 4
+C 49500 56600 1 0 0 TC1262-1.sym
+{
+T 41500 60900 5 10 0 1 0 0 1
+footprint=SOT223
+T 51000 57500 5 10 0 1 0 0 1
+device=TC1262
+T 50900 57400 5 10 1 1 0 0 1
+refdes=U3
+T 49500 56600 5 10 0 1 0 0 1
+pn=TC1262-3.3VDB
+}
+C 51600 56400 1 0 0 gnd-1.sym
+N 51600 57100 51700 57100 4
+N 51700 56700 51700 57100 4
+N 51600 56800 51700 56800 4
+N 49500 57100 49300 57100 4
+N 49300 56200 49300 57500 4
+C 47100 55600 1 90 0 capacitor-1.sym
+{
+T 46400 55800 5 10 0 0 90 0 1
+device=CAPACITOR
+T 46700 55900 5 10 1 1 90 0 1
+refdes=C8
+T 46200 55800 5 10 0 0 90 0 1
+symversion=0.1
+T 47100 56200 5 10 1 1 270 0 1
+value=1 uF
+T 47100 55600 5 10 0 0 270 0 1
+footprint=0603
+T 47100 55600 5 10 0 1 0 0 1
+pn=VJ0603V105MXQPW1BC
+}
+C 48600 55600 1 90 0 capacitor-1.sym
+{
+T 47900 55800 5 10 0 0 90 0 1
+device=CAPACITOR
+T 48200 55900 5 10 1 1 90 0 1
+refdes=C7
+T 47700 55800 5 10 0 0 90 0 1
+symversion=0.1
+T 48600 56200 5 10 1 1 270 0 1
+value=10 uF
+T 48600 55600 5 10 0 0 270 0 1
+footprint=0805
+T 48600 55600 5 10 0 1 0 0 1
+pn=08056D106MAT2A
+}
+C 47900 55600 1 90 0 capacitor-1.sym
+{
+T 47200 55800 5 10 0 0 90 0 1
+device=CAPACITOR
+T 47500 55900 5 10 1 1 90 0 1
+refdes=C9
+T 47000 55800 5 10 0 0 90 0 1
+symversion=0.1
+T 47900 56200 5 10 1 1 270 0 1
+value=1 uF
+T 47900 55600 5 10 0 0 270 0 1
+footprint=0603
+T 47900 55600 5 10 0 1 0 0 1
+pn=VJ0603V105MXQPW1BC
+}
+C 50100 55100 1 90 0 capacitor-1.sym
+{
+T 49400 55300 5 10 0 0 90 0 1
+device=CAPACITOR
+T 49700 55400 5 10 1 1 90 0 1
+refdes=C10
+T 49200 55300 5 10 0 0 90 0 1
+symversion=0.1
+T 50100 55700 5 10 1 1 270 0 1
+value=10 uF
+T 50100 55100 5 10 0 0 270 0 1
+footprint=0805
+T 50100 55100 5 10 0 1 0 0 1
+pn=08056D106MAT2A
+}
+N 46900 56500 46900 56800 4
+N 47700 56500 47700 56800 4
+N 48400 56500 48400 56800 4
+C 46800 55000 1 0 0 gnd-1.sym
+C 47600 55000 1 0 0 gnd-1.sym
+C 48300 55000 1 0 0 gnd-1.sym
+N 46900 55600 46900 55300 4
+N 47700 55600 47700 55300 4
+N 48400 55600 48400 55300 4
+C 49800 54500 1 0 0 gnd-1.sym
+N 49900 54800 49900 55100 4
+N 49900 56000 49900 56200 4
+C 45400 56700 1 180 0 diode-sot23.sym
+{
+T 45000 56100 5 10 0 0 180 0 1
+device=DIODE
+T 45100 56200 5 10 1 1 180 0 1
+refdes=D4
+T 45205 56000 5 10 0 1 180 0 1
+footprint=SOT23
+T 45400 56700 5 10 0 1 0 0 1
+pn=PMBD914,215
+}
+N 49900 56200 49300 56200 4
+C 37000 55200 1 90 0 capacitor-1.sym
+{
+T 36300 55400 5 10 0 0 90 0 1
+device=CAPACITOR
+T 36600 55500 5 10 1 1 90 0 1
+refdes=C11
+T 36100 55400 5 10 0 0 90 0 1
+symversion=0.1
+T 37000 55800 5 10 1 1 270 0 1
+value=10 uF
+T 37000 55200 5 10 0 0 270 0 1
+footprint=0805
+T 37000 55200 5 10 0 1 0 0 1
+pn=08056D106MAT2A
+}
+C 36700 54600 1 0 0 gnd-1.sym
+N 36800 54900 36800 55200 4
+C 38200 55100 1 90 0 capacitor-1.sym
+{
+T 37500 55300 5 10 0 0 90 0 1
+device=CAPACITOR
+T 37800 55400 5 10 1 1 90 0 1
+refdes=C12
+T 37300 55300 5 10 0 0 90 0 1
+symversion=0.1
+T 38200 55700 5 10 1 1 270 0 1
+value=10 uF
+T 38200 55100 5 10 0 0 270 0 1
+footprint=0805
+T 38200 55100 5 10 0 1 0 0 1
+pn=08056D106MAT2A
+}
+C 37900 54600 1 0 0 gnd-1.sym
+N 38000 54900 38000 55100 4
+C 37800 56200 1 0 0 3.3V-plus-1.sym
+N 36800 56100 36800 56200 4
+N 36800 56200 36000 56200 4
+N 38000 56200 38000 56000 4
+C 40700 43500 1 0 0 3.3V-plus-1.sym
+N 40900 43500 40900 43400 4
+N 40900 43400 41800 43400 4
+N 41800 43000 41600 43000 4
+N 41800 42600 41600 42600 4
+N 41800 42200 41600 42200 4
+N 41800 41800 41600 41800 4
+N 41000 41400 41800 41400 4
+N 41800 41000 41600 41000 4
+N 41000 40600 41800 40600 4
+N 41600 43400 41600 41800 4
+C 40800 40600 1 0 0 3.3V-plus-1.sym
+C 40900 41100 1 0 0 gnd-1.sym
+N 41600 41400 41600 41000 4
+C 41500 39700 1 0 0 gnd-1.sym
+N 41800 40200 41600 40200 4
+N 41600 40200 41600 40000 4
+C 39200 42800 1 90 0 capacitor-1.sym
+{
+T 38500 43000 5 10 0 0 90 0 1
+device=CAPACITOR
+T 38800 43100 5 10 1 1 90 0 1
+refdes=C13
+T 38300 43000 5 10 0 0 90 0 1
+symversion=0.1
+T 39200 43400 5 10 1 1 270 0 1
+value=2.2 uF
+T 39200 42800 5 10 0 0 270 0 1
+footprint=0805
+T 39200 42800 5 10 0 1 0 0 1
+pn=VJ0805G225KXYTW1BC
+}
+C 40200 42800 1 90 0 capacitor-1.sym
+{
+T 39500 43000 5 10 0 0 90 0 1
+device=CAPACITOR
+T 39800 43100 5 10 1 1 90 0 1
+refdes=C14
+T 39300 43000 5 10 0 0 90 0 1
+symversion=0.1
+T 40200 43400 5 10 1 1 270 0 1
+value=2.2 uF
+T 40200 42800 5 10 0 0 270 0 1
+footprint=0805
+T 40200 42800 5 10 0 1 0 0 1
+pn=VJ0805G225KXYTW1BC
+}
+C 38900 42300 1 0 0 gnd-1.sym
+C 39900 42300 1 0 0 gnd-1.sym
+N 41800 44200 39000 44200 4
+N 39000 44200 39000 43700 4
+N 39000 42800 39000 42600 4
+N 40000 42800 40000 42600 4
+N 40000 43700 40000 44000 4
+N 40000 44000 41500 44000 4
+N 41500 44000 41500 43800 4
+N 41500 43800 41800 43800 4
+C 38100 42800 1 90 0 capacitor-1.sym
+{
+T 37400 43000 5 10 0 0 90 0 1
+device=CAPACITOR
+T 37700 43100 5 10 1 1 90 0 1
+refdes=C15
+T 37200 43000 5 10 0 0 90 0 1
+symversion=0.1
+T 38100 43400 5 10 1 1 270 0 1
+value=0.1 uF
+T 38100 42800 5 10 0 0 270 0 1
+footprint=0603
+T 38100 42800 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 37800 42300 1 0 0 gnd-1.sym
+N 37900 42800 37900 42600 4
+N 37900 43700 37900 44400 4
+N 37900 44400 38500 44400 4
+N 38500 44400 38500 44700 4
+N 38500 44700 39700 44700 4
+N 39700 44700 39700 45000 4
+N 39700 45000 41800 45000 4
+N 44500 58600 44500 59400 4
+N 44500 59400 40500 59400 4
+N 40500 59400 40500 54700 4
+N 40500 54700 46600 54700 4
+N 46600 54700 46600 51000 4
+N 46600 51000 45300 51000 4
+N 44700 58300 44700 59600 4
+N 44700 59600 40300 59600 4
+N 40300 59600 40300 48600 4
+N 40300 48600 41800 48600 4
+N 44900 58000 44900 59800 4
+N 44900 59800 40100 59800 4
+N 40100 59800 40100 48200 4
+N 40100 48200 41800 48200 4
+N 45100 57700 45100 60000 4
+N 45100 60000 39900 60000 4
+N 39900 60000 39900 47800 4
+N 39600 48000 39600 48100 4
+N 39600 47600 39600 47800 4
+N 39600 47400 39600 47500 4
+N 39900 47800 41800 47800 4
+C 50400 39000 1 180 0 MCP3008-ISL-1.sym
+{
+T 47300 38200 5 10 0 1 180 0 1
+footprint=SO16
+T 47400 38100 5 10 0 1 180 0 1
+device=MCP3008-ISL
+T 49300 36800 5 10 1 1 180 0 1
+refdes=U1
+T 50400 39000 5 10 0 1 0 0 1
+pn=MCP3008-ISL
+}
+N 45300 41400 46600 41400 4
+N 46600 41400 46600 38300 4
+N 46600 38300 47900 38300 4
+N 45300 41000 46400 41000 4
+N 46400 38000 46400 41000 4
+N 46400 38000 47900 38000 4
+N 45300 40600 47000 40600 4
+N 47000 40600 47000 38900 4
+N 47000 38900 47900 38900 4
+N 45300 40200 46800 40200 4
+N 46800 40200 46800 38600 4
+N 46800 38600 47900 38600 4
+C 54700 39500 1 180 0 adc_buffer-1.sym
+{
+T 52000 38000 5 10 0 1 180 0 1
+device=ADC buffer
+T 53000 38100 5 10 1 1 180 0 1
+refdes=X8
+}
+C 54700 37400 1 180 0 adc_buffer-1.sym
+{
+T 52000 35900 5 10 0 1 180 0 1
+device=ADC buffer
+T 53000 36000 5 10 1 1 180 0 1
+refdes=X9
+}
+N 53300 37900 53300 37800 4
+N 52000 37800 53300 37800 4
+N 53600 37900 53600 37600 4
+N 53600 37600 51800 37600 4
+N 51800 35500 51800 37600 4
+N 53300 35800 53300 35700 4
+N 53300 35700 52000 35700 4
+N 53600 35800 53600 35500 4
+N 51500 35500 53600 35500 4
+N 52300 36300 50600 36300 4
+N 50600 36300 50600 36800 4
+N 50600 36800 50400 36800 4
+N 52300 36600 50800 36600 4
+N 50800 36600 50800 37100 4
+N 50800 37100 50400 37100 4
+N 52300 36900 51000 36900 4
+N 51000 36900 51000 37400 4
+N 51000 37400 50400 37400 4
+N 52300 37200 51200 37200 4
+N 51200 37200 51200 37700 4
+N 51200 37700 50400 37700 4
+N 52300 39300 50600 39300 4
+N 50600 39300 50600 38900 4
+N 50600 38900 50400 38900 4
+N 52300 39000 50800 39000 4
+N 50800 39000 50800 38600 4
+N 50800 38600 50400 38600 4
+N 52300 38700 51000 38700 4
+N 51000 38700 51000 38300 4
+N 51000 38300 50400 38300 4
+N 52300 38400 51200 38400 4
+N 51200 38400 51200 38000 4
+N 51200 38000 50400 38000 4
+N 47900 36800 47700 36800 4
+N 47700 36100 47700 37400 4
+N 47700 36100 52000 36100 4
+N 47900 37100 47500 37100 4
+N 47500 35900 47500 37700 4
+N 47500 35900 51800 35900 4
+N 47900 37400 47700 37400 4
+N 47900 37700 47500 37700 4
+N 17700 45100 18400 45100 4
+N 18400 44300 17500 44300 4
+N 17500 44300 17500 35200 4
+N 17500 35200 46200 35200 4
+N 46200 35200 46200 49000 4
+N 46200 49000 45300 49000 4
+N 45300 48600 46000 48600 4
+N 46000 35400 46000 48600 4
+N 46000 35400 17700 35400 4
+N 17700 35400 17700 45100 4
+N 27000 51500 33700 51500 4
+N 33700 51500 33700 51000 4
+N 33700 51000 38800 51000 4
+N 38800 51000 38800 51300 4
+N 38800 51300 40900 51300 4
+N 40900 51300 40900 51800 4
+N 40900 51800 41800 51800 4
+N 41800 44600 39900 44600 4
+N 39900 44600 39900 46800 4
+N 28700 46800 39900 46800 4
+N 28700 46800 28700 51900 4
+N 28700 51900 27000 51900 4
+N 27000 51100 28500 51100 4
+N 28500 44100 28500 51100 4
+N 28500 44100 37900 44100 4
+C 48200 34700 1 90 0 capacitor-1.sym
+{
+T 47500 34900 5 10 0 0 90 0 1
+device=CAPACITOR
+T 47800 35000 5 10 1 1 90 0 1
+refdes=C16
+T 47300 34900 5 10 0 0 90 0 1
+symversion=0.1
+T 48200 35300 5 10 1 1 270 0 1
+value=0.1 uF
+T 48200 34700 5 10 0 0 270 0 1
+footprint=0603
+T 48200 34700 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 49300 34700 1 90 0 capacitor-1.sym
+{
+T 48600 34900 5 10 0 0 90 0 1
+device=CAPACITOR
+T 48900 35000 5 10 1 1 90 0 1
+refdes=C17
+T 48400 34900 5 10 0 0 90 0 1
+symversion=0.1
+T 49300 35300 5 10 1 1 270 0 1
+value=0.1 uF
+T 49300 34700 5 10 0 0 270 0 1
+footprint=0603
+T 49300 34700 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 48000 36100 48000 35600 4
+N 49100 36100 49100 35600 4
+N 48500 35900 48500 34400 4
+N 48000 34400 49100 34400 4
+N 49100 34400 49100 34700 4
+N 48000 34400 48000 34700 4
+C 15800 54600 1 180 0 connector3-1.sym
+{
+T 14000 53700 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 15800 53500 5 10 1 1 180 0 1
+refdes=CONN12
+T 15800 54600 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 15800 54600 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+C 13900 53400 1 0 0 gnd-1.sym
+N 14100 53800 14000 53800 4
+N 14000 53800 14000 53700 4
+C 16600 54500 1 0 0 12V-plus-1.sym
+C 13500 54200 1 0 0 12V-plus-1.sym
+N 13700 54200 13700 54100 4
+N 13700 54100 14100 54100 4
+N 17100 55000 17100 54500 4
+N 17100 54500 16800 54500 4
+C 33900 54400 1 0 0 12V-plus-1.sym
+N 34100 54400 34100 54300 4
+N 34100 54300 34400 54300 4
+N 34400 54300 34400 54700 4
+C 61000 38900 1 180 0 connector3-1.sym
+{
+T 59200 38000 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 61000 37800 5 10 1 1 180 0 1
+refdes=CONN5
+T 61000 38900 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 61000 38900 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+C 58900 30900 1 0 0 gnd-1.sym
+C 61000 40400 1 180 0 connector3-1.sym
+{
+T 59200 39500 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 61000 39300 5 10 1 1 180 0 1
+refdes=CONN4
+T 61000 40400 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 61000 40400 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+C 61000 41900 1 180 0 connector3-1.sym
+{
+T 59200 41000 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 61000 40800 5 10 1 1 180 0 1
+refdes=CONN3
+T 61000 41900 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 61000 41900 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+C 61000 43400 1 180 0 connector3-1.sym
+{
+T 59200 42500 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 61000 42300 5 10 1 1 180 0 1
+refdes=CONN2
+T 61000 43400 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 61000 43400 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+C 61000 37400 1 180 0 connector3-1.sym
+{
+T 59200 36500 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 61000 36300 5 10 1 1 180 0 1
+refdes=CONN6
+T 61000 37400 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 61000 37400 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+C 61000 35900 1 180 0 connector3-1.sym
+{
+T 59200 35000 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 61000 34800 5 10 1 1 180 0 1
+refdes=CONN7
+T 61000 35900 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 61000 35900 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+C 61000 34400 1 180 0 connector3-1.sym
+{
+T 59200 33500 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 61000 33300 5 10 1 1 180 0 1
+refdes=CONN8
+T 61000 34400 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 61000 34400 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+C 61000 32900 1 180 0 connector3-1.sym
+{
+T 59200 32000 5 10 0 0 180 0 1
+device=CONNECTOR_3
+T 61000 31800 5 10 1 1 180 0 1
+refdes=CONN9
+T 61000 32900 5 10 0 0 180 0 1
+footprint=22-23-2031
+T 61000 32900 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+N 59300 42600 59000 42600 4
+N 59000 31200 59000 42600 4
+N 59000 41100 59300 41100 4
+N 59000 39600 59300 39600 4
+N 59000 38100 59300 38100 4
+N 59000 36600 59300 36600 4
+N 59000 35100 59300 35100 4
+N 59000 33600 59300 33600 4
+N 59300 32100 59000 32100 4
+N 58800 42900 59300 42900 4
+N 58800 32400 58800 43400 4
+N 58800 41400 59300 41400 4
+N 58800 39900 59300 39900 4
+N 58800 38400 59300 38400 4
+N 58800 36900 59300 36900 4
+N 58800 35400 59300 35400 4
+N 58800 33900 59300 33900 4
+N 58800 32400 59300 32400 4
+N 59300 43200 56900 43200 4
+N 56900 39300 56900 43200 4
+N 56900 39300 54700 39300 4
+N 59300 41700 57200 41700 4
+N 57200 39000 57200 41700 4
+N 57200 39000 54700 39000 4
+N 59300 40200 57500 40200 4
+N 57500 40200 57500 38700 4
+N 57500 38700 54700 38700 4
+N 59300 38700 57800 38700 4
+N 57800 38700 57800 38400 4
+N 57800 38400 54700 38400 4
+N 54700 37200 59300 37200 4
+N 59300 35700 57600 35700 4
+N 57600 35700 57600 36900 4
+N 57600 36900 54700 36900 4
+N 59300 34200 57300 34200 4
+N 57300 34200 57300 36600 4
+N 57300 36600 54700 36600 4
+N 59300 32700 57000 32700 4
+N 57000 32700 57000 36300 4
+N 57000 36300 54700 36300 4
+C 18000 54800 1 0 0 5V-plus-1.sym
+N 18200 54800 18200 54600 4
+N 18200 54600 17600 54600 4
+C 35800 57500 1 0 0 5V-plus-1.sym
+C 49100 57500 1 0 0 5V-plus-1.sym
+C 51800 38000 1 0 0 5V-plus-1.sym
+N 52000 35700 52000 38000 4
+C 51400 34700 1 0 0 gnd-1.sym
+N 51500 35500 51500 35000 4
+C 58300 41900 1 90 0 capacitor-1.sym
+{
+T 57600 42100 5 10 0 0 90 0 1
+device=CAPACITOR
+T 57900 42200 5 10 1 1 90 0 1
+refdes=C18
+T 57400 42100 5 10 0 0 90 0 1
+symversion=0.1
+T 58300 42500 5 10 1 1 270 0 1
+value=0.1 uF
+T 58300 41900 5 10 0 0 270 0 1
+footprint=0603
+T 58300 41900 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 58300 40400 1 90 0 capacitor-1.sym
+{
+T 57600 40600 5 10 0 0 90 0 1
+device=CAPACITOR
+T 57900 40700 5 10 1 1 90 0 1
+refdes=C19
+T 57400 40600 5 10 0 0 90 0 1
+symversion=0.1
+T 58300 41000 5 10 1 1 270 0 1
+value=0.1 uF
+T 58300 40400 5 10 0 0 270 0 1
+footprint=0603
+T 58300 40400 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 58300 38900 1 90 0 capacitor-1.sym
+{
+T 57600 39100 5 10 0 0 90 0 1
+device=CAPACITOR
+T 57900 39200 5 10 1 1 90 0 1
+refdes=C20
+T 57400 39100 5 10 0 0 90 0 1
+symversion=0.1
+T 58300 39500 5 10 1 1 270 0 1
+value=0.1 uF
+T 58300 38900 5 10 0 0 270 0 1
+footprint=0603
+T 58300 38900 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 58300 37400 1 90 0 capacitor-1.sym
+{
+T 57600 37600 5 10 0 0 90 0 1
+device=CAPACITOR
+T 57900 37700 5 10 1 1 90 0 1
+refdes=C21
+T 57400 37600 5 10 0 0 90 0 1
+symversion=0.1
+T 58300 38000 5 10 1 1 270 0 1
+value=0.1 uF
+T 58300 37400 5 10 0 0 270 0 1
+footprint=0603
+T 58300 37400 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 58300 35900 1 90 0 capacitor-1.sym
+{
+T 57600 36100 5 10 0 0 90 0 1
+device=CAPACITOR
+T 57900 36200 5 10 1 1 90 0 1
+refdes=C22
+T 57400 36100 5 10 0 0 90 0 1
+symversion=0.1
+T 58300 36500 5 10 1 1 270 0 1
+value=0.1 uF
+T 58300 35900 5 10 0 0 270 0 1
+footprint=0603
+T 58300 35900 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 58300 34400 1 90 0 capacitor-1.sym
+{
+T 57600 34600 5 10 0 0 90 0 1
+device=CAPACITOR
+T 57900 34700 5 10 1 1 90 0 1
+refdes=C23
+T 57400 34600 5 10 0 0 90 0 1
+symversion=0.1
+T 58300 35000 5 10 1 1 270 0 1
+value=0.1 uF
+T 58300 34400 5 10 0 0 270 0 1
+footprint=0603
+T 58300 34400 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 58300 32900 1 90 0 capacitor-1.sym
+{
+T 57600 33100 5 10 0 0 90 0 1
+device=CAPACITOR
+T 57900 33200 5 10 1 1 90 0 1
+refdes=C24
+T 57400 33100 5 10 0 0 90 0 1
+symversion=0.1
+T 58300 33500 5 10 1 1 270 0 1
+value=0.1 uF
+T 58300 32900 5 10 0 0 270 0 1
+footprint=0603
+T 58300 32900 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 58100 42800 58100 43000 4
+N 58100 41900 58100 41800 4
+N 58100 41800 59000 41800 4
+N 58100 41300 58100 41500 4
+N 59000 40300 58100 40300 4
+N 58100 40300 58100 40400 4
+N 58100 39800 58100 40000 4
+N 58100 38900 58100 38800 4
+N 58100 38800 59000 38800 4
+N 58100 38300 58100 38500 4
+N 59000 37300 58100 37300 4
+N 58100 37300 58100 37400 4
+N 58100 36800 58100 37000 4
+N 59000 35800 58100 35800 4
+N 58100 35800 58100 35900 4
+N 58100 35300 58100 35500 4
+N 58100 34400 58100 34300 4
+N 58100 34300 59000 34300 4
+N 58100 33800 58100 34000 4
+N 58100 32900 58100 32800 4
+N 58100 32800 59000 32800 4
+C 58300 31400 1 90 0 capacitor-1.sym
+{
+T 57600 31600 5 10 0 0 90 0 1
+device=CAPACITOR
+T 57900 31700 5 10 1 1 90 0 1
+refdes=C25
+T 57400 31600 5 10 0 0 90 0 1
+symversion=0.1
+T 58300 32000 5 10 1 1 270 0 1
+value=0.1 uF
+T 58300 31400 5 10 0 0 270 0 1
+footprint=0603
+T 58300 31400 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 58100 32300 58100 32500 4
+N 58100 31400 58100 31300 4
+N 58100 31300 59000 31300 4
+C 40100 40500 1 90 0 capacitor-1.sym
+{
+T 39400 40700 5 10 0 0 90 0 1
+device=CAPACITOR
+T 39700 40800 5 10 1 1 90 0 1
+refdes=C26
+T 39200 40700 5 10 0 0 90 0 1
+symversion=0.1
+T 40100 41100 5 10 1 1 270 0 1
+value=0.1 uF
+T 40100 40500 5 10 0 0 270 0 1
+footprint=0603
+T 40100 40500 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 39300 40500 1 90 0 capacitor-1.sym
+{
+T 38600 40700 5 10 0 0 90 0 1
+device=CAPACITOR
+T 38900 40800 5 10 1 1 90 0 1
+refdes=C27
+T 38400 40700 5 10 0 0 90 0 1
+symversion=0.1
+T 39300 41100 5 10 1 1 270 0 1
+value=0.1 uF
+T 39300 40500 5 10 0 0 270 0 1
+footprint=0603
+T 39300 40500 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 38400 40500 1 90 0 capacitor-1.sym
+{
+T 37700 40700 5 10 0 0 90 0 1
+device=CAPACITOR
+T 38000 40800 5 10 1 1 90 0 1
+refdes=C28
+T 37500 40700 5 10 0 0 90 0 1
+symversion=0.1
+T 38400 41100 5 10 1 1 270 0 1
+value=0.1 uF
+T 38400 40500 5 10 0 0 270 0 1
+footprint=0603
+T 38400 40500 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 37600 40500 1 90 0 capacitor-1.sym
+{
+T 36900 40700 5 10 0 0 90 0 1
+device=CAPACITOR
+T 37200 40800 5 10 1 1 90 0 1
+refdes=C29
+T 36700 40700 5 10 0 0 90 0 1
+symversion=0.1
+T 37600 41100 5 10 1 1 270 0 1
+value=0.1 uF
+T 37600 40500 5 10 0 0 270 0 1
+footprint=0603
+T 37600 40500 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 36800 40500 1 90 0 capacitor-1.sym
+{
+T 36100 40700 5 10 0 0 90 0 1
+device=CAPACITOR
+T 36400 40800 5 10 1 1 90 0 1
+refdes=C30
+T 35900 40700 5 10 0 0 90 0 1
+symversion=0.1
+T 36800 41100 5 10 1 1 270 0 1
+value=0.1 uF
+T 36800 40500 5 10 0 0 270 0 1
+footprint=0603
+T 36800 40500 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+C 38100 40000 1 0 0 gnd-1.sym
+C 38000 41600 1 0 0 3.3V-plus-1.sym
+N 36600 40500 36600 40400 4
+N 35800 40400 39900 40400 4
+N 39900 40400 39900 40500 4
+N 39100 40500 39100 40400 4
+N 38200 40500 38200 40400 4
+N 38200 40400 38200 40300 4
+N 37400 40500 37400 40400 4
+N 36600 41400 36600 41500 4
+N 35800 41500 39900 41500 4
+N 39900 41500 39900 41400 4
+N 39100 41400 39100 41500 4
+N 38200 41500 38200 41600 4
+N 38200 41500 38200 41400 4
+N 37400 41400 37400 41500 4
+C 39000 55100 1 90 0 capacitor-1.sym
+{
+T 38300 55300 5 10 0 0 90 0 1
+device=CAPACITOR
+T 38600 55400 5 10 1 1 90 0 1
+refdes=C32
+T 38100 55300 5 10 0 0 90 0 1
+symversion=0.1
+T 39000 55700 5 10 1 1 270 0 1
+value=0.1 uF
+T 39000 55100 5 10 0 0 270 0 1
+footprint=0603
+T 39000 55100 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 38000 56100 38800 56100 4
+N 38800 56100 38800 56000 4
+N 38800 55100 38800 55000 4
+N 38800 55000 38000 55000 4
+C 36000 40500 1 90 0 capacitor-1.sym
+{
+T 35300 40700 5 10 0 0 90 0 1
+device=CAPACITOR
+T 35600 40800 5 10 1 1 90 0 1
+refdes=C31
+T 35100 40700 5 10 0 0 90 0 1
+symversion=0.1
+T 36000 41100 5 10 1 1 270 0 1
+value=0.1 uF
+T 36000 40500 5 10 0 0 270 0 1
+footprint=0603
+T 36000 40500 5 10 0 1 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 35800 41500 35800 41400 4
+N 35800 40500 35800 40400 4
+C 55100 46000 1 0 0 led-3.sym
+{
+T 56050 46650 5 10 0 0 0 0 1
+device=LED
+T 55550 46550 5 10 1 1 0 0 1
+refdes=D2
+T 55100 46000 5 10 0 0 0 0 1
+footprint=0805
+T 55300 45900 5 10 1 1 0 0 1
+value=yellow
+T 55100 46000 5 10 0 1 0 0 1
+pn=LY R971-HL-1
+}
+C 55100 45100 1 0 0 led-3.sym
+{
+T 56050 45750 5 10 0 0 0 0 1
+device=LED
+T 55550 45650 5 10 1 1 0 0 1
+refdes=D5
+T 55100 45100 5 10 0 0 0 0 1
+footprint=0805
+T 55300 45000 5 10 1 1 0 0 1
+value=green
+T 55100 45100 5 10 0 1 0 0 1
+pn=LG R971-KN-1
+}
+C 55100 44300 1 0 0 led-3.sym
+{
+T 56050 44950 5 10 0 0 0 0 1
+device=LED
+T 55550 44850 5 10 1 1 0 0 1
+refdes=D6
+T 55100 44300 5 10 0 0 0 0 1
+footprint=0805
+T 55300 44200 5 10 1 1 0 0 1
+value=red
+T 55100 44300 5 10 0 1 0 0 1
+pn=LH R974-LP-1
+}
+C 57100 46300 1 180 0 resistor-1.sym
+{
+T 56800 45900 5 10 0 0 180 0 1
+device=RESISTOR
+T 56900 46000 5 10 1 1 180 0 1
+refdes=R13
+T 57100 46300 5 10 0 0 180 0 1
+footprint=0603
+T 57100 46500 5 10 1 1 180 0 1
+value=130 ohms
+T 57100 46300 5 10 0 1 0 0 1
+pn=ERJ-3GEYJ131V
+}
+C 57100 45400 1 180 0 resistor-1.sym
+{
+T 56800 45000 5 10 0 0 180 0 1
+device=RESISTOR
+T 56900 45100 5 10 1 1 180 0 1
+refdes=R14
+T 57100 45400 5 10 0 0 180 0 1
+footprint=0603
+T 57100 45600 5 10 1 1 180 0 1
+value=130 ohms
+T 57100 45400 5 10 0 1 0 0 1
+pn=ERJ-3GEYJ131V
+}
+C 57100 44600 1 180 0 resistor-1.sym
+{
+T 56800 44200 5 10 0 0 180 0 1
+device=RESISTOR
+T 56900 44300 5 10 1 1 180 0 1
+refdes=R15
+T 57100 44600 5 10 0 0 180 0 1
+footprint=0603
+T 57100 44800 5 10 1 1 180 0 1
+value=130 ohms
+T 57100 44600 5 10 0 1 0 0 1
+pn=ERJ-3GEYJ131V
+}
+N 56000 46200 56200 46200 4
+N 56200 45300 56000 45300 4
+N 56200 44500 56000 44500 4
+C 57200 46500 1 0 0 3.3V-plus-1.sym
+N 57400 43800 57400 46500 4
+N 57400 46200 57100 46200 4
+N 57400 45300 57100 45300 4
+N 57400 44500 57100 44500 4
+N 45300 45800 47900 45800 4
+N 47900 45800 47900 45400 4
+N 47900 45400 53900 45400 4
+N 47900 46500 46400 46500 4
+N 46400 46500 46400 50600 4
+N 46400 50600 45300 50600 4
+N 47900 44500 46600 44500 4
+N 46600 44500 46600 50200 4
+N 46600 50200 45300 50200 4
+N 45300 45400 45800 45400 4
+N 45800 45400 45800 50400 4
+N 45800 50400 46800 50400 4
+N 46800 50400 46800 50300 4
+N 46800 50300 47900 50300 4
+N 50500 43900 52000 43900 4
+N 55100 46200 53900 46200 4
+N 53900 46200 53900 45400 4
+N 45300 44600 46400 44600 4
+N 46400 44600 46400 44800 4
+N 46400 44800 47200 44800 4
+N 47200 44800 47200 45200 4
+N 47200 45200 54100 45200 4
+N 54100 45200 54100 45300 4
+N 54100 45300 55100 45300 4
+N 55100 44500 54100 44500 4
+N 54100 44500 54100 40500 4
+N 54100 40500 47400 40500 4
+N 47400 40500 47400 41100 4
+N 47400 41100 46800 41100 4
+N 46800 41100 46800 41200 4
+N 46800 41200 45800 41200 4
+N 45800 41200 45800 41800 4
+N 45800 41800 45300 41800 4
+C 53600 47500 1 270 0 gnd-1.sym
+N 54300 47700 53200 47700 4
+N 53200 47700 53200 47900 4
+N 53200 47900 47800 47900 4
+N 47800 47400 47800 47900 4
+N 47800 47400 45300 47400 4
+N 54300 48000 53400 48000 4
+N 53400 48000 53400 48100 4
+N 53400 48100 47600 48100 4
+N 45300 47000 46800 47000 4
+N 46800 47000 46800 47600 4
+N 46800 47600 47600 47600 4
+N 47600 47600 47600 48100 4
+C 54000 48300 1 90 0 generic-power.sym
+{
+T 53750 48500 5 10 1 1 90 3 1
+net=NRST:1
+}
+C 37100 43700 1 180 0 generic-power.sym
+{
+T 36900 43450 5 10 1 1 180 3 1
+net=NRST:1
+}
+N 36900 43700 36900 44100 4
+C 56000 48500 1 180 0 connector4-1.sym
+{
+T 54200 47600 5 10 0 0 180 0 1
+device=CONNECTOR_4
+T 56000 47100 5 10 1 1 180 0 1
+refdes=CONN1
+T 56000 48500 5 10 0 0 0 0 1
+footprint=22-23-2041
+T 56000 48500 5 10 0 1 0 0 1
+pn=22-23-2041
+}
+N 53900 47400 54300 47400 4
+N 54000 48500 54000 48300 4
+N 54000 48300 54300 48300 4
+N 41800 49400 28900 49400 4
+N 28900 49400 28900 57000 4
+N 28900 57000 13100 57000 4
+N 13100 57000 13100 50700 4
+N 58100 32500 58800 32500 4
+N 58100 43000 58800 43000 4
+N 58100 41500 58800 41500 4
+N 58100 40000 58800 40000 4
+N 58100 38500 58800 38500 4
+N 58100 37000 58800 37000 4
+N 58100 35500 58800 35500 4
+N 58100 34000 58800 34000 4
+C 14300 48100 1 90 0 led-3.sym
+{
+T 13650 49050 5 10 0 0 90 0 1
+device=LED
+T 13750 48550 5 10 1 1 90 0 1
+refdes=D7
+T 14300 48100 5 10 0 0 90 0 1
+footprint=0805
+T 14400 48300 5 10 1 1 90 0 1
+value=green
+T 14300 48100 5 10 0 1 0 0 1
+pn=LG R971-KN-1
+}
+C 14000 50000 1 270 0 resistor-1.sym
+{
+T 14400 49700 5 10 0 0 270 0 1
+device=RESISTOR
+T 14300 49800 5 10 1 1 270 0 1
+refdes=R17
+T 14000 50000 5 10 0 0 270 0 1
+footprint=0603
+T 13800 50000 5 10 1 1 270 0 1
+value=1 kohms
+T 14000 50000 5 10 0 1 0 0 1
+pn=SG73S1JTTD102J
+}
+C 14000 47700 1 0 0 gnd-1.sym
+C 13900 50100 1 0 0 12V-plus-1.sym
+N 14100 50100 14100 50000 4
+N 14100 49000 14100 49100 4
+N 14100 48000 14100 48100 4
+C 14500 40900 1 0 0 4-40_bolt-1.sym
+{
+T 14200 42100 5 10 0 1 0 0 1
+device=4-40_bolt
+T 14500 42100 5 10 0 1 0 0 1
+footprint=4-40_bolt
+T 15000 41600 5 10 1 1 0 0 1
+refdes=B2
+}
+C 55100 43600 1 0 0 led-3.sym
+{
+T 56050 44250 5 10 0 0 0 0 1
+device=LED
+T 55550 44050 5 10 1 1 0 0 1
+refdes=D1
+T 55100 43600 5 10 0 0 0 0 1
+footprint=0805
+T 55300 43500 5 10 1 1 0 0 1
+value=green
+T 55100 43600 5 10 0 1 0 0 1
+pn=LG R971-KN-1
+}
+C 57100 43900 1 180 0 resistor-1.sym
+{
+T 56800 43500 5 10 0 0 180 0 1
+device=RESISTOR
+T 56900 43600 5 10 1 1 180 0 1
+refdes=R1
+T 57100 43900 5 10 0 0 180 0 1
+footprint=0603
+T 57100 44100 5 10 1 1 180 0 1
+value=130 ohms
+T 57100 43900 5 10 0 1 0 0 1
+pn=ERJ-3GEYJ131V
+}
+N 56200 43800 56000 43800 4
+N 57400 43800 57100 43800 4
+N 41800 51400 41100 51400 4
+N 41100 51400 41100 53400 4
+N 41100 53400 52800 53400 4
+N 52800 53400 52800 43800 4
+N 52800 43800 55100 43800 4
diff --git a/bbb_cape/schematic/cape.gsch2pcb b/bbb_cape/schematic/cape.gsch2pcb
new file mode 100644
index 0000000..e8ff08e
--- /dev/null
+++ b/bbb_cape/schematic/cape.gsch2pcb
@@ -0,0 +1,2 @@
+schematics cape-main.sch
+output-name cape
diff --git a/bbb_cape/schematic/cape.pcb b/bbb_cape/schematic/cape.pcb
new file mode 100644
index 0000000..bc27b41
--- /dev/null
+++ b/bbb_cape/schematic/cape.pcb
@@ -0,0 +1,7483 @@
+# release: pcb 20110918
+
+# To read pcb files, the pcb version (or the git source date) must be >= the file version
+FileVersion[20070407]
+
+PCB["971 BBB Cape" 500000 400000]
+
+Grid[500.0 441 0 0]
+Cursor[222941 98500 0.000000]
+PolyArea[3100.006200]
+Thermal[0.500000]
+DRC[800 1000 800 10 1000 500]
+Flags("showdrc,rubberband,autodrc,clearnew,snappin,hidenames")
+Groups("1,c:3:2:4,s:5")
+Styles["Signal,800,2000,1000,800:Power,2500,6000,3500,1000:Fat,4000,6000,3500,1000:Skinny,600,2402,1181,600"]
+
+Symbol[' ' 1800]
+(
+)
+Symbol['!' 1200]
+(
+	SymbolLine[0 4500 0 5000 800]
+	SymbolLine[0 1000 0 3500 800]
+)
+Symbol['"' 1200]
+(
+	SymbolLine[0 1000 0 2000 800]
+	SymbolLine[1000 1000 1000 2000 800]
+)
+Symbol['#' 1200]
+(
+	SymbolLine[0 3500 2000 3500 800]
+	SymbolLine[0 2500 2000 2500 800]
+	SymbolLine[1500 2000 1500 4000 800]
+	SymbolLine[500 2000 500 4000 800]
+)
+Symbol['$' 1200]
+(
+	SymbolLine[1500 1500 2000 2000 800]
+	SymbolLine[500 1500 1500 1500 800]
+	SymbolLine[0 2000 500 1500 800]
+	SymbolLine[0 2000 0 2500 800]
+	SymbolLine[0 2500 500 3000 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[2000 3500 2000 4000 800]
+	SymbolLine[1500 4500 2000 4000 800]
+	SymbolLine[500 4500 1500 4500 800]
+	SymbolLine[0 4000 500 4500 800]
+	SymbolLine[1000 1000 1000 5000 800]
+)
+Symbol['%' 1200]
+(
+	SymbolLine[0 1500 0 2000 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 1000 1000 800]
+	SymbolLine[1000 1000 1500 1500 800]
+	SymbolLine[1500 1500 1500 2000 800]
+	SymbolLine[1000 2500 1500 2000 800]
+	SymbolLine[500 2500 1000 2500 800]
+	SymbolLine[0 2000 500 2500 800]
+	SymbolLine[0 5000 4000 1000 800]
+	SymbolLine[3500 5000 4000 4500 800]
+	SymbolLine[4000 4000 4000 4500 800]
+	SymbolLine[3500 3500 4000 4000 800]
+	SymbolLine[3000 3500 3500 3500 800]
+	SymbolLine[2500 4000 3000 3500 800]
+	SymbolLine[2500 4000 2500 4500 800]
+	SymbolLine[2500 4500 3000 5000 800]
+	SymbolLine[3000 5000 3500 5000 800]
+)
+Symbol['&' 1200]
+(
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[0 1500 0 2500 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[0 3500 1500 2000 800]
+	SymbolLine[500 5000 1000 5000 800]
+	SymbolLine[1000 5000 2000 4000 800]
+	SymbolLine[0 2500 2500 5000 800]
+	SymbolLine[500 1000 1000 1000 800]
+	SymbolLine[1000 1000 1500 1500 800]
+	SymbolLine[1500 1500 1500 2000 800]
+	SymbolLine[0 3500 0 4500 800]
+)
+Symbol[''' 1200]
+(
+	SymbolLine[0 2000 1000 1000 800]
+)
+Symbol['(' 1200]
+(
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[0 1500 0 4500 800]
+)
+Symbol[')' 1200]
+(
+	SymbolLine[0 1000 500 1500 800]
+	SymbolLine[500 1500 500 4500 800]
+	SymbolLine[0 5000 500 4500 800]
+)
+Symbol['*' 1200]
+(
+	SymbolLine[0 2000 2000 4000 800]
+	SymbolLine[0 4000 2000 2000 800]
+	SymbolLine[0 3000 2000 3000 800]
+	SymbolLine[1000 2000 1000 4000 800]
+)
+Symbol['+' 1200]
+(
+	SymbolLine[0 3000 2000 3000 800]
+	SymbolLine[1000 2000 1000 4000 800]
+)
+Symbol[',' 1200]
+(
+	SymbolLine[0 6000 1000 5000 800]
+)
+Symbol['-' 1200]
+(
+	SymbolLine[0 3000 2000 3000 800]
+)
+Symbol['.' 1200]
+(
+	SymbolLine[0 5000 500 5000 800]
+)
+Symbol['/' 1200]
+(
+	SymbolLine[0 4500 3000 1500 800]
+)
+Symbol['0' 1200]
+(
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[0 1500 0 4500 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 1500 1000 800]
+	SymbolLine[1500 1000 2000 1500 800]
+	SymbolLine[2000 1500 2000 4500 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[0 4000 2000 2000 800]
+)
+Symbol['1' 1200]
+(
+	SymbolLine[0 1800 800 1000 800]
+	SymbolLine[800 1000 800 5000 800]
+	SymbolLine[0 5000 1500 5000 800]
+)
+Symbol['2' 1200]
+(
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 2000 1000 800]
+	SymbolLine[2000 1000 2500 1500 800]
+	SymbolLine[2500 1500 2500 2500 800]
+	SymbolLine[0 5000 2500 2500 800]
+	SymbolLine[0 5000 2500 5000 800]
+)
+Symbol['3' 1200]
+(
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 1500 1000 800]
+	SymbolLine[1500 1000 2000 1500 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 2800 1500 2800 800]
+	SymbolLine[2000 1500 2000 2300 800]
+	SymbolLine[2000 3300 2000 4500 800]
+	SymbolLine[2000 3300 1500 2800 800]
+	SymbolLine[2000 2300 1500 2800 800]
+)
+Symbol['4' 1200]
+(
+	SymbolLine[0 3500 2000 1000 800]
+	SymbolLine[0 3500 2500 3500 800]
+	SymbolLine[2000 1000 2000 5000 800]
+)
+Symbol['5' 1200]
+(
+	SymbolLine[0 1000 2000 1000 800]
+	SymbolLine[0 1000 0 3000 800]
+	SymbolLine[0 3000 500 2500 800]
+	SymbolLine[500 2500 1500 2500 800]
+	SymbolLine[1500 2500 2000 3000 800]
+	SymbolLine[2000 3000 2000 4500 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+)
+Symbol['6' 1200]
+(
+	SymbolLine[1500 1000 2000 1500 800]
+	SymbolLine[500 1000 1500 1000 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[0 1500 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[1500 2800 2000 3300 800]
+	SymbolLine[0 2800 1500 2800 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[2000 3300 2000 4500 800]
+)
+Symbol['7' 1200]
+(
+	SymbolLine[500 5000 2500 1000 800]
+	SymbolLine[0 1000 2500 1000 800]
+)
+Symbol['8' 1200]
+(
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[0 3700 0 4500 800]
+	SymbolLine[0 3700 700 3000 800]
+	SymbolLine[700 3000 1300 3000 800]
+	SymbolLine[1300 3000 2000 3700 800]
+	SymbolLine[2000 3700 2000 4500 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[0 2300 700 3000 800]
+	SymbolLine[0 1500 0 2300 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 1500 1000 800]
+	SymbolLine[1500 1000 2000 1500 800]
+	SymbolLine[2000 1500 2000 2300 800]
+	SymbolLine[1300 3000 2000 2300 800]
+)
+Symbol['9' 1200]
+(
+	SymbolLine[500 5000 2000 3000 800]
+	SymbolLine[2000 1500 2000 3000 800]
+	SymbolLine[1500 1000 2000 1500 800]
+	SymbolLine[500 1000 1500 1000 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[0 1500 0 2500 800]
+	SymbolLine[0 2500 500 3000 800]
+	SymbolLine[500 3000 2000 3000 800]
+)
+Symbol[':' 1200]
+(
+	SymbolLine[0 2500 500 2500 800]
+	SymbolLine[0 3500 500 3500 800]
+)
+Symbol[';' 1200]
+(
+	SymbolLine[0 5000 1000 4000 800]
+	SymbolLine[1000 2500 1000 3000 800]
+)
+Symbol['<' 1200]
+(
+	SymbolLine[0 3000 1000 2000 800]
+	SymbolLine[0 3000 1000 4000 800]
+)
+Symbol['=' 1200]
+(
+	SymbolLine[0 2500 2000 2500 800]
+	SymbolLine[0 3500 2000 3500 800]
+)
+Symbol['>' 1200]
+(
+	SymbolLine[0 2000 1000 3000 800]
+	SymbolLine[0 4000 1000 3000 800]
+)
+Symbol['?' 1200]
+(
+	SymbolLine[1000 3000 1000 3500 800]
+	SymbolLine[1000 4500 1000 5000 800]
+	SymbolLine[0 1500 0 2000 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 1500 1000 800]
+	SymbolLine[1500 1000 2000 1500 800]
+	SymbolLine[2000 1500 2000 2000 800]
+	SymbolLine[1000 3000 2000 2000 800]
+)
+Symbol['@' 1200]
+(
+	SymbolLine[0 1000 0 4000 800]
+	SymbolLine[0 4000 1000 5000 800]
+	SymbolLine[1000 5000 4000 5000 800]
+	SymbolLine[5000 3500 5000 1000 800]
+	SymbolLine[5000 1000 4000 0 800]
+	SymbolLine[4000 0 1000 0 800]
+	SymbolLine[1000 0 0 1000 800]
+	SymbolLine[1500 2000 1500 3000 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[2000 3500 3000 3500 800]
+	SymbolLine[3000 3500 3500 3000 800]
+	SymbolLine[3500 3000 4000 3500 800]
+	SymbolLine[3500 3000 3500 1500 800]
+	SymbolLine[3500 2000 3000 1500 800]
+	SymbolLine[2000 1500 3000 1500 800]
+	SymbolLine[2000 1500 1500 2000 800]
+	SymbolLine[4000 3500 5000 3500 800]
+)
+Symbol['A' 1200]
+(
+	SymbolLine[0 2000 0 5000 800]
+	SymbolLine[0 2000 700 1000 800]
+	SymbolLine[700 1000 1800 1000 800]
+	SymbolLine[1800 1000 2500 2000 800]
+	SymbolLine[2500 2000 2500 5000 800]
+	SymbolLine[0 3000 2500 3000 800]
+)
+Symbol['B' 1200]
+(
+	SymbolLine[0 5000 2000 5000 800]
+	SymbolLine[2000 5000 2500 4500 800]
+	SymbolLine[2500 3300 2500 4500 800]
+	SymbolLine[2000 2800 2500 3300 800]
+	SymbolLine[500 2800 2000 2800 800]
+	SymbolLine[500 1000 500 5000 800]
+	SymbolLine[0 1000 2000 1000 800]
+	SymbolLine[2000 1000 2500 1500 800]
+	SymbolLine[2500 1500 2500 2300 800]
+	SymbolLine[2000 2800 2500 2300 800]
+)
+Symbol['C' 1200]
+(
+	SymbolLine[700 5000 2000 5000 800]
+	SymbolLine[0 4300 700 5000 800]
+	SymbolLine[0 1700 0 4300 800]
+	SymbolLine[0 1700 700 1000 800]
+	SymbolLine[700 1000 2000 1000 800]
+)
+Symbol['D' 1200]
+(
+	SymbolLine[500 1000 500 5000 800]
+	SymbolLine[1800 1000 2500 1700 800]
+	SymbolLine[2500 1700 2500 4300 800]
+	SymbolLine[1800 5000 2500 4300 800]
+	SymbolLine[0 5000 1800 5000 800]
+	SymbolLine[0 1000 1800 1000 800]
+)
+Symbol['E' 1200]
+(
+	SymbolLine[0 2800 1500 2800 800]
+	SymbolLine[0 5000 2000 5000 800]
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 1000 2000 1000 800]
+)
+Symbol['F' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 1000 2000 1000 800]
+	SymbolLine[0 2800 1500 2800 800]
+)
+Symbol['G' 1200]
+(
+	SymbolLine[2000 1000 2500 1500 800]
+	SymbolLine[500 1000 2000 1000 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[0 1500 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 5000 2000 5000 800]
+	SymbolLine[2000 5000 2500 4500 800]
+	SymbolLine[2500 3500 2500 4500 800]
+	SymbolLine[2000 3000 2500 3500 800]
+	SymbolLine[1000 3000 2000 3000 800]
+)
+Symbol['H' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[2500 1000 2500 5000 800]
+	SymbolLine[0 3000 2500 3000 800]
+)
+Symbol['I' 1200]
+(
+	SymbolLine[0 1000 1000 1000 800]
+	SymbolLine[500 1000 500 5000 800]
+	SymbolLine[0 5000 1000 5000 800]
+)
+Symbol['J' 1200]
+(
+	SymbolLine[700 1000 1500 1000 800]
+	SymbolLine[1500 1000 1500 4500 800]
+	SymbolLine[1000 5000 1500 4500 800]
+	SymbolLine[500 5000 1000 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[0 4500 0 4000 800]
+)
+Symbol['K' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 3000 2000 1000 800]
+	SymbolLine[0 3000 2000 5000 800]
+)
+Symbol['L' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 5000 2000 5000 800]
+)
+Symbol['M' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 1000 1500 3000 800]
+	SymbolLine[1500 3000 3000 1000 800]
+	SymbolLine[3000 1000 3000 5000 800]
+)
+Symbol['N' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 1000 2500 5000 800]
+	SymbolLine[2500 1000 2500 5000 800]
+)
+Symbol['O' 1200]
+(
+	SymbolLine[0 1500 0 4500 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 1500 1000 800]
+	SymbolLine[1500 1000 2000 1500 800]
+	SymbolLine[2000 1500 2000 4500 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+)
+Symbol['P' 1200]
+(
+	SymbolLine[500 1000 500 5000 800]
+	SymbolLine[0 1000 2000 1000 800]
+	SymbolLine[2000 1000 2500 1500 800]
+	SymbolLine[2500 1500 2500 2500 800]
+	SymbolLine[2000 3000 2500 2500 800]
+	SymbolLine[500 3000 2000 3000 800]
+)
+Symbol['Q' 1200]
+(
+	SymbolLine[0 1500 0 4500 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 1500 1000 800]
+	SymbolLine[1500 1000 2000 1500 800]
+	SymbolLine[2000 1500 2000 4000 800]
+	SymbolLine[1000 5000 2000 4000 800]
+	SymbolLine[500 5000 1000 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[1000 3500 2000 5000 800]
+)
+Symbol['R' 1200]
+(
+	SymbolLine[0 1000 2000 1000 800]
+	SymbolLine[2000 1000 2500 1500 800]
+	SymbolLine[2500 1500 2500 2500 800]
+	SymbolLine[2000 3000 2500 2500 800]
+	SymbolLine[500 3000 2000 3000 800]
+	SymbolLine[500 1000 500 5000 800]
+	SymbolLine[1300 3000 2500 5000 800]
+)
+Symbol['S' 1200]
+(
+	SymbolLine[2000 1000 2500 1500 800]
+	SymbolLine[500 1000 2000 1000 800]
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[0 1500 0 2500 800]
+	SymbolLine[0 2500 500 3000 800]
+	SymbolLine[500 3000 2000 3000 800]
+	SymbolLine[2000 3000 2500 3500 800]
+	SymbolLine[2500 3500 2500 4500 800]
+	SymbolLine[2000 5000 2500 4500 800]
+	SymbolLine[500 5000 2000 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+)
+Symbol['T' 1200]
+(
+	SymbolLine[0 1000 2000 1000 800]
+	SymbolLine[1000 1000 1000 5000 800]
+)
+Symbol['U' 1200]
+(
+	SymbolLine[0 1000 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[2000 1000 2000 4500 800]
+)
+Symbol['V' 1200]
+(
+	SymbolLine[0 1000 1000 5000 800]
+	SymbolLine[1000 5000 2000 1000 800]
+)
+Symbol['W' 1200]
+(
+	SymbolLine[0 1000 0 3000 800]
+	SymbolLine[0 3000 500 5000 800]
+	SymbolLine[500 5000 1500 3000 800]
+	SymbolLine[1500 3000 2500 5000 800]
+	SymbolLine[2500 5000 3000 3000 800]
+	SymbolLine[3000 3000 3000 1000 800]
+)
+Symbol['X' 1200]
+(
+	SymbolLine[0 5000 2500 1000 800]
+	SymbolLine[0 1000 2500 5000 800]
+)
+Symbol['Y' 1200]
+(
+	SymbolLine[0 1000 1000 3000 800]
+	SymbolLine[1000 3000 2000 1000 800]
+	SymbolLine[1000 3000 1000 5000 800]
+)
+Symbol['Z' 1200]
+(
+	SymbolLine[0 1000 2500 1000 800]
+	SymbolLine[0 5000 2500 1000 800]
+	SymbolLine[0 5000 2500 5000 800]
+)
+Symbol['[' 1200]
+(
+	SymbolLine[0 1000 500 1000 800]
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 5000 500 5000 800]
+)
+Symbol['\' 1200]
+(
+	SymbolLine[0 1500 3000 4500 800]
+)
+Symbol[']' 1200]
+(
+	SymbolLine[0 1000 500 1000 800]
+	SymbolLine[500 1000 500 5000 800]
+	SymbolLine[0 5000 500 5000 800]
+)
+Symbol['^' 1200]
+(
+	SymbolLine[0 1500 500 1000 800]
+	SymbolLine[500 1000 1000 1500 800]
+)
+Symbol['_' 1200]
+(
+	SymbolLine[0 5000 2000 5000 800]
+)
+Symbol['a' 1200]
+(
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[0 3500 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[2000 3000 2000 4500 800]
+	SymbolLine[2000 4500 2500 5000 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+)
+Symbol['b' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[2000 3500 2000 4500 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[0 3500 500 3000 800]
+)
+Symbol['c' 1200]
+(
+	SymbolLine[500 3000 2000 3000 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[0 3500 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 5000 2000 5000 800]
+)
+Symbol['d' 1200]
+(
+	SymbolLine[2000 1000 2000 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[0 3500 0 4500 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[1500 3000 2000 3500 800]
+)
+Symbol['e' 1200]
+(
+	SymbolLine[500 5000 2000 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[0 3500 0 4500 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[0 4000 2000 4000 800]
+	SymbolLine[2000 4000 2000 3500 800]
+)
+Symbol['f' 1000]
+(
+	SymbolLine[500 1500 500 5000 800]
+	SymbolLine[500 1500 1000 1000 800]
+	SymbolLine[1000 1000 1500 1000 800]
+	SymbolLine[0 3000 1000 3000 800]
+)
+Symbol['g' 1200]
+(
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[0 3500 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[0 6000 500 6500 800]
+	SymbolLine[500 6500 1500 6500 800]
+	SymbolLine[1500 6500 2000 6000 800]
+	SymbolLine[2000 3000 2000 6000 800]
+)
+Symbol['h' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[2000 3500 2000 5000 800]
+)
+Symbol['i' 1000]
+(
+	SymbolLine[0 2000 0 2100 1000]
+	SymbolLine[0 3500 0 5000 800]
+)
+Symbol['j' 1000]
+(
+	SymbolLine[500 2000 500 2100 1000]
+	SymbolLine[500 3500 500 6000 800]
+	SymbolLine[0 6500 500 6000 800]
+)
+Symbol['k' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+	SymbolLine[0 3500 1500 5000 800]
+	SymbolLine[0 3500 1000 2500 800]
+)
+Symbol['l' 1000]
+(
+	SymbolLine[0 1000 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+)
+Symbol['m' 1200]
+(
+	SymbolLine[500 3500 500 5000 800]
+	SymbolLine[500 3500 1000 3000 800]
+	SymbolLine[1000 3000 1500 3000 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[2000 3500 2000 5000 800]
+	SymbolLine[2000 3500 2500 3000 800]
+	SymbolLine[2500 3000 3000 3000 800]
+	SymbolLine[3000 3000 3500 3500 800]
+	SymbolLine[3500 3500 3500 5000 800]
+	SymbolLine[0 3000 500 3500 800]
+)
+Symbol['n' 1200]
+(
+	SymbolLine[500 3500 500 5000 800]
+	SymbolLine[500 3500 1000 3000 800]
+	SymbolLine[1000 3000 1500 3000 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[2000 3500 2000 5000 800]
+	SymbolLine[0 3000 500 3500 800]
+)
+Symbol['o' 1200]
+(
+	SymbolLine[0 3500 0 4500 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[2000 3500 2000 4500 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[0 4500 500 5000 800]
+)
+Symbol['p' 1200]
+(
+	SymbolLine[500 3500 500 6500 800]
+	SymbolLine[0 3000 500 3500 800]
+	SymbolLine[500 3500 1000 3000 800]
+	SymbolLine[1000 3000 2000 3000 800]
+	SymbolLine[2000 3000 2500 3500 800]
+	SymbolLine[2500 3500 2500 4500 800]
+	SymbolLine[2000 5000 2500 4500 800]
+	SymbolLine[1000 5000 2000 5000 800]
+	SymbolLine[500 4500 1000 5000 800]
+)
+Symbol['q' 1200]
+(
+	SymbolLine[2000 3500 2000 6500 800]
+	SymbolLine[1500 3000 2000 3500 800]
+	SymbolLine[500 3000 1500 3000 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[0 3500 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+)
+Symbol['r' 1200]
+(
+	SymbolLine[500 3500 500 5000 800]
+	SymbolLine[500 3500 1000 3000 800]
+	SymbolLine[1000 3000 2000 3000 800]
+	SymbolLine[0 3000 500 3500 800]
+)
+Symbol['s' 1200]
+(
+	SymbolLine[500 5000 2000 5000 800]
+	SymbolLine[2000 5000 2500 4500 800]
+	SymbolLine[2000 4000 2500 4500 800]
+	SymbolLine[500 4000 2000 4000 800]
+	SymbolLine[0 3500 500 4000 800]
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[500 3000 2000 3000 800]
+	SymbolLine[2000 3000 2500 3500 800]
+	SymbolLine[0 4500 500 5000 800]
+)
+Symbol['t' 1000]
+(
+	SymbolLine[500 1000 500 4500 800]
+	SymbolLine[500 4500 1000 5000 800]
+	SymbolLine[0 2500 1000 2500 800]
+)
+Symbol['u' 1200]
+(
+	SymbolLine[0 3000 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+	SymbolLine[2000 3000 2000 4500 800]
+)
+Symbol['v' 1200]
+(
+	SymbolLine[0 3000 1000 5000 800]
+	SymbolLine[2000 3000 1000 5000 800]
+)
+Symbol['w' 1200]
+(
+	SymbolLine[0 3000 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[500 5000 1000 5000 800]
+	SymbolLine[1000 5000 1500 4500 800]
+	SymbolLine[1500 3000 1500 4500 800]
+	SymbolLine[1500 4500 2000 5000 800]
+	SymbolLine[2000 5000 2500 5000 800]
+	SymbolLine[2500 5000 3000 4500 800]
+	SymbolLine[3000 3000 3000 4500 800]
+)
+Symbol['x' 1200]
+(
+	SymbolLine[0 3000 2000 5000 800]
+	SymbolLine[0 5000 2000 3000 800]
+)
+Symbol['y' 1200]
+(
+	SymbolLine[0 3000 0 4500 800]
+	SymbolLine[0 4500 500 5000 800]
+	SymbolLine[2000 3000 2000 6000 800]
+	SymbolLine[1500 6500 2000 6000 800]
+	SymbolLine[500 6500 1500 6500 800]
+	SymbolLine[0 6000 500 6500 800]
+	SymbolLine[500 5000 1500 5000 800]
+	SymbolLine[1500 5000 2000 4500 800]
+)
+Symbol['z' 1200]
+(
+	SymbolLine[0 3000 2000 3000 800]
+	SymbolLine[0 5000 2000 3000 800]
+	SymbolLine[0 5000 2000 5000 800]
+)
+Symbol['{' 1200]
+(
+	SymbolLine[500 1500 1000 1000 800]
+	SymbolLine[500 1500 500 2500 800]
+	SymbolLine[0 3000 500 2500 800]
+	SymbolLine[0 3000 500 3500 800]
+	SymbolLine[500 3500 500 4500 800]
+	SymbolLine[500 4500 1000 5000 800]
+)
+Symbol['|' 1200]
+(
+	SymbolLine[0 1000 0 5000 800]
+)
+Symbol['}' 1200]
+(
+	SymbolLine[0 1000 500 1500 800]
+	SymbolLine[500 1500 500 2500 800]
+	SymbolLine[500 2500 1000 3000 800]
+	SymbolLine[500 3500 1000 3000 800]
+	SymbolLine[500 3500 500 4500 800]
+	SymbolLine[0 5000 500 4500 800]
+)
+Symbol['~' 1200]
+(
+	SymbolLine[0 3500 500 3000 800]
+	SymbolLine[500 3000 1000 3000 800]
+	SymbolLine[1000 3000 1500 3500 800]
+	SymbolLine[1500 3500 2000 3500 800]
+	SymbolLine[2000 3500 2500 3000 800]
+)
+Attribute("import::src0" "/home/austin/local/robotics/git.frc971/bbb_cape/schematic/cape-main.sch")
+Attribute("PCB::grid::unit" "mil")
+Via[432324 289000 3600 2000 0 2000 "" ""]
+Via[386441 237000 3600 2000 0 2000 "" ""]
+Via[387441 74000 3600 2000 0 2000 "" ""]
+Via[393441 45000 3600 2000 0 2000 "" ""]
+Via[386720 118000 3600 2000 0 2000 "" ""]
+Via[400441 206000 3600 2000 0 2000 "" ""]
+Via[389441 216000 3600 2000 0 2000 "" ""]
+Via[400441 211000 3600 2000 0 2000 "" ""]
+Via[393441 192000 3600 2000 0 2000 "" ""]
+Via[393441 73000 3600 2000 0 2000 "" ""]
+Via[385941 45500 3600 2000 0 2000 "" ""]
+Via[375441 165000 3600 2000 0 2000 "" ""]
+Via[384162 212000 3600 2000 0 2000 "" ""]
+Via[387070 165000 3600 2000 0 2000 "" ""]
+Via[384162 94000 3600 2000 0 2000 "" ""]
+Via[458441 25000 3600 2000 0 2000 "" ""]
+Via[458441 55000 3600 2000 0 2000 "" ""]
+Via[458441 85000 3600 2000 0 2000 "" ""]
+Via[458441 115000 3600 2000 0 2000 "" ""]
+Via[458441 146000 3600 2000 0 2000 "" ""]
+Via[458441 175000 3600 2000 0 2000 "" ""]
+Via[458441 205000 3600 2000 0 2000 "" ""]
+Via[458441 236000 3600 2000 0 2000 "" ""]
+Via[446441 298000 3600 2000 0 2000 "" ""]
+Via[434882 325000 3600 2000 0 2000 "" ""]
+Via[423441 325000 3600 2000 0 2000 "" ""]
+Via[372441 229614 3600 2000 0 2000 "" ""]
+Via[398441 152000 3600 2000 0 2000 "" ""]
+Via[398441 147000 3600 2000 0 2000 "" ""]
+Via[384512 142000 3600 2000 0 2000 "" ""]
+Via[398441 86000 3600 2000 0 2000 "" ""]
+Via[398441 91000 3600 2000 0 2000 "" ""]
+Via[372441 109311 3600 2000 0 2000 "" ""]
+Via[372441 48811 3600 2000 0 2000 "" ""]
+Via[383662 21500 3600 2000 0 2000 "" ""]
+Via[397441 27000 3600 2000 0 2000 "" ""]
+Via[397941 32559 3600 2000 0 2000 "" ""]
+Via[307716 124925 2500 1600 0 1000 "" ""]
+Via[308992 128029 2500 1600 0 1000 "" ""]
+Via[308872 133478 2500 1600 0 1000 "" ""]
+Via[245557 120492 2500 1600 0 1000 "" ""]
+Via[266413 103406 2500 1600 0 1000 "" ""]
+Via[263240 104671 2500 1600 0 1000 "" ""]
+Via[262740 108171 2500 1600 0 1000 "" ""]
+Via[254740 101671 2500 1600 0 1000 "" ""]
+Via[287917 92171 2500 1600 0 1000 "" ""]
+Via[269653 101369 2500 1600 0 1000 "" ""]
+Via[273229 101418 2500 1600 0 1000 "" ""]
+Via[278225 120398 2500 1600 0 1000 "" ""]
+Via[262750 131228 2500 1600 0 1000 "" ""]
+Via[293902 117737 2500 1600 0 1000 "" ""]
+Via[260341 115751 2500 1600 0 1000 "" ""]
+Via[296779 95037 2500 1600 0 1000 "" ""]
+Via[253101 138164 2500 1600 0 1000 "" ""]
+Via[239302 137765 2500 1600 0 1000 "" ""]
+Via[295937 156372 2500 1600 0 1000 "" ""]
+Via[278207 101388 2500 1600 0 1000 "" ""]
+Via[277174 91781 2500 1600 0 1000 "" ""]
+Via[242456 106457 2500 1600 0 1000 "" ""]
+Via[242168 101200 2500 1600 0 1000 "" ""]
+Via[312157 99844 2500 1600 0 1000 "" ""]
+Via[312122 104962 2500 1600 0 1000 "" ""]
+Via[277449 52500 2500 1600 0 1000 "" ""]
+Via[303365 70000 2500 1600 0 1000 "" ""]
+Via[285430 75000 2500 1600 0 1000 "" ""]
+Via[302941 59993 2500 1600 0 1000 "" ""]
+Via[371602 139772 2000 1600 0 1000 "" ""]
+Via[396441 165000 2000 1600 0 1000 "" ""]
+Via[385941 34000 2000 1600 0 1000 "" ""]
+Via[398441 109000 2000 1600 0 1000 "" ""]
+Via[386023 242187 2000 1600 0 1000 "" ""]
+Via[398441 227000 2000 1600 0 1000 "" ""]
+Via[440941 277000 6000 2000 0 3500 "" ""]
+Via[434449 343500 2000 1600 0 1000 "" ""]
+Via[440449 343500 2000 1600 0 1000 "" ""]
+Via[163941 272500 2000 1600 0 1000 "" ""]
+Via[193390 272500 2000 1600 0 1000 "" ""]
+Via[112222 272660 2000 1600 0 1000 "" ""]
+Via[245441 272500 2000 1600 0 1000 "" ""]
+Via[114441 278500 2000 1600 0 1000 "" ""]
+Via[115441 267500 2000 1600 0 1000 "" ""]
+Via[152441 278500 2000 1600 0 1000 "" ""]
+Via[151941 268000 2000 1600 0 1000 "" ""]
+Via[127941 252000 2000 1600 0 1000 "" ""]
+Via[141441 252000 2000 1600 0 1000 "" ""]
+Via[198441 277500 2000 1600 0 1000 "" ""]
+Via[195441 267000 2000 1600 0 1000 "" ""]
+Via[208941 252000 2000 1600 0 1000 "" ""]
+Via[223941 252000 2000 1600 0 1000 "" ""]
+Via[234441 277500 2000 1600 0 1000 "" ""]
+Via[235941 267000 2000 1600 0 1000 "" ""]
+Via[128941 125500 2000 1600 0 1000 "" ""]
+Via[128941 131500 2000 1600 0 1000 "" ""]
+Via[128941 137500 2000 1600 0 1000 "" ""]
+Via[128941 145000 2000 1600 0 1000 "" ""]
+Via[128941 151500 2000 1600 0 1000 "" ""]
+Via[128941 157500 2000 1600 0 1000 "" ""]
+Via[162441 157500 2000 1600 0 1000 "" ""]
+Via[162441 151500 2000 1600 0 1000 "" ""]
+Via[161941 145000 2000 1600 0 1000 "" ""]
+Via[162441 137500 2000 1600 0 1000 "" ""]
+Via[162941 131500 2000 1600 0 1000 "" ""]
+Via[162941 125500 2000 1600 0 1000 "" ""]
+Via[165941 169000 2000 1600 0 1000 "" ""]
+Via[165941 173500 2000 1600 0 1000 "" ""]
+Via[165941 179500 2000 1600 0 1000 "" ""]
+Via[169441 186000 2000 1600 0 1000 "" ""]
+Via[169441 191500 2000 1600 0 1000 "" ""]
+Via[169441 198500 2000 1600 0 1000 "" ""]
+Via[141307 99117 2000 1600 0 1000 "" ""]
+Via[158441 76171 2000 1600 0 1000 "" ""]
+Via[158441 71171 2000 1600 0 1000 "" ""]
+Via[158441 73500 2000 1600 0 1000 "" ""]
+Via[197441 85500 2000 1600 0 1000 "" ""]
+Via[195441 88500 2000 1600 0 1000 "" ""]
+Via[197441 91500 2000 1600 0 1000 "" ""]
+Via[124831 97615 2000 1600 0 1000 "" ""]
+Via[135441 61500 2000 1600 0 1000 "" ""]
+Via[135441 65000 2000 1600 0 1000 "" ""]
+Via[139941 62000 2000 1600 0 1000 "" ""]
+Via[153941 62000 2000 1600 0 1000 "" ""]
+Via[111941 66000 2000 1600 0 1000 "" ""]
+Via[117941 66000 2000 1600 0 1000 "" ""]
+Via[126441 66000 2000 1600 0 1000 "" ""]
+Via[126441 59500 2000 1600 0 1000 "" ""]
+Via[111941 59000 2000 1600 0 1000 "" ""]
+Via[111941 42500 2000 1600 0 1000 "" ""]
+Via[142441 42500 2000 1600 0 1000 "" ""]
+Via[142441 50500 2000 1600 0 1000 "" ""]
+Via[154941 54500 2000 1600 0 1000 "" ""]
+Via[149441 50500 2000 1600 0 1000 "" ""]
+Via[121941 42500 2000 1600 0 1000 "" ""]
+Via[130941 42500 2000 1600 0 1000 "" ""]
+Via[309441 258432 2000 1600 0 1000 "" ""]
+Via[309441 263550 2000 1600 0 1000 "" ""]
+Via[310941 284060 2000 1600 0 1000 "" ""]
+Via[305696 292500 2000 1600 0 1000 "" ""]
+Via[263441 80000 2000 1600 0 1000 "" ""]
+Via[304584 192517 2000 1600 0 1000 "" ""]
+Via[304706 189417 2000 1600 0 1000 "" ""]
+Via[305280 195617 2000 1600 0 1000 "" ""]
+Via[246941 162000 2000 1600 0 1000 "" ""]
+Via[242441 170500 2000 1600 0 1000 "" ""]
+Via[246441 170500 2000 1600 0 1000 "" ""]
+Via[250941 170500 2000 1600 0 1000 "" ""]
+Via[221884 146000 2000 1600 0 1000 "" ""]
+Via[224441 148000 2000 1600 0 1000 "" ""]
+Via[356441 167000 2000 1600 0 1000 "" ""]
+Via[338441 175808 2000 1600 0 1000 "" ""]
+Via[338441 169876 2000 1600 0 1000 "" ""]
+Via[225441 151000 2000 1600 0 1000 "" ""]
+Via[219441 127500 2000 1600 0 1000 "" ""]
+Via[220729 134420 2000 1600 0 1000 "" ""]
+Via[217441 121000 2000 1600 0 1000 "" ""]
+Via[260568 83003 2000 1600 0 1000 "" ""]
+Via[240391 121436 2000 1600 0 1000 "" ""]
+Via[230441 107000 2000 1600 0 1000 "" ""]
+Via[264034 117069 2500 1600 0 1000 "" ""]
+Via[279441 115000 2000 1600 0 1000 "" ""]
+Via[246731 96969 2000 1600 0 1000 "" ""]
+Via[270441 64000 2000 1600 0 1000 "" ""]
+Via[270441 57500 2000 1600 0 1000 "" ""]
+Via[270441 50500 2000 1600 0 1000 "" ""]
+Via[392188 161000 2000 1600 0 1000 "" ""]
+Via[388207 152720 2000 1600 0 1000 "" ""]
+Via[191363 55551 2000 1600 0 1000 "" ""]
+Via[178887 57182 2000 1600 0 1000 "" ""]
+Via[168732 49167 2000 1600 0 1000 "" ""]
+Via[296727 143773 2500 1600 0 1000 "" ""]
+Via[339837 58173 2000 1600 0 1000 "" ""]
+Via[353390 60479 2000 1600 0 1000 "" ""]
+Via[337441 237000 2000 1600 0 1000 "" ""]
+Via[377347 237822 2000 1600 0 1000 "" ""]
+Via[230441 153000 2000 1600 0 1000 "" ""]
+Via[358941 191500 2000 1600 0 1000 "" ""]
+Via[220441 140500 2000 1600 0 1000 "" ""]
+Via[218441 138500 2000 1600 0 1000 "" ""]
+Via[198441 137500 2000 1600 0 1000 "" ""]
+Via[198441 130500 2000 1600 0 1000 "" ""]
+Via[205441 123000 2000 1600 0 1000 "" ""]
+Via[185441 172000 2000 1600 0 1000 "" ""]
+Via[177441 172000 2000 1600 0 1000 "" ""]
+Via[177441 182500 2000 1600 0 1000 "" ""]
+Via[185441 182500 2000 1600 0 1000 "" ""]
+Via[193941 187500 2000 1600 0 1000 "" ""]
+Via[202441 187500 2000 1600 0 1000 "" ""]
+Via[210441 187500 2000 1600 0 1000 "" ""]
+Via[220441 185000 2000 1600 0 1000 "" ""]
+Via[224941 179500 2000 1600 0 1000 "" ""]
+Via[225441 173500 2000 1600 0 1000 "" ""]
+Via[224941 164500 2000 1600 0 1000 "" ""]
+Via[224441 156000 2000 1600 0 1000 "" ""]
+Via[212941 162000 2000 1600 0 1000 "" ""]
+Via[203941 162500 2000 1600 0 1000 "" ""]
+Via[193941 163000 2000 1600 0 1000 "" ""]
+Via[236441 164500 2000 1600 0 1000 "" ""]
+Via[181941 141500 2000 1600 0 1000 "" ""]
+Via[104441 195500 2000 1600 0 1000 "" ""]
+Via[100941 195500 2000 1600 0 1000 "" ""]
+Via[260941 208500 2000 1600 0 1000 "" ""]
+Via[269441 201500 2000 1600 0 1000 "" ""]
+Via[269941 168500 2000 1600 0 1000 "" ""]
+Via[251941 189500 2000 1600 0 1000 "" ""]
+Via[243941 198000 2000 1600 0 1000 "" ""]
+Via[245863 208476 2000 1600 0 1000 "" ""]
+Via[261502 92633 2000 1600 0 1000 "" ""]
+Via[268941 86000 2500 1600 0 1000 "" ""]
+Via[249101 71207 2000 1600 0 1000 "" ""]
+Via[229818 45012 2000 1600 0 1000 "" ""]
+Via[270441 43000 2000 1600 0 1000 "" ""]
+Via[138925 193887 2000 1600 0 1000 "" ""]
+Via[138872 197970 2000 1600 0 1000 "" ""]
+Via[138925 202159 2000 1600 0 1000 "" ""]
+Via[138925 207302 2000 1600 0 1000 "" ""]
+Via[161941 201000 2000 1600 0 1000 "" ""]
+Via[161941 207000 2000 1600 0 1000 "" ""]
+Via[166941 207000 2000 1600 0 1000 "" ""]
+Via[166941 202500 2000 1600 0 1000 "" ""]
+Via[354941 306501 2000 1600 0 1000 "" ""]
+Via[354941 302001 2000 1600 0 1000 "" ""]
+Via[354941 296001 2000 1600 0 1000 "" ""]
+Via[354941 290001 2000 1600 0 1000 "" ""]
+Via[354941 284001 2000 1600 0 1000 "" ""]
+Via[354941 278001 2000 1600 0 1000 "" ""]
+Via[354941 272001 2000 1600 0 1000 "" ""]
+Via[387941 272001 2000 1600 0 1000 "" ""]
+Via[387941 278001 2000 1600 0 1000 "" ""]
+Via[387941 284001 2000 1600 0 1000 "" ""]
+Via[387941 290001 2000 1600 0 1000 "" ""]
+Via[387941 302001 2000 1600 0 1000 "" ""]
+Via[387941 306501 2000 1600 0 1000 "" ""]
+Via[387941 296001 2000 1600 0 1000 "" ""]
+Via[391441 315501 2000 1600 0 1000 "" ""]
+Via[391441 320001 2000 1600 0 1000 "" ""]
+Via[391941 325501 2000 1600 0 1000 "" ""]
+Via[395441 333001 2000 1600 0 1000 "" ""]
+Via[394441 340001 2000 1600 0 1000 "" ""]
+Via[392941 346501 2000 1600 0 1000 "" ""]
+Via[368941 351500 2000 1600 0 1000 "" ""]
+Via[368941 356500 2000 1600 0 1000 "" ""]
+Via[374941 356500 2000 1600 0 1000 "" ""]
+Via[374941 353000 2000 1600 0 1000 "" ""]
+Via[106441 251500 2000 1600 0 1000 "" ""]
+Via[101941 295500 2000 1600 0 1000 "" ""]
+Via[149941 251000 2000 1600 0 1000 "" ""]
+Via[166441 296000 2000 1600 0 1000 "" ""]
+Via[183941 296000 2000 1600 0 1000 "" ""]
+Via[253441 297500 2000 1600 0 1000 "" ""]
+Via[231441 252000 2000 1600 0 1000 "" ""]
+
+Element["lock" "22-23-2031" "X6/X1/CONN12" "unknown" 463500 16000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [-15000 -12200 15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 -5700 -5000 12800 1000]
+	ElementLine [5000 -5700 5000 12800 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X6/X3/CONN12" "unknown" 463500 76000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X6/X4/CONN12" "unknown" 463500 106000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X7/X1/CONN12" "unknown" 463500 136000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X7/X2/CONN12" "unknown" 463500 166000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [-15000 -12200 15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 -5700 -5000 12800 1000]
+	ElementLine [5000 -5700 5000 12800 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X7/X3/CONN12" "unknown" 463500 196000 21000 -12200 3 100 "selected"]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X7/X4/CONN12" "unknown" 463500 226000 21000 -12200 3 100 "selected"]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X5/X1/CONN12" "unknown" 463500 256000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X5/X2/CONN12" "unknown" 463500 286000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X5/X3/CONN12" "unknown" 463500 316000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X5/X4/CONN12" "unknown" 463500 346000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2041" "X1/X2/CONN4" "unknown" 422000 16000 16000 -12200 3 100 ""]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "lock,edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [20000 -12200 -20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 12800 -10000 -5700 1000]
+	ElementLine [0 12800 0 -5700 1000]
+	ElementLine [10000 12800 10000 -5700 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2041" "X4/X4/CONN4" "unknown" 422000 226000 16000 -12200 3 100 "selected"]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "lock,edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [20000 -12200 -20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 12800 -10000 -5700 1000]
+	ElementLine [0 12800 0 -5700 1000]
+	ElementLine [10000 12800 10000 -5700 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2041" "X4/X2/CONN4" "unknown" 422000 196000 16000 -12200 3 100 ""]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "lock,edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [20000 -12200 -20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 12800 -10000 -5700 1000]
+	ElementLine [0 12800 0 -5700 1000]
+	ElementLine [10000 12800 10000 -5700 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2041" "X3/X4/CONN4" "unknown" 422000 166000 16000 -12200 3 100 ""]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "lock,edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [20000 -12200 -20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 12800 -10000 -5700 1000]
+	ElementLine [0 12800 0 -5700 1000]
+	ElementLine [10000 12800 10000 -5700 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2041" "X3/X2/CONN4" "unknown" 422000 136000 16000 -12200 3 100 ""]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "lock,edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [-20000 -12200 20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 -5700 -10000 12800 1000]
+	ElementLine [0 -5700 0 12800 1000]
+	ElementLine [10000 -5700 10000 12800 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2041" "X2/X4/CONN4" "unknown" 422000 106000 16000 -12200 3 100 ""]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "lock,edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [20000 -12200 -20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 12800 -10000 -5700 1000]
+	ElementLine [0 12800 0 -5700 1000]
+	ElementLine [10000 12800 10000 -5700 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2041" "X2/X2/CONN4" "unknown" 422000 76000 16000 -12200 3 100 ""]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "lock,edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [-20000 -12200 20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 -5700 -10000 12800 1000]
+	ElementLine [0 -5700 0 12800 1000]
+	ElementLine [10000 -5700 10000 12800 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2031" "X6/X2/CONN12" "unknown" 463500 46000 21000 -12200 3 100 ""]
+(
+	Pin[-10000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[10000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	ElementLine [-15000 -12200 -15000 12800 1000]
+	ElementLine [15000 -12200 15000 12800 1000]
+	ElementLine [15000 -12200 -15000 -12200 1000]
+	ElementLine [-15000 -5700 15000 -5700 1000]
+	ElementLine [-5000 12800 -5000 -5700 1000]
+	ElementLine [5000 12800 5000 -5700 1000]
+	ElementLine [-15000 12800 15000 12800 1000]
+	ElementLine [-15000 12800 -5000 12800 1000]
+
+	)
+
+Element["lock" "22-23-2041" "X1/X4/CONN4" "unknown" 422000 46000 16000 -12200 3 100 ""]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "lock,edge2,thermal(1X)"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "lock,edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "lock,edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [20000 -12200 -20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 12800 -10000 -5700 1000]
+	ElementLine [0 12800 0 -5700 1000]
+	ElementLine [10000 12800 10000 -5700 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["" "0603" "X4/C1" "0.1_uF" 395441 209000 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["onsolder" "TSSOP16" "X4/U4" "unknown" 385441 218000 6000 2000 3 100 "auto"]
+(
+	Pad[8956 9311 8956 13917 1299 1000 2299 "1B" "1" "onsolder,square,edge2"]
+	Pad[6397 9311 6397 13917 1299 1000 2299 "1A" "2" "onsolder,square,edge2"]
+	Pad[3838 9311 3838 13917 1299 1000 2299 "1Y" "3" "onsolder,square,edge2"]
+	Pad[1279 9311 1279 13917 1299 1000 2299 "ENABLE" "4" "onsolder,square,edge2"]
+	Pad[-1279 9311 -1279 13917 1299 1000 2299 "2Y" "5" "onsolder,square,edge2"]
+	Pad[-3838 9311 -3838 13917 1299 1000 2299 "2A" "6" "onsolder,square,edge2"]
+	Pad[-6397 9311 -6397 13917 1299 1000 2299 "2B" "7" "onsolder,square,edge2"]
+	Pad[-8956 9311 -8956 13917 1299 1000 2299 "GND" "8" "onsolder,square,edge2"]
+	Pad[-8956 -13917 -8956 -9311 1299 1000 2299 "3B" "9" "onsolder,square"]
+	Pad[-6397 -13917 -6397 -9311 1299 1000 2299 "3A" "10" "onsolder,square"]
+	Pad[-3838 -13917 -3838 -9311 1299 1000 2299 "3Y" "11" "onsolder,square"]
+	Pad[-1279 -13917 -1279 -9311 1299 1000 2299 "_ENABLE_" "12" "onsolder,square"]
+	Pad[1279 -13917 1279 -9311 1299 1000 2299 "4Y" "13" "onsolder,square"]
+	Pad[3838 -13917 3838 -9311 1299 1000 2299 "4A" "14" "onsolder,square"]
+	Pad[6397 -13917 6397 -9311 1299 1000 2299 "4B" "15" "onsolder,square"]
+	Pad[8956 -13917 8956 -9311 1299 1000 2299 "VCC" "16" "onsolder,square"]
+	ElementLine [-10606 15566 10606 15566 1000]
+	ElementLine [-10606 -15566 -10606 15566 1000]
+	ElementLine [-10606 -15566 10606 -15566 1000]
+	ElementLine [10606 2500 10606 15566 1000]
+	ElementLine [10606 -15566 10606 -2500 1000]
+	ElementArc [10606 0 2500 2500 270 180 1000]
+
+	)
+
+Element["onsolder" "0603" "X6/C1" "0.1_uF" 398441 78000 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["" "0603" "X5/C1" "0.1_uF" 429441 330000 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["onsolder" "TSSOP16" "X5/U4" "unknown" 433603 307614 -6000 -2000 1 100 "auto"]
+(
+	Pad[-8956 -13917 -8956 -9311 1299 1000 2299 "1B" "1" "onsolder,square"]
+	Pad[-6397 -13917 -6397 -9311 1299 1000 2299 "1A" "2" "onsolder,square"]
+	Pad[-3838 -13917 -3838 -9311 1299 1000 2299 "1Y" "3" "onsolder,square"]
+	Pad[-1279 -13917 -1279 -9311 1299 1000 2299 "ENABLE" "4" "onsolder,square"]
+	Pad[1279 -13917 1279 -9311 1299 1000 2299 "2Y" "5" "onsolder,square"]
+	Pad[3838 -13917 3838 -9311 1299 1000 2299 "2A" "6" "onsolder,square"]
+	Pad[6397 -13917 6397 -9311 1299 1000 2299 "2B" "7" "onsolder,square"]
+	Pad[8956 -13917 8956 -9311 1299 1000 2299 "GND" "8" "onsolder,square"]
+	Pad[8956 9311 8956 13917 1299 1000 2299 "3B" "9" "onsolder,square,edge2"]
+	Pad[6397 9311 6397 13917 1299 1000 2299 "3A" "10" "onsolder,square,edge2"]
+	Pad[3838 9311 3838 13917 1799 1000 2799 "3Y" "11" "onsolder,square,edge2"]
+	Pad[1279 9311 1279 13917 1299 1000 2299 "_ENABLE_" "12" "onsolder,square,edge2"]
+	Pad[-1279 9311 -1279 13917 1299 1000 2299 "4Y" "13" "onsolder,square,edge2"]
+	Pad[-3838 9311 -3838 13917 1299 1000 2299 "4A" "14" "onsolder,square,edge2"]
+	Pad[-6397 9311 -6397 13917 1299 1000 2299 "4B" "15" "onsolder,square,edge2"]
+	Pad[-8956 9311 -8956 13917 1299 1000 2299 "VCC" "16" "onsolder,square,edge2"]
+	ElementLine [-10606 -15566 10606 -15566 1000]
+	ElementLine [10606 -15566 10606 15566 1000]
+	ElementLine [-10606 15566 10606 15566 1000]
+	ElementLine [-10606 -15566 -10606 -2500 1000]
+	ElementLine [-10606 2500 -10606 15566 1000]
+	ElementArc [-10606 0 2500 2500 90 180 1000]
+
+	)
+
+Element["" "0603" "X3/C1" "0.1_uF" 393135 150385 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X1/C1" "0.1_uF" 393441 31500 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X2/C1" "0.1_uF" 393441 91441 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X2/R9" "10_kohms" 424441 8000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X1/C2" "0.1_uF" 458441 247000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X4/C2" "0.1_uF" 458500 337000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X2/C2" "0.1_uF" 458441 277000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X3/C2" "0.1_uF" 458441 187000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X2/C2" "0.1_uF" 458441 157000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X1/C2" "0.1_uF" 458441 7000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X2/C2" "0.1_uF" 458500 37000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X3/C2" "0.1_uF" 458441 67000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X1/R6" "500_ohms" 470941 23500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X3/R6" "500_ohms" 470941 83500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X4/R6" "500_ohms" 470941 113500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X1/R6" "500_ohms" 470941 144000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X2/R6" "500_ohms" 470941 173500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X3/R6" "500_ohms" 470941 203500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X4/R6" "500_ohms" 470941 234000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X4/R9" "10_kohms" 424441 38000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X4/R10" "10_kohms" 434441 38000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X4/R6" "500_ohms" 424382 53500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X4/C2" "0.1_uF" 411941 37000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X4/R8" "500_ohms" 436941 55941 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X2/R6" "500_ohms" 424382 83500 -10291 74850 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X2/R8" "500_ohms" 436941 86059 9079 45850 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X2/C2" "0.1_uF" 411941 67000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X2/R9" "10_kohms" 424441 68000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X2/R10" "10_kohms" 434441 68000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X4/R9" "10_kohms" 424441 98000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X4/R10" "10_kohms" 434441 98000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X4/R6" "500_ohms" 424382 113500 -64291 40850 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X4/R8" "500_ohms" 437000 116000 21850 98850 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X2/X4/C2" "0.1_uF" 411941 97000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X2/R9" "10_kohms" 424441 128000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X2/R10" "10_kohms" 434441 128000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X2/R6" "500_ohms" 424382 143500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X2/R8" "500_ohms" 437000 146000 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X2/C2" "0.1_uF" 412000 127000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X4/R9" "10_kohms" 424441 158000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X4/R10" "10_kohms" 434441 158000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X4/R6" "500_ohms" 424500 173500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X4/R8" "500_ohms" 437000 176000 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X3/X4/C2" "0.1_uF" 412000 157000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X2/R9" "10_kohms" 424441 188000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X2/R10" "10_kohms" 434441 188000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X2/R6" "500_ohms" 424382 204000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X2/C2" "0.1_uF" 411941 187000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X4/R10" "10_kohms" 434441 218000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X4/R9" "10_kohms" 424441 218000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X4/R6" "500_ohms" 424382 233500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X4/R8" "500_ohms" 436941 236059 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X4/C2" "0.1_uF" 411941 217000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X2/R10" "10_kohms" 434500 7882 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X2/R6" "500_ohms" 424559 23441 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X2/C2" "0.1_uF" 412000 6882 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X2/R7" "10_kohms" 471000 277000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X1/R7" "10_kohms" 471000 247000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X3/R7" "10_kohms" 471000 307000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X4/R7" "10_kohms" 471000 337000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X2/R7" "10_kohms" 471000 157000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X1/R7" "10_kohms" 471118 127000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X3/R7" "10_kohms" 471000 187000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X4/R7" "10_kohms" 470941 217000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X2/R7" "10_kohms" 471000 37000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X3/R7" "10_kohms" 471000 67000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X4/R7" "10_kohms" 470441 97000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X1/R7" "10_kohms" 471000 7000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X4/X2/R8" "500_ohms" 437000 206000 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X1/X2/R8" "500_ohms" 436941 25941 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/C1" "0.1_uF" 398441 197000 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["" "TSSOP16" "X7/U4" "unknown" 385441 187000 6000 -2000 3 100 ""]
+(
+	Pad[8956 -13917 8956 -9311 1299 1000 2299 "1B" "1" "square"]
+	Pad[6397 -13917 6397 -9311 1299 1000 2299 "1A" "2" "square"]
+	Pad[3838 -13917 3838 -9311 1299 1000 2299 "1Y" "3" "square"]
+	Pad[1279 -13917 1279 -9311 1299 1000 2299 "ENABLE" "4" "square"]
+	Pad[-1279 -13917 -1279 -9311 1299 1000 2299 "2Y" "5" "square"]
+	Pad[-3838 -13917 -3838 -9311 1299 1000 2299 "2A" "6" "square"]
+	Pad[-6397 -13917 -6397 -9311 1299 1000 2299 "2B" "7" "square"]
+	Pad[-8956 -13917 -8956 -9311 1299 1000 2299 "GND" "8" "square"]
+	Pad[-8956 9311 -8956 13917 1299 1000 2299 "3B" "9" "square,edge2"]
+	Pad[-6397 9311 -6397 13917 1299 1000 2299 "3A" "10" "square,edge2"]
+	Pad[-3838 9311 -3838 13917 1299 1000 2299 "3Y" "11" "square,edge2"]
+	Pad[-1279 9311 -1279 13917 1299 1000 2299 "_ENABLE_" "12" "square,edge2"]
+	Pad[1279 9311 1279 13917 1299 1000 2299 "4Y" "13" "square,edge2"]
+	Pad[3838 9311 3838 13917 1299 1000 2299 "4A" "14" "square,edge2"]
+	Pad[6397 9311 6397 13917 1299 1000 2299 "4B" "15" "square,edge2"]
+	Pad[8956 9311 8956 13917 1299 1000 2299 "VCC" "16" "square,edge2"]
+	ElementLine [-10606 -15566 10606 -15566 1000]
+	ElementLine [-10606 -15566 -10606 15566 1000]
+	ElementLine [-10606 15566 10606 15566 1000]
+	ElementLine [10606 -15566 10606 -2500 1000]
+	ElementLine [10606 2500 10606 15566 1000]
+	ElementArc [10606 0 2500 2500 270 180 1000]
+
+	)
+
+Element["onsolder" "0603" "X5/X3/C2" "0.1_uF" 458500 307000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X4/R6" "500_ohms" 471000 353500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X3/R6" "500_ohms" 470941 323500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X2/R6" "500_ohms" 470941 293500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X5/X1/R6" "500_ohms" 470941 264000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X1/C2" "0.1_uF" 458441 127000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X7/X4/C2" "0.1_uF" 458441 217000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X2/R6" "500_ohms" 471059 53500 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "X6/X4/C2" "0.1_uF" 458441 97000 3150 -3150 2 100 "auto"]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["" "0603" "C28" "0.1_uF" 297240 150171 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C29" "0.1_uF" 246240 139171 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C30" "0.1_uF" 246827 104709 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C31" "0.1_uF" 266941 90000 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0805" "C13" "2.2_uF" 242697 132171 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "0805" "C14" "2.2_uF" 290441 151543 -3150 3150 1 100 ""]
+(
+	Pad[-393 3543 393 3543 5118 2000 5718 "1" "1" "square"]
+	Pad[-393 -3543 393 -3543 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-2755 -393 -2755 393 800]
+	ElementLine [2755 -393 2755 393 800]
+
+	)
+
+Element["" "0603" "C15" "0.1_uF" 171291 44038 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["onsolder" "0603" "C32" "0.1_uF" 208240 131171 -3150 3150 0 100 "auto"]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0805" "C10" "10_uF" 147441 59000 -3150 -3150 1 100 "auto"]
+(
+	Pad[-393 -3543 393 -3543 5118 2000 5718 "1" "1" "onsolder,square"]
+	Pad[-393 3543 393 3543 5118 2000 5718 "2" "2" "onsolder,square"]
+	ElementLine [-2755 -393 -2755 393 800]
+	ElementLine [2755 -393 2755 393 800]
+
+	)
+
+Element["" "SOT23" "D4" "unknown" 148599 107771 11000 12300 2 100 ""]
+(
+	Pad[-300 0 300 0 3400 3000 4000 "1" "1" "square"]
+	Pad[-300 7800 300 7800 3400 3000 4000 "ANODE" "2" "square"]
+	Pad[7900 3900 8500 3900 3400 3000 4000 "3" "3" "square,edge2"]
+	ElementLine [-2900 -2500 11000 -2500 1000]
+	ElementLine [-2900 -2500 -2900 10300 1000]
+	ElementLine [-2900 10300 11000 10300 1000]
+	ElementLine [11000 -2500 11000 10300 1000]
+
+	)
+
+Element["" "SO16W" "U2" "unknown" 169799 83671 -2000 -6000 0 100 ""]
+(
+	Pad[-21000 -17500 -15000 -17500 2000 1000 3000 "DVDD" "1" "square"]
+	Pad[-21000 -12500 -15000 -12500 2000 1000 3000 "RSVD" "2" "square"]
+	Pad[-21000 -7500 -15000 -7500 2000 1000 3000 "RSVD" "3" "square"]
+	Pad[-21000 -2500 -15000 -2500 2000 1000 3000 "_CS_" "4" "square"]
+	Pad[-21000 2500 -15000 2500 2000 1000 3000 "MISO" "5" "square"]
+	Pad[-21000 7500 -15000 7500 2000 1000 3000 "PDD" "6" "square"]
+	Pad[-21000 12500 -15000 12500 2000 1000 3000 "PSS" "7" "square"]
+	Pad[-21000 17500 -15000 17500 2000 1000 3000 "VX" "8" "square"]
+	Pad[15000 17500 21000 17500 2000 1000 3000 "CP5" "9" "square,edge2"]
+	Pad[15000 12500 21000 12500 2000 1000 3000 "RSVD" "10" "square,edge2"]
+	Pad[15000 7500 21000 7500 2000 1000 3000 "AVSS" "11" "square,edge2"]
+	Pad[15000 2500 21000 2500 2000 1000 3000 "RSVD" "12" "square,edge2"]
+	Pad[15000 -2500 21000 -2500 2000 1000 3000 "DVSS" "13" "square,edge2"]
+	Pad[15000 -7500 21000 -7500 2000 1000 3000 "AVDD" "14" "square,edge2"]
+	Pad[15000 -12500 21000 -12500 2000 1000 3000 "MOSI" "15" "square,edge2"]
+	Pad[15000 -17500 21000 -17500 2000 1000 3000 "SCLK" "16" "square,edge2"]
+	ElementLine [-23000 -19500 -23000 19500 1000]
+	ElementLine [-23000 19500 23000 19500 1000]
+	ElementLine [23000 19500 23000 -19500 1000]
+	ElementLine [-23000 -19500 -2500 -19500 1000]
+	ElementLine [23000 -19500 2500 -19500 1000]
+	ElementArc [0 -19500 2500 2500 0 180 1000]
+
+	)
+
+Element["" "0603" "C2" "1_uF" 197799 78671 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C3" "1_uF" 141441 68500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C6" "1_uF" 197799 98671 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C9" "1_uF" 141799 93671 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["onsolder" "0805" "C7" "10_uF" 122342 91171 3150 -3150 2 100 "auto"]
+(
+	Pad[3543 -393 3543 393 5118 2000 5718 "1" "1" "onsolder,square"]
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "2" "2" "onsolder,square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["hidename" "1812" "L2" "470_uH" 126799 100329 -3938 14763 1 100 ""]
+(
+	Pad[-1968 -9843 1969 -9843 9480 3937 9874 "2" "2" "square"]
+	Pad[-1968 9842 1969 9842 9480 3937 9874 "1" "1" "square"]
+	ElementLine [-5905 15748 -7874 13779 800]
+	ElementLine [-5905 15748 7874 15748 800]
+	ElementLine [7874 -15748 7874 15748 800]
+	ElementLine [-7874 -15748 7874 -15748 800]
+	ElementLine [-7874 -15748 -7874 13779 800]
+
+	)
+
+Element["" "ABMM2" "U9" "unknown" 290941 72000 0 0 0 100 ""]
+(
+	Pad[5512 -12007 5512 -9349 7480 -3936 8080 "2" "2" "square"]
+	Pad[5512 9350 5512 12008 7480 -3936 8080 "1" "1" "square,edge2"]
+	Pad[-5511 9350 -5511 12008 7480 -3936 8080 "4" "4" "square,edge2"]
+	Pad[-5511 -12007 -5511 -9349 7480 -3936 8080 "3" "3" "square"]
+	ElementArc [709 13720 500 500 0 360 1000]
+
+	)
+
+Element["" "0603" "C4" "18_pF" 303857 77787 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C5" "18_pF" 277941 60000 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["onsolder" "0603" "C26" "0.1_uF" 290476 97043 -3150 3150 0 100 "auto"]
+(
+	Pad[-2559 -492 -2559 492 3452 2000 4052 "1" "1" "onsolder,square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["" "0603" "C27" "0.1_uF" 307954 102403 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["onsolder" "0805" "C11" "10_uF" 183541 161100 3150 3150 3 100 "auto"]
+(
+	Pad[-393 3543 393 3543 5118 2000 5718 "1" "1" "onsolder,square"]
+	Pad[-393 -3543 393 -3543 5118 2000 5718 "2" "2" "onsolder,square"]
+	ElementLine [2755 393 2755 -393 800]
+	ElementLine [-2755 393 -2755 -393 800]
+
+	)
+
+Element["onsolder" "0805" "C12" "10_uF" 208541 137100 -3150 3150 0 100 "auto"]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "onsolder,square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "onsolder,square"]
+	ElementLine [-393 2755 393 2755 800]
+	ElementLine [-393 -2755 393 -2755 800]
+
+	)
+
+Element["onsolder" "SOT223" "U4" "unknown" 194441 149100 25300 32900 3 100 "auto"]
+(
+	Pad[0 -3300 0 3300 5600 3000 6200 "VIN" "1" "onsolder,square"]
+	Pad[9000 -3300 9000 3300 5600 3000 6200 "GND" "2" "onsolder,square"]
+	Pad[18100 -3300 18100 3300 5600 3000 6200 "VOUT" "3" "onsolder,square"]
+	Pad[4500 24400 13500 24400 12200 3000 12800 "PAD" "4" "onsolder,square"]
+	ElementLine [-5200 32900 -5200 -8500 1000]
+	ElementLine [-5200 -8500 23300 -8500 1000]
+	ElementLine [23300 -8500 23300 32900 1000]
+	ElementLine [23300 32900 -5200 32900 1000]
+
+	)
+
+Element["" "1210" "X14/C4" "10_uF" 107571 162535 3150 -3150 3 100 ""]
+(
+	Pad[-2755 -5905 2755 -5905 5118 2000 5718 "1" "1" "square"]
+	Pad[-2755 5905 2755 5905 5118 2000 5718 "2" "2" "square"]
+	ElementLine [5314 -1968 5314 1968 800]
+	ElementLine [-5314 -1968 -5314 1968 800]
+
+	)
+
+Element["" "1210" "X14/C3" "10_uF" 119571 162535 3150 -3150 3 100 ""]
+(
+	Pad[-2755 -5905 2755 -5905 5118 2000 5718 "1" "1" "square"]
+	Pad[-2755 5905 2755 5905 5118 2000 5718 "2" "2" "square"]
+	ElementLine [5314 1968 5314 -1968 800]
+	ElementLine [-5314 1968 -5314 -1968 800]
+
+	)
+
+Element["" "TOPMOD" "X14/U3" "unknown" 145941 142000 0 0 0 100 ""]
+(
+	Pad[-15000 26772 -15000 33071 3504 2000 4104 "VIN" "1" "square,edge2"]
+	Pad[-10000 26772 -10000 33071 3504 2000 4104 "RON" "2" "square,edge2"]
+	Pad[-5000 26772 -5000 33071 3504 2000 4104 "EN" "3" "square,edge2"]
+	Pad[0 26772 0 33071 3504 2000 4104 "GND" "4" "square,edge2"]
+	Pad[5000 26772 5000 33071 3504 2000 4104 "SS" "5" "square,edge2"]
+	Pad[10000 26772 10000 33071 3504 2000 4104 "FB" "6" "square,edge2"]
+	Pad[15000 26772 15000 33071 3504 2000 4104 "VOUT" "7" "square,edge2"]
+	Pad[0 -6693 0 6693 21063 2000 21663 "PAD" "8" "square"]
+	ElementLine [-18110 35827 -18110 20079 1000]
+	ElementLine [18110 35827 -18110 35827 1000]
+	ElementLine [18110 20079 18110 35827 1000]
+	ElementLine [-19685 20079 -19685 -20079 1000]
+	ElementLine [19685 20079 19685 -20079 1000]
+	ElementLine [19685 20079 -19685 20079 1000]
+	ElementLine [19685 -20079 -19685 -20079 1000]
+
+	)
+
+Element["" "0603" "X14/R4" "9.31_kohm" 143441 181500 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X14/R3" "154.0_kohm" 133012 182630 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X14/R2" "34.0_kohm" 133012 188630 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0805" "X14/R5" "1.27_kohm" 147441 194500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["onsolder" "0603" "C25" "0.1_uF" 77441 347500 3150 3150 3 100 "auto"]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "C18" "0.1_uF" 287441 347500 3150 3150 3 100 "auto"]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "C19" "0.1_uF" 257441 347500 3150 3150 3 100 "auto"]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "C20" "0.1_uF" 227441 347500 3150 3150 3 100 "auto"]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "C21" "0.1_uF" 197441 347500 3150 3150 3 100 "auto"]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "C22" "0.1_uF" 167441 347500 3150 3150 3 100 "auto"]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "C23" "0.1_uF" 137441 347500 3150 3150 3 100 "auto"]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "C24" "0.1_uF" 107441 347500 3150 3150 3 100 "auto"]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["" "22-23-2031" "CONN5" "unknown" 205441 342500 -12200 -21000 0 100 ""]
+(
+	Pin[0 10000 6500 3000 7100 4000 "1" "1" "square,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "thermal(1X)"]
+	Pin[0 -10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12200 15000 12800 15000 1000]
+	ElementLine [-12200 -15000 12800 -15000 1000]
+	ElementLine [-12200 -15000 -12200 15000 1000]
+	ElementLine [-5700 -15000 -5700 15000 1000]
+	ElementLine [-5700 5000 12800 5000 1000]
+	ElementLine [-5700 -5000 12800 -5000 1000]
+	ElementLine [12800 -15000 12800 15000 1000]
+	ElementLine [12800 5000 12800 15000 1000]
+
+	)
+
+Element["" "22-23-2031" "CONN4" "unknown" 235441 342500 -12200 -21000 0 100 ""]
+(
+	Pin[0 10000 6500 3000 7100 4000 "1" "1" "square,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "thermal(1X)"]
+	Pin[0 -10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12200 15000 12800 15000 1000]
+	ElementLine [-12200 -15000 12800 -15000 1000]
+	ElementLine [-12200 -15000 -12200 15000 1000]
+	ElementLine [-5700 -15000 -5700 15000 1000]
+	ElementLine [-5700 5000 12800 5000 1000]
+	ElementLine [-5700 -5000 12800 -5000 1000]
+	ElementLine [12800 -15000 12800 15000 1000]
+	ElementLine [12800 5000 12800 15000 1000]
+
+	)
+
+Element["" "22-23-2031" "CONN3" "unknown" 265441 342500 -12200 -21000 0 100 ""]
+(
+	Pin[0 10000 6500 3000 7100 4000 "1" "1" "square,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "thermal(1X)"]
+	Pin[0 -10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12200 15000 12800 15000 1000]
+	ElementLine [-12200 -15000 12800 -15000 1000]
+	ElementLine [-12200 -15000 -12200 15000 1000]
+	ElementLine [-5700 -15000 -5700 15000 1000]
+	ElementLine [-5700 5000 12800 5000 1000]
+	ElementLine [-5700 -5000 12800 -5000 1000]
+	ElementLine [12800 -15000 12800 15000 1000]
+	ElementLine [12800 5000 12800 15000 1000]
+
+	)
+
+Element["" "22-23-2031" "CONN2" "unknown" 295441 342500 -12200 -21000 0 100 ""]
+(
+	Pin[0 10000 6500 3000 7100 4000 "1" "1" "square,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "thermal(1X)"]
+	Pin[0 -10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12200 15000 12800 15000 1000]
+	ElementLine [-12200 -15000 12800 -15000 1000]
+	ElementLine [-12200 -15000 -12200 15000 1000]
+	ElementLine [-5700 -15000 -5700 15000 1000]
+	ElementLine [-5700 5000 12800 5000 1000]
+	ElementLine [-5700 -5000 12800 -5000 1000]
+	ElementLine [12800 -15000 12800 15000 1000]
+	ElementLine [12800 5000 12800 15000 1000]
+
+	)
+
+Element["" "22-23-2031" "CONN6" "unknown" 175441 342500 -12200 -21000 0 100 ""]
+(
+	Pin[0 10000 6500 3000 7100 4000 "1" "1" "square,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "thermal(1X)"]
+	Pin[0 -10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12200 15000 12800 15000 1000]
+	ElementLine [-12200 -15000 12800 -15000 1000]
+	ElementLine [-12200 -15000 -12200 15000 1000]
+	ElementLine [-5700 -15000 -5700 15000 1000]
+	ElementLine [-5700 5000 12800 5000 1000]
+	ElementLine [-5700 -5000 12800 -5000 1000]
+	ElementLine [12800 -15000 12800 15000 1000]
+	ElementLine [12800 5000 12800 15000 1000]
+
+	)
+
+Element["" "22-23-2031" "CONN7" "unknown" 145441 342500 -12200 -21000 0 100 ""]
+(
+	Pin[0 10000 6500 3000 7100 4000 "1" "1" "square,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "thermal(1X)"]
+	Pin[0 -10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12200 15000 12800 15000 1000]
+	ElementLine [-12200 -15000 12800 -15000 1000]
+	ElementLine [-12200 -15000 -12200 15000 1000]
+	ElementLine [-5700 -15000 -5700 15000 1000]
+	ElementLine [-5700 5000 12800 5000 1000]
+	ElementLine [-5700 -5000 12800 -5000 1000]
+	ElementLine [12800 -15000 12800 15000 1000]
+	ElementLine [12800 5000 12800 15000 1000]
+
+	)
+
+Element["" "22-23-2031" "CONN8" "unknown" 115441 342500 -12200 -21000 0 100 ""]
+(
+	Pin[0 10000 6500 3000 7100 4000 "1" "1" "square,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "thermal(1X)"]
+	Pin[0 -10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12200 15000 12800 15000 1000]
+	ElementLine [-12200 -15000 12800 -15000 1000]
+	ElementLine [-12200 -15000 -12200 15000 1000]
+	ElementLine [-5700 -15000 -5700 15000 1000]
+	ElementLine [-5700 5000 12800 5000 1000]
+	ElementLine [-5700 -5000 12800 -5000 1000]
+	ElementLine [12800 -15000 12800 15000 1000]
+	ElementLine [12800 5000 12800 15000 1000]
+
+	)
+
+Element["" "22-23-2031" "CONN9" "unknown" 85441 342500 -12200 -21000 0 100 ""]
+(
+	Pin[0 10000 6500 3000 7100 4000 "1" "1" "square,thermal(2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" "thermal(1X)"]
+	Pin[0 -10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12200 15000 12800 15000 1000]
+	ElementLine [-12200 -15000 12800 -15000 1000]
+	ElementLine [-12200 -15000 -12200 15000 1000]
+	ElementLine [-5700 -15000 -5700 15000 1000]
+	ElementLine [-5700 5000 12800 5000 1000]
+	ElementLine [-5700 -5000 12800 -5000 1000]
+	ElementLine [12800 -15000 12800 15000 1000]
+	ElementLine [12800 5000 12800 15000 1000]
+
+	)
+
+Element["" "22-23-2041" "CONN1" "unknown" 327441 151000 16000 -12200 3 100 ""]
+(
+	Pin[-15000 0 6500 3000 7100 4000 "1" "1" "square,edge2,thermal(0X,2X)"]
+	Pin[-5000 0 6500 3000 7100 4000 "2" "2" "edge2"]
+	Pin[5000 0 6500 3000 7100 4000 "3" "3" "edge2"]
+	Pin[15000 0 6500 3000 7100 4000 "4" "4" "edge2"]
+	ElementLine [-20000 -12200 -20000 12800 1000]
+	ElementLine [20000 -12200 20000 12800 1000]
+	ElementLine [20000 -12200 -20000 -12200 1000]
+	ElementLine [-20000 -5700 20000 -5700 1000]
+	ElementLine [-10000 12800 -10000 -5700 1000]
+	ElementLine [0 12800 0 -5700 1000]
+	ElementLine [10000 12800 10000 -5700 1000]
+	ElementLine [-20000 12800 20000 12800 1000]
+	ElementLine [-20000 12800 -10000 12800 1000]
+
+	)
+
+Element["" "TSSOP16" "X6/U4" "unknown" 385441 69000 6000 -2000 3 100 ""]
+(
+	Pad[8956 -13917 8956 -9311 1299 1000 2299 "1B" "1" "square"]
+	Pad[6397 -13917 6397 -9311 1299 1000 2299 "1A" "2" "square"]
+	Pad[3838 -13917 3838 -9311 1299 1000 2299 "1Y" "3" "square"]
+	Pad[1279 -13917 1279 -9311 1299 1000 2299 "ENABLE" "4" "square"]
+	Pad[-1279 -13917 -1279 -9311 1299 1000 2299 "2Y" "5" "square"]
+	Pad[-3838 -13917 -3838 -9311 1299 1000 2299 "2A" "6" "square"]
+	Pad[-6397 -13917 -6397 -9311 1299 1000 2299 "2B" "7" "square"]
+	Pad[-8956 -13917 -8956 -9311 1299 1000 2299 "GND" "8" "square"]
+	Pad[-8956 9311 -8956 13917 1299 1000 2299 "3B" "9" "square,edge2"]
+	Pad[-6397 9311 -6397 13917 1299 1000 2299 "3A" "10" "square,edge2"]
+	Pad[-3838 9311 -3838 13917 1299 1000 2299 "3Y" "11" "square,edge2"]
+	Pad[-1279 9311 -1279 13917 1299 1000 2299 "_ENABLE_" "12" "square,edge2"]
+	Pad[1279 9311 1279 13917 1299 1000 2299 "4Y" "13" "square,edge2"]
+	Pad[3838 9311 3838 13917 1299 1000 2299 "4A" "14" "square,edge2"]
+	Pad[6397 9311 6397 13917 1299 1000 2299 "4B" "15" "square,edge2"]
+	Pad[8956 9311 8956 13917 1299 1000 2299 "VCC" "16" "square,edge2"]
+	ElementLine [-10606 -15566 10606 -15566 1000]
+	ElementLine [-10606 -15566 -10606 15566 1000]
+	ElementLine [-10606 15566 10606 15566 1000]
+	ElementLine [10606 -15566 10606 -2500 1000]
+	ElementLine [10606 2500 10606 15566 1000]
+	ElementArc [10606 0 2500 2500 270 180 1000]
+
+	)
+
+Element["onsolder" "0603" "R12" "500_ohms" 440941 337000 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["onsolder" "0603" "R10" "500_ohms" 434941 337000 -3150 -3150 1 100 "auto"]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "onsolder,square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "onsolder,square"]
+
+	)
+
+Element["" "0603" "X8/C4" "0.1_uF" 241941 266500 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/C5" "0.1_uF" 216441 252000 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/C1" "0.1_uF" 190441 266500 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/C2" "0.1_uF" 190441 278500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R3" "5_kohms" 239441 287500 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/C3" "0.1_uF" 241941 278500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "SO14" "X8/U2" "unknown" 215941 272500 -2000 -6000 0 100 ""]
+(
+	Pad[-13500 -15000 -7000 -15000 2000 1000 3000 "OUT" "1" "square"]
+	Pad[-13500 -10000 -7000 -10000 2000 1000 3000 "IN-" "2" "square"]
+	Pad[-13500 -5000 -7000 -5000 2000 1000 3000 "IN+" "3" "square"]
+	Pad[-13500 0 -7000 0 2000 1000 3000 "V+" "4" "square"]
+	Pad[-13500 5000 -7000 5000 2000 1000 3000 "IN+" "5" "square"]
+	Pad[-13500 10000 -7000 10000 2000 1000 3000 "IN-" "6" "square"]
+	Pad[-13500 15000 -7000 15000 2000 1000 3000 "OUT" "7" "square"]
+	Pad[7000 15000 13500 15000 2000 1000 3000 "OUT" "8" "square,edge2"]
+	Pad[7000 10000 13500 10000 2000 1000 3000 "IN-" "9" "square,edge2"]
+	Pad[7000 5000 13500 5000 2000 1000 3000 "IN+" "10" "square,edge2"]
+	Pad[7000 0 13500 0 2000 1000 3000 "V-" "11" "square,edge2"]
+	Pad[7000 -5000 13500 -5000 2000 1000 3000 "IN+" "12" "square,edge2"]
+	Pad[7000 -10000 13500 -10000 2000 1000 3000 "IN-" "13" "square,edge2"]
+	Pad[7000 -15000 13500 -15000 2000 1000 3000 "OUT" "14" "square,edge2"]
+	ElementLine [-15500 -17000 -15500 17000 1000]
+	ElementLine [-15500 17000 15500 17000 1000]
+	ElementLine [15500 17000 15500 -17000 1000]
+	ElementLine [-15500 -17000 -2500 -17000 1000]
+	ElementLine [15500 -17000 2500 -17000 1000]
+	ElementArc [0 -17000 2500 2500 0 180 1000]
+
+	)
+
+Element["" "0603" "X8/R1" "5_kohms" 192941 258500 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R2" "5_kohms" 192916 287660 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R1" "5_kohms" 111416 258660 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R3" "5_kohms" 157941 287500 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/C1" "0.1_uF" 108941 266500 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/C4" "0.1_uF" 160441 266500 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "SO14" "X9/U2" "unknown" 134166 272660 -2000 -6000 0 100 ""]
+(
+	Pad[-13500 -15000 -7000 -15000 2000 1000 3000 "OUT" "1" "square"]
+	Pad[-13500 -10000 -7000 -10000 2000 1000 3000 "IN-" "2" "square"]
+	Pad[-13500 -5000 -7000 -5000 2000 1000 3000 "IN+" "3" "square"]
+	Pad[-13500 0 -7000 0 2000 1000 3000 "V+" "4" "square"]
+	Pad[-13500 5000 -7000 5000 2000 1000 3000 "IN+" "5" "square"]
+	Pad[-13500 10000 -7000 10000 2000 1000 3000 "IN-" "6" "square"]
+	Pad[-13500 15000 -7000 15000 2000 1000 3000 "OUT" "7" "square"]
+	Pad[7000 15000 13500 15000 2000 1000 3000 "OUT" "8" "square,edge2"]
+	Pad[7000 10000 13500 10000 2000 1000 3000 "IN-" "9" "square,edge2"]
+	Pad[7000 5000 13500 5000 2000 1000 3000 "IN+" "10" "square,edge2"]
+	Pad[7000 0 13500 0 2000 1000 3000 "V-" "11" "square,edge2"]
+	Pad[7000 -5000 13500 -5000 2000 1000 3000 "IN+" "12" "square,edge2"]
+	Pad[7000 -10000 13500 -10000 2000 1000 3000 "IN-" "13" "square,edge2"]
+	Pad[7000 -15000 13500 -15000 2000 1000 3000 "OUT" "14" "square,edge2"]
+	ElementLine [-15500 -17000 -15500 17000 1000]
+	ElementLine [-15500 17000 15500 17000 1000]
+	ElementLine [15500 17000 15500 -17000 1000]
+	ElementLine [-15500 -17000 -2500 -17000 1000]
+	ElementLine [15500 -17000 2500 -17000 1000]
+	ElementArc [0 -17000 2500 2500 0 180 1000]
+
+	)
+
+Element["" "0603" "X9/R2" "5_kohms" 111441 287500 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/C2" "0.1_uF" 108941 278500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/C3" "0.1_uF" 160441 278500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R4" "5_kohms" 157941 258500 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C16" "0.1_uF" 306188 286619 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "C17" "0.1_uF" 304964 260991 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "SO16" "U1" "unknown" 284938 271678 -2000 -6000 0 100 ""]
+(
+	Pad[-13500 -17500 -7000 -17500 2000 1000 3000 "CH0" "1" "square"]
+	Pad[-13500 -12500 -7000 -12500 2000 1000 3000 "CH1" "2" "square"]
+	Pad[-13500 -7500 -7000 -7500 2000 1000 3000 "CH2" "3" "square"]
+	Pad[-13500 -2500 -7000 -2500 2000 1000 3000 "CH3" "4" "square"]
+	Pad[-13500 2500 -7000 2500 2000 1000 3000 "CH4" "5" "square"]
+	Pad[-13500 7500 -7000 7500 2000 1000 3000 "CH5" "6" "square"]
+	Pad[-13500 12500 -7000 12500 2000 1000 3000 "CH6" "7" "square"]
+	Pad[-13500 17500 -7000 17500 2000 1000 3000 "CH7" "8" "square"]
+	Pad[7000 17500 13500 17500 2000 1000 3000 "DGND" "9" "square,edge2"]
+	Pad[7000 12500 13500 12500 2000 1000 3000 "_CS_" "10" "square,edge2"]
+	Pad[7000 7500 13500 7500 2000 1000 3000 "MOSI" "11" "square,edge2"]
+	Pad[7000 2500 13500 2500 2000 1000 3000 "MISO" "12" "square,edge2"]
+	Pad[7000 -2500 13500 -2500 2000 1000 3000 "CLK" "13" "square,edge2"]
+	Pad[7000 -7500 13500 -7500 2000 1000 3000 "AGND" "14" "square,edge2"]
+	Pad[7000 -12500 13500 -12500 2000 1000 3000 "AVDD" "15" "square,edge2"]
+	Pad[7000 -17500 13500 -17500 2000 1000 3000 "DVDD" "16" "square,edge2"]
+	ElementLine [-15500 -19500 -15500 19500 1000]
+	ElementLine [-15500 19500 15500 19500 1000]
+	ElementLine [15500 19500 15500 -19500 1000]
+	ElementLine [-15500 -19500 -2500 -19500 1000]
+	ElementLine [15500 -19500 2500 -19500 1000]
+	ElementArc [0 -19500 2500 2500 0 180 1000]
+
+	)
+
+Element["" "0603" "C8" "1_uF" 141441 79000 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["onsolder" "SOT223" "U3" "unknown" 136799 75571 -25300 -32900 1 100 "auto"]
+(
+	Pad[0 -3300 0 3300 5600 3000 6200 "VIN" "1" "onsolder,square,edge2"]
+	Pad[-9000 -3300 -9000 3300 5600 3000 6200 "GND" "2" "onsolder,square,edge2"]
+	Pad[-18100 -3300 -18100 3300 5600 3000 6200 "VOUT" "3" "onsolder,square,edge2"]
+	Pad[-13500 -24400 -4500 -24400 12200 3000 12800 "PAD" "4" "onsolder,square,edge2"]
+	ElementLine [5200 -32900 5200 8500 1000]
+	ElementLine [-23300 8500 5200 8500 1000]
+	ElementLine [-23300 -32900 -23300 8500 1000]
+	ElementLine [-23300 -32900 5200 -32900 1000]
+
+	)
+
+Element["" "0805" "D2" "yellow" 248855 50500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "CATHODE" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "ANODE" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "0805" "D6" "red" 248898 64500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "CATHODE" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "ANODE" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "0603" "R15" "130_ohms" 263441 64500 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "R14" "130_ohms" 263398 57500 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "R13" "130_ohms" 263398 50500 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0805" "D5" "green" 248855 57500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "CATHODE" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "ANODE" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["onsolder" "TSSOP16" "X3/U4" "unknown" 385791 159229 6000 2000 3 100 "auto"]
+(
+	Pad[8956 9311 8956 13917 1299 1000 2299 "1B" "1" "onsolder,square,edge2"]
+	Pad[6397 9311 6397 13917 1299 1000 2299 "1A" "2" "onsolder,square,edge2"]
+	Pad[3838 9311 3838 13917 1299 1000 2299 "1Y" "3" "onsolder,square,edge2"]
+	Pad[1279 9311 1279 13917 1299 1000 2299 "ENABLE" "4" "onsolder,square,edge2"]
+	Pad[-1279 9311 -1279 13917 1299 1000 2299 "2Y" "5" "onsolder,square,edge2"]
+	Pad[-3838 9311 -3838 13917 1299 1000 2299 "2A" "6" "onsolder,square,edge2"]
+	Pad[-6397 9311 -6397 13917 1299 1000 2299 "2B" "7" "onsolder,square,edge2"]
+	Pad[-8956 9311 -8956 13917 1299 1000 2299 "GND" "8" "onsolder,square,edge2"]
+	Pad[-8956 -13917 -8956 -9311 1299 1000 2299 "3B" "9" "onsolder,square"]
+	Pad[-6397 -13917 -6397 -9311 1299 1000 2299 "3A" "10" "onsolder,square"]
+	Pad[-3838 -13917 -3838 -9311 1299 1000 2299 "3Y" "11" "onsolder,square"]
+	Pad[-1279 -13917 -1279 -9311 1299 1000 2299 "_ENABLE_" "12" "onsolder,square"]
+	Pad[1279 -13917 1279 -9311 1299 1000 2299 "4Y" "13" "onsolder,square"]
+	Pad[3838 -13917 3838 -9311 1299 1000 2299 "4A" "14" "onsolder,square"]
+	Pad[6397 -13917 6397 -9311 1299 1000 2299 "4B" "15" "onsolder,square"]
+	Pad[8956 -13917 8956 -9311 1299 1000 2299 "VCC" "16" "onsolder,square"]
+	ElementLine [-10606 15566 10606 15566 1000]
+	ElementLine [-10606 -15566 -10606 15566 1000]
+	ElementLine [-10606 -15566 10606 -15566 1000]
+	ElementLine [10606 2500 10606 15566 1000]
+	ElementLine [10606 -15566 10606 -2500 1000]
+	ElementArc [10606 0 2500 2500 270 180 1000]
+
+	)
+
+Element["onsolder" "TSSOP16" "X2/U4" "unknown" 385441 100000 6000 2000 3 100 "auto"]
+(
+	Pad[8956 9311 8956 13917 1299 1000 2299 "1B" "1" "onsolder,square,edge2"]
+	Pad[6397 9311 6397 13917 1299 1000 2299 "1A" "2" "onsolder,square,edge2"]
+	Pad[3838 9311 3838 13917 1299 1000 2299 "1Y" "3" "onsolder,square,edge2"]
+	Pad[1279 9311 1279 13917 1299 1000 2299 "ENABLE" "4" "onsolder,square,edge2"]
+	Pad[-1279 9311 -1279 13917 1299 1000 2299 "2Y" "5" "onsolder,square,edge2"]
+	Pad[-3838 9311 -3838 13917 1299 1000 2299 "2A" "6" "onsolder,square,edge2"]
+	Pad[-6397 9311 -6397 13917 1299 1000 2299 "2B" "7" "onsolder,square,edge2"]
+	Pad[-8956 9311 -8956 13917 1299 1000 2299 "GND" "8" "onsolder,square,edge2"]
+	Pad[-8956 -13917 -8956 -9311 1299 1000 2299 "3B" "9" "onsolder,square"]
+	Pad[-6397 -13917 -6397 -9311 1299 1000 2299 "3A" "10" "onsolder,square"]
+	Pad[-3838 -13917 -3838 -9311 1299 1000 2299 "3Y" "11" "onsolder,square"]
+	Pad[-1279 -13917 -1279 -9311 1299 1000 2299 "_ENABLE_" "12" "onsolder,square"]
+	Pad[1279 -13917 1279 -9311 1299 1000 2299 "4Y" "13" "onsolder,square"]
+	Pad[3838 -13917 3838 -9311 1299 1000 2299 "4A" "14" "onsolder,square"]
+	Pad[6397 -13917 6397 -9311 1299 1000 2299 "4B" "15" "onsolder,square"]
+	Pad[8956 -13917 8956 -9311 1299 1000 2299 "VCC" "16" "onsolder,square"]
+	ElementLine [-10606 15566 10606 15566 1000]
+	ElementLine [-10606 -15566 -10606 15566 1000]
+	ElementLine [-10606 -15566 10606 -15566 1000]
+	ElementLine [10606 2500 10606 15566 1000]
+	ElementLine [10606 -15566 10606 -2500 1000]
+	ElementArc [10606 0 2500 2500 270 180 1000]
+
+	)
+
+Element["onsolder" "TSSOP16" "X1/U4" "unknown" 384941 39500 6000 2000 3 100 "auto"]
+(
+	Pad[8956 9311 8956 13917 1299 1000 2299 "1B" "1" "onsolder,square,edge2"]
+	Pad[6397 9311 6397 13917 1299 1000 2299 "1A" "2" "onsolder,square,edge2"]
+	Pad[3838 9311 3838 13917 1299 1000 2299 "1Y" "3" "onsolder,square,edge2"]
+	Pad[1279 9311 1279 13917 1299 1000 2299 "ENABLE" "4" "onsolder,square,edge2"]
+	Pad[-1279 9311 -1279 13917 1299 1000 2299 "2Y" "5" "onsolder,square,edge2"]
+	Pad[-3838 9311 -3838 13917 1299 1000 2299 "2A" "6" "onsolder,square,edge2"]
+	Pad[-6397 9311 -6397 13917 1299 1000 2299 "2B" "7" "onsolder,square,edge2"]
+	Pad[-8956 9311 -8956 13917 1299 1000 2299 "GND" "8" "onsolder,square,edge2"]
+	Pad[-8956 -13917 -8956 -9311 1299 1000 2299 "3B" "9" "onsolder,square"]
+	Pad[-6397 -13917 -6397 -9311 1299 1000 2299 "3A" "10" "onsolder,square"]
+	Pad[-3838 -13917 -3838 -9311 1299 1000 2299 "3Y" "11" "onsolder,square"]
+	Pad[-1279 -13917 -1279 -9311 1299 1000 2299 "_ENABLE_" "12" "onsolder,square"]
+	Pad[1279 -13917 1279 -9311 1299 1000 2299 "4Y" "13" "onsolder,square"]
+	Pad[3838 -13917 3838 -9311 1299 1000 2299 "4A" "14" "onsolder,square"]
+	Pad[6397 -13917 6397 -9311 1299 1000 2299 "4B" "15" "onsolder,square"]
+	Pad[8956 -13917 8956 -9311 1299 1000 2299 "VCC" "16" "onsolder,square"]
+	ElementLine [-10606 15566 10606 15566 1000]
+	ElementLine [-10606 -15566 -10606 15566 1000]
+	ElementLine [-10606 -15566 10606 -15566 1000]
+	ElementLine [10606 2500 10606 15566 1000]
+	ElementLine [10606 -15566 10606 -2500 1000]
+	ElementArc [10606 0 2500 2500 270 180 1000]
+
+	)
+
+Element["hidename" "LQFP64_10" "U6" "unknown" 277240 119171 5000 4905 3 100 ""]
+(
+	Pad[14763 -24134 14763 -20736 1102 3000 1402 "VBAT" "1" "square"]
+	Pad[12795 -24134 12795 -20736 1102 3000 1402 "PC13" "2" "square"]
+	Pad[10826 -24134 10826 -20736 1102 3000 1402 "PC14" "3" "square"]
+	Pad[8858 -24134 8858 -20736 1102 3000 1402 "PC15" "4" "square"]
+	Pad[6889 -24134 6889 -20736 1102 3000 1402 "OSC in" "5" "square"]
+	Pad[4921 -24134 4921 -20736 1102 3000 1402 "OSC out" "6" "square"]
+	Pad[2952 -24134 2952 -20736 1102 3000 1402 "_RST_" "7" "square"]
+	Pad[984 -24134 984 -20736 1102 3000 1402 "PC0" "8" "square"]
+	Pad[-985 -24134 -985 -20736 1102 3000 1402 "PC1" "9" "square"]
+	Pad[-2953 -24134 -2953 -20736 1102 3000 1402 "PC2" "10" "square"]
+	Pad[-4922 -24134 -4922 -20736 1102 3000 1402 "PC3" "11" "square"]
+	Pad[-6890 -24134 -6890 -20736 1102 3000 1402 "VSS analog" "12" "square"]
+	Pad[-8859 -24134 -8859 -20736 1102 3000 1402 "VDD analog" "13" "square"]
+	Pad[-10827 -24134 -10827 -20736 1102 3000 1402 "PA0" "14" "square"]
+	Pad[-12796 -24134 -12796 -20736 1102 3000 1402 "PA1" "15" "square"]
+	Pad[-14764 -24134 -14764 -20736 1102 3000 1402 "PA2" "16" "square"]
+	Pad[-24134 -14763 -20736 -14763 1102 3000 1402 "PA3" "17" "square,octagon"]
+	Pad[-24134 -12795 -20736 -12795 1102 3000 1402 "VSS 4" "18" "square,octagon"]
+	Pad[-24134 -10826 -20736 -10826 1102 3000 1402 "VDD 4" "19" "square,octagon"]
+	Pad[-24134 -8858 -20736 -8858 1102 3000 1402 "PA4" "20" "square,octagon"]
+	Pad[-24134 -6889 -20736 -6889 1102 3000 1402 "PA5" "21" "square,octagon"]
+	Pad[-24134 -4921 -20736 -4921 1102 3000 1402 "PA6" "22" "square,octagon"]
+	Pad[-24134 -2952 -20736 -2952 1102 3000 1402 "PA7" "23" "square,octagon"]
+	Pad[-24134 -984 -20736 -984 1102 3000 1402 "PC4" "24" "square,octagon"]
+	Pad[-24134 985 -20736 985 1102 3000 1402 "PC5" "25" "square,octagon"]
+	Pad[-24134 2953 -20736 2953 1102 3000 1402 "PB0" "26" "square,octagon"]
+	Pad[-24134 4922 -20736 4922 1102 3000 1402 "PB1" "27" "square,octagon"]
+	Pad[-24134 6890 -20736 6890 1102 3000 1402 "PB2" "28" "square,octagon"]
+	Pad[-24134 8859 -20736 8859 1102 3000 1402 "PB10" "29" "square,octagon"]
+	Pad[-24134 10827 -20736 10827 1102 3000 1402 "PB11" "30" "square,octagon"]
+	Pad[-24134 12796 -20736 12796 1102 3000 1402 "VCAP 1" "31" "square,octagon"]
+	Pad[-24134 14764 -20736 14764 1102 3000 1402 "VDD 1" "32" "square,octagon"]
+	Pad[-14763 20736 -14763 24134 1102 3000 1402 "PB12" "33" "square,edge2"]
+	Pad[-12795 20736 -12795 24134 1102 3000 1402 "PB13" "34" "square,edge2"]
+	Pad[-10826 20736 -10826 24134 1102 3000 1402 "PB14" "35" "square,edge2"]
+	Pad[-8858 20736 -8858 24134 1102 3000 1402 "PB15" "36" "square,edge2"]
+	Pad[-6889 20736 -6889 24134 1102 3000 1402 "PC6" "37" "square,edge2"]
+	Pad[-4921 20736 -4921 24134 1102 3000 1402 "PC7" "38" "square,edge2"]
+	Pad[-2952 20736 -2952 24134 1102 3000 1402 "PC8" "39" "square,edge2"]
+	Pad[-984 20736 -984 24134 1102 3000 1402 "PC9" "40" "square,edge2"]
+	Pad[985 20736 985 24134 1102 3000 1402 "PA8" "41" "square,edge2"]
+	Pad[2953 20736 2953 24134 1102 3000 1402 "PA9" "42" "square,edge2"]
+	Pad[4922 20736 4922 24134 1102 3000 1402 "PA10" "43" "square,edge2"]
+	Pad[6890 20736 6890 24134 1102 3000 1402 "PA11" "44" "square,edge2"]
+	Pad[8859 20736 8859 24134 1102 3000 1402 "PA12" "45" "square,edge2"]
+	Pad[10827 20736 10827 24134 1102 3000 1402 "PA13" "46" "square,edge2"]
+	Pad[12796 20736 12796 24134 1102 3000 1402 "VCAP 2" "47" "square,edge2"]
+	Pad[14764 20736 14764 24134 1102 3000 1402 "VDD 2" "48" "square,edge2"]
+	Pad[20736 14763 24134 14763 1102 3000 1402 "PA14" "49" "square,octagon,edge2"]
+	Pad[20736 12795 24134 12795 1102 3000 1402 "PA15" "50" "square,octagon,edge2"]
+	Pad[20736 10826 24134 10826 1102 3000 1402 "PC10" "51" "square,octagon,edge2"]
+	Pad[20736 8858 24134 8858 1102 3000 1402 "PC11" "52" "square,octagon,edge2"]
+	Pad[20736 6889 24134 6889 1102 3000 1402 "PC12" "53" "square,octagon,edge2"]
+	Pad[20736 4921 24134 4921 1102 3000 1402 "PD2" "54" "square,octagon,edge2"]
+	Pad[20736 2952 24134 2952 1102 3000 1402 "PB3" "55" "square,octagon,edge2"]
+	Pad[20736 984 24134 984 1102 3000 1402 "PB4" "56" "square,octagon,edge2"]
+	Pad[20736 -985 24134 -985 1102 3000 1402 "PB5" "57" "square,octagon,edge2"]
+	Pad[20736 -2953 24134 -2953 1102 3000 1402 "PB6" "58" "square,octagon,edge2"]
+	Pad[20736 -4922 24134 -4922 1102 3000 1402 "PB7" "59" "square,octagon,edge2"]
+	Pad[20736 -6890 24134 -6890 1102 3000 1402 "BOOT0" "60" "square,octagon,edge2"]
+	Pad[20736 -8859 24134 -8859 1102 3000 1402 "PB8" "61" "square,octagon,edge2"]
+	Pad[20736 -10827 24134 -10827 1102 3000 1402 "PB9" "62" "square,octagon,edge2"]
+	Pad[20736 -12796 24134 -12796 1102 3000 1402 "VSS 3" "63" "square,octagon,edge2"]
+	Pad[20736 -14764 24134 -14764 1102 3000 1402 "VDD 3" "64" "square,octagon,edge2"]
+	ElementLine [19285 -16385 19285 19285 800]
+	ElementLine [-19285 19285 19285 19285 800]
+	ElementLine [-19285 -19285 -19285 19285 800]
+	ElementLine [-19285 -19285 16385 -19285 800]
+	ElementLine [16385 -19285 19285 -16385 800]
+	ElementArc [16385 -16385 1000 1000 270 360 800]
+
+	)
+
+Element["lock" "beaglebone" "U8" "unknown" 163299 127671 -112500 -118000 0 100 ""]
+(
+	Pin[-77500 92500 18300 1800 18900 12850 "bogus_442" "442" "lock,edge2"]
+	Pin[-77500 -97500 18300 1800 18900 12850 "bogus_542" "542" "lock,edge2"]
+	Pin[182500 80000 21000 1800 23000 19000 "bogus_642" "642" "lock,edge2"]
+	Pin[182500 -85000 18300 1800 18900 12850 "bogus_742" "742" "lock,edge2"]
+	Pin[-57500 87500 6600 2000 8600 4600 "(2) GND" "48" "lock,edge2,thermal(2X)"]
+	Pin[-57500 97500 6600 2000 8600 4600 "(1) GND" "47" "square,lock,edge2,thermal(2X)"]
+	Pin[-47500 87500 6600 2000 8600 4600 "(4) DC_3.3V" "50" "lock,edge2"]
+	Pin[-47500 97500 6600 2000 8600 4600 "(3) DC_3.3V" "49" "lock,edge2"]
+	Pin[-37500 87500 6600 2000 8600 4600 "(6) VDD_5V" "52" "lock,edge2,thermal(1X)"]
+	Pin[-37500 97500 6600 2000 8600 4600 "(5) VDD_5V" "51" "lock,edge2,thermal(1X)"]
+	Pin[-27500 87500 6600 2000 8600 4600 "(8) SYS_5V" "54" "lock,edge2"]
+	Pin[-27500 97500 6600 2000 8600 4600 "(7) SYS_5V" "53" "lock,edge2"]
+	Pin[-17500 87500 6600 2000 8600 4600 "(10) SYS_RESETn (A10)" "56" "lock,edge2"]
+	Pin[-17500 97500 6600 2000 8600 4600 "(9) PWR_BUT" "55" "lock,edge2"]
+	Pin[-7500 87500 6600 2000 8600 4600 "(12) GPIO1_28 (U18)" "58" "lock,edge2"]
+	Pin[-7500 97500 6600 2000 8600 4600 "(11) UART4_RXD (T17)" "57" "lock,edge2"]
+	Pin[2500 87500 6600 2000 8600 4600 "(14) EHRPWM1A (U14)" "60" "lock,edge2"]
+	Pin[2500 97500 6600 2000 8600 4600 "(13) UART4_TXD (U17)" "59" "lock,edge2"]
+	Pin[12500 87500 6600 2000 8600 4600 "(16) EHRPWM1B (T14)" "62" "lock,edge2"]
+	Pin[12500 97500 6600 2000 8600 4600 "(15) GPIO1_16 (R13)" "61" "lock,edge2"]
+	Pin[22500 87500 6600 2000 8600 4600 "(18) I2C1_SDA (B16)" "64" "lock,edge2"]
+	Pin[22500 97500 6600 2000 8600 4600 "(17) I2C1_SCL (A16)" "63" "lock,edge2"]
+	Pin[32500 87500 6600 2000 8600 4600 "(20) I2C2_SDA (D18)" "66" "lock,edge2"]
+	Pin[32500 97500 6600 2000 8600 4600 "(19) I2C2_SCL (D17)" "65" "lock,edge2"]
+	Pin[42500 87500 6600 2000 8600 4600 "(22) UART2_RXD (A17)" "68" "lock,edge2"]
+	Pin[42500 97500 6600 2000 8600 4600 "(21) UART2_TXD (B17)" "67" "lock,edge2"]
+	Pin[52500 87500 6600 2000 8600 4600 "(24) UART1_TXD (D15)" "70" "lock,edge2"]
+	Pin[52500 97500 6600 2000 8600 4600 "(23) GPIO1_17 (V14)" "69" "lock,edge2"]
+	Pin[62500 87500 6600 2000 8600 4600 "(26) UART1_RXD (D16)" "72" "lock,edge2"]
+	Pin[62500 97500 6600 2000 8600 4600 "(25) GPIO3_21 (A14)" "71" "lock,edge2"]
+	Pin[72500 87500 6600 2000 8600 4600 "(28) SPI1_CS0 (C12)" "74" "lock,edge2"]
+	Pin[72500 97500 6600 2000 8600 4600 "(27) GPIO3_19 (C13)" "73" "lock,edge2"]
+	Pin[82500 87500 6600 2000 8600 4600 "(30) SPI1_D1 (D12)" "76" "lock,edge2"]
+	Pin[82500 97500 6600 2000 8600 4600 "(29) SPI1_D0 (B13)" "75" "lock,edge2"]
+	Pin[92500 87500 6600 2000 8600 4600 "(32) VADC" "78" "lock,edge2"]
+	Pin[92500 97500 6600 2000 8600 4600 "(31) SPI1_SCLK (A13)" "77" "lock,edge2"]
+	Pin[102500 87500 6600 2000 8600 4600 "(34) AGND" "80" "lock,edge2"]
+	Pin[102500 97500 6600 2000 8600 4600 "(33) AIN4 (C8)" "79" "lock,edge2"]
+	Pin[112500 87500 6600 2000 8600 4600 "(36) AIN5 (B8)" "82" "lock,edge2"]
+	Pin[112500 97500 6600 2000 8600 4600 "(35) AIN6 (A8)" "81" "lock,edge2"]
+	Pin[122500 87500 6600 2000 8600 4600 "(38) AIN3 (A7)" "84" "lock,edge2"]
+	Pin[122500 97500 6600 2000 8600 4600 "(37) AIN2 (B7)" "83" "lock,edge2"]
+	Pin[132500 87500 6600 2000 8600 4600 "(40) AIN1 (C7)" "86" "lock,edge2"]
+	Pin[132500 97500 6600 2000 8600 4600 "(39) AIN0 (B6)" "85" "lock,edge2"]
+	Pin[142500 87500 6600 2000 8600 4600 "(42) GPIO0_7 (C18)" "88" "lock,edge2"]
+	Pin[142500 97500 6600 2000 8600 4600 "(41) CLKOUT2 (D14)" "87" "lock,edge2"]
+	Pin[152500 87500 6600 2000 8600 4600 "(44) GND" "90" "lock,edge2"]
+	Pin[152500 97500 6600 2000 8600 4600 "(43) GND" "89" "lock,edge2"]
+	Pin[162500 87500 6600 2000 8600 4600 "(46) GND" "92" "lock,edge2"]
+	Pin[162500 97500 6600 2000 8600 4600 "(45) GND" "91" "lock,edge2"]
+	Pin[-57500 -102500 6600 2000 8600 4600 "GND" "2" "lock,edge2,thermal(2X)"]
+	Pin[-57500 -92500 6600 2000 8600 4600 "GND" "1" "square,lock,edge2,thermal(2X)"]
+	Pin[-47500 -102500 6600 2000 8600 4600 "(T9) GPIO1_7" "4" "lock,edge2"]
+	Pin[-47500 -92500 6600 2000 8600 4600 "(R9) GPIO1_6" "3" "lock,edge2"]
+	Pin[-37500 -102500 6600 2000 8600 4600 "(T8) GPIO1_3" "6" "lock,edge2"]
+	Pin[-37500 -92500 6600 2000 8600 4600 "(R8) GPIO1_2" "5" "lock,edge2"]
+	Pin[-27500 -102500 6600 2000 8600 4600 "(T7) TIMER7" "8" "lock,edge2"]
+	Pin[-27500 -92500 6600 2000 8600 4600 "(R7) TIMER4" "7" "lock,edge2"]
+	Pin[-17500 -102500 6600 2000 8600 4600 "(U6) TIMER6" "10" "lock,edge2"]
+	Pin[-17500 -92500 6600 2000 8600 4600 "(T6) TIMER5" "9" "lock,edge2"]
+	Pin[-7500 -102500 6600 2000 8600 4600 "(T12) GPIO1_12" "12" "lock,edge2"]
+	Pin[-7500 -92500 6600 2000 8600 4600 "(R12) GPIO1_13" "11" "lock,edge2"]
+	Pin[2500 -102500 6600 2000 8600 4600 "(T11) GPIO0_26" "14" "lock,edge2"]
+	Pin[2500 -92500 6600 2000 8600 4600 "(T10) EHRPWM2B" "13" "lock,edge2"]
+	Pin[12500 -102500 6600 2000 8600 4600 "(V13) GPIO1_14" "16" "lock,edge2"]
+	Pin[12500 -92500 6600 2000 8600 4600 "(U13) GPIO1_15" "15" "lock,edge2"]
+	Pin[22500 -102500 6600 2000 8600 4600 "(V12) GPIO2_1" "18" "lock,edge2"]
+	Pin[22500 -92500 6600 2000 8600 4600 "(U12) GPIO0_27" "17" "lock,edge2"]
+	Pin[32500 -102500 6600 2000 8600 4600 "(V9) GPIO1_31" "20" "lock,edge2"]
+	Pin[32500 -92500 6600 2000 8600 4600 "(U10) EHRPWM2A" "19" "lock,edge2"]
+	Pin[42500 -102500 6600 2000 8600 4600 "(V8) GPIO1_5" "22" "lock,edge2"]
+	Pin[42500 -92500 6600 2000 8600 4600 "(U9) GPIO1_30" "21" "lock,edge2"]
+	Pin[52500 -102500 6600 2000 8600 4600 "(V7) GPIO1_1" "24" "lock,edge2"]
+	Pin[52500 -92500 6600 2000 8600 4600 "(U8) GPIO1_4" "23" "lock,edge2"]
+	Pin[62500 -102500 6600 2000 8600 4600 "(V6) GPIO1_29" "26" "lock,edge2"]
+	Pin[62500 -92500 6600 2000 8600 4600 "(U7) GPIO1_0" "25" "lock,edge2"]
+	Pin[72500 -102500 6600 2000 8600 4600 "(V5) GPIO2_24" "28" "lock,edge2"]
+	Pin[72500 -92500 6600 2000 8600 4600 "(U5) GPIO2_22" "27" "lock,edge2"]
+	Pin[82500 -102500 6600 2000 8600 4600 "(R6) GPIO2_25" "30" "lock,edge2"]
+	Pin[82500 -92500 6600 2000 8600 4600 "(R5) GPIO2_23" "29" "lock,edge2"]
+	Pin[92500 -102500 6600 2000 8600 4600 "(T5) UART5_RTSN" "32" "lock,edge2"]
+	Pin[92500 -92500 6600 2000 8600 4600 "(V4) UART5_CTSN" "31" "lock,edge2"]
+	Pin[102500 -102500 6600 2000 8600 4600 "(U4) UART3_RTSN" "34" "lock,edge2"]
+	Pin[102500 -92500 6600 2000 8600 4600 "(V3) UART4_RTSN" "33" "lock,edge2"]
+	Pin[112500 -102500 6600 2000 8600 4600 "(U3) UART3_CTSN" "36" "lock,edge2"]
+	Pin[112500 -92500 6600 2000 8600 4600 "(V2) UART4_CTSN" "35" "lock,edge2"]
+	Pin[122500 -102500 6600 2000 8600 4600 "(U2) UART5_RXD" "38" "lock,edge2"]
+	Pin[122500 -92500 6600 2000 8600 4600 "(U1) UART5_TXD" "37" "lock,edge2"]
+	Pin[132500 -102500 6600 2000 8600 4600 "(T4) GPIO2_13" "40" "lock,edge2"]
+	Pin[132500 -92500 6600 2000 8600 4600 "(T3) GPIO2_12" "39" "lock,edge2"]
+	Pin[142500 -102500 6600 2000 8600 4600 "(T2) GPIO2_11" "42" "lock,edge2"]
+	Pin[142500 -92500 6600 2000 8600 4600 "(T1) GPIO2_10" "41" "lock,edge2"]
+	Pin[152500 -102500 6600 2000 8600 4600 "(R4) GPIO2_9" "44" "lock,edge2"]
+	Pin[152500 -92500 6600 2000 8600 4600 "(R3) GPIO2_8" "43" "lock,edge2"]
+	Pin[162500 -102500 6600 2000 8600 4600 "(R2) GPIO2_7" "46" "lock,edge2"]
+	Pin[162500 -92500 6600 2000 8600 4600 "(R1) GPIO2_6" "45" "lock,edge2"]
+	Pin[32500 75000 6600 2000 8600 4600 "" "UART1" "square,edge2"]
+	Pin[42500 75000 6600 2000 8600 4600 "" "UART2" "edge2"]
+	Pin[52500 75000 6600 2000 8600 4600 "" "UART3" "edge2"]
+	Pin[62500 75000 6600 2000 8600 4600 "" "UART4" "edge2"]
+	Pin[72500 75000 6600 2000 8600 4600 "" "UART5" "edge2"]
+	Pin[152500 -65000 22000 1800 24000 20000 "bogus_842" "842" "edge2"]
+
+	)
+
+Element["" "22-23-2031" "CONN12" "unknown" 85441 170000 12200 21000 2 100 ""]
+(
+	Pin[0 -10000 6500 3000 7100 4000 "1" "1" "square,thermal(0,2X)"]
+	Pin[0 0 6500 3000 7100 4000 "2" "2" ""]
+	Pin[0 10000 6500 3000 7100 4000 "3" "3" ""]
+	ElementLine [-12800 -15000 12200 -15000 1000]
+	ElementLine [-12800 15000 12200 15000 1000]
+	ElementLine [12200 -15000 12200 15000 1000]
+	ElementLine [5700 -15000 5700 15000 1000]
+	ElementLine [-12800 -5000 5700 -5000 1000]
+	ElementLine [-12800 5000 5700 5000 1000]
+	ElementLine [-12800 -15000 -12800 15000 1000]
+	ElementLine [-12800 -15000 -12800 -5000 1000]
+
+	)
+
+Element["" "0603" "X8/R4" "5_kohms" 238500 258500 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0805" "D7" "green" 95941 192000 -3150 3150 1 100 ""]
+(
+	Pad[-393 3543 393 3543 5118 2000 5718 "CATHODE" "1" "square"]
+	Pad[-393 -3543 393 -3543 5118 2000 5718 "ANODE" "2" "square"]
+	ElementLine [-2755 -393 -2755 393 800]
+	ElementLine [2755 -393 2755 393 800]
+
+	)
+
+Element["" "0805" "X14/D1" "green" 170441 155000 3150 -3150 3 100 ""]
+(
+	Pad[-393 -3543 393 -3543 5118 2000 5718 "CATHODE" "1" "square"]
+	Pad[-393 3543 393 3543 5118 2000 5718 "ANODE" "2" "square"]
+	ElementLine [2755 -393 2755 393 800]
+	ElementLine [-2755 -393 -2755 393 800]
+
+	)
+
+Element["" "0603" "X14/R13" "300_ohms" 171441 165559 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "R17" "1_kohms" 102941 186000 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "4-40_bolt" "B2" "unknown" 353000 250000 0 0 0 100 ""]
+(
+	Pin[0 0 18300 1800 18900 12850 "the_hole" "1" ""]
+
+	)
+
+Element["" "0603" "R1" "130_ohms" 263441 43500 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0805" "D1" "green" 248898 43500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "CATHODE" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "ANODE" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "0603" "X9/R9" "6.65 kohms" 166658 289991 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R5" "6.65 kohms" 102683 256483 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R12" "6.65 kohms" 248008 266292 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R10" "6.65 kohms" 248441 278500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R9" "6.65 kohms" 248441 295000 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R8" "6.65 kohms" 184441 278500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "1210" "X14/C6" "100 uF" 150941 204000 -3150 -3150 0 100 ""]
+(
+	Pad[-5905 -2755 -5905 2755 5118 2000 5718 "1" "1" "square"]
+	Pad[5905 -2755 5905 2755 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-1968 -5314 1968 -5314 800]
+	ElementLine [-1968 5314 1968 5314 800]
+
+	)
+
+Element["" "0805" "X14/C5" "22 nf" 160941 194500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "0805" "X14/C2" "10 nf" 147441 187500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "0603" "X9/R12" "6.65 kohms" 165975 266222 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R11" "6.65 kohms" 157975 251995 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R10" "6.65 kohms" 166441 278500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R8" "6.65 kohms" 102441 278500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R7" "6.65 kohms" 102401 289124 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X9/R6" "6.65 kohms" 102790 266424 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R11" "6.65 kohms" 238514 252246 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R7" "6.65 kohms" 184441 289500 3150 -3150 3 100 ""]
+(
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 2559 492 2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R6" "6.65 kohms" 184983 266488 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X8/R5" "6.65 kohms" 199559 251654 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0805" "X14/R6" "6.65_kohm" 161028 187630 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "1210" "X16/C4" "10_uF" 342941 307501 3150 -3150 3 100 ""]
+(
+	Pad[-2755 -5905 2755 -5905 5118 2000 5718 "1" "1" "square"]
+	Pad[-2755 5905 2755 5905 5118 2000 5718 "2" "2" "square"]
+	ElementLine [5314 -1968 5314 1968 300]
+	ElementLine [-5314 -1968 -5314 1968 300]
+
+	)
+
+Element["" "0603" "X16/R4" "9.31_kohm" 369441 328001 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X16/R3" "154.0_kohm" 359382 328500 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0603" "X16/R2" "34.0_kohm" 359382 334500 -3150 -3150 0 100 ""]
+(
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[2559 -492 2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0805" "X16/R5" "1.27_kohm" 374941 345044 -3150 3150 1 100 ""]
+(
+	Pad[-393 3543 393 3543 5118 2000 5718 "1" "1" "square"]
+	Pad[-393 -3543 393 -3543 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-2755 -393 -2755 393 800]
+	ElementLine [2755 -393 2755 393 800]
+
+	)
+
+Element["" "1210" "X16/C3" "10_uF" 329941 307501 3150 -3150 3 100 ""]
+(
+	Pad[-2755 -5905 2755 -5905 5118 2000 5718 "1" "1" "square"]
+	Pad[-2755 5905 2755 5905 5118 2000 5718 "2" "2" "square"]
+	ElementLine [5314 -1968 5314 1968 800]
+	ElementLine [-5314 -1968 -5314 1968 800]
+
+	)
+
+Element["" "TOPMOD" "X16/U3" "unknown" 371941 288500 88630 11630 0 100 ""]
+(
+	Pad[-15000 26772 -15000 33071 3504 2000 4104 "VIN" "1" "square,edge2"]
+	Pad[-10000 26772 -10000 33071 3504 2000 4104 "RON" "2" "square,edge2"]
+	Pad[-5000 26772 -5000 33071 3504 2000 4104 "EN" "3" "square,edge2"]
+	Pad[0 26772 0 33071 3504 2000 4104 "GND" "4" "square,edge2"]
+	Pad[5000 26772 5000 33071 3504 2000 4104 "SS" "5" "square,edge2"]
+	Pad[10000 26772 10000 33071 3504 2000 4104 "FB" "6" "square,edge2"]
+	Pad[15000 26772 15000 33071 3504 2000 4104 "VOUT" "7" "square,edge2"]
+	Pad[0 -6693 0 6693 21063 2000 21663 "PAD" "8" "square"]
+	ElementLine [-18110 35827 -18110 20079 1000]
+	ElementLine [18110 35827 -18110 35827 1000]
+	ElementLine [18110 20079 18110 35827 1000]
+	ElementLine [-19685 20079 -19685 -20079 1000]
+	ElementLine [19685 20079 19685 -20079 1000]
+	ElementLine [19685 20079 -19685 20079 1000]
+	ElementLine [19685 -20079 -19685 -20079 1000]
+
+	)
+
+Element["" "0805" "X16/D1" "green" 397941 305501 3150 -3150 3 100 ""]
+(
+	Pad[-393 -3543 393 -3543 5118 2000 5718 "CATHODE" "1" "square"]
+	Pad[-393 3543 393 3543 5118 2000 5718 "ANODE" "2" "square"]
+	ElementLine [2755 -393 2755 393 800]
+	ElementLine [-2755 -393 -2755 393 800]
+
+	)
+
+Element["" "0603" "X16/R13" "300_ohms" 397941 318060 -3150 3150 1 100 ""]
+(
+	Pad[-492 2559 492 2559 2952 2000 3552 "1" "1" "square"]
+	Pad[-492 -2559 492 -2559 2952 2000 3552 "2" "2" "square"]
+
+	)
+
+Element["" "0805" "X16/C2" "10 nf" 373941 334000 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "1210" "X16/C6" "100 uF" 387441 354000 -3150 -3150 0 100 ""]
+(
+	Pad[-5905 -2755 -5905 2755 5118 2000 5718 "1" "1" "square"]
+	Pad[5905 -2755 5905 2755 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-1968 -5314 1968 -5314 800]
+	ElementLine [-1968 5314 1968 5314 800]
+
+	)
+
+Element["" "0805" "X16/C5" "22 nf" 385441 341500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "0805" "X16/R6" "6.65_kohm" 387941 333500 -3150 -3150 0 100 ""]
+(
+	Pad[-3543 -393 -3543 393 5118 2000 5718 "1" "1" "square"]
+	Pad[3543 -393 3543 393 5118 2000 5718 "2" "2" "square"]
+	ElementLine [-393 -2755 393 -2755 800]
+	ElementLine [-393 2755 393 2755 800]
+
+	)
+
+Element["" "0603" "X9/C5" "0.1_uF" 134441 252000 3150 3150 2 100 ""]
+(
+	Pad[2559 -492 2559 492 2952 2000 3552 "1" "1" "square"]
+	Pad[-2559 -492 -2559 492 2952 2000 3552 "2" "2" "square"]
+
+	)
+Layer(1 "top")
+(
+	Line[448750 69700 376485 69700 1000 2000 "clearline,auto,lock"]
+	Line[371215 41738 371157 41738 1000 2000 "clearline"]
+	Line[387623 41738 371287 41738 1000 2000 "clearline"]
+	Line[389279 43395 387623 41738 1000 2000 "clearline"]
+	Line[389279 43995 389279 43395 1000 2000 "clearline"]
+	Line[379941 45000 370441 45000 1000 2000 "clearline"]
+	Line[384162 49221 379941 45000 1000 2000 "clearline"]
+	Line[384162 55083 384162 49221 1000 2000 "clearline"]
+	Line[387425 213631 385730 215327 1000 2000 "clearline"]
+	Line[387441 213631 387425 213631 1000 2000 "clearline"]
+	Line[387441 213631 387441 213631 1000 2000 "clearline"]
+	Line[387441 210038 387441 213631 1000 2000 "clearline"]
+	Line[387479 210000 387441 210038 1000 2000 "clearline"]
+	Line[386720 209241 387479 210000 1000 2000 "clearline"]
+	Line[386720 196311 386720 209241 1000 2000 "clearline"]
+	Line[384162 167218 377944 161000 1000 2000 "clearline"]
+	Line[384162 173083 384162 167218 1000 2000 "clearline"]
+	Line[381044 74000 387441 74000 1000 2000 "clearline"]
+	Line[379044 76000 381044 74000 1000 2000 "clearline"]
+	Line[389279 80614 389279 75838 1000 2000 "clearline"]
+	Line[387441 74000 389279 75838 1000 2000 "clearline"]
+	Line[391838 46603 393441 45000 1000 2000 "clearline"]
+	Line[391838 62000 391838 46603 1000 2000 "clearline"]
+	Line[381441 98000 376441 93000 1000 2000 "clearline"]
+	Line[379441 88000 370441 88000 1000 2000 "clearline"]
+	Line[381603 85838 379441 88000 1000 2000 "clearline"]
+	Line[381603 78311 381603 85838 1000 2000 "clearline"]
+	Line[389279 167175 391441 165013 1000 2000 "clearline"]
+	Line[389279 173083 389279 167175 1000 2000 "clearline"]
+	Line[445441 230891 448750 234200 1000 2000 "clearline"]
+	Line[445441 219000 445441 230891 1000 2000 "clearline"]
+	Line[443441 217000 445441 219000 1000 2000 "clearline"]
+	Line[394810 217000 443441 217000 1000 2000 "clearline"]
+	Line[391810 214000 394810 217000 1000 2000 "clearline"]
+	Line[399882 211559 395441 211559 1000 2000 "clearline"]
+	Line[400441 211000 399882 211559 1000 2000 "clearline"]
+	Line[400000 206441 395441 206441 1000 2000 "clearline"]
+	Line[400441 206000 400000 206441 1000 2000 "clearline"]
+	Line[391810 204425 391810 214000 1000 2000 "clearline"]
+	Line[391838 204397 391810 204425 1000 2000 "clearline"]
+	Line[389279 215838 389441 216000 1000 2000 "clearline"]
+	Line[389279 212838 389279 215838 1000 2000 "clearline"]
+	Line[389279 196311 389279 212904 1000 2000 "clearline"]
+	Line[378441 205000 376441 205000 1000 2000 "clearline"]
+	Line[381603 201838 378441 205000 1000 2000 "clearline"]
+	Line[381603 196311 381603 201838 1000 2000 "clearline"]
+	Line[458250 203200 412250 203200 1000 2000 "clearline,auto"]
+	Line[412250 195700 412250 203200 1000 2000 "clearline,auto"]
+	Line[412250 188700 412250 202700 1000 2000 "clearline,auto"]
+	Line[412250 188700 389117 188700 1000 2000 "clearline,auto"]
+	Line[401750 188700 376485 188700 1000 2000 "clearline,auto"]
+	Line[376485 188700 376485 196311 1000 2000 "clearline,auto"]
+	Line[391973 202691 391838 202691 1000 2000 "clearline,auto"]
+	Line[394441 200000 400441 206000 1000 2000 "clearline"]
+	Line[458441 146000 456641 146000 1000 2000 "clearline,auto"]
+	Line[456641 146000 456641 147800 1000 2000 "clearline,auto"]
+	Line[456641 147800 448750 147800 1000 2000 "clearline,auto"]
+	Line[448750 147800 448750 170750 1000 2000 "clearline,auto"]
+	Line[448750 170750 394397 170750 1000 2000 "clearline,auto"]
+	Line[394397 170750 394397 173083 1000 2000 "clearline,auto"]
+	Line[458441 175000 456641 175000 1000 2000 "clearline,auto"]
+	Line[456641 175000 456641 182000 1000 2000 "clearline,auto"]
+	Line[456641 182000 379044 182000 1000 2000 "clearline,auto"]
+	Line[379044 177689 379044 182000 1000 2000 "clearline,auto"]
+	Line[458441 203200 458441 205000 1000 2000 "clearline,auto"]
+	Line[458441 203200 458250 203200 1000 2000 "clearline,auto"]
+	Line[458250 203200 458250 203200 1000 2000 "clearline,auto"]
+	Line[376485 192000 376485 196311 1000 2000 "clearline,auto"]
+	Line[458441 234200 458441 236000 1000 2000 "clearline,auto"]
+	Line[458441 234200 458250 234200 1000 2000 "clearline,auto"]
+	Line[458250 234200 458250 234200 1000 2000 "clearline,auto"]
+	Line[458250 234200 448750 234200 1000 2000 "clearline,auto"]
+	Line[391838 200917 391838 204465 1000 2000 "clearline,auto"]
+	Line[386720 165350 387070 165000 1000 2000 "clearline"]
+	Line[386720 175386 386720 165350 1000 2000 "clearline"]
+	Line[376485 166044 375441 165000 1000 2000 "clearline"]
+	Line[376485 175386 376485 166044 1000 2000 "clearline"]
+	Line[379044 194000 389279 194000 1000 2000 "clearline"]
+	Line[379044 198614 379044 194000 1000 2000 "clearline"]
+	Line[389279 198614 389279 194000 1000 2000 "clearline"]
+	Line[381603 180000 391838 180000 1000 2000 "clearline"]
+	Line[381603 175386 381603 180000 1000 2000 "clearline"]
+	Line[391838 175386 391838 180000 1000 2000 "clearline"]
+	Line[384162 198614 384162 212000 1000 2000 "clearline"]
+	Line[448750 69700 448750 77225 1000 2000 "clearline,auto"]
+	Line[376485 69700 376485 74781 1000 2000 "clearline,auto"]
+	Line[458441 25000 456641 25000 1000 2000 "clearline,auto"]
+	Line[456641 25000 456641 26800 1000 2000 "clearline,auto"]
+	Line[456641 26800 448750 26800 1000 2000 "clearline,auto"]
+	Line[448750 26800 448750 50750 1000 2000 "clearline,auto"]
+	Line[448750 50750 394397 50750 1000 2000 "clearline,auto"]
+	Line[394397 50750 394397 55083 1000 2000 "clearline,auto"]
+	Line[458441 55000 456641 55000 1000 2000 "clearline,auto"]
+	Line[456641 55000 456641 64000 1000 2000 "clearline,auto"]
+	Line[456641 64000 379044 64000 1000 2000 "clearline,auto"]
+	Line[379044 59689 379044 64000 1000 2000 "clearline,auto"]
+	Line[458441 83200 458441 85000 1000 2000 "clearline,auto"]
+	Line[458441 83200 458250 83200 1000 2000 "clearline,auto"]
+	Line[458250 83200 458250 83200 1000 2000 "clearline,auto"]
+	Line[458250 83200 448750 83200 1000 2000 "clearline,auto"]
+	Line[448750 71250 448750 83200 1000 2000 "clearline,auto"]
+	Line[376485 71250 376485 78311 1000 2000 "clearline,auto"]
+	Line[458441 113200 458441 115000 1000 2000 "clearline,auto"]
+	Line[458441 113200 458250 113200 1000 2000 "clearline,auto"]
+	Line[458250 113200 458250 113200 1000 2000 "clearline,auto"]
+	Line[458250 113200 432250 113200 1000 2000 "clearline,auto"]
+	Line[432250 82566 432250 113200 1000 2000 "clearline,auto"]
+	Line[432250 82566 402250 82566 1000 2000 "clearline,auto"]
+	Line[402250 76161 402250 82566 1000 2000 "clearline,auto"]
+	Line[402250 76161 391838 76161 1000 2000 "clearline,auto"]
+	Line[391838 76161 391838 78311 1000 2000 "clearline,auto"]
+	Line[381603 62000 391838 62000 1000 2000 "clearline"]
+	Line[381603 57386 381603 62000 1000 2000 "clearline"]
+	Line[379044 80614 379044 76000 1000 2000 "clearline"]
+	Line[394397 84566 395831 86000 1000 2000 "clearline"]
+	Line[394397 80614 394397 84566 1000 2000 "clearline"]
+	Line[386720 46279 385941 45500 1000 2000 "clearline"]
+	Line[376485 52855 372441 48811 1000 2000 "clearline"]
+	Line[376485 57386 376485 52855 1000 2000 "clearline"]
+	Line[384162 80614 384162 94000 1000 2000 "clearline"]
+	Line[432000 327882 434882 325000 1000 2000 "clearline"]
+	Line[432000 330000 432000 327882 1000 2000 "clearline"]
+	Line[426882 328441 423441 325000 1000 2000 "clearline"]
+	Line[426882 330000 426882 328441 1000 2000 "clearline"]
+	Line[397497 152944 393135 152944 1000 2000 "clearline"]
+	Line[398441 152000 397497 152944 1000 2000 "clearline"]
+	Line[397615 147826 398441 147000 1000 2000 "clearline"]
+	Line[393135 147826 397615 147826 1000 2000 "clearline"]
+	Line[395831 86000 398441 86000 1000 2000 "clearline"]
+	Line[392949 88882 395831 86000 1000 2000 "clearline"]
+	Line[395441 94000 398441 91000 1000 2000 "clearline"]
+	Line[392949 94000 395441 94000 1000 2000 "clearline"]
+	Line[393441 34059 396441 34059 1000 2000 ""]
+	Line[396441 34059 397941 32559 1000 2000 ""]
+	Line[397441 27000 395441 27000 1000 2000 ""]
+	Line[395441 27000 393441 29000 1000 2000 ""]
+	Line[306581 126060 307716 124925 800 1600 "clearline"]
+	Line[297976 126060 306581 126060 800 1600 "clearline"]
+	Line[297976 128029 308992 128029 800 1600 "clearline"]
+	Line[305390 129997 308872 133478 800 1600 "clearline"]
+	Line[297976 129997 305390 129997 800 1600 "clearline"]
+	Line[291991 92228 298420 92228 800 1600 "clearline"]
+	Line[290035 94185 291991 92228 800 1600 "clearline"]
+	Line[290035 95037 290035 94185 800 1600 "clearline"]
+	Line[295931 100628 297971 98589 800 1600 "clearline"]
+	Line[289428 100628 295931 100628 800 1600 "clearline"]
+	Line[288066 99265 289428 100628 800 1600 "clearline"]
+	Line[288066 95037 288066 99265 800 1600 "clearline"]
+	Line[247189 122124 245557 120492 800 1600 "clearline"]
+	Line[253106 122124 247189 122124 800 1600 "clearline"]
+	Line[253106 124093 245166 124093 800 1600 "clearline"]
+	Line[253106 120156 260641 120156 800 1600 "clearline"]
+	Line[295489 173808 312917 173808 1000 2000 "clearline"]
+	Line[284130 162449 295489 173808 1000 2000 "clearline"]
+	Line[284130 139907 284130 162449 1000 2000 "clearline"]
+	Line[296103 171876 312620 171876 1000 2000 "clearline"]
+	Line[286099 161872 296103 171876 1000 2000 "clearline"]
+	Line[286099 139907 286099 161872 1000 2000 "clearline"]
+	Line[238192 116219 227240 127171 1000 2000 "clearline"]
+	Line[253106 116219 238192 116219 1000 2000 "clearline"]
+	Line[232350 126061 229240 129171 1000 2000 "clearline"]
+	Line[253106 126061 232350 126061 1000 2000 "clearline"]
+	Line[252106 139171 248799 139171 1000 2000 "clearline"]
+	Line[253106 138171 252106 139171 1000 2000 "clearline"]
+	Line[253106 133935 253106 138171 1000 2000 "clearline"]
+	Line[266413 95037 266413 103406 800 1600 "clearline"]
+	Line[264444 95037 264444 101008 800 1600 "clearline"]
+	Line[264444 100875 263240 102079 800 1600 "clearline"]
+	Line[263240 102079 263240 104671 800 1600 "clearline"]
+	Line[262476 95037 260740 96773 800 1600 "clearline"]
+	Line[260740 96773 260740 106671 800 1600 "clearline"]
+	Line[260740 106671 262240 108171 800 1600 "clearline"]
+	Line[262240 108171 262740 108171 800 1600 "clearline"]
+	Line[253106 104408 254740 102774 800 1600 "clearline"]
+	Line[254740 102774 254740 101671 800 1600 "clearline"]
+	Line[297976 108344 332557 108344 800 1600 "clearline"]
+	Line[297976 112281 295178 112281 800 1600 "clearline"]
+	Line[286098 95037 286098 99560 800 1600 "clearline"]
+	Line[286098 99386 286098 99560 800 1600 "clearline"]
+	Line[286098 99525 286098 99569 800 1600 "clearline"]
+	Line[286098 99569 288774 102245 800 1600 "clearline"]
+	Line[288774 102245 296702 102245 800 1600 "clearline"]
+	Line[296702 102245 304176 94771 800 1600 "clearline"]
+	Line[274287 95037 274287 82311 800 1600 "clearline"]
+	Line[274287 82311 270726 78751 800 1600 "clearline"]
+	Line[270351 104057 270351 102067 800 1600 "clearline"]
+	Line[270351 102067 269653 101369 800 1600 "clearline"]
+	Line[270351 139907 270351 103976 800 1600 "clearline"]
+	Line[272319 139907 272319 104406 800 1600 "clearline"]
+	Line[272319 104406 272319 102328 800 1600 "clearline"]
+	Line[272319 102328 273229 101418 800 1600 "clearline"]
+	Line[278225 139907 278225 120398 800 1600 "clearline"]
+	Line[253106 114250 237756 114250 800 1600 "clearline"]
+	Line[237756 114250 225528 126478 800 1600 "clearline"]
+	Line[253106 112282 237358 112282 800 1600 "clearline"]
+	Line[237358 112282 223884 125756 800 1600 "clearline"]
+	Line[253106 128030 259552 128030 800 1600 "clearline"]
+	Line[259552 128030 262750 131228 800 1600 "clearline"]
+	Line[253106 110313 228091 110313 800 1600 "clearline"]
+	Line[245207 124093 242550 121436 800 1600 "clearline"]
+	Line[242550 121436 240391 121436 800 1600 "clearline"]
+	Line[295259 112281 293902 113638 800 1600 "clearline"]
+	Line[293902 113638 293902 117737 800 1600 "clearline"]
+	Line[260501 120156 261609 120156 800 1600 "clearline"]
+	Line[253106 118187 257905 118187 800 1600 "clearline"]
+	Line[257905 118187 260341 115751 800 1600 "clearline"]
+	Line[253106 131967 249600 131967 800 1600 "clearline"]
+	Line[249600 131967 249396 132171 800 1600 "clearline"]
+	Line[249396 132171 246240 132171 800 1600 "clearline"]
+	Line[239154 131778 239154 134644 800 1600 "clearline"]
+	Line[239154 134644 243681 139171 800 1600 "clearline"]
+	Line[292003 95037 296779 95037 800 1600 "clearline"]
+	Line[240788 136279 239302 137765 800 1600 "clearline"]
+	Line[290048 148000 290048 141606 800 1600 "clearline"]
+	Line[296748 147612 296748 146350 800 1600 "clearline"]
+	Line[292004 139907 294441 139907 800 1600 "clearline"]
+	Line[294348 139907 296748 142307 800 1600 "clearline"]
+	Line[296748 142307 296748 146307 800 1600 "clearline"]
+	Line[296748 152730 296748 155000 800 1600 "clearline"]
+	Line[296748 155000 296662 155086 800 1600 "clearline"]
+	Line[296662 155086 290441 155086 800 1600 "clearline"]
+	Line[295937 155086 295937 156372 800 1600 "clearline"]
+	Line[278224 95037 278224 101483 800 1600 "clearline"]
+	Line[276255 95037 276255 92700 800 1600 "clearline"]
+	Line[276255 92700 277174 91781 800 1600 "clearline"]
+	Line[253106 106376 252274 106376 800 1600 "clearline"]
+	Line[252274 106376 250724 104826 800 1600 "clearline"]
+	Line[250724 104826 250724 102935 800 1600 "clearline"]
+	Line[250724 102935 249939 102150 800 1600 "clearline"]
+	Line[249939 102150 246827 102150 800 1600 "clearline"]
+	Line[249757 107268 250834 108345 800 1600 "clearline"]
+	Line[250834 108345 254805 108345 800 1600 "clearline"]
+	Line[249757 107268 243267 107268 800 1600 "clearline"]
+	Line[243267 107268 242456 106457 800 1600 "clearline"]
+	Line[246335 102150 243118 102150 800 1600 "clearline"]
+	Line[243118 102150 242168 101200 800 1600 "clearline"]
+	Line[297976 104407 302689 104407 800 1600 "clearline"]
+	Line[302689 104407 304230 102866 800 1600 "clearline"]
+	Line[304230 102866 304230 100712 800 1600 "clearline"]
+	Line[304230 100712 305098 99844 800 1600 "clearline"]
+	Line[305098 99844 307954 99844 800 1600 "clearline"]
+	Line[305357 104962 303944 106375 800 1600 "clearline"]
+	Line[303944 106375 299675 106375 800 1600 "clearline"]
+	Line[305357 104962 312122 104962 800 1600 "clearline"]
+	Line[307462 99844 312157 99844 800 1600 "clearline"]
+	Line[280192 91333 275887 87028 800 1600 "clearline"]
+	Line[275887 87028 275887 81648 800 1600 "clearline"]
+	Line[278941 71008 278941 87000 800 1600 "clearline"]
+	Line[278941 87000 282161 90220 800 1600 "clearline"]
+	Line[282161 90220 282161 96736 800 1600 "clearline"]
+	Line[278941 71992 278941 62500 800 1600 "clearline"]
+	Line[278941 62500 280119 61322 800 1600 "clearline"]
+	Line[280119 61322 285430 61322 800 1600 "clearline"]
+	Line[277449 57441 277449 52500 800 1600 "clearline"]
+	Line[303365 80346 298786 80346 800 1600 "clearline"]
+	Line[298786 80346 296453 82679 800 1600 "clearline"]
+	Line[284129 95037 284129 90812 800 1600 "clearline"]
+	Line[284129 90812 285441 89500 800 1600 "clearline"]
+	Line[285441 89500 294941 89500 800 1600 "clearline"]
+	Line[294941 89500 296453 87988 800 1600 "clearline"]
+	Line[296453 87988 296453 82679 800 1600 "clearline"]
+	Line[303365 75228 303365 70000 800 1600 "clearline"]
+	Line[296453 59993 302941 59993 800 1600 "clearline"]
+	Line[285430 81350 285430 75000 800 1600 "clearline"]
+	Line[304176 94771 369319 94771 800 1600 "clearline"]
+	Line[297938 98622 303559 93000 800 1600 "clearline"]
+	Line[303559 93000 376441 93000 800 1600 "clearline"]
+	Line[298441 92228 302670 88000 800 1600 "clearline"]
+	Line[302670 88000 370441 88000 800 1600 "clearline"]
+	Line[371602 139772 371602 154657 800 1600 "clearline"]
+	Line[371602 154657 377944 161000 800 1600 "clearline"]
+	Line[396441 165000 395441 165000 800 1600 "clearline"]
+	Line[395441 165000 391838 168603 800 1600 "clearline"]
+	Line[391838 168603 391838 175386 800 1600 "clearline"]
+	Line[393441 45000 393441 41500 800 1600 "clearline"]
+	Line[385941 34000 393441 41500 800 1600 "clearline"]
+	Line[387182 95720 384902 98000 800 1600 "clearline"]
+	Line[384902 98000 381441 98000 800 1600 "clearline"]
+	Line[398441 109000 389279 99838 800 1600 "clearline"]
+	Line[389279 78311 389279 99838 800 1600 "clearline"]
+	Line[369319 94771 401986 127439 800 1600 "clearline"]
+	Line[401986 127439 401986 146236 800 1600 "clearline"]
+	Line[401986 146122 401986 154468 800 1600 "clearline"]
+	Line[401986 154468 391461 164993 800 1600 "clearline"]
+	Line[366441 142228 366441 196922 800 1600 "clearline"]
+	Line[366441 196922 374519 205000 800 1600 "clearline"]
+	Line[374519 205000 376510 205000 800 1600 "clearline"]
+	Line[389441 216000 398441 225000 800 1600 "clearline"]
+	Line[398441 225000 398441 227000 800 1600 "clearline"]
+	Line[440941 277000 398441 234500 2500 2000 "clearline"]
+	Line[398441 234500 398441 227000 2500 2000 "clearline"]
+	Line[389279 57386 389279 44087 1000 2000 "clearline"]
+	Line[386720 57386 386720 46279 1000 2000 "clearline"]
+	Line[387172 95730 387172 88000 800 1600 "clearline"]
+	Line[387172 88000 386720 87548 800 1600 "clearline"]
+	Line[386720 87548 386720 80614 800 1600 "clearline"]
+	Line[364841 143135 364841 197908 800 1600 "clearline"]
+	Line[364841 197908 374323 207390 800 1600 "clearline"]
+	Line[374323 207390 379833 207390 800 1600 "clearline"]
+	Line[379833 207390 379833 211914 800 1600 "clearline"]
+	Line[379833 211914 383246 215327 800 1600 "clearline"]
+	Line[383246 215327 385730 215327 800 1600 "clearline"]
+	Line[363241 143798 363241 198571 800 1600 "clearline"]
+	Line[363241 198571 377441 212771 800 1600 "clearline"]
+	Line[377441 212771 377441 231882 800 1600 "clearline"]
+	Line[377441 233605 377441 232000 800 1600 "clearline"]
+	Line[297976 116218 333399 116218 800 1600 "clearline"]
+	Line[297976 118186 333104 118186 800 1600 "clearline"]
+	Line[297976 122123 334778 122123 800 1600 "clearline"]
+	Line[333399 116218 361641 144460 800 1600 "clearline"]
+	Line[333104 118186 360041 145123 800 1600 "clearline"]
+	Line[334778 122123 358441 145786 800 1600 "clearline"]
+	Line[358441 145786 358441 148000 800 1600 "clearline"]
+	Line[120666 257660 119666 258660 2500 2000 "clearline"]
+	Line[119666 258660 113975 258660 2500 2000 "clearline"]
+	Line[120666 262660 116666 258660 2500 2000 "clearline"]
+	Line[116666 258660 115036 258660 2500 2000 "clearline"]
+	Line[141166 257660 154177 257660 2500 2000 "clearline"]
+	Line[154177 257660 155438 258921 2500 2000 "clearline"]
+	Line[141166 262660 151222 262660 2500 2000 "clearline"]
+	Line[151222 262660 155382 258500 2500 2000 "clearline"]
+	Line[222941 262500 232882 262500 2500 2000 "clearline"]
+	Line[141166 287660 155222 287660 2500 2000 "clearline"]
+	Line[155222 287660 155382 287500 2500 2000 "clearline"]
+	Line[155382 287500 150542 282660 2500 2000 "clearline"]
+	Line[150542 282660 144416 282660 2500 2000 "clearline"]
+	Line[114000 287008 114652 287660 2500 2000 "clearline"]
+	Line[114652 287660 123916 287660 2500 2000 "clearline"]
+	Line[120666 282660 118840 282660 2500 2000 "clearline"]
+	Line[118840 282660 114000 287500 2500 2000 "clearline"]
+	Line[195500 258008 196008 257500 2500 2000 "clearline"]
+	Line[196008 257500 205691 257500 2500 2000 "clearline"]
+	Line[202441 262500 199874 262500 2500 2000 "clearline"]
+	Line[199874 262500 195441 258067 2500 2000 "clearline"]
+	Line[195475 287168 195807 287500 2500 2000 "clearline"]
+	Line[195807 287500 205691 287500 2500 2000 "clearline"]
+	Line[202441 282500 200635 282500 2500 2000 "clearline"]
+	Line[200635 282500 195475 287660 2500 2000 "clearline"]
+	Line[222941 287500 236882 287500 2500 2000 "clearline"]
+	Line[222941 282500 231882 282500 2500 2000 "clearline"]
+	Line[231882 282500 236882 287500 2500 2000 "clearline"]
+	Line[159949 281059 160500 281610 2500 2000 "clearline"]
+	Line[160500 281610 160500 287500 2500 2000 "clearline"]
+	Line[108882 287008 108882 281118 2500 2000 "clearline"]
+	Line[108882 281118 108941 281059 2500 2000 "clearline"]
+	Line[108857 258168 108857 263857 2500 2000 "clearline"]
+	Line[108857 263857 108941 263941 2500 2000 "clearline"]
+	Line[160500 258008 160500 263941 2500 2000 "clearline"]
+	Line[190382 258008 190382 263941 2500 2000 "clearline"]
+	Line[241449 281059 241449 286949 2500 2000 "clearline"]
+	Line[241449 286949 242000 287500 2500 2000 "clearline"]
+	Line[189949 281059 189949 287660 2500 2000 "clearline"]
+	Line[112542 272660 108941 269059 2500 2000 "clearline"]
+	Line[112222 272660 108941 275941 2500 2000 "clearline"]
+	Line[159949 269059 160441 269551 2500 2000 "clearline"]
+	Line[160441 269551 160441 275941 2500 2000 "clearline"]
+	Line[189949 269059 193390 272500 2500 2000 "clearline"]
+	Line[193882 272500 190441 275941 2500 2000 "clearline"]
+	Line[241449 269059 241941 269551 2500 2000 "clearline"]
+	Line[241941 269551 241941 275941 2500 2000 "clearline"]
+	Line[160441 272500 163941 272500 2500 2000 "clearline"]
+	Line[241941 272500 245441 272500 2500 2000 "clearline"]
+	Line[114441 278500 115281 277660 800 1600 "clearline"]
+	Line[115281 277660 123916 277660 800 1600 "clearline"]
+	Line[115441 267500 115601 267660 800 1600 "clearline"]
+	Line[115601 267660 123916 267660 800 1600 "clearline"]
+	Line[152441 278500 151601 277660 800 1600 "clearline"]
+	Line[151601 277660 144416 277660 800 1600 "clearline"]
+	Line[151941 268000 151601 267660 800 1600 "clearline"]
+	Line[151601 267660 144416 267660 800 1600 "clearline"]
+	Line[131882 267844 131882 252000 2500 2000 "clearline"]
+	Line[137000 251508 137000 269059 2500 2000 "clearline"]
+	Line[137000 251508 137492 252000 2500 2000 "clearline"]
+	Line[137492 252000 141441 252000 2500 2000 "clearline"]
+	Line[131882 251508 131390 252000 2500 2000 "clearline"]
+	Line[131390 252000 127941 252000 2500 2000 "clearline"]
+	Line[198441 277500 205691 277500 800 1600 "clearline"]
+	Line[195441 267000 195941 267500 800 1600 "clearline"]
+	Line[195941 267500 205691 267500 800 1600 "clearline"]
+	Line[213882 267559 213882 251500 2500 2000 "clearline"]
+	Line[219000 268559 219000 251500 2500 2000 "clearline"]
+	Line[213882 251008 212890 252000 2500 2000 "clearline"]
+	Line[219000 251992 219008 252000 2500 2000 "clearline"]
+	Line[219008 252000 223941 252000 2500 2000 "clearline"]
+	Line[234441 277500 226191 277500 800 1600 "clearline"]
+	Line[235941 267000 235441 267500 800 1600 "clearline"]
+	Line[235441 267500 226191 267500 800 1600 "clearline"]
+	Line[130941 168772 130453 169260 2500 2000 "clearline"]
+	Line[130453 169260 130453 188630 2500 2000 "clearline"]
+	Line[135941 168772 135571 169142 2500 2000 "clearline"]
+	Line[135571 169142 135571 182630 2500 2000 "clearline"]
+	Line[140941 168772 141012 168843 2500 2000 "clearline"]
+	Line[145941 168772 146130 168961 2500 2000 "clearline"]
+	Line[160941 168772 160941 179500 2500 2000 "clearline"]
+	Line[160941 179500 164571 183130 2500 2000 "clearline"]
+	Line[164571 183130 164571 187630 2500 2000 "clearline"]
+	Line[164571 187630 163571 188630 2500 2000 "clearline"]
+	Line[163571 188630 163071 194630 2500 2000 "clearline"]
+	Line[163071 195122 163000 195193 2500 2000 "clearline"]
+	Line[145941 135307 146130 135496 2500 2000 "clearline"]
+	Line[146130 135496 146130 174000 2500 2000 "clearline"]
+	Line[148799 91171 141799 91112 2500 2000 "clearline"]
+	Line[141307 91112 126799 91112 2500 2000 "clearline"]
+	Line[148799 96171 148740 96230 2500 2000 "clearline"]
+	Line[148740 96230 141799 96230 2500 2000 "clearline"]
+	Line[141307 96230 141307 99117 2500 2000 "clearline"]
+	Line[140949 71059 141061 71171 2500 2000 "clearline"]
+	Line[141061 71171 151799 71171 2500 2000 "clearline"]
+	Line[151799 71171 151799 76171 2500 2000 "clearline"]
+	Line[148799 71171 158441 71171 2500 2000 "clearline"]
+	Line[158441 71171 158441 75500 2500 2000 "clearline"]
+	Line[148799 76171 158441 76171 2500 2000 "clearline"]
+	Line[158441 76171 158441 73000 2500 2000 "clearline"]
+	Line[140949 76441 141219 76171 2500 2000 "clearline"]
+	Line[141219 76171 151799 76171 2500 2000 "clearline"]
+	Line[140949 81559 140949 85508 2500 2000 "clearline"]
+	Line[140949 85508 141799 86358 2500 2000 "clearline"]
+	Line[141799 86358 141799 91112 2500 2000 "clearline"]
+	Line[148799 101171 148599 101371 2500 2000 "clearline"]
+	Line[148599 101371 148599 107771 2500 2000 "clearline"]
+	Line[148299 107771 145899 110171 2500 2000 "clearline"]
+	Line[145899 110171 126799 110171 2500 2000 "clearline"]
+	Line[167299 101171 156799 111671 2500 2000 "clearline"]
+	Line[167299 101171 197799 101171 2500 2000 "clearline"]
+	Line[197307 76112 187799 76112 2500 2000 "clearline"]
+	Line[148799 66171 141441 66171 2500 2000 "clearline"]
+	Line[124831 90486 124831 97615 2500 2000 "clearline"]
+	Line[108857 258168 108857 249184 800 1600 "clearline"]
+	Line[190382 258992 190382 255059 800 1600 "clearline"]
+	Line[190382 255059 197441 248000 800 1600 "clearline"]
+	Line[242000 287008 246992 292000 800 1600 "clearline"]
+	Line[246992 292000 279941 292000 800 1600 "clearline"]
+	Line[279941 292000 280941 291000 800 1600 "clearline"]
+	Line[280941 291000 280941 286500 800 1600 "clearline"]
+	Line[280941 286500 278619 284178 800 1600 "clearline"]
+	Line[278619 284178 274688 284178 800 1600 "clearline"]
+	Line[245000 264059 242000 264059 800 1600 "clearline"]
+	Line[197441 248000 245141 248000 800 1600 "clearline"]
+	Line[245141 248000 258308 261167 800 1600 "clearline"]
+	Line[280221 281782 280909 281094 800 1600 "clearline"]
+	Line[280909 281094 280909 276966 800 1600 "clearline"]
+	Line[280909 277000 278088 274178 800 1600 "clearline"]
+	Line[278088 274178 274688 274178 800 1600 "clearline"]
+	Line[246941 246000 196941 246000 800 1600 "clearline"]
+	Line[189878 250800 196310 244368 800 1600 "clearline"]
+	Line[196310 244368 248572 244368 800 1600 "clearline"]
+	Line[248572 244368 268382 264178 800 1600 "clearline"]
+	Line[268382 264178 274688 264178 800 1600 "clearline"]
+	Line[165241 249200 189215 249200 800 1600 "clearline"]
+	Line[189215 249200 195678 242737 800 1600 "clearline"]
+	Line[195678 242737 250704 242737 800 1600 "clearline"]
+	Line[250678 242737 250704 242737 800 1600 "clearline"]
+	Line[250704 242737 269573 261606 800 1600 "clearline"]
+	Line[269573 261606 279063 261606 800 1600 "clearline"]
+	Line[279972 269178 274688 269178 800 1600 "clearline"]
+	Line[280691 252970 280691 256686 800 1600 "clearline"]
+	Line[280691 256686 278199 259178 800 1600 "clearline"]
+	Line[278199 259178 274688 259178 800 1600 "clearline"]
+	Line[291938 264178 304263 264178 2500 2000 "clearline"]
+	Line[304263 264178 304941 263500 2500 2000 "clearline"]
+	Line[304472 258432 303726 259178 2500 2000 "clearline"]
+	Line[303726 259178 295188 259178 2500 2000 "clearline"]
+	Line[291938 254178 300709 254178 2500 2000 "clearline"]
+	Line[300709 254178 304964 258432 2500 2000 "clearline"]
+	Line[305696 284060 310941 284060 2500 2000 "clearline"]
+	Line[304472 263550 309441 263550 2500 2000 "clearline"]
+	Line[304472 258432 309441 258432 2500 2000 "clearline"]
+	Line[291938 289178 306188 289178 2500 2000 "clearline"]
+	Line[305696 289178 305696 292500 2500 2000 "clearline"]
+	Line[291938 274178 307525 274178 800 1600 "clearline"]
+	Line[307525 274178 329417 252287 800 1600 "clearline"]
+	Line[291938 279178 304788 279178 800 1600 "clearline"]
+	Line[291938 284178 299638 284178 800 1600 "clearline"]
+	Line[299638 284178 303038 280778 800 1600 "clearline"]
+	Line[303038 280778 305451 280778 800 1600 "clearline"]
+	Line[328601 253102 332661 249042 800 1600 "clearline"]
+	Line[332661 249042 332661 212047 800 1600 "clearline"]
+	Line[304700 279178 304927 279178 800 1600 "clearline"]
+	Line[334308 249798 334308 211431 800 1600 "clearline"]
+	Line[305083 280778 305590 280778 800 1600 "clearline"]
+	Line[305590 280778 335927 250442 800 1600 "clearline"]
+	Line[312289 189417 304706 189417 800 1600 "clearline"]
+	Line[334308 211367 312358 189417 800 1600 "clearline"]
+	Line[332661 212000 313178 192517 800 1600 "clearline"]
+	Line[313178 192517 304584 192517 800 1600 "clearline"]
+	Line[270708 78733 264708 78733 800 1600 "clearline"]
+	Line[264708 78733 263441 80000 800 1600 "clearline"]
+	Line[274802 153844 280193 148453 800 1600 "clearline"]
+	Line[280193 148453 280193 141606 800 1600 "clearline"]
+	Line[282162 139907 282162 151851 800 1600 "clearline"]
+	Line[282162 151851 279206 154807 800 1600 "clearline"]
+	Line[279206 154807 279206 169766 800 1600 "clearline"]
+	Line[237387 220023 220345 220023 800 1600 "clearline"]
+	Line[220345 220023 215709 215387 800 1600 "clearline"]
+	Line[215709 215387 215709 215248 800 1600 "clearline"]
+	Line[262477 139907 262477 146464 800 1600 "clearline"]
+	Line[262477 146464 246941 162000 800 1600 "clearline"]
+	Line[264445 139907 264445 148496 800 1600 "clearline"]
+	Line[264445 148496 242441 170500 800 1600 "clearline"]
+	Line[266414 139907 266441 150500 800 1600 "clearline"]
+	Line[266441 150500 246441 170500 800 1600 "clearline"]
+	Line[268382 139907 268382 153059 800 1600 "clearline"]
+	Line[268382 153059 250941 170500 800 1600 "clearline"]
+	Line[223884 125756 223884 144000 800 1600 "clearline"]
+	Line[223884 144000 221884 146000 800 1600 "clearline"]
+	Line[225528 126478 225528 146913 800 1600 "clearline"]
+	Line[225528 146913 224441 148000 800 1600 "clearline"]
+	Line[360041 145123 360041 190000 800 1600 "clearline"]
+	Line[358441 148000 358441 165000 800 1600 "clearline"]
+	Line[358441 165000 356441 167000 800 1600 "clearline"]
+	Line[312620 171876 336441 171876 800 1600 "clearline"]
+	Line[336441 171876 338441 169876 800 1600 "clearline"]
+	Line[312917 173808 336441 173808 800 1600 "clearline"]
+	Line[336441 173808 338441 175808 800 1600 "clearline"]
+	Line[361641 144460 361641 199233 800 1600 "clearline"]
+	Line[369127 228686 369127 228686 800 1600 "clearline"]
+	Line[297976 133934 301042 137000 800 1600 "clearline"]
+	Line[301042 137000 318441 137000 800 1600 "clearline"]
+	Line[318441 137000 332441 151000 800 1600 "clearline"]
+	Line[289441 137000 288067 138374 800 1600 "clearline"]
+	Line[288067 138374 288067 141606 800 1600 "clearline"]
+	Line[227240 127171 227240 149201 800 1600 "clearline"]
+	Line[227240 149201 225441 151000 800 1600 "clearline"]
+	Line[229240 129171 229240 151799 800 1600 "clearline"]
+	Line[229240 151799 230441 153000 800 1600 "clearline"]
+	Line[253106 129998 257334 129998 800 1600 "clearline"]
+	Line[220729 134420 218246 131937 800 1600 "clearline"]
+	Line[219441 127500 222262 124679 800 1600 "clearline"]
+	Line[222262 124679 222262 119468 800 1600 "clearline"]
+	Line[203519 107078 217441 121000 800 1600 "clearline"]
+	Line[218309 132000 216941 130632 800 1600 "clearline"]
+	Line[216941 130632 216941 125500 800 1600 "clearline"]
+	Line[216941 125500 219941 122500 800 1600 "clearline"]
+	Line[219941 122500 219941 118500 800 1600 "clearline"]
+	Line[219941 118500 205941 104500 800 1600 "clearline"]
+	Line[205941 104500 205941 74853 800 1600 "clearline"]
+	Line[205941 74853 197259 66171 800 1600 "clearline"]
+	Line[197259 66171 187799 66171 800 1600 "clearline"]
+	Line[222262 119500 222262 116821 800 1600 "clearline"]
+	Line[222262 116821 208441 103000 800 1600 "clearline"]
+	Line[208441 103000 208441 74500 800 1600 "clearline"]
+	Line[208441 74500 197441 63500 800 1600 "clearline"]
+	Line[197441 63500 180941 63500 800 1600 "clearline"]
+	Line[228128 110313 220754 110313 800 1600 "clearline"]
+	Line[220754 110313 210941 100500 800 1600 "clearline"]
+	Line[210941 100500 210941 74000 800 1600 "clearline"]
+	Line[210941 74000 198441 61500 800 1600 "clearline"]
+	Line[198441 61500 179441 61500 800 1600 "clearline"]
+	Line[179441 61500 159770 81171 800 1600 "clearline"]
+	Line[159770 81171 151799 81171 800 1600 "clearline"]
+	Line[180941 63500 158270 86171 800 1600 "clearline"]
+	Line[158270 86171 151799 86171 800 1600 "clearline"]
+	Line[274288 139907 274288 144181 800 1600 "clearline"]
+	Line[274288 144181 269982 148487 800 1600 "clearline"]
+	Line[275887 81648 271118 76879 800 1600 "clearline"]
+	Line[271118 76879 261394 76879 800 1600 "clearline"]
+	Line[261394 76879 260568 77705 800 1600 "clearline"]
+	Line[260568 77705 260568 83003 800 1600 "clearline"]
+	Line[297976 120155 296286 120155 800 1600 "clearline"]
+	Line[296286 120155 294441 122000 800 1600 "clearline"]
+	Line[294441 122000 288441 122000 800 1600 "clearline"]
+	Line[288441 122000 281441 115000 800 1600 "clearline"]
+	Line[281441 115000 279441 115000 800 1600 "clearline"]
+	Line[261609 120156 264034 117731 800 1600 "clearline"]
+	Line[264034 117731 264034 117069 800 1600 "clearline"]
+	Line[266978 130582 266978 113347 800 1600 "clearline"]
+	Line[266978 113347 262278 113347 800 1600 "clearline"]
+	Line[262278 113347 258841 109910 800 1600 "clearline"]
+	Line[258841 109910 258841 97900 800 1600 "clearline"]
+	Line[245312 50107 230441 64978 800 1600 "clearline"]
+	Line[230441 64978 230441 107000 800 1600 "clearline"]
+	Line[245312 57107 240441 61978 800 1600 "clearline"]
+	Line[240441 61978 240441 90679 800 1600 "clearline"]
+	Line[240441 90679 246731 96969 800 1600 "clearline"]
+	Line[258841 97900 245355 84414 800 1600 "clearline"]
+	Line[245355 84414 245355 64500 800 1600 "clearline"]
+	Line[252441 64107 252834 64500 2500 2000 "clearline"]
+	Line[252834 64500 260882 64500 2500 2000 "clearline"]
+	Line[260839 57008 260347 57500 2500 2000 "clearline"]
+	Line[260347 57500 252398 57500 2500 2000 "clearline"]
+	Line[252398 50107 252791 50500 2500 2000 "clearline"]
+	Line[252791 50500 260839 50500 2500 2000 "clearline"]
+	Line[265957 50008 265957 57500 2500 2000 "clearline"]
+	Line[265957 57500 266000 57543 2500 2000 "clearline"]
+	Line[266000 57543 266000 64500 2500 2000 "clearline"]
+	Line[265957 50008 266449 50500 2500 2000 "clearline"]
+	Line[266449 50500 270441 50500 2500 2000 "clearline,rubberend"]
+	Line[265957 57992 266449 57500 2500 2000 "clearline"]
+	Line[266449 57500 270441 57500 2500 2000 "clearline"]
+	Line[266000 64008 266008 64000 2500 2000 "clearline"]
+	Line[266008 64000 270441 64000 2500 2000 "clearline"]
+	Line[388207 152720 388207 157019 800 1600 "clearline"]
+	Line[388207 157019 392188 161000 800 1600 "clearline"]
+	Line[191363 55551 179851 44038 800 1600 "clearline"]
+	Line[179851 44038 173850 44038 800 1600 "clearline"]
+	Line[151115 40500 145803 35189 800 1600 "clearline"]
+	Line[178887 57182 162155 57182 800 1600 "clearline"]
+	Line[162155 57182 145249 40276 800 1600 "clearline"]
+	Line[145249 40276 139132 40276 800 1600 "clearline"]
+	Line[139132 40276 135740 36883 800 1600 "clearline"]
+	Line[135740 36883 135740 35068 800 1600 "clearline"]
+	Line[280192 91333 280192 99691 800 1600 "clearline"]
+	Line[280192 99691 281692 101191 800 1600 "clearline"]
+	Line[281692 101191 281692 106164 800 1600 "clearline"]
+	Line[281692 106164 275876 111980 800 1600 "clearline"]
+	Line[275876 111980 275876 115363 800 1600 "clearline"]
+	Line[275876 115363 277826 117313 800 1600 "clearline"]
+	Line[277826 117313 279890 117313 800 1600 "clearline"]
+	Line[279890 117313 294482 131905 800 1600 "clearline"]
+	Line[294482 131905 294482 134457 800 1600 "clearline"]
+	Line[294482 134457 298803 138778 800 1600 "clearline"]
+	Line[298803 138778 317755 138778 800 1600 "clearline"]
+	Line[317755 138778 327407 148430 800 1600 "clearline"]
+	Line[327407 148430 327407 153590 800 1600 "clearline"]
+	Line[327407 153590 330486 156669 800 1600 "clearline"]
+	Line[330486 156669 336772 156669 800 1600 "clearline"]
+	Line[336772 156669 342441 151000 800 1600 "clearline"]
+	Line[313869 142428 322441 151000 800 1600 "clearline"]
+	Line[339837 58173 349316 58173 800 1600 "clearline"]
+	Line[349316 58173 358050 49439 800 1600 "clearline"]
+	Line[358050 49439 358050 46749 800 1600 "clearline"]
+	Line[358050 46749 363061 41738 800 1600 "clearline"]
+	Line[371157 41738 363061 41738 800 1600 "clearline"]
+	Line[353390 60479 360933 52936 800 1600 "clearline"]
+	Line[360933 52936 360933 47664 800 1600 "clearline"]
+	Line[360933 47664 363598 45000 800 1600 "clearline"]
+	Line[370441 45000 363598 45000 800 1600 "clearline"]
+	Line[237441 172955 218396 192000 800 1600 "clearline"]
+	Line[218396 192000 189441 192000 800 1600 "clearline"]
+	Line[189441 192000 172611 208830 800 1600 "clearline"]
+	Line[225824 215194 231840 209178 800 1600 "clearline"]
+	Line[231840 209178 239183 209178 800 1600 "clearline"]
+	Line[239183 209178 274802 173559 800 1600 "clearline"]
+	Line[274802 153844 274802 173559 800 1600 "clearline"]
+	Line[250914 211240 250914 217691 800 1600 "clearline"]
+	Line[250914 217691 248581 220023 800 1600 "clearline"]
+	Line[248581 220023 233567 220023 800 1600 "clearline"]
+	Line[335927 250442 337441 248928 800 1600 "clearline"]
+	Line[337441 248928 337441 237000 800 1600 "clearline"]
+	Line[361641 199300 369127 206786 800 1600 "clearline"]
+	Line[369127 230612 369127 206786 800 1600 "clearline"]
+	Line[168732 44038 168732 49167 2500 2000 "clearline"]
+	Line[151115 40500 172571 40500 800 1600 "clearline"]
+	Line[172571 40500 173850 41779 800 1600 "clearline"]
+	Line[173850 41779 173850 44038 800 1600 "clearline"]
+	Line[369127 230612 376337 237822 800 1600 "clearline"]
+	Line[376337 237822 377347 237822 800 1600 "clearline"]
+	Line[237359 172955 252223 172955 800 1600 "clearline"]
+	Line[252223 172955 256778 168400 800 1600 "clearline"]
+	Line[256810 168369 269982 155196 800 1600 "clearline"]
+	Line[269982 148487 269982 155196 800 1600 "clearline"]
+	Line[313869 142428 299592 142428 800 1600 "clearline"]
+	Line[299592 142428 294164 137000 800 1600 "clearline"]
+	Line[294164 137000 289441 137000 800 1600 "clearline"]
+	Line[257443 129998 261210 133765 800 1600 "clearline"]
+	Line[261210 133765 263795 133765 800 1600 "clearline"]
+	Line[263795 133765 266978 130582 800 1600 "clearline"]
+	Line[184799 71171 199112 71171 800 1600 "clearline"]
+	Line[199112 71171 203441 75500 800 1600 "clearline"]
+	Line[203441 75500 203441 107000 800 1600 "clearline"]
+	Line[203441 107000 204441 108000 800 1600 "clearline"]
+	Line[222941 257500 235178 257500 2500 2000 "clearline"]
+	Line[235178 257500 236178 258500 2500 2000 "clearline"]
+	Line[236178 258500 236382 258500 2500 2000 "clearline"]
+	Line[232882 262500 236382 259000 2500 2000 "clearline"]
+	Line[236382 259000 236382 258500 2500 2000 "clearline"]
+	Line[241500 258008 241500 263059 2500 2000 "clearline"]
+	Line[241500 263059 242441 264000 2500 2000 "clearline"]
+	Line[279047 261606 281047 261606 800 1600 "clearline"]
+	Line[281047 261606 282441 263000 800 1600 "clearline"]
+	Line[282441 263000 282441 266709 800 1600 "clearline"]
+	Line[279972 269178 282441 266709 800 1600 "clearline"]
+	Line[108857 249184 111041 247000 800 1600 "clearline"]
+	Line[111041 247000 188441 247000 800 1600 "clearline"]
+	Line[188441 247000 194941 240500 800 1600 "clearline"]
+	Line[194941 240500 251941 240500 800 1600 "clearline"]
+	Line[251941 240500 265619 254178 800 1600 "clearline"]
+	Line[265619 254178 274688 254178 800 1600 "clearline"]
+	Line[187441 245000 193941 238500 800 1600 "clearline"]
+	Line[193941 238500 253441 238500 800 1600 "clearline"]
+	Line[266441 251500 279221 251500 800 1600 "clearline"]
+	Line[279221 251500 280691 252970 800 1600 "clearline"]
+	Line[304927 279178 334308 249798 800 1600 "clearline"]
+	Line[291938 269178 309763 269178 800 1600 "clearline"]
+	Line[309763 269178 320804 258137 800 1600 "clearline"]
+	Line[320804 258137 320804 206075 800 1600 "clearline"]
+	Line[320804 206000 310421 195617 800 1600 "clearline"]
+	Line[310421 195617 305280 195617 800 1600 "clearline"]
+	Line[297976 114249 333942 114249 800 1600 "clearline"]
+	Line[333942 114249 363241 143548 800 1600 "clearline"]
+	Line[363241 143548 363241 144454 800 1600 "clearline"]
+	Line[297976 110312 332396 110312 800 1600 "clearline"]
+	Line[332396 110312 364841 142757 800 1600 "clearline"]
+	Line[364841 142757 364841 143543 800 1600 "clearline"]
+	Line[332251 108344 332761 108344 800 1600 "clearline"]
+	Line[332761 108344 366441 142024 800 1600 "clearline"]
+	Line[366441 142024 366441 143131 800 1600 "clearline"]
+	Line[358941 191500 360041 190400 800 1600 "clearline"]
+	Line[360041 190400 360041 170100 800 1600 "clearline"]
+	Line[99311 156630 107571 156630 4000 2000 ""]
+	Line[86941 300905 86941 241500 5500 2000 ""]
+	Line[102449 188559 102347 188457 2500 2000 "clearline"]
+	Line[102347 188457 95941 188457 2500 2000 "clearline"]
+	Line[95548 195543 95591 195500 2500 2000 "clearline"]
+	Line[95591 195500 104441 195500 2500 2000 "clearline"]
+	Line[170949 168118 170067 169000 2500 2000 "clearline"]
+	Line[170067 169000 165941 169000 2500 2000 "clearline"]
+	Line[170949 163000 170441 162492 2500 2000 "clearline"]
+	Line[170441 162492 170441 158543 2500 2000 "clearline"]
+	Line[170048 151457 170005 151500 2500 2000 "clearline"]
+	Line[170005 151500 162441 151500 2500 2000 "clearline"]
+	Line[377441 233605 386151 242315 800 1600 "clearline"]
+	Line[264382 89508 261502 92388 800 1600 "clearline"]
+	Line[261502 92388 261502 92633 800 1600 "clearline"]
+	Line[270350 95037 270350 90850 800 1600 "clearline"]
+	Line[270350 90850 269500 90000 800 1600 "clearline"]
+	Line[269500 89508 268941 88949 800 1600 "clearline"]
+	Line[268941 88949 268941 86000 800 1600 "clearline"]
+	Line[272318 95037 272318 84615 800 1600 "clearline"]
+	Line[272318 84615 269965 82262 800 1600 "clearline"]
+	Line[269965 82262 265196 82262 800 1600 "clearline"]
+	Line[265196 82262 260348 87110 800 1600 "clearline"]
+	Line[260348 87110 257209 87110 800 1600 "clearline"]
+	Line[257209 87110 254546 84448 800 1600 "clearline"]
+	Line[254546 84448 254546 76653 800 1600 "clearline"]
+	Line[254546 76653 249101 71207 800 1600 "clearline"]
+	Line[229818 45012 231331 43500 800 1600 "clearline"]
+	Line[231331 43500 245355 43500 800 1600 "clearline"]
+	Line[252441 43107 252834 43500 2500 2000 "clearline"]
+	Line[252834 43500 260882 43500 2500 2000 "clearline"]
+	Line[266000 43008 266000 50500 2500 2000 "clearline"]
+	Line[266000 43008 270441 43008 2500 2000 "clearline"]
+	Line[172691 208750 170941 210500 800 1600 "clearline"]
+	Line[170941 210500 170941 217000 800 1600 "clearline"]
+	Line[170941 217000 167941 220000 800 1600 "clearline"]
+	Line[167941 220000 149441 220000 800 1600 "clearline"]
+	Line[149441 220000 145717 216276 800 1600 "clearline"]
+	Line[145717 216276 145717 215185 800 1600 "clearline"]
+	Line[140941 168772 140882 168831 2500 2000 "clearline"]
+	Line[140882 168831 140882 181500 2500 2000 "clearline"]
+	Line[145941 168772 146000 168831 2500 2000 "clearline"]
+	Line[146000 168831 146000 185398 2500 2000 "clearline"]
+	Line[146000 185398 143898 187500 2500 2000 "clearline"]
+	Line[143898 187500 143898 194500 2500 2000 "clearline"]
+	Line[143898 194107 145036 195245 2500 2000 "clearline"]
+	Line[145036 195245 145036 204000 2500 2000 "clearline"]
+	Line[150941 168772 150984 168815 2500 2000 "clearline"]
+	Line[150984 168815 150984 187500 2500 2000 "clearline"]
+	Line[155941 168772 155941 179672 2500 2000 "clearline"]
+	Line[155941 179672 157485 181216 2500 2000 "clearline"]
+	Line[157485 181216 157485 187630 2500 2000 "clearline"]
+	Line[157485 187630 157398 187717 2500 2000 "clearline"]
+	Line[157398 187717 157398 194500 2500 2000 "clearline"]
+	Line[157398 194500 150984 194500 2500 2000 "clearline"]
+	Line[340186 301596 329941 301596 2500 2000 "clearline"]
+	Line[340186 301596 353282 288500 2500 2000 "clearline"]
+	Line[353282 288500 371941 288500 2500 2000 "clearline"]
+	Line[356823 328008 356941 327890 2500 2000 "clearline"]
+	Line[361941 328008 361941 318421 2500 2000 "clearline"]
+	Line[374548 341501 374549 341500 2500 2000 "clearline"]
+	Line[374549 341500 382780 341499 2500 2000 "clearline"]
+	Line[386941 315272 386941 325501 2500 2000 "clearline"]
+	Line[376941 315272 376941 327001 2500 2000 "clearline"]
+	Line[371941 281807 371941 318421 2500 2000 "clearline"]
+	Line[386941 325501 390441 329001 2500 2000 "clearline"]
+	Line[390441 329001 390527 333500 2500 2000 "clearline"]
+	Line[390527 333107 390484 338913 2500 2000 "clearline"]
+	Line[390484 338913 387898 341499 2500 2000 "clearline"]
+	Line[387898 341499 387941 346500 2500 2000 "clearline"]
+	Line[397548 301958 397548 297108 2500 2000 "clearline"]
+	Line[397548 297108 394941 294501 2500 2000 "clearline"]
+	Line[394941 294501 387441 294501 2500 2000 "clearline"]
+	Line[397548 309044 397941 309437 2500 2000 "clearline"]
+	Line[397941 309437 397941 315501 2500 2000 "clearline"]
+	Line[397449 320619 392567 325501 2500 2000 "clearline"]
+	Line[392567 325501 391941 325501 2500 2000 "clearline"]
+	Line[86941 301000 102941 317000 5500 2000 "clearline"]
+	Line[102941 317000 318941 317000 5500 2000 "clearline"]
+	Line[268381 95037 268381 94174 800 1600 "clearline"]
+	Line[268381 94174 264382 90175 800 1600 "clearline"]
+	Line[264382 90175 264382 90000 800 1600 "clearline"]
+	Line[275291 179048 245863 208476 2500 2000 "clearline"]
+	Line[279206 182948 250914 211240 800 1600 "clearline"]
+	Line[279206 169735 279206 182948 800 1600 "clearline"]
+	Line[135571 188138 136777 188138 2500 2000 "clearline"]
+	Line[136777 188138 139107 185809 2500 2000 "clearline"]
+	Line[139107 185809 139107 183275 2500 2000 "clearline"]
+	Line[139107 183275 140882 181500 2500 2000 "clearline"]
+	Line[366941 315272 366882 315331 2500 2000 "clearline"]
+	Line[366882 315331 366882 328001 2500 2000 "clearline"]
+	Line[366882 328493 365467 329908 2500 2000 "clearline"]
+	Line[365467 329908 365467 331317 2500 2000 "clearline"]
+	Line[365467 331317 362284 334500 2500 2000 "clearline"]
+	Line[371941 315272 372000 315331 2500 2000 "clearline"]
+	Line[372000 315331 372000 332398 2500 2000 "clearline"]
+	Line[372000 332398 370398 334000 2500 2000 "clearline"]
+	Line[376941 327000 377484 327543 2500 2000 "clearline"]
+	Line[377484 327543 377484 334000 2500 2000 "clearline"]
+	Line[381941 315272 381941 327000 2500 2000 "clearline"]
+	Line[381941 327000 384398 329457 2500 2000 "clearline"]
+	Line[384398 329457 384398 333500 2500 2000 "clearline"]
+	Line[384398 333107 383441 334064 2500 2000 "clearline"]
+	Line[383441 334064 383441 337000 2500 2000 "clearline"]
+	Line[383441 337000 382440 338001 2500 2000 "clearline"]
+	Line[382440 338001 382440 341499 2500 2000 "clearline"]
+	Line[374548 348587 379961 354000 2500 2000 "clearline"]
+	Line[379961 354000 381536 354000 2500 2000 "clearline"]
+	Line[370398 333607 369441 334564 2500 2000 "clearline"]
+	Line[369441 334564 369441 345500 2500 2000 "clearline"]
+	Line[369441 345500 372528 348587 2500 2000 "clearline"]
+	Line[372528 348587 374548 348587 2500 2000 "clearline"]
+	Line[141166 272660 160281 272660 2500 2000 "clearline"]
+	Line[160281 272660 160441 272500 2500 2000 "clearline"]
+	Line[131882 267844 127066 272660 2500 2000 "clearline"]
+	Line[127066 272660 123916 272660 2500 2000 "clearline"]
+	Line[137000 269441 140219 272660 2500 2000 "clearline"]
+	Line[140219 272660 141441 272660 2500 2000 "clearline"]
+	Line[165441 249200 163241 249200 800 1600 "clearline"]
+	Line[163241 249200 160441 252000 800 1600 "clearline"]
+	Line[160534 251503 160500 251536 800 1600 "clearline"]
+	Line[160500 251536 160500 258441 800 1600 "clearline"]
+	Line[160933 263941 161211 263663 800 1600 "clearline"]
+	Line[161211 263663 165975 263663 800 1600 "clearline"]
+	Line[165483 268781 165483 270958 2500 2000 "clearline"]
+	Line[165483 270958 163941 272500 2500 2000 "clearline"]
+	Line[163941 272500 166441 275000 2500 2000 "clearline"]
+	Line[166441 275000 166441 275941 2500 2000 "clearline"]
+	Line[190178 250500 189746 250932 800 1600 "clearline"]
+	Line[189746 250932 175256 250932 800 1600 "clearline"]
+	Line[108449 281059 102441 281059 2500 2000 "clearline"]
+	Line[102441 281059 102401 281099 2500 2000 "clearline"]
+	Line[102401 281099 102401 286565 2500 2000 "clearline"]
+	Line[101949 275941 101978 275970 2500 2000 "clearline"]
+	Line[101978 275970 108912 275970 2500 2000 "clearline"]
+	Line[102191 259042 102790 259642 2500 2000 "clearline"]
+	Line[102790 259642 102790 263865 2500 2000 "clearline"]
+	Line[102790 263865 103009 264084 2500 2000 "clearline"]
+	Line[103009 264084 108857 264084 2500 2000 "clearline"]
+	Line[102191 253924 104615 251500 800 1600 "clearline"]
+	Line[104615 251500 106441 251500 800 1600 "clearline"]
+	Line[187441 245000 103941 245000 800 1600 "clearline"]
+	Line[103941 245000 97441 251500 800 1600 "clearline"]
+	Line[97441 251500 97441 281500 800 1600 "clearline"]
+	Line[97441 281500 99941 284000 800 1600 "clearline"]
+	Line[99941 284000 99981 283960 800 1600 "clearline"]
+	Line[99981 283960 102401 283960 800 1600 "clearline"]
+	Line[102298 268983 102315 269000 2500 2000 "clearline"]
+	Line[102315 269000 108882 269000 2500 2000 "clearline"]
+	Line[101909 291683 101941 291715 2500 2000 "clearline"]
+	Line[101941 291715 101941 295500 2500 2000 "clearline"]
+	Line[159949 281059 166441 281059 2500 2000 "clearline"]
+	Line[166166 287432 166097 287500 2500 2000 "clearline"]
+	Line[166097 287500 160500 287500 2500 2000 "clearline"]
+	Line[155416 251503 150444 251503 2500 2000 "clearline"]
+	Line[150444 251503 149941 251000 2500 2000 "clearline"]
+	Line[166166 292550 166441 292825 2500 2000 "clearline"]
+	Line[166441 292825 166441 296000 2500 2000 "clearline"]
+	Line[183949 281059 190441 281059 2500 2000 "clearline"]
+	Line[189949 275941 184441 275941 2500 2000 "clearline"]
+	Line[183949 281059 184441 281551 2500 2000 "clearline"]
+	Line[184441 281551 184441 286941 2500 2000 "clearline"]
+	Line[183949 292059 183941 292067 2500 2000 "clearline"]
+	Line[183941 292067 183941 296000 2500 2000 "clearline"]
+	Line[189949 263941 189937 263929 2500 2000 "clearline"]
+	Line[189937 263929 184983 263929 2500 2000 "clearline"]
+	Line[202118 251162 202955 252000 2500 2000 "clearline"]
+	Line[212890 252000 202955 252000 2500 2000 "clearline"]
+	Line[197441 248000 197000 248441 800 1600 "clearline"]
+	Line[197000 248441 197000 251654 800 1600 "clearline"]
+	Line[184491 269047 184503 269059 2500 2000 "clearline"]
+	Line[184503 269059 190441 269059 2500 2000 "clearline"]
+	Line[175256 250932 171441 254747 800 1600 "clearline"]
+	Line[171441 254747 171441 277500 800 1600 "clearline"]
+	Line[171441 277500 167882 281059 800 1600 "clearline"]
+	Line[167882 281059 166382 281059 800 1600 "clearline"]
+	Line[196941 246000 183441 259500 800 1600 "clearline"]
+	Line[183441 259500 180441 259500 800 1600 "clearline"]
+	Line[180441 259500 178941 261000 800 1600 "clearline"]
+	Line[178941 261000 178941 279500 800 1600 "clearline"]
+	Line[178941 279500 180500 281059 800 1600 "clearline"]
+	Line[180500 281059 184382 281059 800 1600 "clearline"]
+	Line[202441 272500 208941 272500 2500 2000 "clearline"]
+	Line[208941 272500 213882 267559 2500 2000 "clearline"]
+	Line[219000 268559 222941 272500 2500 2000 "clearline"]
+	Line[222941 272500 226191 272500 2500 2000 "clearline"]
+	Line[241449 281059 248441 281059 2500 2000 "clearline"]
+	Line[247949 275941 247890 276000 2500 2000 "clearline"]
+	Line[247890 276000 241941 276000 2500 2000 "clearline"]
+	Line[247949 297559 248008 297500 2500 2000 "clearline"]
+	Line[248008 297500 253441 297500 2500 2000 "clearline"]
+	Line[253441 238500 266441 251500 800 1600 "clearline"]
+	Line[235955 251754 235709 252000 2500 2000 "clearline"]
+	Line[235709 252000 231441 252000 2500 2000 "clearline"]
+	Line[241073 251754 241059 251768 2500 2000 "clearline"]
+	Line[241059 251768 241059 258500 2500 2000 "clearline"]
+	Line[241449 263941 241657 263733 2500 2000 "clearline"]
+	Line[241657 263733 248008 263733 2500 2000 "clearline"]
+	Line[247516 268851 247308 269059 2500 2000 "clearline"]
+	Line[247308 269059 241941 269059 2500 2000 "clearline"]
+	Line[246941 246000 266441 265500 800 1600 "clearline"]
+	Line[266441 265500 266441 276500 800 1600 "clearline"]
+	Line[266441 276500 269119 279178 800 1600 "clearline"]
+	Line[269119 279178 274688 279178 800 1600 "clearline"]
+	Line[258291 261150 263941 266800 800 1600 "clearline"]
+	Line[263941 266800 263941 278500 800 1600 "clearline"]
+	Line[263941 278500 267222 281781 800 1600 "clearline"]
+	Line[267222 281781 280222 281781 800 1600 "clearline"]
+	Line[271438 289178 266119 289178 800 1600 "clearline"]
+	Line[266119 289178 255941 279000 800 1600 "clearline"]
+	Line[255941 279000 255941 270000 800 1600 "clearline"]
+	Line[255941 270000 249674 263733 800 1600 "clearline"]
+	Line[249674 263733 247941 263733 800 1600 "clearline"]
+	Text[91441 55500 0 120 "20131204" "clearline"]
+	Polygon("")
+	(
+		[182941 79000] [199941 79000] [199941 97500] [182941 97500] 
+	)
+	Polygon("")
+	(
+		[80441 152000] [109941 152000] [109941 133500] [121941 121500] [165941 121500] 
+		[165941 163000] [80441 163000] 
+	)
+	Polygon("")
+	(
+		[74941 165000] [90441 165000] [90441 175000] [74941 175000] 
+	)
+	Polygon("")
+	(
+		[100441 165000] [115941 165000] [115941 175000] [100441 175000] 
+	)
+	Polygon("")
+	(
+		[112441 165000] [127941 165000] [127941 175000] [112441 175000] 
+	)
+	Polygon("")
+	(
+		[117441 165000] [132941 165500] [132941 175000] [117441 175000] 
+	)
+	Polygon("")
+	(
+		[117441 167500] [132941 167500] [132941 177500] [117441 177500] 
+	)
+	Polygon("")
+	(
+		[114941 177000] [130441 177000] [130441 187000] [114941 187000] 
+	)
+	Polygon("")
+	(
+		[116441 182500] [131941 182500] [131941 192500] [116441 192500] 
+	)
+	Polygon("")
+	(
+		[116441 176000] [131941 176000] [131941 186000] [116441 186000] 
+	)
+	Polygon("clearpoly")
+	(
+		[69941 205500] [101441 205500] [101441 244500] [69941 244500] 
+	)
+	Polygon("")
+	(
+		[99941 176000] [115441 176000] [115441 186000] [99941 186000] 
+	)
+	Polygon("")
+	(
+		[267324 199427] [271324 199427] [271324 203427] [267324 203427] 
+	)
+	Polygon("")
+	(
+		[267324 199427] [271324 199427] [271324 203427] [267324 203427] 
+	)
+	Polygon("")
+	(
+		[258824 206427] [262824 206427] [262824 210427] [258824 210427] 
+	)
+	Polygon("")
+	(
+		[241824 195927] [245824 195927] [245824 199927] [241824 199927] 
+	)
+	Polygon("")
+	(
+		[249824 187427] [253824 187427] [253824 191427] [249824 191427] 
+	)
+	Polygon("")
+	(
+		[267824 166427] [271824 166427] [271824 170427] [267824 170427] 
+	)
+	Polygon("clearpoly")
+	(
+		[69941 165500] [132941 165000] [132441 192500] [116441 192500] [101941 207000] 
+		[101941 207500] [69941 207500] 
+	)
+	Polygon("")
+	(
+		[136592 191607] [146455 191607] [146455 210060] [136592 210060] 
+	)
+	Polygon("")
+	(
+		[159441 167000] [159441 179000] [162441 182000] [162441 190000] [160941 191500] 
+		[160941 198500] [153441 198500] [153441 209500] [167441 209500] [171941 205000] 
+		[171941 184500] [168441 181000] [168441 167000] 
+	)
+	Polygon("")
+	(
+		[323941 292501] [347941 268501] [391941 268501] [391941 308501] [323941 308501] 
+	)
+	Polygon("")
+	(
+		[314941 311000] [357941 311000] [357941 338000] [344941 338000] [330941 324000] 
+		[314941 324000] 
+	)
+	Polygon("")
+	(
+		[385941 313501] [385941 325501] [388941 328501] [388941 336501] [387441 338001] 
+		[387441 360500] [398441 360500] [398441 331001] [394941 327501] [394941 313501] 
+	)
+	Polygon("clearpoly")
+	(
+		[283441 148500] [211441 148500] [211441 230500] [283441 230500] 
+	)
+	Polygon("")
+	(
+		[366441 334000] [370398 334000] [370441 348000] [384441 348000] [384441 360500] 
+		[368941 360500] [366441 358000] 
+	)
+)
+Layer(2 "power")
+(
+	Line[397441 27000 393941 23500 2500 2000 ""]
+	Line[398441 86000 395441 86000 2500 2000 ""]
+	Line[398441 147000 394441 147000 2500 2000 ""]
+	Line[398441 206386 395441 206386 2500 2000 ""]
+	Line[106441 251500 112941 251500 2500 2000 "clearline"]
+	Line[101941 295500 111441 295500 2500 2000 "clearline"]
+	Polygon("")
+	(
+		[382941 49500] [389441 49500] [389441 41500] [382941 41500] 
+	)
+	Polygon("")
+	(
+		[383941 122500] [390441 122500] [390441 114500] [383941 114500] 
+	)
+	Polygon("")
+	(
+		[383441 169000] [389941 169000] [389941 161000] [383441 161000] 
+	)
+	Polygon("")
+	(
+		[383441 240000] [389941 240000] [389941 232000] [383441 232000] 
+	)
+	Polygon("")
+	(
+		[428941 293500] [435441 293500] [435441 285500] [428941 285500] 
+	)
+	Polygon("")
+	(
+		[419441 328000] [426441 328000] [426441 322000] [419441 322000] 
+	)
+	Polygon("")
+	(
+		[292922 98958] [299422 98958] [299422 90958] [292922 90958] 
+	)
+	Polygon("")
+	(
+		[249877 142945] [256377 142945] [256377 134945] [249877 134945] 
+	)
+	Polygon("")
+	(
+		[258902 96891] [265402 96891] [265402 88891] [258902 88891] 
+	)
+	Polygon("")
+	(
+		[292941 147000] [299441 147000] [299441 139000] [292941 139000] 
+	)
+	Polygon("")
+	(
+		[238701 111793] [245201 111793] [245201 103793] [238701 103793] 
+	)
+	Polygon("")
+	(
+		[309441 102000] [314941 102000] [314941 97000] [309441 97000] 
+	)
+	Polygon("clearpoly")
+	(
+		[481441 6000] [481441 358500] [478941 361000] [75441 361000] [72941 358500] 
+		[72941 327500] [328441 327500] [328441 268000] [408941 268000] [408941 333000] 
+		[453441 333000] [453441 246000] [406441 246000] [407441 3000] [478941 3000] 
+	)
+	Polygon("")
+	(
+		[386941 317000] [397941 317000] [397441 358500] [386941 358500] 
+	)
+	Polygon("")
+	(
+		[437412 346125] [442912 346125] [442912 341125] [437412 341125] 
+	)
+	Polygon("clearpoly")
+	(
+		[109941 121500] [130941 121500] [130941 57500] [156941 57500] [156941 121500] 
+		[168441 121500] [168441 183500] [173441 183500] [173441 232500] [320941 232500] 
+		[320941 323500] [109941 323500] 
+	)
+	Polygon("")
+	(
+		[162941 171500] [168441 171500] [168441 166500] [162941 166500] 
+	)
+	Polygon("")
+	(
+		[162941 176000] [168441 176000] [168441 171000] [162941 171000] 
+	)
+	Polygon("")
+	(
+		[162941 182000] [168441 182000] [168441 177000] [162941 177000] 
+	)
+	Polygon("")
+	(
+		[166441 188500] [171941 188500] [171941 183500] [166441 183500] 
+	)
+	Polygon("")
+	(
+		[166441 194000] [171941 194000] [171941 189000] [166441 189000] 
+	)
+	Polygon("")
+	(
+		[166441 201000] [171941 201000] [171941 196000] [166441 196000] 
+	)
+	Polygon("")
+	(
+		[206441 254500] [211941 254500] [211941 249500] [206441 249500] 
+	)
+	Polygon("")
+	(
+		[124941 254500] [130441 254500] [130441 249500] [124941 249500] 
+	)
+	Polygon("")
+	(
+		[132941 64500] [138441 64500] [138441 59500] [132941 59500] 
+	)
+	Polygon("")
+	(
+		[132941 68000] [138441 68000] [138441 63000] [132941 63000] 
+	)
+	Polygon("")
+	(
+		[137441 65000] [142941 65000] [142941 60000] [137441 60000] 
+	)
+	Polygon("")
+	(
+		[151441 65000] [156941 65000] [156941 60000] [151441 60000] 
+	)
+	Polygon("")
+	(
+		[306941 260932] [312441 260932] [312441 255932] [306941 255932] 
+	)
+	Polygon("")
+	(
+		[308441 286560] [313941 286560] [313941 281560] [308441 281560] 
+	)
+	Polygon("")
+	(
+		[267941 53000] [273441 53000] [273441 48000] [267941 48000] 
+	)
+	Polygon("")
+	(
+		[267941 60000] [273441 60000] [273441 55000] [267941 55000] 
+	)
+	Polygon("")
+	(
+		[267941 66500] [273441 66500] [273441 61500] [267941 61500] 
+	)
+	Polygon("")
+	(
+		[214941 141500] [220441 141500] [220441 136500] [214941 136500] 
+	)
+	Polygon("")
+	(
+		[218441 143000] [223941 143000] [223941 138000] [218441 138000] 
+	)
+	Polygon("clearpoly")
+	(
+		[400441 3000] [170441 3000] [169941 178500] [174941 178500] [174941 228500] 
+		[368441 228500] [368441 263500] [412441 263500] [412441 327500] [449441 327500] 
+		[449441 247000] [400441 247000] 
+	)
+	Polygon("")
+	(
+		[388723 317877] [394223 317877] [394223 312877] [388723 312877] 
+	)
+	Polygon("")
+	(
+		[109941 245000] [117941 245000] [117941 260000] [109941 260000] 
+	)
+	Polygon("")
+	(
+		[109941 292000] [114941 292000] [114941 299500] [109941 299500] 
+	)
+	Polygon("")
+	(
+		[146941 253500] [152441 253500] [152441 248500] [146941 248500] 
+	)
+	Polygon("")
+	(
+		[163941 298500] [169441 298500] [169441 293500] [163941 293500] 
+	)
+	Polygon("")
+	(
+		[180941 298500] [186441 298500] [186441 293500] [180941 293500] 
+	)
+	Polygon("")
+	(
+		[228441 254500] [233941 254500] [233941 249500] [228441 249500] 
+	)
+	Polygon("")
+	(
+		[250941 300000] [256441 300000] [256441 295000] [250941 295000] 
+	)
+)
+Layer(3 "ground")
+(
+	Line[397941 32559 394441 32559 2500 2000 ""]
+	Line[398441 91000 395441 91000 2500 2000 ""]
+	Line[398441 152000 395441 152000 2500 2000 ""]
+	Line[446441 298000 442441 298000 2500 2000 ""]
+	Line[400441 211000 395441 211000 2500 2000 ""]
+	Line[302941 59993 300453 59993 2500 2000 ""]
+	Line[319941 313000 98441 313000 7000 2000 ""]
+	Line[98441 313000 86941 301500 7000 2000 ""]
+	Line[86941 301500 86941 288500 7000 2000 ""]
+	Polygon("")
+	(
+		[378441 17000] [389441 17000] [389441 25000] [378441 25000] 
+	)
+	Polygon("")
+	(
+		[368441 45000] [379441 45000] [379441 53000] [368441 53000] 
+	)
+	Polygon("")
+	(
+		[379162 91000] [390162 91000] [390162 99000] [379162 99000] 
+	)
+	Polygon("")
+	(
+		[366441 105311] [377441 105311] [377441 113311] [366441 113311] 
+	)
+	Polygon("")
+	(
+		[379512 139000] [390512 139000] [390512 147000] [379512 147000] 
+	)
+	Polygon("")
+	(
+		[370441 160843] [381441 160843] [381441 168843] [370441 168843] 
+	)
+	Polygon("")
+	(
+		[367485 224614] [378485 224614] [378485 232614] [367485 232614] 
+	)
+	Polygon("")
+	(
+		[414441 314000] [425441 314000] [425441 322000] [414441 322000] 
+	)
+	Polygon("")
+	(
+		[388441 189000] [396441 189000] [396441 196000] [388441 196000] 
+	)
+	Polygon("")
+	(
+		[390441 69882] [396441 70000] [396441 77000] [390441 76882] 
+	)
+	Polygon("")
+	(
+		[284262 89200] [292262 89200] [292262 96200] [284262 96200] 
+	)
+	Polygon("")
+	(
+		[266207 82284] [274207 82284] [274207 89284] [266207 89284] 
+	)
+	Polygon("")
+	(
+		[236441 135000] [244441 135000] [244441 142000] [236441 142000] 
+	)
+	Polygon("")
+	(
+		[291712 152853] [299712 152853] [299712 159853] [291712 159853] 
+	)
+	Polygon("")
+	(
+		[236218 96834] [244218 96834] [244218 103834] [236218 103834] 
+	)
+	Polygon("")
+	(
+		[308941 102500] [315441 102500] [315441 108500] [308941 108500] 
+	)
+	Polygon("")
+	(
+		[282148 71866] [288648 71866] [288648 77866] [282148 77866] 
+	)
+	Polygon("")
+	(
+		[300719 66534] [304150 66562] [307219 72534] [300719 72534] 
+	)
+	Polygon("")
+	(
+		[274167 49366] [280667 49366] [280667 55366] [274167 55366] 
+	)
+	Polygon("")
+	(
+		[375937 206839] [386937 206839] [386937 214839] [375937 214839] 
+	)
+	Polygon("")
+	(
+		[428941 320000] [439941 320000] [439941 328000] [428941 328000] 
+	)
+	Polygon("")
+	(
+		[430941 340500] [437441 340500] [437441 346500] [430941 346500] 
+	)
+	Polygon("")
+	(
+		[107941 269500] [114441 269500] [114441 275500] [107941 275500] 
+	)
+	Polygon("")
+	(
+		[159441 269500] [165941 269500] [165941 275500] [159441 275500] 
+	)
+	Polygon("")
+	(
+		[188941 269500] [195441 269500] [195441 275500] [188941 275500] 
+	)
+	Polygon("")
+	(
+		[240941 269500] [247441 269500] [247441 275500] [240941 275500] 
+	)
+	Polygon("")
+	(
+		[137941 249000] [144441 249000] [144441 255000] [137941 255000] 
+	)
+	Polygon("")
+	(
+		[220441 249000] [226941 249000] [226941 255000] [220441 255000] 
+	)
+	Polygon("")
+	(
+		[159941 122500] [165441 122500] [165441 162000] [159941 162000] 
+	)
+	Polygon("")
+	(
+		[125941 121500] [131441 121500] [131441 161000] [125941 161000] 
+	)
+	Polygon("")
+	(
+		[155197 68454] [161697 68454] [161697 74454] [155197 74454] 
+	)
+	Polygon("")
+	(
+		[155441 72171] [161941 72171] [161941 78171] [155441 78171] 
+	)
+	Polygon("")
+	(
+		[138021 96151] [144521 96151] [144521 102151] [138021 102151] 
+	)
+	Polygon("")
+	(
+		[194441 87500] [200941 87500] [200941 93500] [194441 93500] 
+	)
+	Polygon("")
+	(
+		[192441 84500] [198941 84500] [198941 90500] [192441 90500] 
+	)
+	Polygon("")
+	(
+		[194441 81500] [200941 81500] [200941 87500] [194441 87500] 
+	)
+	Polygon("")
+	(
+		[109941 40500] [116441 40500] [116441 46500] [109941 46500] 
+	)
+	Polygon("")
+	(
+		[117941 40500] [124441 40500] [124441 46500] [117941 46500] 
+	)
+	Polygon("")
+	(
+		[126941 40500] [133441 40500] [133441 46500] [126941 46500] 
+	)
+	Polygon("")
+	(
+		[139441 40500] [145941 40500] [145941 46500] [139441 46500] 
+	)
+	Polygon("")
+	(
+		[139441 46500] [145941 46500] [145941 52500] [139441 52500] 
+	)
+	Polygon("")
+	(
+		[145441 46500] [151941 46500] [151941 52500] [145441 52500] 
+	)
+	Polygon("")
+	(
+		[150941 51000] [157441 51000] [157441 57000] [150941 57000] 
+	)
+	Polygon("")
+	(
+		[123441 56500] [129941 56500] [129941 62500] [123441 62500] 
+	)
+	Polygon("")
+	(
+		[123441 62500] [129941 62500] [129941 68500] [123441 68500] 
+	)
+	Polygon("")
+	(
+		[113441 62000] [119941 62000] [119941 68000] [113441 68000] 
+	)
+	Polygon("")
+	(
+		[109441 62000] [115941 62000] [115941 68000] [109441 68000] 
+	)
+	Polygon("")
+	(
+		[109441 55500] [115941 55500] [115941 61500] [109441 61500] 
+	)
+	Polygon("")
+	(
+		[302196 290000] [308696 290000] [308696 296000] [302196 296000] 
+	)
+	Polygon("")
+	(
+		[165130 46070] [171630 46070] [171630 52070] [165130 52070] 
+	)
+	Polygon("")
+	(
+		[201941 120000] [208441 120000] [208441 126000] [201941 126000] 
+	)
+	Polygon("")
+	(
+		[194941 127500] [201441 127500] [201441 133500] [194941 133500] 
+	)
+	Polygon("")
+	(
+		[194941 134500] [201441 134500] [201441 140500] [194941 140500] 
+	)
+	Polygon("")
+	(
+		[178441 138500] [184941 138500] [184941 144500] [178441 144500] 
+	)
+	Polygon("")
+	(
+		[220941 153000] [227441 153000] [227441 159000] [220941 159000] 
+	)
+	Polygon("")
+	(
+		[221441 161500] [227941 161500] [227941 167500] [221441 167500] 
+	)
+	Polygon("")
+	(
+		[232941 161500] [239441 161500] [239441 167500] [232941 167500] 
+	)
+	Polygon("")
+	(
+		[209441 159000] [215941 159000] [215941 165000] [209441 165000] 
+	)
+	Polygon("")
+	(
+		[200441 159500] [206941 159500] [206941 165500] [200441 165500] 
+	)
+	Polygon("")
+	(
+		[190441 160000] [196941 160000] [196941 166000] [190441 166000] 
+	)
+	Polygon("")
+	(
+		[221941 170500] [228441 170500] [228441 176500] [221941 176500] 
+	)
+	Polygon("")
+	(
+		[221441 176500] [227941 176500] [227941 182500] [221441 182500] 
+	)
+	Polygon("")
+	(
+		[216941 182000] [223441 182000] [223441 188000] [216941 188000] 
+	)
+	Polygon("")
+	(
+		[206941 184500] [213441 184500] [213441 190500] [206941 190500] 
+	)
+	Polygon("")
+	(
+		[198941 184500] [205441 184500] [205441 190500] [198941 190500] 
+	)
+	Polygon("")
+	(
+		[190441 184500] [196941 184500] [196941 190500] [190441 190500] 
+	)
+	Polygon("")
+	(
+		[181941 179500] [188441 179500] [188441 185500] [181941 185500] 
+	)
+	Polygon("")
+	(
+		[173941 179500] [180441 179500] [180441 185500] [173941 185500] 
+	)
+	Polygon("")
+	(
+		[173941 169000] [180441 169000] [180441 175000] [173941 175000] 
+	)
+	Polygon("")
+	(
+		[181941 169000] [188441 169000] [188441 175000] [181941 175000] 
+	)
+	Polygon("")
+	(
+		[98941 193500] [107441 193500] [107441 198000] [98941 198000] 
+	)
+	Polygon("")
+	(
+		[266441 198000] [272941 198000] [272941 205000] [266441 205000] 
+	)
+	Polygon("")
+	(
+		[257941 203500] [264441 203500] [264441 210500] [257941 210500] 
+	)
+	Polygon("")
+	(
+		[242941 203500] [249441 203500] [249441 210500] [242941 210500] 
+	)
+	Polygon("")
+	(
+		[240941 194500] [247441 194500] [247441 201500] [240941 201500] 
+	)
+	Polygon("")
+	(
+		[248941 186000] [255441 186000] [255441 193000] [248941 193000] 
+	)
+	Polygon("")
+	(
+		[266941 165000] [273441 165000] [273441 172000] [266941 172000] 
+	)
+	Polygon("")
+	(
+		[303941 261550] [310441 261550] [310441 267550] [303941 267550] 
+	)
+	Polygon("")
+	(
+		[309441 262000] [315941 262000] [315941 265000] [309441 265000] 
+	)
+	Polygon("")
+	(
+		[385441 269500] [390941 269500] [390941 309000] [385441 309000] 
+	)
+	Polygon("")
+	(
+		[351941 270000] [357441 270000] [357441 309500] [351941 309500] 
+	)
+	Polygon("clearpoly")
+	(
+		[481441 358500] [481441 6000] [478941 3000] [402441 3000] [401441 241000] 
+		[448441 241000] [447441 330000] [407941 330000] [407941 268000] [313941 268000] 
+		[313941 324000] [72941 324000] [72941 358500] [75441 361000] [478941 361000] 
+	)
+	Polygon("clearpoly")
+	(
+		[396441 247000] [445441 247000] [445441 331000] [411941 331000] [411441 265000] 
+		[310441 265000] [310441 303000] [71441 303000] [71441 155500] [73941 153000] 
+		[109941 153000] [109941 78000] [73941 78000] [71441 75500] [71441 5500] 
+		[73941 3000] [396441 3000] 
+	)
+	Polygon("")
+	(
+		[365696 348500] [372196 348500] [372196 354500] [365696 354500] 
+	)
+	Polygon("")
+	(
+		[365696 353500] [372196 353500] [372196 359500] [365696 359500] 
+	)
+	Polygon("")
+	(
+		[371696 353500] [378196 353500] [378196 359500] [371696 359500] 
+	)
+	Polygon("")
+	(
+		[371696 350000] [378196 350000] [378196 356000] [371696 356000] 
+	)
+)
+Layer(4 "bottom")
+(
+	Line[401596 40000 378544 40000 1000 2000 "clearline,auto,lock"]
+	Line[404250 100000 376485 100000 1000 2000 "clearline,auto,lock"]
+	Line[402250 158000 379394 158000 1000 2000 "clearline,auto,lock"]
+	Line[376456 18000 367546 26910 800 1600 "clearline"]
+	Line[376024 21588 369155 28457 800 1600 "clearline"]
+	Line[375705 178810 369166 172271 1000 2000 "clearline"]
+	Line[385585 178810 375705 178810 1000 2000 "clearline"]
+	Line[389629 174766 385585 178810 1000 2000 "clearline"]
+	Line[389629 168540 389629 174766 1000 2000 "clearline"]
+	Line[418440 299000 418440 284125 1000 2000 "clearline"]
+	Line[422425 302985 418440 299000 1000 2000 "clearline"]
+	Line[432030 302985 422425 302985 1000 2000 "clearline"]
+	Line[434882 300133 432030 302985 1000 2000 "clearline"]
+	Line[434882 298303 434882 300133 1000 2000 "clearline"]
+	Line[429765 299176 427941 301000 1000 2000 "clearline"]
+	Line[432324 293697 432324 289000 1000 2000 ""]
+	Line[428241 307000 420941 307000 1000 2000 "clearline"]
+	Line[420441 298454 420441 284500 1000 2000 "clearline"]
+	Line[422987 301000 420441 298454 1000 2000 "clearline"]
+	Line[427941 301000 422987 301000 1000 2000 "clearline"]
+	Line[429765 293697 429765 299176 1000 2000 "clearline"]
+	Line[391441 238000 388941 240500 1000 2000 "clearline"]
+	Line[386720 236721 386441 237000 1000 2000 "clearline"]
+	Line[386720 229614 386720 236721 1000 2000 "clearline"]
+	Line[389279 75838 387441 74000 1000 2000 "clearline"]
+	Line[393441 44103 393441 45000 1000 2000 "clearline"]
+	Line[391338 42000 393441 44103 1000 2000 "clearline"]
+	Line[391338 47103 391338 51114 1000 2000 "clearline"]
+	Line[393441 45000 391338 47103 1000 2000 "clearline"]
+	Line[373441 81000 368441 86000 1000 2000 "clearline"]
+	Line[382720 81000 373441 81000 1000 2000 "clearline"]
+	Line[374441 83000 369441 88000 1000 2000 "clearline"]
+	Line[379441 83000 374441 83000 1000 2000 "clearline"]
+	Line[381603 85162 379441 83000 1000 2000 "clearline"]
+	Line[381603 86083 381603 85162 1000 2000 "clearline"]
+	Line[386720 202279 377441 193000 1000 2000 "clearline"]
+	Line[374441 195000 371441 195000 1000 2000 "clearline"]
+	Line[389653 122000 371441 122000 1000 2000 "clearline"]
+	Line[390441 117412 390441 121212 1000 2000 "clearline"]
+	Line[389279 116250 390441 117412 1000 2000 "clearline"]
+	Line[389279 109311 389279 116250 1000 2000 "clearline"]
+	Line[381441 118000 371441 118000 1000 2000 "clearline"]
+	Line[384162 115279 381441 118000 1000 2000 "clearline"]
+	Line[384162 109311 384162 115279 1000 2000 "clearline"]
+	Line[404441 216000 400441 220000 1000 2000 "clearline"]
+	Line[380441 220000 400441 220000 1000 2000 "clearline"]
+	Line[376485 216044 380441 220000 1000 2000 "clearline"]
+	Line[376485 214300 376485 216044 1000 2000 "clearline"]
+	Line[389279 215838 389279 206386 1000 2000 "clearline"]
+	Line[389441 216000 389279 215838 1000 2000 "clearline"]
+	Line[376441 177000 370441 171000 1000 2000 "clearline"]
+	Line[381441 177000 376441 177000 1000 2000 "clearline"]
+	Line[384512 173929 381441 177000 1000 2000 "clearline"]
+	Line[384512 168540 384512 173929 1000 2000 "clearline"]
+	Line[381953 143750 378003 139800 1000 2000 "clearline"]
+	Line[381953 145312 381953 143750 1000 2000 "clearline"]
+	Line[388441 141000 385441 138000 1000 2000 "clearline"]
+	Line[388441 143000 388441 141000 1000 2000 "clearline"]
+	Line[387070 144371 388441 143000 1000 2000 "clearline"]
+	Line[387070 145312 387070 144371 1000 2000 "clearline"]
+	Line[386720 204083 386720 202279 1000 2000 "clearline"]
+	Line[381603 202162 374441 195000 1000 2000 "clearline"]
+	Line[381603 204083 381603 202162 1000 2000 "clearline"]
+	Line[391441 236000 391441 238000 1000 2000 "clearline"]
+	Line[389279 233838 391441 236000 1000 2000 "clearline"]
+	Line[389279 227311 389279 233838 1000 2000 "clearline"]
+	Line[429441 305000 421895 305000 1000 2000 "clearline"]
+	Line[428441 306800 428241 307000 1000 2000 "clearline"]
+	Line[432324 310683 428441 306800 1000 2000 "clearline"]
+	Line[432324 316925 432324 310683 1000 2000 "clearline"]
+	Line[437441 313000 429441 305000 1000 2000 "clearline"]
+	Line[434882 293697 434882 298882 1000 2000 "clearline"]
+	Line[437441 320000 437441 313000 1000 2000 "clearline"]
+	Line[432441 320000 432441 315000 1000 2000 "clearline"]
+	Line[404250 216191 411882 208559 1000 2000 "clearline"]
+	Line[437000 208559 411882 208559 1000 2000 "clearline"]
+	Line[391838 212397 394441 215000 1000 2000 "clearline"]
+	Line[391838 206386 391838 212397 1000 2000 "clearline"]
+	Line[402441 215000 394441 215000 1000 2000 "clearline"]
+	Line[413441 204000 402441 215000 1000 2000 "clearline"]
+	Line[421823 204000 413441 204000 1000 2000 "clearline"]
+	Line[395882 194441 393441 192000 1000 2000 "clearline"]
+	Line[398441 194441 395882 194441 1000 2000 "clearline"]
+	Line[398441 204000 400441 206000 1000 2000 "clearline"]
+	Line[398441 199559 398441 204000 1000 2000 "clearline"]
+	Line[421823 83992 420347 83992 1000 2000 "clearline,auto"]
+	Line[420347 83992 420347 85468 1000 2000 "clearline,auto"]
+	Line[420347 85468 402250 85468 1000 2000 "clearline,auto"]
+	Line[402250 85468 402250 94300 1000 2000 "clearline,auto"]
+	Line[402250 94300 391838 94300 1000 2000 "clearline,auto"]
+	Line[391838 90689 391838 94300 1000 2000 "clearline,auto"]
+	Line[398441 80559 398441 86000 1000 2000 "clearline"]
+	Line[394441 206000 400441 206000 1000 2000 "clearline"]
+	Line[395882 75441 393441 73000 1000 2000 "clearline"]
+	Line[398441 75441 395882 75441 1000 2000 "clearline"]
+	Line[402250 158000 402250 161000 1000 2000 "clearline"]
+	Line[379394 161953 379394 158000 1000 2000 "clearline"]
+	Line[392188 166000 392188 161000 1000 2000 "clearline"]
+	Line[381953 166000 381953 161000 1000 2000 "clearline"]
+	Line[381953 161000 392188 161000 1000 2000 "clearline"]
+	Line[404250 100000 404250 88618 1000 2000 "clearline"]
+	Line[379044 98000 389167 98000 1000 2000 "clearline"]
+	Line[379044 88386 379044 98000 1000 2000 "clearline"]
+	Line[376485 88386 376485 100000 1000 2000 "clearline"]
+	Line[386220 45779 385941 45500 1000 2000 "clearline"]
+	Line[386220 51114 386220 45779 1000 2000 "clearline"]
+	Line[401596 40000 401596 45766 1000 2000 "clearline,auto"]
+	Line[378544 40000 378544 42790 1000 2000 "clearline,auto"]
+	Line[381103 46500 381103 42000 1000 2000 "clearline"]
+	Line[381103 42000 391338 42000 1000 2000 "clearline"]
+	Line[376835 166394 375441 165000 1000 2000 "clearline"]
+	Line[376835 170843 376835 166394 1000 2000 "clearline"]
+	Line[384162 206386 384162 212000 1000 2000 "clearline"]
+	Line[421941 171532 421941 173992 1000 2000 "clearline,auto"]
+	Line[421941 171532 402250 171532 1000 2000 "clearline,auto"]
+	Line[402250 160000 402250 171532 1000 2000 "clearline,auto"]
+	Line[379394 160000 379394 168540 1000 2000 "clearline,auto"]
+	Line[387070 170843 387070 165000 1000 2000 "clearline"]
+	Line[437433 88618 404250 88618 1000 2000 "clearline,auto"]
+	Line[384162 88386 384162 94000 1000 2000 "clearline"]
+	Line[401596 51532 402250 51532 1000 2000 "clearline"]
+	Line[401596 40000 401596 51532 1000 2000 "clearline"]
+	Line[421823 51532 402250 51532 1000 2000 "auto"]
+	Line[378544 40000 378544 45581 1000 2000 "clearline,auto"]
+	Line[437441 305000 440000 307559 1000 2000 "clearline"]
+	Line[440000 319228 440000 307559 1000 2000 "clearline"]
+	Line[437441 296000 437441 305000 1000 2000 "clearline"]
+	Line[460441 234000 458441 236000 1000 2000 "clearline"]
+	Line[468382 234000 460441 234000 1000 2000 "clearline"]
+	Line[459941 203500 458441 205000 1000 2000 "clearline"]
+	Line[468382 203500 459941 203500 1000 2000 "clearline"]
+	Line[459941 173500 458441 175000 1000 2000 "clearline"]
+	Line[468382 173500 459941 173500 1000 2000 "clearline"]
+	Line[460441 144000 458441 146000 1000 2000 "clearline"]
+	Line[468382 144000 460441 144000 1000 2000 "clearline"]
+	Line[459941 113500 458441 115000 1000 2000 "clearline"]
+	Line[468382 113500 459941 113500 1000 2000 "clearline"]
+	Line[459941 83500 458441 85000 1000 2000 "clearline"]
+	Line[468382 83500 459941 83500 1000 2000 "clearline"]
+	Line[459941 53500 458441 55000 1000 2000 "clearline"]
+	Line[468500 53500 459941 53500 1000 2000 "clearline"]
+	Line[459941 23500 458441 25000 1000 2000 "clearline"]
+	Line[468382 23500 459941 23500 1000 2000 "clearline"]
+	Line[468382 264492 466906 264492 1000 2000 "clearline,auto"]
+	Line[466906 264492 466906 265968 1000 2000 "clearline,auto"]
+	Line[466906 265968 424647 265968 1000 2000 "clearline,auto"]
+	Line[424647 265968 424647 293697 1000 2000 "clearline,auto"]
+	Line[429765 329000 440000 329000 1000 2000 "clearline"]
+	Line[429765 323676 429765 329000 1000 2000 "clearline"]
+	Line[440000 324000 440000 329000 1000 2000 "clearline"]
+	Line[427206 285000 428441 285000 1000 2000 "clearline"]
+	Line[427206 291000 427206 285000 1000 2000 "clearline"]
+	Line[437441 285000 427441 285000 1000 2000 "clearline"]
+	Line[437441 291000 437441 285000 1000 2000 "clearline"]
+	Line[444441 296000 446441 298000 1000 2000 ""]
+	Line[442559 296000 444441 296000 1000 2000 ""]
+	Line[434882 319228 434882 325000 1000 2000 ""]
+	Line[424647 323794 423441 325000 1000 2000 ""]
+	Line[424647 319228 424647 323794 1000 2000 ""]
+	Line[427206 296000 427206 291000 1000 2000 ""]
+	Line[437441 296000 437441 291000 1000 2000 ""]
+	Line[468441 351532 468441 353992 1000 2000 "auto"]
+	Line[468441 351532 427206 351532 1000 2000 "auto"]
+	Line[427206 321531 427206 351532 1000 2000 "auto"]
+	Line[429765 319228 429765 324000 1000 2000 ""]
+	Line[440000 319228 440000 324000 1000 2000 ""]
+	Line[468382 293992 448750 293992 1000 2000 "auto"]
+	Line[448750 291547 448750 293992 1000 2000 "auto"]
+	Line[448750 291547 440000 291547 1000 2000 "auto"]
+	Line[440000 291547 440000 293697 1000 2000 "auto"]
+	Line[468382 323992 442559 323992 1000 2000 "auto"]
+	Line[442559 321531 442559 323992 1000 2000 "auto"]
+	Line[421823 231532 421823 233992 1000 2000 "auto"]
+	Line[421823 231532 402250 231532 1000 2000 "auto"]
+	Line[402250 223000 402250 231532 1000 2000 "auto"]
+	Line[402250 223000 379044 223000 1000 2000 "auto"]
+	Line[379044 223000 379044 227311 1000 2000 "auto"]
+	Line[376485 208689 376485 214300 1000 2000 "auto"]
+	Line[381603 225000 391838 225000 1000 2000 ""]
+	Line[381603 229614 381603 225000 1000 2000 ""]
+	Line[391838 229614 391838 225000 1000 2000 ""]
+	Line[376485 229614 372441 229614 1000 2000 ""]
+	Line[437433 238618 394397 238618 1000 2000 "auto"]
+	Line[394397 231917 394397 238618 1000 2000 "auto"]
+	Line[379394 164000 379394 168540 1000 2000 "auto"]
+	Line[437492 148559 402250 148559 1000 2000 "auto"]
+	Line[402250 148559 402250 155300 1000 2000 "auto"]
+	Line[402250 155300 377244 155300 1000 2000 "auto"]
+	Line[377244 149918 377244 155300 1000 2000 "auto"]
+	Line[377244 149918 376835 149918 1000 2000 "auto"]
+	Line[389629 147615 389629 152000 1000 2000 ""]
+	Line[379394 147615 379394 152000 1000 2000 ""]
+	Line[381953 170843 381953 166000 1000 2000 ""]
+	Line[392188 170843 392188 166000 1000 2000 ""]
+	Line[394441 148000 397441 148000 1000 2000 "clearline"]
+	Line[397441 148000 398441 147000 1000 2000 "clearline"]
+	Line[384512 147615 384512 142000 1000 2000 "clearline"]
+	Line[437492 178559 394747 178559 1000 2000 "clearline,auto"]
+	Line[394747 173146 394747 178559 1000 2000 "clearline,auto"]
+	Line[421823 143992 402250 143992 1000 2000 "clearline,auto"]
+	Line[402250 143162 402250 143992 1000 2000 "clearline,auto"]
+	Line[402250 143162 392188 143162 1000 2000 "clearline,auto"]
+	Line[392188 143162 392188 145312 1000 2000 "clearline,auto"]
+	Line[386720 111614 386720 118000 1000 2000 "clearline"]
+	Line[402250 106661 402250 109347 1000 2000 "clearline,auto"]
+	Line[402250 106661 401750 106661 1000 2000 "clearline,auto"]
+	Line[401750 105000 401750 106662 1000 2000 "clearline,auto"]
+	Line[401750 105000 379044 105000 1000 2000 "clearline,auto"]
+	Line[379044 105000 379044 109311 1000 2000 "clearline,auto"]
+	Line[381603 107838 381603 111614 1000 2000 "clearline"]
+	Line[382441 107000 381603 107838 1000 2000 "clearline"]
+	Line[391838 107000 382441 107000 1000 2000 "clearline"]
+	Line[391838 111614 391838 107000 1000 2000 "clearline"]
+	Line[394480 86000 398441 86000 1000 2000 "clearline"]
+	Line[394397 86083 394480 86000 1000 2000 "clearline"]
+	Line[376485 109311 372441 109311 1000 2000 "clearline"]
+	Line[421823 111532 421823 113992 1000 2000 "clearline,auto"]
+	Line[421823 111532 402250 111532 1000 2000 "clearline,auto"]
+	Line[402250 107161 402250 111532 1000 2000 "clearline,auto"]
+	Line[379044 107161 379044 109311 1000 2000 "clearline,auto"]
+	Line[437492 118559 394397 118559 1000 2000 "clearline,auto"]
+	Line[394397 113917 394397 118559 1000 2000 "clearline,auto"]
+	Line[391338 22949 391338 28000 1000 2000 "clearline"]
+	Line[422000 22949 391338 22949 1000 2000 "clearline"]
+	Line[431941 4532 431941 4532 1000 2000 "auto"]
+	Line[431882 34532 431882 34532 1000 2000 "auto"]
+	Line[431882 94532 431882 94532 1000 2000 "auto"]
+	Line[431882 124532 431882 124532 1000 2000 "auto"]
+	Line[431882 184532 431882 184532 1000 2000 "auto"]
+	Line[431882 64532 431882 64532 1000 2000 "auto"]
+	Line[431882 154532 431882 154532 1000 2000 "auto"]
+	Line[431882 214532 431882 214532 1000 2000 "auto"]
+	Line[376394 30550 376394 30550 1000 2000 "auto"]
+	Line[463500 247492 463500 247492 2500 2000 "auto"]
+	Line[463500 337492 463500 337492 2500 2000 "auto"]
+	Line[463500 277492 463500 277492 2500 2000 "auto"]
+	Line[463500 187492 463500 187492 2500 2000 "auto"]
+	Line[463500 157492 463500 157492 2500 2000 "auto"]
+	Line[463500 7492 463500 7492 2500 2000 "auto"]
+	Line[463500 37492 463500 37492 2500 2000 "auto"]
+	Line[463500 67492 463500 67492 2500 2000 "auto"]
+	Line[437433 53382 437433 53382 2500 2000 "auto"]
+	Line[437433 53382 437433 53382 2500 2000 "auto"]
+	Line[437433 83500 437433 83500 2500 2000 "auto"]
+	Line[437433 83500 437433 83500 2500 2000 "auto"]
+	Line[437492 113441 437492 113441 2500 2000 "auto"]
+	Line[437492 113441 437492 113441 2500 2000 "auto"]
+	Line[437492 143441 437492 143441 2500 2000 "auto"]
+	Line[437492 143441 437492 143441 2500 2000 "auto"]
+	Line[437492 173441 437492 173441 2500 2000 "auto"]
+	Line[437492 173441 437492 173441 2500 2000 "auto"]
+	Line[437433 233500 437433 233500 2500 2000 "auto"]
+	Line[437433 233500 437433 233500 2500 2000 "auto"]
+	Line[437492 203441 437492 203441 2500 2000 "auto"]
+	Line[437492 203441 437492 203441 2500 2000 "auto"]
+	Line[437433 23382 437433 23382 2500 2000 "auto"]
+	Line[437433 23382 437433 23382 2500 2000 "auto"]
+	Line[463500 307492 463500 307492 2500 2000 "auto"]
+	Line[463500 127492 463500 127492 2500 2000 "auto"]
+	Line[463500 217492 463500 217492 2500 2000 "auto"]
+	Line[463500 97492 463500 97492 2500 2000 "auto"]
+	Line[427118 22949 427118 22949 2500 2000 "auto"]
+	Line[427118 22949 427118 22949 2500 2000 "auto"]
+	Line[427059 173008 427059 173008 2500 2000 "auto"]
+	Line[427059 173008 427059 173008 2500 2000 "auto"]
+	Line[393897 58500 393897 58500 1000 2000 "auto"]
+	Line[383662 27886 383662 21500 1000 2000 "clearline"]
+	Line[437433 28500 401750 28500 1000 2000 ""]
+	Line[388779 27886 388779 32500 1000 2000 ""]
+	Line[381103 51114 381103 46500 1000 2000 ""]
+	Line[463500 337492 463500 337492 2500 2000 "clearline,auto"]
+	Line[463500 307492 463500 307492 2500 2000 "clearline,auto"]
+	Line[463500 277492 463500 277492 2500 2000 "clearline,auto"]
+	Line[463500 217492 463500 217492 2500 2000 "clearline,auto"]
+	Line[463500 187492 463500 187492 2500 2000 "clearline,auto"]
+	Line[463500 157492 463500 157492 2500 2000 "clearline,auto"]
+	Line[463500 127492 463500 127492 2500 2000 "clearline,auto"]
+	Line[463500 97492 463500 97492 2500 2000 "clearline,auto"]
+	Line[463500 67492 463500 67492 2500 2000 "clearline,auto"]
+	Line[463500 37492 463500 37492 2500 2000 "clearline,auto"]
+	Line[463500 7492 463500 7492 2500 2000 "clearline,auto"]
+	Line[463500 247492 463500 247492 2500 2000 "clearline,auto"]
+	Line[427000 166000 427000 173008 2500 2000 "auto"]
+	Line[427000 16000 427000 22949 2500 2000 "auto"]
+	Line[375985 30050 376394 30550 1000 2000 "auto"]
+	Line[463500 337492 461059 337492 2500 2000 "clearline,auto"]
+	Line[463500 307492 461059 307492 2500 2000 "clearline,auto"]
+	Line[463500 277492 461000 277492 2500 2000 "clearline,auto"]
+	Line[463500 217492 461000 217492 2500 2000 "clearline,auto"]
+	Line[463500 187492 461000 187492 2500 2000 "clearline,auto"]
+	Line[463500 157492 461000 157492 2500 2000 "clearline,auto"]
+	Line[463500 127492 461000 127492 2500 2000 "clearline,auto"]
+	Line[463500 97492 461000 97492 2500 2000 "clearline,auto"]
+	Line[463500 67492 461000 67492 2500 2000 "clearline,auto"]
+	Line[463500 37492 461059 37492 2500 2000 "clearline,auto"]
+	Line[463500 7492 461000 7492 2500 2000 "clearline,auto"]
+	Line[463500 247492 461000 247492 2500 2000 "clearline,auto"]
+	Line[463500 157492 461000 157492 2500 2000 "auto"]
+	Line[463500 166000 463500 166000 2500 2000 "auto"]
+	Line[463500 127492 461000 127492 2500 2000 "auto"]
+	Line[463500 136000 463500 136000 2500 2000 "auto"]
+	Line[463500 187492 461000 187492 2500 2000 "auto"]
+	Line[463500 196000 463500 196000 2500 2000 "auto"]
+	Line[463500 97492 461000 97492 2500 2000 "auto"]
+	Line[463500 106000 463500 106000 2500 2000 "auto"]
+	Line[463500 67492 461000 67492 2500 2000 "auto"]
+	Line[463500 76000 463500 76000 2500 2000 "auto"]
+	Line[463500 217492 461000 217492 2500 2000 "auto"]
+	Line[463500 226000 463500 226000 2500 2000 "auto"]
+	Line[463500 37492 461059 37492 2500 2000 "auto"]
+	Line[463500 46000 463500 46000 2500 2000 "auto"]
+	Line[463500 7492 461000 7492 2500 2000 "auto"]
+	Line[463500 16000 463500 16000 2500 2000 "auto"]
+	Line[463500 337492 461059 337492 2500 2000 "auto"]
+	Line[463500 346000 463500 346000 2500 2000 "auto"]
+	Line[463500 307492 461059 307492 2500 2000 "auto"]
+	Line[463500 316000 463500 316000 2500 2000 "auto"]
+	Line[463500 277492 461000 277492 2500 2000 "auto"]
+	Line[463500 286000 463500 286000 2500 2000 "auto"]
+	Line[463500 247492 461000 247492 2500 2000 "auto"]
+	Line[463500 256000 463500 256000 2500 2000 "auto"]
+	Line[437000 226000 437000 226000 2500 2000 "auto"]
+	Line[427000 226000 427000 226000 2500 2000 "auto"]
+	Line[437000 196000 437000 196000 2500 2000 "auto"]
+	Line[427000 196000 427000 196000 2500 2000 "auto"]
+	Line[437000 166000 437000 166000 2500 2000 "auto"]
+	Line[427000 166000 427000 166000 2500 2000 "auto"]
+	Line[437000 136000 437000 136000 2500 2000 "auto"]
+	Line[427000 136000 427000 136000 2500 2000 "auto"]
+	Line[437000 106000 437000 106000 2500 2000 "auto"]
+	Line[427000 106000 427000 106000 2500 2000 "auto"]
+	Line[437000 76000 437000 76000 2500 2000 "auto"]
+	Line[427000 76000 427000 76000 2500 2000 "auto"]
+	Line[437000 46000 437000 46000 2500 2000 "auto"]
+	Line[427000 46000 427000 46000 2500 2000 "auto"]
+	Line[437059 8374 437000 8374 2500 2000 "auto"]
+	Line[437000 16000 437000 16000 2500 2000 "auto"]
+	Line[427000 16000 427000 16000 2500 2000 "auto"]
+	Line[431941 4532 421882 4532 1000 2000 "auto"]
+	Line[431882 34532 421882 34532 1000 2000 "auto"]
+	Line[431882 94532 421882 94532 1000 2000 "auto"]
+	Line[431882 124532 421882 124532 1000 2000 "auto"]
+	Line[431882 184532 421882 184532 1000 2000 "auto"]
+	Line[431882 64532 421882 64532 1000 2000 "auto"]
+	Line[431882 154532 421882 154532 1000 2000 "auto"]
+	Line[431882 214532 421882 214532 1000 2000 "auto"]
+	Line[437000 226000 437000 233500 2500 2000 "auto"]
+	Line[427000 233008 426941 233008 2500 2000 "auto"]
+	Line[427000 226000 427000 233008 2500 2000 "auto"]
+	Line[437000 196000 437000 203441 2500 2000 "auto"]
+	Line[427000 203508 426941 203508 2500 2000 "auto"]
+	Line[427000 196000 427000 203508 2500 2000 "auto"]
+	Line[437000 166000 437000 173441 2500 2000 "auto"]
+	Line[427059 173008 427000 173008 2500 2000 "auto"]
+	Line[427000 173008 427059 173008 2500 2000 "auto"]
+	Line[437000 136000 437000 143441 2500 2000 "auto"]
+	Line[427000 143008 426941 143008 2500 2000 "auto"]
+	Line[427000 136000 427000 143008 2500 2000 "auto"]
+	Line[437000 106000 437000 113441 2500 2000 "auto"]
+	Line[427000 113008 426941 113008 2500 2000 "auto"]
+	Line[427000 106000 427000 113008 2500 2000 "auto"]
+	Line[437000 76000 437000 83500 2500 2000 "auto"]
+	Line[427000 83008 426941 83008 2500 2000 "auto"]
+	Line[427000 76000 427000 83008 2500 2000 "auto"]
+	Line[437000 46000 437000 53382 2500 2000 "auto"]
+	Line[427000 53008 426941 53008 2500 2000 "auto"]
+	Line[427000 46000 427000 53008 2500 2000 "auto"]
+	Line[437000 16000 437000 23382 2500 2000 "auto"]
+	Line[427118 22949 427000 22949 2500 2000 "auto"]
+	Line[427000 22949 427118 22949 2500 2000 "auto"]
+	Line[376394 29910 375985 29910 1000 2000 "auto"]
+	Line[376394 30550 376394 32339 1000 2000 "auto"]
+	Line[437433 58500 393897 58500 1000 2000 "auto"]
+	Line[376394 29910 375985 30050 1000 2000 "auto"]
+	Line[378544 46661 378544 48811 1000 2000 "auto"]
+	Line[376394 32339 376394 35000 1000 2000 "auto"]
+	Line[375985 30189 376394 30550 1000 2000 "auto"]
+	Line[376394 29910 376394 30050 1000 2000 "auto"]
+	Line[376394 29910 376394 29910 1000 2000 "auto"]
+	Line[463500 247492 463500 247492 2500 2000 "clearline,auto"]
+	Line[463500 337492 463500 337492 2500 2000 "clearline,auto"]
+	Line[463500 277492 463500 277492 2500 2000 "clearline,auto"]
+	Line[463500 187492 463500 187492 2500 2000 "clearline,auto"]
+	Line[463500 157492 463500 157492 2500 2000 "clearline,auto"]
+	Line[463500 7492 463500 7492 2500 2000 "clearline,auto"]
+	Line[463500 37492 463500 37492 2500 2000 "clearline,auto"]
+	Line[463500 67492 463500 67492 2500 2000 "clearline,auto"]
+	Line[427000 53008 427000 53008 2500 2000 "auto"]
+	Line[427000 83008 427000 83008 2500 2000 "auto"]
+	Line[427000 113008 427000 113008 2500 2000 "auto"]
+	Line[427000 143008 427000 143008 2500 2000 "auto"]
+	Line[427000 203508 427000 203508 2500 2000 "auto"]
+	Line[427000 233008 427000 233008 2500 2000 "auto"]
+	Line[463500 307492 463500 307492 2500 2000 "clearline,auto"]
+	Line[463500 127492 463500 127492 2500 2000 "clearline,auto"]
+	Line[463500 217492 463500 217492 2500 2000 "clearline,auto"]
+	Line[463500 97492 463500 97492 2500 2000 "clearline,auto"]
+	Line[463500 16000 463500 16000 2500 2000 "auto"]
+	Line[463500 76000 463500 76000 2500 2000 "auto"]
+	Line[463500 106000 463500 106000 2500 2000 "auto"]
+	Line[463500 97492 461000 96508 2500 2000 "auto"]
+	Line[461000 97492 463500 97492 2500 2000 "clearline,auto"]
+	Line[461000 97492 463500 97492 2500 2000 "clearline,auto"]
+	Line[463500 136000 463500 136000 2500 2000 "auto"]
+	Line[463500 166000 463500 166000 2500 2000 "auto"]
+	Line[463500 196000 463500 196000 2500 2000 "auto"]
+	Line[463500 226000 463500 226000 2500 2000 "auto"]
+	Line[463500 217492 461000 216508 2500 2000 "auto"]
+	Line[461000 217492 463500 217492 2500 2000 "clearline,auto"]
+	Line[461000 217492 463500 217492 2500 2000 "clearline,auto"]
+	Line[463500 127492 461000 126508 2500 2000 "auto"]
+	Line[461000 127492 463500 127492 2500 2000 "clearline,auto"]
+	Line[461000 127492 463500 127492 2500 2000 "clearline,auto"]
+	Line[463500 256000 463500 256000 2500 2000 "auto"]
+	Line[463500 286000 463500 286000 2500 2000 "auto"]
+	Line[463500 316000 463500 316000 2500 2000 "auto"]
+	Line[473500 353992 473559 353992 2500 2000 "clearline,auto"]
+	Line[463500 346000 463500 346000 2500 2000 "auto"]
+	Line[463500 307492 461059 306508 2500 2000 "auto"]
+	Line[461059 307492 463500 307492 2500 2000 "clearline,auto"]
+	Line[461059 307492 463500 307492 2500 2000 "clearline,auto"]
+	Line[473500 6508 473559 6508 2500 2000 "clearline,auto"]
+	Line[473500 96508 473000 96508 2500 2000 "clearline,auto"]
+	Line[473500 66508 473559 66508 2500 2000 "clearline,auto"]
+	Line[473500 36508 473559 36508 2500 2000 "clearline,auto"]
+	Line[473500 186508 473559 186508 2500 2000 "clearline,auto"]
+	Line[473500 126508 473677 126508 2500 2000 "clearline,auto"]
+	Line[473500 156508 473559 156508 2500 2000 "clearline,auto"]
+	Line[473500 246508 473559 246508 2500 2000 "clearline,auto"]
+	Line[427000 16000 427000 16000 2500 2000 "auto"]
+	Line[437000 16000 437000 16000 2500 2000 "auto"]
+	Line[427118 22949 427118 22949 2500 2000 "auto"]
+	Line[427118 22949 427000 22949 2500 2000 "auto"]
+	Line[437000 7390 437059 7390 2500 2000 "auto"]
+	Line[437059 8374 437059 8374 2500 2000 "auto"]
+	Line[437000 8374 437059 8374 2500 2000 "auto"]
+	Line[427000 226000 427000 226000 2500 2000 "auto"]
+	Line[437000 226000 437000 226000 2500 2000 "auto"]
+	Line[426941 233008 427000 233008 2500 2000 "auto"]
+	Line[426941 233008 427000 233008 2500 2000 "auto"]
+	Line[427000 196000 427000 196000 2500 2000 "auto"]
+	Line[437000 196000 437000 196000 2500 2000 "auto"]
+	Line[426941 203508 427000 203508 2500 2000 "auto"]
+	Line[426941 203508 427000 203508 2500 2000 "auto"]
+	Line[427000 166000 427000 166000 2500 2000 "auto"]
+	Line[437000 166000 437000 166000 2500 2000 "auto"]
+	Line[427059 173008 427059 173008 2500 2000 "auto"]
+	Line[427059 173008 427000 173008 2500 2000 "auto"]
+	Line[427000 136000 427000 136000 2500 2000 "auto"]
+	Line[437000 136000 437000 136000 2500 2000 "auto"]
+	Line[426941 143008 427000 143008 2500 2000 "auto"]
+	Line[426941 143008 427000 143008 2500 2000 "auto"]
+	Line[427000 106000 427000 106000 2500 2000 "auto"]
+	Line[437000 106000 437000 106000 2500 2000 "auto"]
+	Line[426941 113008 427000 113008 2500 2000 "auto"]
+	Line[426941 113008 427000 113008 2500 2000 "auto"]
+	Line[427000 76000 427000 76000 2500 2000 "auto"]
+	Line[437000 76000 437000 76000 2500 2000 "auto"]
+	Line[426941 83008 427000 83008 2500 2000 "auto"]
+	Line[426941 83008 427000 83008 2500 2000 "auto"]
+	Line[426941 53008 427000 53008 2500 2000 "auto"]
+	Line[426941 53008 427000 53008 2500 2000 "auto"]
+	Line[421823 51532 421823 51532 1000 2000 "auto"]
+	Line[421823 53008 421823 51532 1000 2000 "auto"]
+	Line[421823 53008 421823 51532 1000 2000 "auto"]
+	Line[463500 67492 461000 66508 2500 2000 "auto"]
+	Line[461000 67492 463500 67492 2500 2000 "clearline,auto"]
+	Line[461000 67492 463500 67492 2500 2000 "clearline,auto"]
+	Line[463500 37492 461059 36508 2500 2000 "auto"]
+	Line[461059 37492 463500 37492 2500 2000 "clearline,auto"]
+	Line[461059 37492 463500 37492 2500 2000 "clearline,auto"]
+	Line[463500 7492 461000 6508 2500 2000 "auto"]
+	Line[461000 7492 463500 7492 2500 2000 "clearline,auto"]
+	Line[461000 7492 463500 7492 2500 2000 "clearline,auto"]
+	Line[463500 157492 461000 156508 2500 2000 "auto"]
+	Line[461000 157492 463500 157492 2500 2000 "clearline,auto"]
+	Line[461000 157492 463500 157492 2500 2000 "clearline,auto"]
+	Line[463500 187492 461000 186508 2500 2000 "auto"]
+	Line[461000 187492 463500 187492 2500 2000 "clearline,auto"]
+	Line[461000 187492 463500 187492 2500 2000 "clearline,auto"]
+	Line[463500 277492 461000 276508 2500 2000 "auto"]
+	Line[461000 277492 463500 277492 2500 2000 "clearline,auto"]
+	Line[461000 277492 463500 277492 2500 2000 "clearline,auto"]
+	Line[463500 337492 461059 336508 2500 2000 "auto"]
+	Line[461059 337492 463500 337492 2500 2000 "clearline,auto"]
+	Line[461059 337492 463500 337492 2500 2000 "clearline,auto"]
+	Line[463500 247492 461000 246508 2500 2000 "auto"]
+	Line[461000 247492 463500 247492 2500 2000 "clearline,auto"]
+	Line[461000 247492 463500 247492 2500 2000 "clearline,auto"]
+	Line[463500 46000 463500 46000 2500 2000 "auto"]
+	Line[375985 29910 376394 29910 1000 2000 "auto"]
+	Line[375985 29910 376394 29910 1000 2000 "auto"]
+	Line[375985 30050 376394 29910 1000 2000 "auto"]
+	Line[427000 46000 427000 46000 2500 2000 "auto"]
+	Line[437000 46000 437000 46000 2500 2000 "auto"]
+	Line[375985 48811 372441 48811 1000 2000 "clearline"]
+	Line[378441 37000 376394 34953 1000 2000 ""]
+	Line[399750 37000 378441 37000 1000 2000 ""]
+	Line[401750 35000 399750 37000 1000 2000 ""]
+	Line[401750 28500 401750 35000 1000 2000 ""]
+	Line[376394 30550 376394 32339 1000 2000 "auto"]
+	Line[378544 44500 378544 46661 1000 2000 "auto"]
+	Line[376394 30050 376394 29910 1000 2000 "auto"]
+	Line[378441 32500 378441 27886 1000 2000 ""]
+	Line[388779 32500 378441 32500 1000 2000 ""]
+	Line[396555 27886 397441 27000 1000 2000 ""]
+	Line[393897 27886 396555 27886 1000 2000 ""]
+	Line[393897 53417 393897 58500 1000 2000 "auto"]
+	Line[421823 51532 421823 53992 1000 2000 "auto"]
+	Line[421823 51532 421823 51532 1000 2000 "auto"]
+	Line[378544 46661 378544 48811 1000 2000 "auto"]
+	Line[376394 29910 375985 30050 1000 2000 "auto"]
+	Line[376394 29910 376394 29910 1000 2000 "auto"]
+	Line[391338 23433 391338 25583 1000 2000 "auto"]
+	Line[427000 16000 427000 16000 2500 2000 "auto"]
+	Line[427118 22949 427118 22949 2500 2000 "auto"]
+	Line[437000 16000 437000 16000 2500 2000 "auto"]
+	Line[427000 46000 427000 46000 2500 2000 "auto"]
+	Line[427000 53008 427000 53008 2500 2000 "auto"]
+	Line[437000 46000 437000 46000 2500 2000 "auto"]
+	Line[427000 76000 427000 76000 2500 2000 "auto"]
+	Line[427000 83008 427000 83008 2500 2000 "auto"]
+	Line[437000 76000 437000 76000 2500 2000 "auto"]
+	Line[427000 106000 427000 106000 2500 2000 "auto"]
+	Line[427000 113008 427000 113008 2500 2000 "auto"]
+	Line[437000 106000 437000 106000 2500 2000 "auto"]
+	Line[427000 136000 427000 136000 2500 2000 "auto"]
+	Line[427000 143008 427000 143008 2500 2000 "auto"]
+	Line[437000 136000 437000 136000 2500 2000 "auto"]
+	Line[427000 166000 427000 166000 2500 2000 "auto"]
+	Line[427059 173008 427059 173008 2500 2000 "auto"]
+	Line[437000 166000 437000 166000 2500 2000 "auto"]
+	Line[427000 196000 427000 196000 2500 2000 "auto"]
+	Line[427000 203508 427000 203508 2500 2000 "auto"]
+	Line[437000 196000 437000 196000 2500 2000 "auto"]
+	Line[427000 226000 427000 226000 2500 2000 "auto"]
+	Line[427000 233008 427000 233008 2500 2000 "auto"]
+	Line[437000 226000 437000 226000 2500 2000 "auto"]
+	Line[431882 214532 431882 218492 1000 2000 "auto"]
+	Line[421882 214532 421882 217508 1000 2000 "auto"]
+	Line[431882 154532 431882 158492 1000 2000 "auto"]
+	Line[421882 154532 421882 157508 1000 2000 "auto"]
+	Line[431882 64532 431882 68492 1000 2000 "auto"]
+	Line[421882 64532 421882 67508 1000 2000 "auto"]
+	Line[431882 184532 431882 188492 1000 2000 "auto"]
+	Line[421882 184532 421882 187508 1000 2000 "auto"]
+	Line[431882 124532 431882 128492 1000 2000 "auto"]
+	Line[421882 124532 421882 127508 1000 2000 "auto"]
+	Line[431882 94532 431882 98492 1000 2000 "auto"]
+	Line[421882 94532 421882 97508 1000 2000 "auto"]
+	Line[431882 34532 431882 38492 1000 2000 "auto"]
+	Line[421882 34532 421882 37508 1000 2000 "auto"]
+	Line[431941 4532 431941 8374 1000 2000 "auto"]
+	Line[421882 4532 421882 7508 1000 2000 "auto"]
+	Line[418559 218000 417000 219559 2500 2000 ""]
+	Line[421882 218000 418559 218000 2500 2000 ""]
+	Line[418559 188000 417000 189559 2500 2000 ""]
+	Line[421882 188000 418559 188000 2500 2000 ""]
+	Line[418441 158000 417000 159441 2500 2000 ""]
+	Line[421882 158000 418441 158000 2500 2000 ""]
+	Line[418500 128000 417000 129500 2500 2000 ""]
+	Line[421882 128000 418500 128000 2500 2000 ""]
+	Line[418941 98000 417000 99941 2500 2000 ""]
+	Line[421882 98000 418941 98000 2500 2000 ""]
+	Line[418559 68000 417000 69559 2500 2000 ""]
+	Line[421882 68000 418559 68000 2500 2000 ""]
+	Line[418441 38000 417000 39441 2500 2000 ""]
+	Line[421882 38000 418441 38000 2500 2000 ""]
+	Line[417000 9441 417000 16000 2500 2000 ""]
+	Line[418441 8000 417000 9441 2500 2000 ""]
+	Line[421882 8000 418441 8000 2500 2000 ""]
+	Line[417000 9323 414559 6882 2500 2000 ""]
+	Line[417000 16000 417000 9323 2500 2000 ""]
+	Line[417000 39500 414500 37000 2500 2000 ""]
+	Line[417000 46000 417000 39500 2500 2000 ""]
+	Line[417000 69500 414500 67000 2500 2000 ""]
+	Line[417000 76000 417000 69500 2500 2000 ""]
+	Line[417000 99500 414500 97000 2500 2000 ""]
+	Line[417000 106000 417000 99500 2500 2000 ""]
+	Line[417000 129441 414559 127000 2500 2000 ""]
+	Line[417000 136000 417000 129441 2500 2000 ""]
+	Line[417000 159441 414559 157000 2500 2000 ""]
+	Line[417000 166000 417000 159441 2500 2000 ""]
+	Line[417000 189500 414500 187000 2500 2000 ""]
+	Line[417000 196000 417000 189500 2500 2000 ""]
+	Line[417000 219500 414500 217000 2500 2000 ""]
+	Line[417000 226000 417000 219500 2500 2000 ""]
+	Line[407000 219382 407000 226000 2500 2000 ""]
+	Line[409382 217000 407000 219382 2500 2000 ""]
+	Line[407000 189382 407000 196000 2500 2000 ""]
+	Line[409382 187000 407000 189382 2500 2000 ""]
+	Line[407000 159441 407000 166000 2500 2000 ""]
+	Line[409441 157000 407000 159441 2500 2000 ""]
+	Line[407000 129441 407000 136000 2500 2000 ""]
+	Line[409441 127000 407000 129441 2500 2000 ""]
+	Line[407000 99382 407000 106000 2500 2000 ""]
+	Line[409382 97000 407000 99382 2500 2000 ""]
+	Line[407000 69382 407000 76000 2500 2000 ""]
+	Line[409382 67000 407000 69382 2500 2000 ""]
+	Line[407000 39382 407000 46000 2500 2000 ""]
+	Line[409382 37000 407000 39382 2500 2000 ""]
+	Line[407000 9323 407000 16000 2500 2000 ""]
+	Line[409441 6882 407000 9323 2500 2000 ""]
+	Line[427000 8492 427000 16000 2500 2000 "auto"]
+	Line[437000 8374 437000 16000 2500 2000 "auto"]
+	Line[437059 8374 437059 8374 2500 2000 "auto"]
+	Line[427000 38492 427000 46000 2500 2000 "auto"]
+	Line[437000 38492 437000 46000 2500 2000 "auto"]
+	Line[427000 68492 427000 76000 2500 2000 "auto"]
+	Line[437000 68492 437000 76000 2500 2000 "auto"]
+	Line[427000 98492 427000 106000 2500 2000 "auto"]
+	Line[437000 98492 437000 106000 2500 2000 "auto"]
+	Line[427000 128492 427000 136000 2500 2000 "auto"]
+	Line[437000 128492 437000 136000 2500 2000 "auto"]
+	Line[427000 158492 427000 166000 2500 2000 "auto"]
+	Line[437000 158492 437000 166000 2500 2000 "auto"]
+	Line[427000 188492 427000 196000 2500 2000 "auto"]
+	Line[437000 188492 437000 196000 2500 2000 "auto"]
+	Line[427000 218492 427000 226000 2500 2000 "auto"]
+	Line[437000 218492 437000 226000 2500 2000 "auto"]
+	Line[455882 7000 453500 9382 2500 2000 ""]
+	Line[453500 39441 453500 46000 2500 2000 ""]
+	Line[455941 37000 453500 39441 2500 2000 ""]
+	Line[453500 69382 453500 76000 2500 2000 ""]
+	Line[455882 67000 453500 69382 2500 2000 ""]
+	Line[453500 99382 453500 106000 2500 2000 ""]
+	Line[455882 97000 453500 99382 2500 2000 ""]
+	Line[453500 129382 453500 136000 2500 2000 ""]
+	Line[455882 127000 453500 129382 2500 2000 ""]
+	Line[453500 159382 453500 166000 2500 2000 ""]
+	Line[455882 157000 453500 159382 2500 2000 ""]
+	Line[453500 189382 453500 196000 2500 2000 ""]
+	Line[455882 187000 453500 189382 2500 2000 ""]
+	Line[453500 219382 453500 226000 2500 2000 ""]
+	Line[455882 217000 453500 219382 2500 2000 ""]
+	Line[453500 249382 453500 256000 2500 2000 ""]
+	Line[455882 247000 453500 249382 2500 2000 ""]
+	Line[453500 279382 453500 286000 2500 2000 ""]
+	Line[455882 277000 453500 279382 2500 2000 ""]
+	Line[453500 309441 453500 316000 2500 2000 ""]
+	Line[455941 307000 453500 309441 2500 2000 ""]
+	Line[453500 339441 453500 346000 2500 2000 ""]
+	Line[455941 337000 453500 339441 2500 2000 ""]
+	Line[463500 247492 463500 256000 2500 2000 "auto"]
+	Line[463500 247492 463500 247492 2500 2000 "auto"]
+	Line[463500 277492 463500 286000 2500 2000 "auto"]
+	Line[463500 277492 463500 277492 2500 2000 "auto"]
+	Line[463500 307492 463500 316000 2500 2000 "auto"]
+	Line[463500 307492 463500 307492 2500 2000 "auto"]
+	Line[463500 337492 463500 346000 2500 2000 "auto"]
+	Line[463500 337492 463500 337492 2500 2000 "auto"]
+	Line[463500 7492 463500 16000 2500 2000 "auto"]
+	Line[463500 7492 463500 7492 2500 2000 "auto"]
+	Line[463500 37492 463500 46000 2500 2000 "auto"]
+	Line[463500 37492 463500 37492 2500 2000 "auto"]
+	Line[463500 217492 463500 226000 2500 2000 "auto"]
+	Line[463500 217492 463500 217492 2500 2000 "auto"]
+	Line[463500 67492 463500 76000 2500 2000 "auto"]
+	Line[463500 67492 463500 67492 2500 2000 "auto"]
+	Line[463500 97492 463500 106000 2500 2000 "auto"]
+	Line[463500 97492 463500 97492 2500 2000 "auto"]
+	Line[463500 187492 463500 196000 2500 2000 "auto"]
+	Line[463500 187492 463500 187492 2500 2000 "auto"]
+	Line[463500 127492 463500 136000 2500 2000 "auto"]
+	Line[463500 127492 463500 127492 2500 2000 "auto"]
+	Line[463500 157492 463500 166000 2500 2000 "auto"]
+	Line[463500 157492 463500 157492 2500 2000 "auto"]
+	Line[468441 247492 463500 247492 2500 2000 "clearline,auto"]
+	Line[468441 7492 463500 7492 2500 2000 "clearline,auto"]
+	Line[468441 37492 463500 37492 2500 2000 "clearline,auto"]
+	Line[468441 67492 463500 67492 2500 2000 "clearline,auto"]
+	Line[467882 97492 463500 97492 2500 2000 "clearline,auto"]
+	Line[468559 127492 463500 127492 2500 2000 "clearline,auto"]
+	Line[468441 157492 463500 157492 2500 2000 "clearline,auto"]
+	Line[468441 187492 463500 187492 2500 2000 "clearline,auto"]
+	Line[468382 217492 463500 217492 2500 2000 "clearline,auto"]
+	Line[473500 247492 473500 256000 2500 2000 "clearline,auto"]
+	Line[473559 247492 473500 247492 2500 2000 "clearline,auto"]
+	Line[473500 256000 473500 264492 2500 2000 "clearline,auto"]
+	Line[473500 7492 473500 16000 2500 2000 "clearline,auto"]
+	Line[473559 7492 473500 7492 2500 2000 "clearline,auto"]
+	Line[473500 16000 473500 23992 2500 2000 "clearline,auto"]
+	Line[473500 37492 473500 46000 2500 2000 "clearline,auto"]
+	Line[473559 37492 473500 37492 2500 2000 "clearline,auto"]
+	Line[473618 46000 473618 53992 2500 2000 "clearline,auto"]
+	Line[473618 46000 473500 46000 2500 2000 "clearline,auto"]
+	Line[473500 67492 473500 76000 2500 2000 "clearline,auto"]
+	Line[473559 67492 473500 67492 2500 2000 "clearline,auto"]
+	Line[473500 76000 473500 83992 2500 2000 "clearline,auto"]
+	Line[473500 97492 473500 106000 2500 2000 "clearline,auto"]
+	Line[473500 97492 473000 97492 2500 2000 "clearline,auto"]
+	Line[473500 106000 473500 113992 2500 2000 "clearline,auto"]
+	Line[473500 127492 473500 136000 2500 2000 "clearline,auto"]
+	Line[473677 127492 473500 127492 2500 2000 "clearline,auto"]
+	Line[473500 136000 473500 144492 2500 2000 "clearline,auto"]
+	Line[473500 157492 473500 166000 2500 2000 "clearline,auto"]
+	Line[473559 157492 473500 157492 2500 2000 "clearline,auto"]
+	Line[473500 166000 473500 173992 2500 2000 "clearline,auto"]
+	Line[473500 187492 473500 196000 2500 2000 "clearline,auto"]
+	Line[473559 187492 473500 187492 2500 2000 "clearline,auto"]
+	Line[473500 196000 473500 203992 2500 2000 "clearline,auto"]
+	Line[473500 217492 473500 226000 2500 2000 "clearline,auto"]
+	Line[473500 226000 473500 234492 2500 2000 "clearline,auto"]
+	Line[468441 277492 463500 277492 2500 2000 "clearline,auto"]
+	Line[468441 307492 463500 307492 2500 2000 "clearline,auto"]
+	Line[468441 337492 463500 337492 2500 2000 "clearline,auto"]
+	Line[473500 286000 473500 293008 2500 2000 "clearline,auto"]
+	Line[473559 277492 473559 286000 2500 2000 "clearline,auto"]
+	Line[473559 286000 473500 286000 2500 2000 "clearline,auto"]
+	Line[473500 316000 473500 323008 2500 2000 "clearline,auto"]
+	Line[473559 307492 473559 316000 2500 2000 "clearline,auto"]
+	Line[473559 316000 473500 316000 2500 2000 "clearline,auto"]
+	Line[473500 346000 473500 353008 2500 2000 "clearline,auto"]
+	Line[473559 353008 473500 353008 2500 2000 "clearline,auto"]
+	Line[473559 337492 473559 346000 2500 2000 "clearline,auto"]
+	Line[473559 346000 473500 346000 2500 2000 "clearline,auto"]
+	Line[307716 124925 221756 124925 800 1600 "clearline"]
+	Line[308992 128029 223868 128029 800 1600 "clearline"]
+	Line[308872 133478 308083 134267 800 1600 "clearline"]
+	Line[245557 120492 247216 122151 800 1600 "clearline"]
+	Line[254740 101671 254740 104171 800 1600 "clearline"]
+	Line[254740 104171 261240 110671 800 1600 "clearline"]
+	Line[287917 97043 287917 92171 800 1600 "clearline"]
+	Line[266413 103406 266896 103889 800 1600 "clearline"]
+	Line[278225 120398 335757 120398 800 1600 "clearline"]
+	Line[262750 131228 263493 130485 800 1600 "clearline"]
+	Line[263493 130485 314645 130485 800 1600 "clearline"]
+	Line[293902 117737 275804 117737 800 1600 "clearline"]
+	Line[260341 115751 257845 113255 800 1600 "clearline"]
+	Line[260253 111936 259864 111936 800 1600 "clearline"]
+	Line[259864 111936 256818 108890 800 1600 "clearline"]
+	Line[257031 109103 252105 104177 800 1600 "clearline"]
+	Line[252105 104177 252105 98229 800 1600 "clearline"]
+	Line[257850 113260 250348 105758 800 1600 "clearline"]
+	Line[250348 105758 250348 98313 800 1600 "clearline"]
+	Line[252105 98302 268053 82354 800 1600 "clearline"]
+	Line[268053 82354 268053 76657 800 1600 "clearline"]
+	Line[250348 98154 250348 97723 800 1600 "clearline"]
+	Line[250348 97723 266453 81618 800 1600 "clearline"]
+	Line[266453 81618 266453 75994 800 1600 "clearline"]
+	Line[296779 95037 294773 97043 800 1600 "clearline"]
+	Line[294773 97043 293035 97043 800 1600 "clearline"]
+	Line[278224 101483 278224 96937 800 1600 "clearline"]
+	Line[278224 96937 285494 89667 800 1600 "clearline"]
+	Line[277174 91781 280976 87978 800 1600 "clearline"]
+	Line[293441 103889 305330 92000 800 1600 "clearline"]
+	Line[261240 110671 268849 110671 800 1600 "clearline"]
+	Line[268849 110671 270178 112000 800 1600 "clearline"]
+	Line[335673 120398 358839 120398 800 1600 "clearline"]
+	Line[358839 120398 376441 138000 800 1600 "clearline"]
+	Line[376441 138000 385441 138000 800 1600 "clearline"]
+	Line[378003 139800 375978 139800 800 1600 "clearline"]
+	Line[375978 139800 358541 122363 800 1600 "clearline"]
+	Line[300104 122363 358541 122363 800 1600 "clearline"]
+	Line[371441 122000 368170 118729 800 1600 "clearline"]
+	Line[368170 118729 324922 118729 800 1600 "clearline"]
+	Line[324922 118729 318193 112000 800 1600 "clearline"]
+	Line[270178 112000 318193 112000 800 1600 "clearline"]
+	Line[270441 110000 319525 110000 800 1600 "clearline"]
+	Line[319525 110000 326237 116712 800 1600 "clearline"]
+	Line[326237 116712 370153 116712 800 1600 "clearline"]
+	Line[370153 116712 371441 118000 800 1600 "clearline"]
+	Line[369441 88000 363841 93600 800 1600 "clearline"]
+	Line[305993 93600 363841 93600 800 1600 "clearline"]
+	Line[305330 92000 362441 92000 800 1600 "clearline"]
+	Line[362441 92000 368441 86000 800 1600 "clearline"]
+	Line[387441 74000 391338 70103 800 1600 "clearline"]
+	Line[391338 70103 391338 50897 800 1600 "clearline"]
+	Line[390441 121212 389653 122000 1000 2000 "clearline"]
+	Line[391838 109311 391838 115915 800 1600 "clearline"]
+	Line[391838 115915 392388 116465 800 1600 "clearline"]
+	Line[392388 116465 392388 136608 800 1600 "clearline"]
+	Line[392388 136608 390280 138716 800 1600 "clearline"]
+	Line[390280 138716 390280 143942 800 1600 "clearline"]
+	Line[390280 143942 389629 144593 800 1600 "clearline"]
+	Line[389629 144593 389629 147615 800 1600 "clearline"]
+	Line[285494 89667 358774 89667 800 1600 "clearline"]
+	Line[358774 89667 367441 81000 800 1600 "clearline"]
+	Line[367441 81000 367441 62500 800 1600 "clearline"]
+	Line[280976 87978 356463 87978 800 1600 "clearline"]
+	Line[356463 87978 363441 81000 800 1600 "clearline"]
+	Line[363441 81000 363441 64096 800 1600 "clearline"]
+	Line[269653 101369 272165 103881 800 1600 "clearline"]
+	Line[272165 103881 274480 103881 800 1600 "clearline"]
+	Line[274480 103881 275724 102637 800 1600 "clearline"]
+	Line[275724 102637 275724 98506 800 1600 "clearline"]
+	Line[275724 98506 273634 96415 800 1600 "clearline"]
+	Line[266413 103406 268508 105501 800 1600 "clearline"]
+	Line[268508 105501 281091 105501 800 1600 "clearline"]
+	Line[281091 105501 282702 103889 800 1600 "clearline"]
+	Line[282702 103889 293441 103889 800 1600 "clearline"]
+	Line[263240 104671 264568 106000 800 1600 "clearline"]
+	Line[264568 106000 266441 106000 800 1600 "clearline"]
+	Line[266441 106000 267558 107117 800 1600 "clearline"]
+	Line[267558 107117 292476 107117 800 1600 "clearline"]
+	Line[305993 93600 292476 107117 800 1600 "clearline"]
+	Line[270441 110000 269158 108717 800 1600 "clearline"]
+	Line[269158 108717 266020 108717 800 1600 "clearline"]
+	Line[266020 108717 265474 108171 800 1600 "clearline"]
+	Line[265474 108171 262740 108171 800 1600 "clearline"]
+	Line[273634 96415 273634 91856 800 1600 "clearline"]
+	Line[273634 91856 279121 86369 800 1600 "clearline"]
+	Line[273229 101418 271946 100134 800 1600 "clearline"]
+	Line[271946 100134 271946 91282 800 1600 "clearline"]
+	Line[278661 84566 345216 84566 800 1600 "clearline"]
+	Line[369155 28457 369155 55743 800 1600 "clearline"]
+	Line[369155 55743 361698 63201 800 1600 "clearline"]
+	Line[361698 63201 361698 79860 800 1600 "clearline"]
+	Line[361698 79860 355188 86369 800 1600 "clearline"]
+	Line[279121 86369 355188 86369 800 1600 "clearline"]
+	Line[367546 26910 367546 54895 800 1600 "clearline"]
+	Line[367546 54895 360013 62428 800 1600 "clearline"]
+	Line[360013 62428 360013 79140 800 1600 "clearline"]
+	Line[360013 79140 354587 84566 800 1600 "clearline"]
+	Line[354587 84566 345007 84566 800 1600 "clearline"]
+	Line[314441 130485 362315 130485 800 1600 "clearline"]
+	Line[362315 130485 371602 139772 800 1600 "clearline"]
+	Line[392188 165000 396441 165000 800 1600 "clearline"]
+	Line[385941 32500 385941 34000 800 1600 "clearline"]
+	Line[389167 88274 389167 98000 1000 2000 "clearline"]
+	Line[391838 107000 396441 107000 800 1600 "clearline"]
+	Line[396441 107000 398441 109000 800 1600 "clearline"]
+	Line[386023 242187 387710 240500 800 1600 "clearline"]
+	Line[387710 240500 388941 240500 800 1600 "clearline"]
+	Line[379044 216000 389441 216000 1000 2000 "clearline"]
+	Line[379044 206386 379044 216000 1000 2000 "clearline"]
+	Line[398441 227000 396441 225000 800 1600 "clearline"]
+	Line[396441 225000 391838 225000 800 1600 "clearline"]
+	Line[389279 204083 389279 187500 800 1600 "clearline"]
+	Line[389279 187500 392188 184591 800 1600 "clearline"]
+	Line[392188 184591 392188 170500 800 1600 "clearline"]
+	Line[437441 285000 440941 281500 2500 2000 "clearline"]
+	Line[440941 281500 440941 277000 2500 2000 "clearline"]
+	Line[363441 64096 372270 55267 800 1600 "clearline"]
+	Line[372270 55267 382441 55267 800 1600 "clearline"]
+	Line[382441 55267 383662 54046 800 1600 "clearline"]
+	Line[383662 54046 383662 51114 800 1600 "clearline"]
+	Line[372661 57280 367441 62500 800 1600 "clearline"]
+	Line[381103 25583 381103 23662 800 1600 "clearline"]
+	Line[381103 23662 379029 21588 800 1600 "clearline"]
+	Line[379029 21588 376024 21588 800 1600 "clearline"]
+	Line[376456 18000 384405 18000 800 1600 "clearline"]
+	Line[384405 18000 387441 21036 800 1600 "clearline"]
+	Line[382720 81000 386720 85000 800 1600 "clearline"]
+	Line[386720 85000 386720 88386 800 1600 "clearline"]
+	Line[278661 84566 271946 91281 800 1600 "clearline"]
+	Line[271946 91281 271946 91495 800 1600 "clearline"]
+	Line[421895 305000 416441 299546 800 1600 "clearline"]
+	Line[416441 299546 416441 294000 800 1600 "clearline"]
+	Line[420941 307000 414441 300500 800 1600 "clearline"]
+	Line[414441 300500 414441 294000 800 1600 "clearline"]
+	Line[439941 329000 440941 330000 800 1600 "clearline"]
+	Line[440941 330000 440941 334441 800 1600 "clearline"]
+	Line[440449 334441 434941 334441 800 1600 "clearline"]
+	Line[434449 339559 434449 343500 800 1600 "clearline"]
+	Line[440449 339559 440449 343500 800 1600 "clearline"]
+	Line[85441 352500 79882 352500 2500 2000 "clearline"]
+	Line[79882 352500 77441 350059 2500 2000 "clearline"]
+	Line[76949 344941 79390 342500 2500 2000 "clearline"]
+	Line[79390 342500 85441 342500 2500 2000 "clearline"]
+	Line[106949 344941 109390 342500 2500 2000 "clearline"]
+	Line[109390 342500 115441 342500 2500 2000 "clearline"]
+	Line[115441 352500 108941 352500 2500 2000 "clearline"]
+	Line[108941 352500 107441 351000 2500 2000 "clearline"]
+	Line[136949 350059 139390 352500 2500 2000 "clearline"]
+	Line[139390 352500 145441 352500 2500 2000 "clearline"]
+	Line[145441 342500 139882 342500 2500 2000 "clearline"]
+	Line[139882 342500 137441 344941 2500 2000 "clearline"]
+	Line[166949 344941 169390 342500 2500 2000 "clearline"]
+	Line[169390 342500 175441 342500 2500 2000 "clearline"]
+	Line[166949 350059 169390 352500 2500 2000 "clearline"]
+	Line[169390 352500 175441 352500 2500 2000 "clearline"]
+	Line[196949 344941 199390 342500 2500 2000 "clearline"]
+	Line[199390 342500 205441 342500 2500 2000 "clearline"]
+	Line[196949 350059 199390 352500 2500 2000 "clearline"]
+	Line[199390 352500 205441 352500 2500 2000 "clearline"]
+	Line[226949 350059 229390 352500 2500 2000 "clearline"]
+	Line[229390 352500 235441 352500 2500 2000 "clearline"]
+	Line[226949 344941 229390 342500 2500 2000 "clearline"]
+	Line[229390 342500 235441 342500 2500 2000 "clearline"]
+	Line[256949 350059 259390 352500 2500 2000 "clearline"]
+	Line[259390 352500 265441 352500 2500 2000 "clearline"]
+	Line[256949 344941 259390 342500 2500 2000 "clearline"]
+	Line[259390 342500 265441 342500 2500 2000 "clearline"]
+	Line[286949 350059 289390 352500 2500 2000 "clearline"]
+	Line[289390 352500 295441 352500 2500 2000 "clearline"]
+	Line[286949 344941 289390 342500 2500 2000 "clearline"]
+	Line[289390 342500 295441 342500 2500 2000 "clearline"]
+	Line[115441 332500 115441 279500 800 1600 "clearline"]
+	Line[115441 279500 114441 278500 800 1600 "clearline"]
+	Line[85441 332500 109941 308000 800 1600 "clearline"]
+	Line[109941 308000 109941 269500 800 1600 "clearline"]
+	Line[109941 269500 111941 267500 800 1600 "clearline"]
+	Line[111941 267500 115441 267500 800 1600 "clearline"]
+	Line[145441 332500 145441 285500 800 1600 "clearline"]
+	Line[145441 285500 152441 278500 800 1600 "clearline"]
+	Line[175441 332500 154941 312000 800 1600 "clearline"]
+	Line[154941 312000 154941 269500 800 1600 "clearline"]
+	Line[154941 269500 153441 268000 800 1600 "clearline"]
+	Line[153441 268000 151941 268000 800 1600 "clearline"]
+	Line[235441 332500 198441 295500 800 1600 "clearline"]
+	Line[198441 295500 198441 277500 800 1600 "clearline"]
+	Line[205441 332500 190941 318000 800 1600 "clearline"]
+	Line[190941 318000 190941 270000 800 1600 "clearline"]
+	Line[190941 270000 193941 267000 800 1600 "clearline"]
+	Line[193941 267000 195441 267000 800 1600 "clearline"]
+	Line[265441 332500 234441 301500 800 1600 "clearline"]
+	Line[234441 301500 234441 277500 800 1600 "clearline"]
+	Line[295441 332500 275941 332500 800 1600 "clearline"]
+	Line[275941 332500 237441 294000 800 1600 "clearline"]
+	Line[237441 294000 237441 268500 800 1600 "clearline"]
+	Line[237441 268500 235941 267000 800 1600 "clearline"]
+	Line[118699 72271 118699 91171 5000 2000 "clearline"]
+	Line[127799 72271 127799 89142 2500 2000 "clearline"]
+	Line[127799 89142 125941 91000 2500 2000 "clearline"]
+	Line[124831 97615 120556 97615 3800 1600 "clearline"]
+	Line[120556 97615 118799 95858 3800 1600 "clearline"]
+	Line[118799 95858 118799 91171 4800 1600 "clearline"]
+	Line[263441 80000 222441 80000 800 1600 "clearline"]
+	Line[250941 170500 269858 189417 800 1600 "clearline"]
+	Line[269858 189417 304706 189417 800 1600 "clearline"]
+	Line[304584 192517 268458 192517 800 1600 "clearline"]
+	Line[268458 192517 246441 170500 800 1600 "clearline"]
+	Line[242441 170500 267558 195617 800 1600 "clearline"]
+	Line[267558 195617 305280 195617 800 1600 "clearline"]
+	Line[309941 187000 272050 187000 800 1600 "clearline"]
+	Line[272050 187000 247050 162000 800 1600 "clearline"]
+	Line[221884 146000 222884 145000 800 1600 "clearline"]
+	Line[222884 145000 275441 145000 800 1600 "clearline"]
+	Line[275441 145000 291441 161000 800 1600 "clearline"]
+	Line[291441 161000 360441 161000 800 1600 "clearline"]
+	Line[360441 161000 370441 171000 800 1600 "clearline"]
+	Line[224441 148000 275441 148000 800 1600 "clearline"]
+	Line[275441 148000 291441 164000 800 1600 "clearline"]
+	Line[377441 193000 348441 164000 800 1600 "clearline"]
+	Line[291441 164000 348441 164000 800 1600 "clearline"]
+	Line[356441 167000 363895 167000 800 1600 "clearline"]
+	Line[363895 167000 369168 172273 800 1600 "clearline"]
+	Line[361041 195000 371441 195000 800 1600 "clearline"]
+	Line[338441 169876 355441 186876 800 1600 "clearline"]
+	Line[338441 175808 353441 190808 800 1600 "clearline"]
+	Line[368441 233037 380404 245000 800 1600 "clearline"]
+	Line[380404 245000 392441 245000 800 1600 "clearline"]
+	Line[392441 245000 420441 273000 800 1600 "clearline"]
+	Line[420441 273000 420441 284500 800 1600 "clearline"]
+	Line[366841 207663 366841 233700 800 1600 "clearline"]
+	Line[366841 233700 380141 247000 800 1600 "clearline"]
+	Line[380141 247000 387441 247000 800 1600 "clearline"]
+	Line[387441 247000 418440 277999 800 1600 "clearline"]
+	Line[418440 277999 418440 284125 800 1600 "clearline"]
+	Line[225441 151000 226441 150000 800 1600 "clearline"]
+	Line[226441 150000 275178 150000 800 1600 "clearline"]
+	Line[275178 150000 292207 167029 800 1600 "clearline"]
+	Line[292207 167029 323886 167029 800 1600 "clearline"]
+	Line[365241 208384 365241 234363 800 1600 "clearline"]
+	Line[365241 234363 416441 285563 800 1600 "clearline"]
+	Line[416441 285563 416441 294545 800 1600 "clearline"]
+	Line[363484 208952 363484 237497 800 1600 "clearline"]
+	Line[363484 237497 414441 288454 800 1600 "clearline"]
+	Line[414441 288454 414441 294446 800 1600 "clearline"]
+	Line[135724 25061 142712 18073 800 1600 "clearline"]
+	Line[142712 18073 176106 18073 800 1600 "clearline"]
+	Line[176106 18073 180672 22639 800 1600 "clearline"]
+	Line[180672 22639 180672 38231 800 1600 "clearline"]
+	Line[222441 80000 180672 38231 800 1600 "clearline"]
+	Line[221804 124925 221493 124925 800 1600 "clearline"]
+	Line[221493 124925 217441 121000 800 1600 "clearline"]
+	Line[223941 128029 219970 128029 800 1600 "clearline"]
+	Line[219970 128029 219441 127500 800 1600 "clearline"]
+	Line[308872 133478 307930 134420 800 1600 "clearline"]
+	Line[307930 134420 220729 134420 800 1600 "clearline"]
+	Line[250553 119224 249753 119224 800 1600 "clearline"]
+	Line[249753 119224 187712 57182 800 1600 "clearline"]
+	Line[187712 57182 178887 57182 800 1600 "clearline"]
+	Line[260568 83003 218816 83003 800 1600 "clearline"]
+	Line[218816 83003 191363 55551 800 1600 "clearline"]
+	Line[240391 121436 230441 111486 800 1600 "clearline"]
+	Line[230441 111486 230441 107000 800 1600 "clearline"]
+	Line[279441 115000 273441 115000 800 1600 "clearline"]
+	Line[264034 117069 264034 115717 800 1600 "clearline"]
+	Line[264034 115717 260253 111936 800 1600 "clearline"]
+	Line[251412 116832 246731 112150 800 1600 "clearline"]
+	Line[246731 112150 246731 96969 800 1600 "clearline"]
+	Line[379394 152000 380114 152720 800 1600 "clearline"]
+	Line[380114 152720 388909 152720 800 1600 "clearline"]
+	Line[388909 152720 389629 152000 800 1600 "clearline"]
+	Line[389279 88386 389279 75838 800 1600 "clearline"]
+	Line[266453 75994 295669 46778 800 1600 "clearline"]
+	Line[295669 46778 328442 46778 800 1600 "clearline"]
+	Line[328442 46778 339837 58173 800 1600 "clearline"]
+	Line[268053 76657 296244 48466 800 1600 "clearline"]
+	Line[296244 48466 326886 48466 800 1600 "clearline"]
+	Line[326886 48466 338899 60479 800 1600 "clearline"]
+	Line[338899 60479 353390 60479 800 1600 "clearline"]
+	Line[309941 187000 334441 211500 800 1600 "clearline"]
+	Line[334441 211500 334441 234000 800 1600 "clearline"]
+	Line[334441 234000 337441 237000 800 1600 "clearline"]
+	Line[387441 21036 387441 22933 800 1600 "clearline"]
+	Line[387441 22933 386220 24154 800 1600 "clearline"]
+	Line[386220 24154 386220 27886 800 1600 "clearline"]
+	Line[372661 57280 387161 57280 800 1600 "clearline"]
+	Line[387161 57280 388779 55662 800 1600 "clearline"]
+	Line[388779 48811 388779 55662 800 1600 "clearline"]
+	Line[377347 237822 380228 237822 800 1600 "clearline"]
+	Line[380228 237822 384162 233888 800 1600 "clearline"]
+	Line[384162 233888 384162 229614 800 1600 "clearline"]
+	Line[323183 168651 291092 168651 800 1600 "clearline"]
+	Line[291092 168651 274191 151750 800 1600 "clearline"]
+	Line[274191 151750 231691 151750 800 1600 "clearline"]
+	Line[231691 151750 230441 153000 800 1600 "clearline"]
+	Line[355441 186876 355441 192511 800 1600 "clearline"]
+	Line[353441 190808 353441 192774 800 1600 "clearline"]
+	Line[368441 233037 368441 202000 800 1600 "clearline"]
+	Line[368441 202000 363441 197000 800 1600 "clearline"]
+	Line[363441 197000 359930 197000 800 1600 "clearline"]
+	Line[359930 197000 355441 192511 800 1600 "clearline"]
+	Line[353441 192774 359287 198620 800 1600 "clearline"]
+	Line[359287 198620 362786 198620 800 1600 "clearline"]
+	Line[362786 198620 366841 202675 800 1600 "clearline"]
+	Line[366841 202675 366841 207780 800 1600 "clearline"]
+	Line[323886 167029 350857 194000 800 1600 "clearline"]
+	Line[350857 194000 352404 194000 800 1600 "clearline"]
+	Line[352404 194000 365241 206837 800 1600 "clearline"]
+	Line[365241 206837 365241 209200 800 1600 "clearline"]
+	Line[365241 209200 365241 209200 800 1600 "clearline"]
+	Line[363484 209043 363484 207343 800 1600 "clearline"]
+	Line[363484 207343 351741 195600 800 1600 "clearline"]
+	Line[351791 195650 350244 195650 800 1600 "clearline"]
+	Line[350244 195650 323245 168651 800 1600 "clearline"]
+	Line[323245 168651 322092 168651 800 1600 "clearline"]
+	Line[250554 119224 253035 119224 800 1600 "clearline"]
+	Line[247253 122188 248390 123325 800 1600 "clearline"]
+	Line[273441 115000 268735 119706 800 1600 "clearline"]
+	Line[268735 119706 259870 119706 800 1600 "clearline"]
+	Line[259870 119706 256996 116832 800 1600 "clearline"]
+	Line[256996 116832 251412 116832 800 1600 "clearline"]
+	Line[253035 119224 255221 121410 800 1600 "clearline"]
+	Line[255221 121410 272141 121410 800 1600 "clearline"]
+	Line[272141 121410 275815 117737 800 1600 "clearline"]
+	Line[275815 117737 276842 117737 800 1600 "clearline"]
+	Line[300814 122363 299852 123325 800 1600 "clearline"]
+	Line[299852 123325 248390 123325 800 1600 "clearline"]
+	Line[248390 123325 245557 120492 800 1600 "clearline"]
+	Line[361041 195000 358941 192900 800 1600 "clearline"]
+	Line[358941 192900 358941 191500 800 1600 "clearline"]
+	Line[203441 145800 203441 163000 2500 2000 ""]
+	Line[203441 145800 204998 144243 2500 2000 ""]
+	Line[204998 144243 204998 137100 2500 2000 ""]
+	Line[204998 137100 205681 136417 2500 2000 ""]
+	Line[205681 136417 205681 131171 2500 2000 ""]
+	Line[210799 130679 212084 131964 2500 2000 "clearline"]
+	Line[212084 131964 212084 137100 2500 2000 "clearline"]
+	Line[212084 137100 212541 137557 2500 2000 "clearline"]
+	Line[212541 137557 212541 149100 2500 2000 "clearline"]
+	Line[212084 136707 216648 136707 2500 2000 "clearline"]
+	Line[216648 136707 220441 140500 2500 2000 "clearline"]
+	Line[194441 145800 188641 145800 2500 2000 "clearline"]
+	Line[188641 145800 183541 150900 2500 2000 "clearline"]
+	Line[183541 150900 183541 157557 2500 2000 "clearline"]
+	Line[183541 157557 178384 157557 2500 2000 "clearline"]
+	Line[178384 157557 165941 170000 2500 2000 "clearline"]
+	Line[165941 170000 165941 182500 2500 2000 "clearline"]
+	Line[165941 182500 169441 186000 2500 2000 "clearline"]
+	Line[204998 136707 204705 137000 2500 2000 ""]
+	Line[204705 137000 194441 137000 2500 2000 ""]
+	Line[205681 130679 205360 131000 2500 2000 ""]
+	Line[205360 131000 200941 131000 2500 2000 ""]
+	Line[205681 130679 205441 130439 2500 2000 ""]
+	Line[205441 130439 205441 126500 2500 2000 ""]
+	Line[203441 145800 199941 142300 2500 2000 ""]
+	Line[199941 142300 199941 139000 2500 2000 ""]
+	Line[453500 9382 453500 16000 2500 2000 ""]
+	Line[249101 71207 229818 51925 800 1600 "clearline"]
+	Line[229818 51925 229818 45012 800 1600 "clearline"]
+	Polygon("")
+	(
+		[122941 95000] [122941 68500] [92941 68500] [92941 40000] [156941 40000] 
+		[156941 57500] [130941 57500] [130941 95000] 
+	)
+	Polygon("")
+	(
+		[133441 82000] [155941 82000] [155941 60000] [133441 60000] 
+	)
+	Polygon("")
+	(
+		[218441 182500] [177941 182500] [177941 161500] [218441 161500] 
+	)
+	Polygon("")
+	(
+		[174941 180000] [179441 180000] [179441 185000] [174941 185000] 
+	)
+	Polygon("")
+	(
+		[182941 180000] [187441 180000] [187441 185000] [182941 185000] 
+	)
+	Polygon("")
+	(
+		[191441 185000] [195941 185000] [195941 190000] [191441 190000] 
+	)
+	Polygon("")
+	(
+		[199941 185000] [204441 185000] [204441 190000] [199941 190000] 
+	)
+	Polygon("")
+	(
+		[207941 185000] [212441 185000] [212441 190000] [207941 190000] 
+	)
+	Polygon("")
+	(
+		[217941 182500] [222441 182500] [222441 187500] [217941 187500] 
+	)
+	Polygon("")
+	(
+		[222441 177000] [226941 177000] [226941 182000] [222441 182000] 
+	)
+	Polygon("")
+	(
+		[222941 171000] [227441 171000] [227441 176000] [222941 176000] 
+	)
+	Polygon("")
+	(
+		[222441 162000] [226941 162000] [226941 167000] [222441 167000] 
+	)
+	Polygon("")
+	(
+		[210441 159500] [214941 159500] [214941 164500] [210441 164500] 
+	)
+	Polygon("")
+	(
+		[201441 160000] [205941 160000] [205941 165000] [201441 165000] 
+	)
+	Polygon("")
+	(
+		[191441 160500] [195941 160500] [195941 165500] [191441 165500] 
+	)
+	Polygon("")
+	(
+		[174941 169500] [179441 169500] [179441 174500] [174941 174500] 
+	)
+	Polygon("")
+	(
+		[221941 153500] [226441 153500] [226441 158500] [221941 158500] 
+	)
+	Polygon("")
+	(
+		[222441 162000] [226941 162000] [226941 167000] [222441 167000] 
+	)
+	Polygon("")
+	(
+		[233941 162000] [238441 162000] [238441 167000] [233941 167000] 
+	)
+	Polygon("")
+	(
+		[195941 135000] [200441 135000] [200441 140000] [195941 140000] 
+	)
+	Polygon("")
+	(
+		[195941 128000] [200441 128000] [200441 133000] [195941 133000] 
+	)
+	Polygon("")
+	(
+		[202941 120500] [207441 120500] [207441 125500] [202941 125500] 
+	)
+	Polygon("")
+	(
+		[179441 139000] [183941 139000] [183941 144000] [179441 144000] 
+	)
+	Polygon("")
+	(
+		[237001 135703] [241501 135703] [241501 140703] [237001 140703] 
+	)
+	Polygon("clearpoly")
+	(
+		[172441 109500] [261941 109500] [261941 176500] [252441 167500] [250941 169000] 
+		[252441 170500] [242441 170500] [261941 190000] [261941 198500] [172441 198500] 
+	)
+)
+Layer(5 "outline")
+(
+	Line[484600 6700 484600 358000 800 1600 "clearline"]
+	Line[479100 364500 73500 364500 800 1600 "clearline"]
+	Line[68000 358000 68000 156000 800 1600 "clearline"]
+	Line[74500 149500 101000 149500 800 1600 "clearline"]
+	Line[107500 144000 107500 87500 800 1600 "clearline"]
+	Line[101000 81000 74500 81000 800 1600 "clearline"]
+	Line[68000 74500 68000 6700 800 1600 "clearline"]
+	Line[74500 200 478100 200 800 1600 "clearline"]
+	Line[189949 263941 189890 264000 2500 2000 "clearline"]
+	Arc[478100 6700 6500 6500 800 1600 -90 -90 "clearline"]
+	Arc[478100 358000 6500 6500 800 1600 180 -90 "clearline"]
+	Arc[74500 358000 6500 6500 800 1600 90 -90 "clearline"]
+	Arc[74500 156000 6500 6500 800 1600 0 -90 "clearline"]
+	Arc[101000 143000 6500 6500 800 1600 180 -90 "clearline"]
+	Arc[101000 87500 6500 6500 800 1600 -90 -90 "clearline"]
+	Arc[74500 74500 6500 6500 800 1600 90 -90 "clearline"]
+	Arc[74500 6700 6500 6500 800 1600 0 -90 "clearline"]
+)
+Layer(6 "silk")
+(
+)
+Layer(7 "silk")
+(
+	Text[384000 226503 1 105 "7                               5              4               3                               1              0" "clearline"]
+	Text[308438 170515 0 100 "-   DIO CLK RST" "clearline"]
+	Text[308438 178515 0 100 "SWD connector" "clearline"]
+	Text[233456 73003 1 100 "ERR HB Z DB" "clearline"]
+	Text[442000 348003 1 105 "11             10              9              8               7              6              5              4              3              2              1              0" "clearline"]
+	Text[116941 173000 3 175 "- +" "clearline"]
+	Text[408938 260015 0 180 "-   +   D" "clearline"]
+	Text[404438 245515 0 135 "-  +   A  B" "clearline"]
+	Text[190941 157500 0 115 "FRC Team 971 BBB Cape" "clearline"]
+	Text[202441 170500 0 115 "20131204 2013-b1" "clearline"]
+	Text[317250 348504 1 180 "-  +  A" "clearline"]
+	Text[78938 316059 0 110 "0             1               2              3              4              5              6              7" "clearline"]
+)
+NetList()
+(
+	Net("+3.3V" "(unknown)")
+	(
+		Connect("C12-2")
+		Connect("C26-2")
+		Connect("C27-2")
+		Connect("C28-2")
+		Connect("C29-2")
+		Connect("C30-2")
+		Connect("C31-2")
+		Connect("C32-2")
+		Connect("R1-1")
+		Connect("R13-1")
+		Connect("R14-1")
+		Connect("R15-1")
+		Connect("U4-3")
+		Connect("U6-1")
+		Connect("U6-13")
+		Connect("U6-19")
+		Connect("U6-32")
+		Connect("U6-48")
+		Connect("U6-64")
+		Connect("X1/C1-2")
+		Connect("X1/U4-4")
+		Connect("X1/U4-16")
+		Connect("X2/C1-2")
+		Connect("X2/U4-4")
+		Connect("X2/U4-16")
+		Connect("X3/C1-2")
+		Connect("X3/U4-4")
+		Connect("X3/U4-16")
+		Connect("X4/C1-2")
+		Connect("X4/U4-4")
+		Connect("X4/U4-16")
+		Connect("X5/C1-2")
+		Connect("X5/U4-4")
+		Connect("X5/U4-16")
+		Connect("X6/C1-2")
+		Connect("X6/U4-4")
+		Connect("X6/U4-16")
+		Connect("X7/C1-2")
+		Connect("X7/U4-4")
+		Connect("X7/U4-16")
+	)
+	Net("+5V" "(unknown)")
+	(
+		Connect("C10-2")
+		Connect("C11-2")
+		Connect("C16-2")
+		Connect("C17-2")
+		Connect("U1-15")
+		Connect("U1-16")
+		Connect("U3-1")
+		Connect("U4-1")
+		Connect("U8-51")
+		Connect("U8-52")
+		Connect("X8/C5-2")
+		Connect("X8/R5-2")
+		Connect("X8/R7-2")
+		Connect("X8/R9-2")
+		Connect("X8/R11-2")
+		Connect("X8/U2-4")
+		Connect("X9/C5-2")
+		Connect("X9/R5-2")
+		Connect("X9/R7-2")
+		Connect("X9/R9-2")
+		Connect("X9/R11-2")
+		Connect("X9/U2-4")
+		Connect("X14/C5-2")
+		Connect("X14/C6-2")
+		Connect("X14/R6-2")
+		Connect("X14/R13-1")
+		Connect("X14/U3-7")
+	)
+	Net("+12V" "(unknown)")
+	(
+		Connect("CONN12-2")
+		Connect("R17-1")
+		Connect("X14/C3-2")
+		Connect("X14/C4-2")
+		Connect("X14/R2-1")
+		Connect("X14/R3-1")
+		Connect("X14/U3-1")
+		Connect("X16/C3-2")
+		Connect("X16/C4-2")
+		Connect("X16/R2-1")
+		Connect("X16/R3-1")
+		Connect("X16/U3-1")
+	)
+	Net("DIFFA" "(unknown)")
+	(
+		Connect("R10-1")
+		Connect("R12-1")
+		Connect("X1/U4-2")
+		Connect("X1/U4-6")
+		Connect("X1/U4-10")
+		Connect("X1/U4-14")
+		Connect("X2/U4-2")
+		Connect("X2/U4-6")
+		Connect("X2/U4-10")
+		Connect("X2/U4-14")
+		Connect("X3/U4-2")
+		Connect("X3/U4-6")
+		Connect("X3/U4-10")
+		Connect("X3/U4-14")
+		Connect("X4/U4-2")
+		Connect("X4/U4-6")
+		Connect("X4/U4-10")
+		Connect("X4/U4-14")
+		Connect("X5/U4-2")
+		Connect("X5/U4-6")
+		Connect("X5/U4-10")
+		Connect("X5/U4-14")
+		Connect("X6/U4-2")
+		Connect("X6/U4-6")
+		Connect("X6/U4-10")
+		Connect("X6/U4-14")
+		Connect("X7/U4-2")
+		Connect("X7/U4-6")
+		Connect("X7/U4-10")
+		Connect("X7/U4-14")
+	)
+	Net("GND" "(unknown)")
+	(
+		Connect("C2-2")
+		Connect("C3-2")
+		Connect("C4-1")
+		Connect("C5-1")
+		Connect("C6-1")
+		Connect("C7-1")
+		Connect("C8-1")
+		Connect("C9-1")
+		Connect("C10-1")
+		Connect("C11-1")
+		Connect("C12-1")
+		Connect("C13-1")
+		Connect("C14-1")
+		Connect("C15-1")
+		Connect("C16-1")
+		Connect("C17-1")
+		Connect("C18-1")
+		Connect("C19-1")
+		Connect("C20-1")
+		Connect("C21-1")
+		Connect("C22-1")
+		Connect("C23-1")
+		Connect("C24-1")
+		Connect("C25-1")
+		Connect("C26-1")
+		Connect("C27-1")
+		Connect("C28-1")
+		Connect("C29-1")
+		Connect("C30-1")
+		Connect("C31-1")
+		Connect("C32-1")
+		Connect("CONN1-1")
+		Connect("CONN2-1")
+		Connect("CONN3-1")
+		Connect("CONN4-1")
+		Connect("CONN5-1")
+		Connect("CONN6-1")
+		Connect("CONN7-1")
+		Connect("CONN8-1")
+		Connect("CONN9-1")
+		Connect("CONN12-1")
+		Connect("D7-1")
+		Connect("U1-9")
+		Connect("U1-14")
+		Connect("U2-2")
+		Connect("U2-3")
+		Connect("U2-7")
+		Connect("U2-10")
+		Connect("U2-11")
+		Connect("U2-12")
+		Connect("U2-13")
+		Connect("U3-2")
+		Connect("U3-4")
+		Connect("U4-2")
+		Connect("U4-4")
+		Connect("U6-12")
+		Connect("U6-18")
+		Connect("U6-63")
+		Connect("U8-1")
+		Connect("U8-2")
+		Connect("U8-47")
+		Connect("U8-48")
+		Connect("U9-2")
+		Connect("U9-4")
+		Connect("X1/C1-1")
+		Connect("X1/U4-8")
+		Connect("X1/U4-12")
+		Connect("X2/C1-1")
+		Connect("X2/U4-8")
+		Connect("X2/U4-12")
+		Connect("X3/C1-1")
+		Connect("X3/U4-8")
+		Connect("X3/U4-12")
+		Connect("X4/C1-1")
+		Connect("X4/U4-8")
+		Connect("X4/U4-12")
+		Connect("X5/C1-1")
+		Connect("X5/U4-8")
+		Connect("X5/U4-12")
+		Connect("X6/C1-1")
+		Connect("X6/U4-8")
+		Connect("X6/U4-12")
+		Connect("X7/C1-1")
+		Connect("X7/U4-8")
+		Connect("X7/U4-12")
+		Connect("X8/C1-1")
+		Connect("X8/C2-1")
+		Connect("X8/C3-1")
+		Connect("X8/C4-1")
+		Connect("X8/C5-1")
+		Connect("X8/R6-1")
+		Connect("X8/R8-1")
+		Connect("X8/R10-1")
+		Connect("X8/R12-1")
+		Connect("X8/U2-11")
+		Connect("X9/C1-1")
+		Connect("X9/C2-1")
+		Connect("X9/C3-1")
+		Connect("X9/C4-1")
+		Connect("X9/C5-1")
+		Connect("X9/R6-1")
+		Connect("X9/R8-1")
+		Connect("X9/R10-1")
+		Connect("X9/R12-1")
+		Connect("X9/U2-11")
+		Connect("X14/C2-1")
+		Connect("X14/C3-1")
+		Connect("X14/C4-1")
+		Connect("X14/C6-1")
+		Connect("X14/D1-1")
+		Connect("X14/R4-1")
+		Connect("X14/R5-1")
+		Connect("X14/U3-4")
+		Connect("X14/U3-8")
+	)
+	Net("NRST" "(unknown)")
+	(
+		Connect("C15-2")
+		Connect("CONN1-4")
+		Connect("U6-7")
+		Connect("U8-9")
+	)
+	Net("SGND" "(unknown)")
+	(
+		Connect("R10-2")
+		Connect("X1/X2/C2-2")
+		Connect("X1/X2/CONN4-1")
+		Connect("X1/X4/C2-2")
+		Connect("X1/X4/CONN4-1")
+		Connect("X2/X2/C2-2")
+		Connect("X2/X2/CONN4-1")
+		Connect("X2/X4/C2-2")
+		Connect("X2/X4/CONN4-1")
+		Connect("X3/X2/C2-2")
+		Connect("X3/X2/CONN4-1")
+		Connect("X3/X4/C2-2")
+		Connect("X3/X4/CONN4-1")
+		Connect("X4/X2/C2-2")
+		Connect("X4/X2/CONN4-1")
+		Connect("X4/X4/C2-2")
+		Connect("X4/X4/CONN4-1")
+		Connect("X5/X1/C2-2")
+		Connect("X5/X1/CONN12-1")
+		Connect("X5/X2/C2-2")
+		Connect("X5/X2/CONN12-1")
+		Connect("X5/X3/C2-2")
+		Connect("X5/X3/CONN12-1")
+		Connect("X5/X4/C2-2")
+		Connect("X5/X4/CONN12-1")
+		Connect("X6/X1/C2-2")
+		Connect("X6/X1/CONN12-1")
+		Connect("X6/X2/C2-2")
+		Connect("X6/X2/CONN12-1")
+		Connect("X6/X3/C2-2")
+		Connect("X6/X3/CONN12-1")
+		Connect("X6/X4/C2-2")
+		Connect("X6/X4/CONN12-1")
+		Connect("X7/X1/C2-2")
+		Connect("X7/X1/CONN12-1")
+		Connect("X7/X2/C2-2")
+		Connect("X7/X2/CONN12-1")
+		Connect("X7/X3/C2-2")
+		Connect("X7/X3/CONN12-1")
+		Connect("X7/X4/C2-2")
+		Connect("X7/X4/CONN12-1")
+		Connect("X16/C2-1")
+		Connect("X16/C3-1")
+		Connect("X16/C4-1")
+		Connect("X16/C6-1")
+		Connect("X16/D1-1")
+		Connect("X16/R4-1")
+		Connect("X16/R5-1")
+		Connect("X16/U3-4")
+		Connect("X16/U3-8")
+	)
+	Net("SVCC" "(unknown)")
+	(
+		Connect("C18-2")
+		Connect("C19-2")
+		Connect("C20-2")
+		Connect("C21-2")
+		Connect("C22-2")
+		Connect("C23-2")
+		Connect("C24-2")
+		Connect("C25-2")
+		Connect("CONN2-2")
+		Connect("CONN3-2")
+		Connect("CONN4-2")
+		Connect("CONN5-2")
+		Connect("CONN6-2")
+		Connect("CONN7-2")
+		Connect("CONN8-2")
+		Connect("CONN9-2")
+		Connect("R12-2")
+		Connect("X1/X2/C2-1")
+		Connect("X1/X2/CONN4-2")
+		Connect("X1/X2/R9-2")
+		Connect("X1/X2/R10-2")
+		Connect("X1/X4/C2-1")
+		Connect("X1/X4/CONN4-2")
+		Connect("X1/X4/R9-2")
+		Connect("X1/X4/R10-2")
+		Connect("X2/X2/C2-1")
+		Connect("X2/X2/CONN4-2")
+		Connect("X2/X2/R9-2")
+		Connect("X2/X2/R10-2")
+		Connect("X2/X4/C2-1")
+		Connect("X2/X4/CONN4-2")
+		Connect("X2/X4/R9-2")
+		Connect("X2/X4/R10-2")
+		Connect("X3/X2/C2-1")
+		Connect("X3/X2/CONN4-2")
+		Connect("X3/X2/R9-2")
+		Connect("X3/X2/R10-2")
+		Connect("X3/X4/C2-1")
+		Connect("X3/X4/CONN4-2")
+		Connect("X3/X4/R9-2")
+		Connect("X3/X4/R10-2")
+		Connect("X4/X2/C2-1")
+		Connect("X4/X2/CONN4-2")
+		Connect("X4/X2/R9-2")
+		Connect("X4/X2/R10-2")
+		Connect("X4/X4/C2-1")
+		Connect("X4/X4/CONN4-2")
+		Connect("X4/X4/R9-2")
+		Connect("X4/X4/R10-2")
+		Connect("X5/X1/C2-1")
+		Connect("X5/X1/CONN12-2")
+		Connect("X5/X1/R7-2")
+		Connect("X5/X2/C2-1")
+		Connect("X5/X2/CONN12-2")
+		Connect("X5/X2/R7-2")
+		Connect("X5/X3/C2-1")
+		Connect("X5/X3/CONN12-2")
+		Connect("X5/X3/R7-2")
+		Connect("X5/X4/C2-1")
+		Connect("X5/X4/CONN12-2")
+		Connect("X5/X4/R7-2")
+		Connect("X6/X1/C2-1")
+		Connect("X6/X1/CONN12-2")
+		Connect("X6/X1/R7-2")
+		Connect("X6/X2/C2-1")
+		Connect("X6/X2/CONN12-2")
+		Connect("X6/X2/R7-2")
+		Connect("X6/X3/C2-1")
+		Connect("X6/X3/CONN12-2")
+		Connect("X6/X3/R7-2")
+		Connect("X6/X4/C2-1")
+		Connect("X6/X4/CONN12-2")
+		Connect("X6/X4/R7-2")
+		Connect("X7/X1/C2-1")
+		Connect("X7/X1/CONN12-2")
+		Connect("X7/X1/R7-2")
+		Connect("X7/X2/C2-1")
+		Connect("X7/X2/CONN12-2")
+		Connect("X7/X2/R7-2")
+		Connect("X7/X3/C2-1")
+		Connect("X7/X3/CONN12-2")
+		Connect("X7/X3/R7-2")
+		Connect("X7/X4/C2-1")
+		Connect("X7/X4/CONN12-2")
+		Connect("X7/X4/R7-2")
+		Connect("X16/C5-2")
+		Connect("X16/C6-2")
+		Connect("X16/R6-2")
+		Connect("X16/R13-1")
+		Connect("X16/U3-7")
+	)
+	Net("unnamed_net1" "(unknown)")
+	(
+		Connect("U6-14")
+		Connect("X2/U4-13")
+	)
+	Net("unnamed_net2" "(unknown)")
+	(
+		Connect("U6-15")
+		Connect("X2/U4-11")
+	)
+	Net("unnamed_net3" "(unknown)")
+	(
+		Connect("U6-16")
+		Connect("X2/U4-5")
+	)
+	Net("unnamed_net4" "(unknown)")
+	(
+		Connect("U6-17")
+		Connect("X2/U4-3")
+	)
+	Net("unnamed_net5" "(unknown)")
+	(
+		Connect("U2-4")
+		Connect("U6-20")
+	)
+	Net("unnamed_net6" "(unknown)")
+	(
+		Connect("U6-21")
+		Connect("X3/U4-5")
+	)
+	Net("unnamed_net7" "(unknown)")
+	(
+		Connect("U6-22")
+		Connect("X4/U4-13")
+	)
+	Net("unnamed_net8" "(unknown)")
+	(
+		Connect("U6-23")
+		Connect("X5/U4-11")
+	)
+	Net("unnamed_net9" "(unknown)")
+	(
+		Connect("U6-41")
+		Connect("X3/U4-13")
+	)
+	Net("unnamed_net10" "(unknown)")
+	(
+		Connect("U6-42")
+		Connect("U8-72")
+	)
+	Net("unnamed_net11" "(unknown)")
+	(
+		Connect("U6-43")
+		Connect("U8-70")
+	)
+	Net("unnamed_net12" "(unknown)")
+	(
+		Connect("U6-44")
+		Connect("X5/U4-5")
+	)
+	Net("unnamed_net13" "(unknown)")
+	(
+		Connect("U6-45")
+		Connect("X5/U4-3")
+	)
+	Net("unnamed_net14" "(unknown)")
+	(
+		Connect("CONN1-2")
+		Connect("U6-46")
+	)
+	Net("unnamed_net15" "(unknown)")
+	(
+		Connect("CONN1-3")
+		Connect("U6-49")
+	)
+	Net("unnamed_net16" "(unknown)")
+	(
+		Connect("U6-26")
+		Connect("X3/U4-11")
+	)
+	Net("unnamed_net17" "(unknown)")
+	(
+		Connect("D2-1")
+		Connect("U6-27")
+	)
+	Net("unnamed_net18" "(unknown)")
+	(
+		Connect("U6-28")
+		Connect("X5/U4-13")
+	)
+	Net("unnamed_net19" "(unknown)")
+	(
+		Connect("U6-55")
+		Connect("X3/U4-3")
+	)
+	Net("unnamed_net20" "(unknown)")
+	(
+		Connect("D5-1")
+		Connect("U6-56")
+	)
+	Net("unnamed_net21" "(unknown)")
+	(
+		Connect("U6-57")
+		Connect("X4/U4-11")
+	)
+	Net("unnamed_net22" "(unknown)")
+	(
+		Connect("U6-58")
+		Connect("X4/U4-5")
+	)
+	Net("unnamed_net23" "(unknown)")
+	(
+		Connect("U6-59")
+		Connect("X4/U4-3")
+	)
+	Net("unnamed_net24" "(unknown)")
+	(
+		Connect("U6-61")
+		Connect("X7/U4-13")
+	)
+	Net("unnamed_net25" "(unknown)")
+	(
+		Connect("U6-62")
+		Connect("X7/U4-11")
+	)
+	Net("unnamed_net26" "(unknown)")
+	(
+		Connect("U6-29")
+		Connect("X7/U4-5")
+	)
+	Net("unnamed_net27" "(unknown)")
+	(
+		Connect("D6-1")
+		Connect("U6-30")
+	)
+	Net("unnamed_net28" "(unknown)")
+	(
+		Connect("U1-10")
+		Connect("U6-33")
+	)
+	Net("unnamed_net29" "(unknown)")
+	(
+		Connect("U1-13")
+		Connect("U6-34")
+	)
+	Net("unnamed_net30" "(unknown)")
+	(
+		Connect("U1-12")
+		Connect("U6-35")
+	)
+	Net("unnamed_net31" "(unknown)")
+	(
+		Connect("U1-11")
+		Connect("U6-36")
+	)
+	Net("unnamed_net32" "(unknown)")
+	(
+		Connect("U6-8")
+		Connect("X1/U4-3")
+	)
+	Net("unnamed_net33" "(unknown)")
+	(
+		Connect("U6-9")
+		Connect("X1/U4-5")
+	)
+	Net("unnamed_net34" "(unknown)")
+	(
+		Connect("U6-10")
+		Connect("U8-8")
+	)
+	Net("unnamed_net35" "(unknown)")
+	(
+		Connect("D1-1")
+		Connect("U6-11")
+	)
+	Net("unnamed_net36" "(unknown)")
+	(
+		Connect("U6-24")
+		Connect("X6/U4-3")
+	)
+	Net("unnamed_net37" "(unknown)")
+	(
+		Connect("U6-25")
+		Connect("X6/U4-5")
+	)
+	Net("unnamed_net38" "(unknown)")
+	(
+		Connect("U6-37")
+		Connect("X1/U4-11")
+	)
+	Net("unnamed_net39" "(unknown)")
+	(
+		Connect("U6-38")
+		Connect("X1/U4-13")
+	)
+	Net("unnamed_net40" "(unknown)")
+	(
+		Connect("U6-39")
+		Connect("U8-56")
+	)
+	Net("unnamed_net41" "(unknown)")
+	(
+		Connect("U2-16")
+		Connect("U6-51")
+	)
+	Net("unnamed_net42" "(unknown)")
+	(
+		Connect("U2-5")
+		Connect("U6-52")
+	)
+	Net("unnamed_net43" "(unknown)")
+	(
+		Connect("U2-15")
+		Connect("U6-53")
+	)
+	Net("unnamed_net44" "(unknown)")
+	(
+		Connect("U6-2")
+		Connect("X6/U4-11")
+	)
+	Net("unnamed_net45" "(unknown)")
+	(
+		Connect("U6-3")
+		Connect("X6/U4-13")
+	)
+	Net("unnamed_net46" "(unknown)")
+	(
+		Connect("U6-4")
+		Connect("X7/U4-3")
+	)
+	Net("unnamed_net47" "(unknown)")
+	(
+		Connect("C4-2")
+		Connect("U6-5")
+		Connect("U9-1")
+	)
+	Net("unnamed_net48" "(unknown)")
+	(
+		Connect("C5-2")
+		Connect("U6-6")
+		Connect("U9-3")
+	)
+	Net("unnamed_net49" "(unknown)")
+	(
+		Connect("U6-60")
+		Connect("U8-7")
+	)
+	Net("unnamed_net50" "(unknown)")
+	(
+		Connect("C13-2")
+		Connect("U6-31")
+	)
+	Net("unnamed_net51" "(unknown)")
+	(
+		Connect("C14-2")
+		Connect("U6-47")
+	)
+	Net("unnamed_net253" "(unknown)")
+	(
+		Connect("C3-1")
+		Connect("U2-1")
+	)
+	Net("unnamed_net254" "(unknown)")
+	(
+		Connect("C2-1")
+		Connect("U2-14")
+	)
+	Net("unnamed_net255" "(unknown)")
+	(
+		Connect("C7-2")
+		Connect("C8-2")
+		Connect("C9-2")
+		Connect("L2-2")
+		Connect("U2-6")
+		Connect("U3-3")
+	)
+	Net("unnamed_net256" "(unknown)")
+	(
+		Connect("D4-1")
+		Connect("L2-1")
+		Connect("U2-8")
+	)
+	Net("unnamed_net257" "(unknown)")
+	(
+		Connect("C6-2")
+		Connect("D4-3")
+		Connect("U2-9")
+	)
+	Net("unnamed_net258" "(unknown)")
+	(
+		Connect("U1-1")
+		Connect("X9/C1-2")
+		Connect("X9/R1-2")
+		Connect("X9/R5-1")
+		Connect("X9/R6-2")
+	)
+	Net("unnamed_net259" "(unknown)")
+	(
+		Connect("U1-2")
+		Connect("X9/C2-2")
+		Connect("X9/R2-2")
+		Connect("X9/R7-1")
+		Connect("X9/R8-2")
+	)
+	Net("unnamed_net260" "(unknown)")
+	(
+		Connect("U1-3")
+		Connect("X9/C3-2")
+		Connect("X9/R3-2")
+		Connect("X9/R9-1")
+		Connect("X9/R10-2")
+	)
+	Net("unnamed_net261" "(unknown)")
+	(
+		Connect("U1-4")
+		Connect("X9/C4-2")
+		Connect("X9/R4-2")
+		Connect("X9/R11-1")
+		Connect("X9/R12-2")
+	)
+	Net("unnamed_net262" "(unknown)")
+	(
+		Connect("U1-5")
+		Connect("X8/C1-2")
+		Connect("X8/R1-2")
+		Connect("X8/R5-1")
+		Connect("X8/R6-2")
+	)
+	Net("unnamed_net263" "(unknown)")
+	(
+		Connect("U1-6")
+		Connect("X8/C2-2")
+		Connect("X8/R2-2")
+		Connect("X8/R7-1")
+		Connect("X8/R8-2")
+	)
+	Net("unnamed_net264" "(unknown)")
+	(
+		Connect("U1-7")
+		Connect("X8/C3-2")
+		Connect("X8/R3-2")
+		Connect("X8/R9-1")
+		Connect("X8/R10-2")
+	)
+	Net("unnamed_net265" "(unknown)")
+	(
+		Connect("U1-8")
+		Connect("X8/C4-2")
+		Connect("X8/R4-2")
+		Connect("X8/R11-1")
+		Connect("X8/R12-2")
+	)
+	Net("unnamed_net266" "(unknown)")
+	(
+		Connect("CONN5-3")
+		Connect("X8/U2-3")
+	)
+	Net("unnamed_net267" "(unknown)")
+	(
+		Connect("CONN4-3")
+		Connect("X8/U2-5")
+	)
+	Net("unnamed_net268" "(unknown)")
+	(
+		Connect("CONN3-3")
+		Connect("X8/U2-10")
+	)
+	Net("unnamed_net269" "(unknown)")
+	(
+		Connect("CONN2-3")
+		Connect("X8/U2-12")
+	)
+	Net("unnamed_net284" "(unknown)")
+	(
+		Connect("CONN9-3")
+		Connect("X9/U2-3")
+	)
+	Net("unnamed_net285" "(unknown)")
+	(
+		Connect("CONN8-3")
+		Connect("X9/U2-5")
+	)
+	Net("unnamed_net286" "(unknown)")
+	(
+		Connect("CONN7-3")
+		Connect("X9/U2-10")
+	)
+	Net("unnamed_net287" "(unknown)")
+	(
+		Connect("CONN6-3")
+		Connect("X9/U2-12")
+	)
+	Net("unnamed_net302" "(unknown)")
+	(
+		Connect("D2-2")
+		Connect("R13-2")
+	)
+	Net("unnamed_net303" "(unknown)")
+	(
+		Connect("D5-2")
+		Connect("R14-2")
+	)
+	Net("unnamed_net304" "(unknown)")
+	(
+		Connect("D6-2")
+		Connect("R15-2")
+	)
+	Net("unnamed_net305" "(unknown)")
+	(
+		Connect("D7-2")
+		Connect("R17-2")
+	)
+	Net("unnamed_net306" "(unknown)")
+	(
+		Connect("D1-2")
+		Connect("R1-2")
+	)
+	Net("X1/unnamed_net130" "(unknown)")
+	(
+		Connect("X1/U4-1")
+		Connect("X1/X4/R8-2")
+	)
+	Net("X1/unnamed_net131" "(unknown)")
+	(
+		Connect("X1/U4-7")
+		Connect("X1/X4/R6-2")
+	)
+	Net("X1/unnamed_net132" "(unknown)")
+	(
+		Connect("X1/U4-9")
+		Connect("X1/X2/R8-2")
+	)
+	Net("X1/unnamed_net133" "(unknown)")
+	(
+		Connect("X1/U4-15")
+		Connect("X1/X2/R6-2")
+	)
+	Net("X1/X2/unnamed_net142" "(unknown)")
+	(
+		Connect("X1/X2/CONN4-3")
+		Connect("X1/X2/R6-1")
+		Connect("X1/X2/R9-1")
+	)
+	Net("X1/X2/unnamed_net143" "(unknown)")
+	(
+		Connect("X1/X2/CONN4-4")
+		Connect("X1/X2/R8-1")
+		Connect("X1/X2/R10-1")
+	)
+	Net("X1/X4/unnamed_net148" "(unknown)")
+	(
+		Connect("X1/X4/CONN4-3")
+		Connect("X1/X4/R6-1")
+		Connect("X1/X4/R9-1")
+	)
+	Net("X1/X4/unnamed_net149" "(unknown)")
+	(
+		Connect("X1/X4/CONN4-4")
+		Connect("X1/X4/R8-1")
+		Connect("X1/X4/R10-1")
+	)
+	Net("X2/unnamed_net55" "(unknown)")
+	(
+		Connect("X2/U4-1")
+		Connect("X2/X4/R8-2")
+	)
+	Net("X2/unnamed_net56" "(unknown)")
+	(
+		Connect("X2/U4-7")
+		Connect("X2/X4/R6-2")
+	)
+	Net("X2/unnamed_net57" "(unknown)")
+	(
+		Connect("X2/U4-9")
+		Connect("X2/X2/R8-2")
+	)
+	Net("X2/unnamed_net58" "(unknown)")
+	(
+		Connect("X2/U4-15")
+		Connect("X2/X2/R6-2")
+	)
+	Net("X2/X2/unnamed_net67" "(unknown)")
+	(
+		Connect("X2/X2/CONN4-3")
+		Connect("X2/X2/R6-1")
+		Connect("X2/X2/R9-1")
+	)
+	Net("X2/X2/unnamed_net68" "(unknown)")
+	(
+		Connect("X2/X2/CONN4-4")
+		Connect("X2/X2/R8-1")
+		Connect("X2/X2/R10-1")
+	)
+	Net("X2/X4/unnamed_net73" "(unknown)")
+	(
+		Connect("X2/X4/CONN4-3")
+		Connect("X2/X4/R6-1")
+		Connect("X2/X4/R9-1")
+	)
+	Net("X2/X4/unnamed_net74" "(unknown)")
+	(
+		Connect("X2/X4/CONN4-4")
+		Connect("X2/X4/R8-1")
+		Connect("X2/X4/R10-1")
+	)
+	Net("X3/unnamed_net105" "(unknown)")
+	(
+		Connect("X3/U4-1")
+		Connect("X3/X4/R8-2")
+	)
+	Net("X3/unnamed_net106" "(unknown)")
+	(
+		Connect("X3/U4-7")
+		Connect("X3/X4/R6-2")
+	)
+	Net("X3/unnamed_net107" "(unknown)")
+	(
+		Connect("X3/U4-9")
+		Connect("X3/X2/R8-2")
+	)
+	Net("X3/unnamed_net108" "(unknown)")
+	(
+		Connect("X3/U4-15")
+		Connect("X3/X2/R6-2")
+	)
+	Net("X3/X2/unnamed_net117" "(unknown)")
+	(
+		Connect("X3/X2/CONN4-3")
+		Connect("X3/X2/R6-1")
+		Connect("X3/X2/R9-1")
+	)
+	Net("X3/X2/unnamed_net118" "(unknown)")
+	(
+		Connect("X3/X2/CONN4-4")
+		Connect("X3/X2/R8-1")
+		Connect("X3/X2/R10-1")
+	)
+	Net("X3/X4/unnamed_net123" "(unknown)")
+	(
+		Connect("X3/X4/CONN4-3")
+		Connect("X3/X4/R6-1")
+		Connect("X3/X4/R9-1")
+	)
+	Net("X3/X4/unnamed_net124" "(unknown)")
+	(
+		Connect("X3/X4/CONN4-4")
+		Connect("X3/X4/R8-1")
+		Connect("X3/X4/R10-1")
+	)
+	Net("X4/unnamed_net80" "(unknown)")
+	(
+		Connect("X4/U4-1")
+		Connect("X4/X4/R8-2")
+	)
+	Net("X4/unnamed_net81" "(unknown)")
+	(
+		Connect("X4/U4-7")
+		Connect("X4/X4/R6-2")
+	)
+	Net("X4/unnamed_net82" "(unknown)")
+	(
+		Connect("X4/U4-9")
+		Connect("X4/X2/R8-2")
+	)
+	Net("X4/unnamed_net83" "(unknown)")
+	(
+		Connect("X4/U4-15")
+		Connect("X4/X2/R6-2")
+	)
+	Net("X4/X2/unnamed_net92" "(unknown)")
+	(
+		Connect("X4/X2/CONN4-3")
+		Connect("X4/X2/R6-1")
+		Connect("X4/X2/R9-1")
+	)
+	Net("X4/X2/unnamed_net93" "(unknown)")
+	(
+		Connect("X4/X2/CONN4-4")
+		Connect("X4/X2/R8-1")
+		Connect("X4/X2/R10-1")
+	)
+	Net("X4/X4/unnamed_net98" "(unknown)")
+	(
+		Connect("X4/X4/CONN4-3")
+		Connect("X4/X4/R6-1")
+		Connect("X4/X4/R9-1")
+	)
+	Net("X4/X4/unnamed_net99" "(unknown)")
+	(
+		Connect("X4/X4/CONN4-4")
+		Connect("X4/X4/R8-1")
+		Connect("X4/X4/R10-1")
+	)
+	Net("X5/unnamed_net169" "(unknown)")
+	(
+		Connect("X5/U4-1")
+		Connect("X5/X1/R6-2")
+	)
+	Net("X5/unnamed_net170" "(unknown)")
+	(
+		Connect("X5/U4-7")
+		Connect("X5/X2/R6-2")
+	)
+	Net("X5/unnamed_net171" "(unknown)")
+	(
+		Connect("X5/U4-9")
+		Connect("X5/X3/R6-2")
+	)
+	Net("X5/unnamed_net172" "(unknown)")
+	(
+		Connect("X5/U4-15")
+		Connect("X5/X4/R6-2")
+	)
+	Net("X5/X1/unnamed_net186" "(unknown)")
+	(
+		Connect("X5/X1/CONN12-3")
+		Connect("X5/X1/R6-1")
+		Connect("X5/X1/R7-1")
+	)
+	Net("X5/X2/unnamed_net182" "(unknown)")
+	(
+		Connect("X5/X2/CONN12-3")
+		Connect("X5/X2/R6-1")
+		Connect("X5/X2/R7-1")
+	)
+	Net("X5/X3/unnamed_net190" "(unknown)")
+	(
+		Connect("X5/X3/CONN12-3")
+		Connect("X5/X3/R6-1")
+		Connect("X5/X3/R7-1")
+	)
+	Net("X5/X4/unnamed_net194" "(unknown)")
+	(
+		Connect("X5/X4/CONN12-3")
+		Connect("X5/X4/R6-1")
+		Connect("X5/X4/R7-1")
+	)
+	Net("X6/unnamed_net227" "(unknown)")
+	(
+		Connect("X6/U4-1")
+		Connect("X6/X1/R6-2")
+	)
+	Net("X6/unnamed_net228" "(unknown)")
+	(
+		Connect("X6/U4-7")
+		Connect("X6/X2/R6-2")
+	)
+	Net("X6/unnamed_net229" "(unknown)")
+	(
+		Connect("X6/U4-9")
+		Connect("X6/X3/R6-2")
+	)
+	Net("X6/unnamed_net230" "(unknown)")
+	(
+		Connect("X6/U4-15")
+		Connect("X6/X4/R6-2")
+	)
+	Net("X6/X1/unnamed_net244" "(unknown)")
+	(
+		Connect("X6/X1/CONN12-3")
+		Connect("X6/X1/R6-1")
+		Connect("X6/X1/R7-1")
+	)
+	Net("X6/X2/unnamed_net240" "(unknown)")
+	(
+		Connect("X6/X2/CONN12-3")
+		Connect("X6/X2/R6-1")
+		Connect("X6/X2/R7-1")
+	)
+	Net("X6/X3/unnamed_net248" "(unknown)")
+	(
+		Connect("X6/X3/CONN12-3")
+		Connect("X6/X3/R6-1")
+		Connect("X6/X3/R7-1")
+	)
+	Net("X6/X4/unnamed_net252" "(unknown)")
+	(
+		Connect("X6/X4/CONN12-3")
+		Connect("X6/X4/R6-1")
+		Connect("X6/X4/R7-1")
+	)
+	Net("X7/unnamed_net198" "(unknown)")
+	(
+		Connect("X7/U4-1")
+		Connect("X7/X1/R6-2")
+	)
+	Net("X7/unnamed_net199" "(unknown)")
+	(
+		Connect("X7/U4-7")
+		Connect("X7/X2/R6-2")
+	)
+	Net("X7/unnamed_net200" "(unknown)")
+	(
+		Connect("X7/U4-9")
+		Connect("X7/X3/R6-2")
+	)
+	Net("X7/unnamed_net201" "(unknown)")
+	(
+		Connect("X7/U4-15")
+		Connect("X7/X4/R6-2")
+	)
+	Net("X7/X1/unnamed_net215" "(unknown)")
+	(
+		Connect("X7/X1/CONN12-3")
+		Connect("X7/X1/R6-1")
+		Connect("X7/X1/R7-1")
+	)
+	Net("X7/X2/unnamed_net211" "(unknown)")
+	(
+		Connect("X7/X2/CONN12-3")
+		Connect("X7/X2/R6-1")
+		Connect("X7/X2/R7-1")
+	)
+	Net("X7/X3/unnamed_net219" "(unknown)")
+	(
+		Connect("X7/X3/CONN12-3")
+		Connect("X7/X3/R6-1")
+		Connect("X7/X3/R7-1")
+	)
+	Net("X7/X4/unnamed_net223" "(unknown)")
+	(
+		Connect("X7/X4/CONN12-3")
+		Connect("X7/X4/R6-1")
+		Connect("X7/X4/R7-1")
+	)
+	Net("X8/unnamed_net271" "(unknown)")
+	(
+		Connect("X8/R1-1")
+		Connect("X8/U2-1")
+		Connect("X8/U2-2")
+	)
+	Net("X8/unnamed_net275" "(unknown)")
+	(
+		Connect("X8/R2-1")
+		Connect("X8/U2-6")
+		Connect("X8/U2-7")
+	)
+	Net("X8/unnamed_net277" "(unknown)")
+	(
+		Connect("X8/R3-1")
+		Connect("X8/U2-8")
+		Connect("X8/U2-9")
+	)
+	Net("X8/unnamed_net279" "(unknown)")
+	(
+		Connect("X8/R4-1")
+		Connect("X8/U2-13")
+		Connect("X8/U2-14")
+	)
+	Net("X9/unnamed_net289" "(unknown)")
+	(
+		Connect("X9/R1-1")
+		Connect("X9/U2-1")
+		Connect("X9/U2-2")
+	)
+	Net("X9/unnamed_net293" "(unknown)")
+	(
+		Connect("X9/R2-1")
+		Connect("X9/U2-6")
+		Connect("X9/U2-7")
+	)
+	Net("X9/unnamed_net295" "(unknown)")
+	(
+		Connect("X9/R3-1")
+		Connect("X9/U2-8")
+		Connect("X9/U2-9")
+	)
+	Net("X9/unnamed_net297" "(unknown)")
+	(
+		Connect("X9/R4-1")
+		Connect("X9/U2-13")
+		Connect("X9/U2-14")
+	)
+	Net("X14/unnamed_net153" "(unknown)")
+	(
+		Connect("X14/R3-2")
+		Connect("X14/U3-2")
+	)
+	Net("X14/unnamed_net154" "(unknown)")
+	(
+		Connect("X14/R2-2")
+		Connect("X14/R4-2")
+		Connect("X14/U3-3")
+	)
+	Net("X14/unnamed_net155" "(unknown)")
+	(
+		Connect("X14/C2-2")
+		Connect("X14/U3-5")
+	)
+	Net("X14/unnamed_net156" "(unknown)")
+	(
+		Connect("X14/C5-1")
+		Connect("X14/R5-2")
+		Connect("X14/R6-1")
+		Connect("X14/U3-6")
+	)
+	Net("X14/unnamed_net158" "(unknown)")
+	(
+		Connect("X14/D1-2")
+		Connect("X14/R13-2")
+	)
+	Net("X16/unnamed_net160" "(unknown)")
+	(
+		Connect("X16/R3-2")
+		Connect("X16/U3-2")
+	)
+	Net("X16/unnamed_net161" "(unknown)")
+	(
+		Connect("X16/R2-2")
+		Connect("X16/R4-2")
+		Connect("X16/U3-3")
+	)
+	Net("X16/unnamed_net162" "(unknown)")
+	(
+		Connect("X16/C2-2")
+		Connect("X16/U3-5")
+	)
+	Net("X16/unnamed_net163" "(unknown)")
+	(
+		Connect("X16/C5-1")
+		Connect("X16/R5-2")
+		Connect("X16/R6-1")
+		Connect("X16/U3-6")
+	)
+	Net("X16/unnamed_net165" "(unknown)")
+	(
+		Connect("X16/D1-2")
+		Connect("X16/R13-2")
+	)
+)
diff --git a/bbb_cape/schematic/check_refdes.sh b/bbb_cape/schematic/check_refdes.sh
new file mode 100755
index 0000000..1ebede1
--- /dev/null
+++ b/bbb_cape/schematic/check_refdes.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+if [[ $# -lt 1 ]]; then
+	find $(dirname $0) \( -name '*.sch' -or -name '*.sym' \) -exec $0 {} \;
+	exit $?
+fi
+
+FILE=$1
+
+DUPLICATED=$(grep -F 'refdes=' "${FILE}" | sort | uniq -d)
+
+if [[ -n ${DUPLICATED} ]]; then
+	echo Duplicated lines in ${FILE}:
+	echo ${DUPLICATED}
+fi
diff --git a/bbb_cape/schematic/copy_values.rb b/bbb_cape/schematic/copy_values.rb
new file mode 100755
index 0000000..62d0d05
--- /dev/null
+++ b/bbb_cape/schematic/copy_values.rb
@@ -0,0 +1,37 @@
+#!/usr/bin/env ruby
+
+system 'rm temp.*'
+system 'gsch2pcb cape.gsch2pcb -o temp > /dev/null 2>&1'
+
+$elements = {}
+
+ElementRegex = /[ \t]*(Element[\[(].+) "(.*)" "(.*)" "(.*)" (.*)/
+
+File.open('temp.pcb') do |f|
+	f.readlines.each do |temp_element|
+		match = ElementRegex.match(temp_element)
+		if match
+			refdes = match[3]
+			value = match[4]
+			$elements[refdes] = value
+		end
+	end
+end
+
+File.open('cape.pcb') do |f|
+	$start_lines = f.readlines
+end
+
+File.open('cape.pcb', 'w') do |f|
+	$start_lines.each do |line|
+		match = ElementRegex.match(line)
+		if match
+			footprint = match[2]
+			refdes = match[3]
+			value = match[4]
+			f.puts "#{match[1]} \"#{footprint}\" \"#{refdes}\" \"#{$elements[refdes] || value}\" #{match[5]}"
+		else
+			f.puts line
+		end
+	end
+end
diff --git a/bbb_cape/schematic/digital input.sch b/bbb_cape/schematic/digital input.sch
new file mode 100644
index 0000000..f6a2458
--- /dev/null
+++ b/bbb_cape/schematic/digital input.sch
@@ -0,0 +1,87 @@
+v 20110115 2
+C 46000 48000 1 180 0 in-1.sym
+{
+T 46000 47700 5 10 0 0 180 0 1
+device=INPUT
+T 45900 48100 5 10 1 1 180 0 1
+refdes=SGND
+}
+C 46000 46600 1 180 0 in-1.sym
+{
+T 46000 46300 5 10 0 0 180 0 1
+device=INPUT
+T 45900 46700 5 10 1 1 180 0 1
+refdes=SVCC
+}
+C 45400 45400 1 0 0 out-1.sym
+{
+T 45400 45700 5 10 0 0 0 0 1
+device=OUTPUT
+T 45400 45600 5 10 1 1 0 0 1
+refdes=OUT
+}
+N 44000 46500 45400 46500 4
+N 45400 47900 44100 47900 4
+N 44100 47900 44100 46800 4
+C 44200 45400 1 0 0 resistor-1.sym
+{
+T 44500 45800 5 10 0 0 0 0 1
+device=RESISTOR
+T 44400 45700 5 10 1 1 0 0 1
+refdes=R6
+T 44200 45200 5 10 1 1 0 0 1
+value=500 ohms
+T 44200 45400 5 10 0 0 0 0 1
+footprint=0603
+T 44200 45400 5 10 0 1 0 0 1
+pn=ERJ-3EKF4990V
+}
+N 45100 45500 45400 45500 4
+C 42300 46000 1 0 0 connector3-1.sym
+{
+T 44100 46900 5 10 0 0 0 0 1
+device=CONNECTOR_3
+T 42300 47100 5 10 1 1 0 0 1
+refdes=CONN12
+T 42300 46000 5 10 0 0 0 0 1
+footprint=22-23-2031
+T 42300 46000 5 10 0 1 0 0 1
+pn=22-23-2031
+}
+N 44200 45500 44100 45500 4
+N 44100 45500 44100 46200 4
+N 44100 46200 44000 46200 4
+C 44900 46800 1 90 0 capacitor-1.sym
+{
+T 44200 47000 5 10 0 0 90 0 1
+device=CAPACITOR
+T 44400 47000 5 10 1 1 90 0 1
+refdes=C2
+T 44000 47000 5 10 0 0 90 0 1
+symversion=0.1
+T 45100 46800 5 10 1 1 90 0 1
+value=0.1 uF
+T 44900 46800 5 10 0 0 0 0 1
+footprint=0603
+T 44900 46800 5 10 0 0 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 44700 47700 44700 47900 4
+N 44700 46800 44700 46500 4
+N 44000 46800 44100 46800 4
+C 44300 46000 1 0 0 resistor-1.sym
+{
+T 44600 46400 5 10 0 0 0 0 1
+device=RESISTOR
+T 44500 46200 5 10 1 1 0 0 1
+refdes=R7
+T 44300 45900 5 10 1 1 0 0 1
+value=10 kohms
+T 44300 46000 5 10 0 0 0 0 1
+footprint=0603
+T 44300 46000 5 10 0 1 0 0 1
+pn=SG73S1JTTD103J
+}
+N 44300 46100 44100 46100 4
+N 45200 46100 45300 46100 4
+N 45300 46100 45300 46500 4
diff --git a/bbb_cape/schematic/digital inputs x4.sch b/bbb_cape/schematic/digital inputs x4.sch
new file mode 100644
index 0000000..11f3308
--- /dev/null
+++ b/bbb_cape/schematic/digital inputs x4.sch
@@ -0,0 +1,168 @@
+v 20110115 2
+C 37300 45500 1 90 0 in-1.sym
+{
+T 37000 45500 5 10 0 0 90 0 1
+device=INPUT
+T 37000 45500 5 10 1 1 90 0 1
+refdes=SGND
+}
+C 38000 45500 1 90 0 in-1.sym
+{
+T 37700 45500 5 10 0 0 90 0 1
+device=INPUT
+T 37700 45500 5 10 1 1 90 0 1
+refdes=SVCC
+}
+C 43800 48900 1 180 0 AM26LV32E-1.sym
+{
+T 44400 46700 5 10 0 1 180 0 1
+device=AM26LV32E
+T 45200 47200 5 10 0 1 180 0 1
+footprint=TSSOP16
+T 42500 46300 5 10 1 1 180 0 1
+refdes=U4
+T 43800 48900 5 10 0 0 0 0 1
+pn=AM26LV32EIPWR
+}
+N 37900 46100 37900 49600 4
+N 37900 46300 38100 46300 4
+N 37900 47400 38100 47400 4
+N 37200 46100 37200 49900 4
+N 38100 46600 37200 46600 4
+N 38100 47700 37200 47700 4
+C 46000 48200 1 180 0 in-1.sym
+{
+T 46000 47900 5 10 0 0 180 0 1
+device=INPUT
+T 46000 47900 5 10 1 1 180 0 1
+refdes=DGND
+}
+C 46000 49400 1 180 0 in-1.sym
+{
+T 46000 49100 5 10 0 0 180 0 1
+device=INPUT
+T 46000 49100 5 10 1 1 180 0 1
+refdes=DVCC
+}
+C 44200 46100 1 270 0 out-1.sym
+{
+T 44500 46100 5 10 0 0 270 0 1
+device=OUTPUT
+T 44500 46100 5 10 1 1 270 0 1
+refdes=OUT0
+}
+C 44700 46100 1 270 0 out-1.sym
+{
+T 45000 46100 5 10 0 0 270 0 1
+device=OUTPUT
+T 45000 46100 5 10 1 1 270 0 1
+refdes=OUT1
+}
+C 45200 46100 1 270 0 out-1.sym
+{
+T 45500 46100 5 10 0 0 270 0 1
+device=OUTPUT
+T 45500 46100 5 10 1 1 270 0 1
+refdes=OUT2
+}
+C 45700 46100 1 270 0 out-1.sym
+{
+T 46000 46100 5 10 0 0 270 0 1
+device=OUTPUT
+T 46000 46100 5 10 1 1 270 0 1
+refdes=OUT3
+}
+N 43800 46600 44300 46600 4
+N 44300 46600 44300 46100 4
+N 43800 48100 45400 48100 4
+N 44600 48100 44600 48400 4
+N 44600 48400 43800 48400 4
+N 43800 47800 44100 47800 4
+N 44100 47800 44100 49300 4
+N 43800 46900 44800 46900 4
+N 44800 46900 44800 46100 4
+N 43800 47200 45300 47200 4
+N 45300 47200 45300 46100 4
+N 43800 47500 45800 47500 4
+N 45800 47500 45800 46100 4
+C 41500 50300 1 270 0 in-1.sym
+{
+T 41800 50300 5 10 0 0 270 0 1
+device=INPUT
+T 41800 50300 5 10 1 1 270 0 1
+refdes=DIFFA
+}
+N 41600 49700 41600 46600 4
+N 41600 46600 42000 46600 4
+N 42000 47200 41600 47200 4
+N 42000 47800 41600 47800 4
+N 42000 48400 41600 48400 4
+C 38100 47200 1 0 0 digital-input-1.sym
+{
+T 40600 48100 5 10 0 1 0 0 1
+device=encoder-input
+T 39800 48000 5 10 1 1 0 0 1
+refdes=X2
+T 38100 47200 5 10 0 0 0 0 1
+source=digital input.sch
+}
+C 38100 46100 1 0 0 digital-input-1.sym
+{
+T 40600 47000 5 10 0 1 0 0 1
+device=encoder-input
+T 39800 46900 5 10 1 1 0 0 1
+refdes=X1
+T 38100 46100 5 10 0 0 0 0 1
+source=digital input.sch
+}
+N 40400 46400 41000 46400 4
+N 41000 46400 41000 46900 4
+N 41000 46900 42000 46900 4
+N 40400 47500 42000 47500 4
+C 38100 48300 1 0 0 digital-input-1.sym
+{
+T 40600 49200 5 10 0 1 0 0 1
+device=encoder-input
+T 39800 49100 5 10 1 1 0 0 1
+refdes=X3
+T 38100 48300 5 10 0 0 0 0 1
+source=digital input.sch
+}
+C 38100 49400 1 0 0 digital-input-1.sym
+{
+T 40600 50300 5 10 0 1 0 0 1
+device=encoder-input
+T 39800 50200 5 10 1 1 0 0 1
+refdes=X4
+T 38100 49400 5 10 0 0 0 0 1
+source=digital input.sch
+}
+N 41000 48100 42000 48100 4
+N 42000 48700 41300 48700 4
+N 41300 48700 41300 49700 4
+N 41300 49700 40400 49700 4
+N 38100 48500 37900 48500 4
+N 38100 49600 37900 49600 4
+N 38100 48800 37200 48800 4
+N 38100 49900 37200 49900 4
+N 40400 48600 41000 48600 4
+N 41000 48600 41000 48100 4
+C 45300 48200 1 90 0 capacitor-1.sym
+{
+T 44600 48400 5 10 0 0 90 0 1
+device=CAPACITOR
+T 44800 48400 5 10 1 1 90 0 1
+refdes=C1
+T 44400 48400 5 10 0 0 90 0 1
+symversion=0.1
+T 45300 48200 5 10 0 0 90 0 1
+footprint=0603
+T 45500 48400 5 10 1 1 90 0 1
+value=0.1 uF
+T 45300 48200 5 10 0 0 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 45100 48200 45100 48100 4
+N 44100 49300 45400 49300 4
+N 45100 49100 45100 49300 4
+N 44100 48700 43800 48700 4
diff --git a/bbb_cape/schematic/encoder input.sch b/bbb_cape/schematic/encoder input.sch
new file mode 100644
index 0000000..04f5214
--- /dev/null
+++ b/bbb_cape/schematic/encoder input.sch
@@ -0,0 +1,126 @@
+v 20110115 2
+C 46700 47900 1 180 0 in-1.sym
+{
+T 46700 47600 5 10 0 0 180 0 1
+device=INPUT
+T 46600 48000 5 10 1 1 180 0 1
+refdes=SGND
+}
+C 46700 46600 1 180 0 in-1.sym
+{
+T 46700 46300 5 10 0 0 180 0 1
+device=INPUT
+T 46600 46700 5 10 1 1 180 0 1
+refdes=SVCC
+}
+C 42300 45700 1 0 0 connector4-1.sym
+{
+T 44100 46600 5 10 0 0 0 0 1
+device=CONNECTOR_4
+T 42300 47100 5 10 1 1 0 0 1
+refdes=CONN4
+T 42300 45700 5 10 0 0 0 0 1
+footprint=22-23-2041
+T 42300 45700 5 10 0 1 0 0 1
+pn=22-23-2041
+}
+C 46100 45600 1 0 0 out-1.sym
+{
+T 46100 45900 5 10 0 0 0 0 1
+device=OUTPUT
+T 46100 45800 5 10 1 1 0 0 1
+refdes=CH1
+}
+C 46100 44600 1 0 0 out-1.sym
+{
+T 46100 44900 5 10 0 0 0 0 1
+device=OUTPUT
+T 46100 44800 5 10 1 1 0 0 1
+refdes=CH2
+}
+N 44000 46500 46100 46500 4
+N 46100 47800 44100 47800 4
+N 44100 46800 44100 47800 4
+C 44900 45600 1 0 0 resistor-1.sym
+{
+T 45200 46000 5 10 0 0 0 0 1
+device=RESISTOR
+T 45100 45800 5 10 1 1 0 0 1
+refdes=R6
+T 44900 45500 5 10 1 1 0 0 1
+value=500 ohms
+T 44900 45600 5 10 0 0 0 0 1
+footprint=0603
+T 44900 45600 5 10 0 1 0 0 1
+pn=ERJ-3EKF4990V
+}
+C 44900 44600 1 0 0 resistor-1.sym
+{
+T 45200 45000 5 10 0 0 0 0 1
+device=RESISTOR
+T 45100 44800 5 10 1 1 0 0 1
+refdes=R8
+T 44900 44500 5 10 1 1 0 0 1
+value=500 ohms
+T 44900 44600 5 10 0 0 0 0 1
+footprint=0603
+T 44900 44600 5 10 0 1 0 0 1
+pn=ERJ-3EKF4990V
+}
+N 44000 45900 44100 45900 4
+N 44100 44700 44100 45900 4
+N 45800 44700 46100 44700 4
+N 45800 45700 46100 45700 4
+C 44900 46700 1 90 0 capacitor-1.sym
+{
+T 44200 46900 5 10 0 0 90 0 1
+device=CAPACITOR
+T 44400 46900 5 10 1 1 90 0 1
+refdes=C2
+T 44000 46900 5 10 0 0 90 0 1
+symversion=0.1
+T 45100 46700 5 10 1 1 90 0 1
+value=0.1 uF
+T 44900 46700 5 10 0 0 0 0 1
+footprint=0603
+T 44900 46700 5 10 0 0 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 44000 46800 44100 46800 4
+N 44900 44700 44100 44700 4
+N 44700 47800 44700 47600 4
+N 44700 46700 44700 46500 4
+C 44900 46100 1 0 0 resistor-1.sym
+{
+T 45200 46500 5 10 0 0 0 0 1
+device=RESISTOR
+T 45100 46300 5 10 1 1 0 0 1
+refdes=R9
+T 44900 46000 5 10 1 1 0 0 1
+value=10 kohms
+T 44900 46100 5 10 0 0 0 0 1
+footprint=0603
+T 44900 46100 5 10 0 1 0 0 1
+pn=SG73S1JTTD103J
+}
+C 44900 45100 1 0 0 resistor-1.sym
+{
+T 45200 45500 5 10 0 0 0 0 1
+device=RESISTOR
+T 45100 45300 5 10 1 1 0 0 1
+refdes=R10
+T 44900 45000 5 10 1 1 0 0 1
+value=10 kohms
+T 44900 45100 5 10 0 0 0 0 1
+footprint=0603
+T 44900 45100 5 10 0 1 0 0 1
+pn=SG73S1JTTD103J
+}
+N 44000 46200 44900 46200 4
+N 44600 46200 44600 45700 4
+N 44600 45700 44900 45700 4
+N 44900 45200 44100 45200 4
+N 45800 46200 45900 46200 4
+N 45900 46200 45900 46500 4
+N 45900 46500 45900 45200 4
+N 45900 45200 45800 45200 4
diff --git a/bbb_cape/schematic/encoder inputs x2.sch b/bbb_cape/schematic/encoder inputs x2.sch
new file mode 100644
index 0000000..f2d82d0
--- /dev/null
+++ b/bbb_cape/schematic/encoder inputs x2.sch
@@ -0,0 +1,145 @@
+v 20110115 2
+C 37300 45500 1 90 0 in-1.sym
+{
+T 37000 45500 5 10 0 0 90 0 1
+device=INPUT
+T 37000 45500 5 10 1 1 90 0 1
+refdes=SGND
+}
+C 38000 45500 1 90 0 in-1.sym
+{
+T 37700 45500 5 10 0 0 90 0 1
+device=INPUT
+T 37700 45500 5 10 1 1 90 0 1
+refdes=SVCC
+}
+C 43800 48900 1 180 0 AM26LV32E-1.sym
+{
+T 44400 46700 5 10 0 1 180 0 1
+device=AM26LV32E
+T 45200 47200 5 10 0 1 180 0 1
+footprint=TSSOP16
+T 42500 46300 5 10 1 1 180 0 1
+refdes=U4
+T 43800 48900 5 10 0 1 0 0 1
+pn=AM26LV32EIPWR
+}
+C 38100 47800 1 0 0 encoder-input-1.sym
+{
+T 40600 49000 5 10 0 1 0 0 1
+device=encoder-input
+T 39800 48600 5 10 1 1 0 0 1
+refdes=X2
+}
+C 38100 46400 1 0 0 encoder-input-1.sym
+{
+T 40600 47600 5 10 0 1 0 0 1
+device=encoder-input
+T 39800 47200 5 10 1 1 0 0 1
+refdes=X4
+}
+N 37900 46100 37900 48000 4
+N 37900 46600 38100 46600 4
+N 37900 48000 38100 48000 4
+N 37200 46100 37200 48300 4
+N 38100 46900 37200 46900 4
+N 38100 48300 37200 48300 4
+N 40400 48300 40900 48300 4
+N 40900 48300 40900 48700 4
+N 40900 48700 42000 48700 4
+N 40400 48000 41200 48000 4
+N 41200 48000 41200 48100 4
+N 41200 48100 42000 48100 4
+N 40400 46900 40900 46900 4
+N 40900 46900 40900 47500 4
+N 40900 47500 42000 47500 4
+N 40400 46600 41200 46600 4
+N 41200 46600 41200 46900 4
+N 41200 46900 42000 46900 4
+C 45800 48200 1 180 0 in-1.sym
+{
+T 45800 47900 5 10 0 0 180 0 1
+device=INPUT
+T 45800 47900 5 10 1 1 180 0 1
+refdes=DGND
+}
+C 45900 49400 1 180 0 in-1.sym
+{
+T 45900 49100 5 10 0 0 180 0 1
+device=INPUT
+T 45900 49100 5 10 1 1 180 0 1
+refdes=DVCC
+}
+C 44200 46100 1 270 0 out-1.sym
+{
+T 44500 46100 5 10 0 0 270 0 1
+device=OUTPUT
+T 44500 46100 5 10 1 1 270 0 1
+refdes=OUT0
+}
+C 44700 46100 1 270 0 out-1.sym
+{
+T 45000 46100 5 10 0 0 270 0 1
+device=OUTPUT
+T 45000 46100 5 10 1 1 270 0 1
+refdes=OUT1
+}
+C 45200 46100 1 270 0 out-1.sym
+{
+T 45500 46100 5 10 0 0 270 0 1
+device=OUTPUT
+T 45500 46100 5 10 1 1 270 0 1
+refdes=OUT2
+}
+C 45700 46100 1 270 0 out-1.sym
+{
+T 46000 46100 5 10 0 0 270 0 1
+device=OUTPUT
+T 46000 46100 5 10 1 1 270 0 1
+refdes=OUT3
+}
+N 43800 46600 44300 46600 4
+N 44300 46600 44300 46100 4
+N 43800 48100 45200 48100 4
+N 44600 48100 44600 48400 4
+N 44600 48400 43800 48400 4
+N 43800 47800 44100 47800 4
+N 44100 47800 44100 49300 4
+N 43800 46900 44800 46900 4
+N 44800 46900 44800 46100 4
+N 43800 47200 45300 47200 4
+N 45300 47200 45300 46100 4
+N 43800 47500 45800 47500 4
+N 45800 47500 45800 46100 4
+C 39400 49100 1 0 0 in-1.sym
+{
+T 39400 49400 5 10 0 0 0 0 1
+device=INPUT
+T 39400 49400 5 10 1 1 0 0 1
+refdes=DIFFA
+}
+N 40000 49200 41600 49200 4
+N 41600 49200 41600 46600 4
+N 41600 46600 42000 46600 4
+N 42000 47200 41600 47200 4
+N 42000 47800 41600 47800 4
+N 42000 48400 41600 48400 4
+C 45300 48200 1 90 0 capacitor-1.sym
+{
+T 44600 48400 5 10 0 0 90 0 1
+device=CAPACITOR
+T 44900 48400 5 10 1 1 90 0 1
+refdes=C1
+T 44400 48400 5 10 0 0 90 0 1
+symversion=0.1
+T 45300 48200 5 10 0 0 90 0 1
+footprint=0603
+T 45500 48400 5 10 1 1 90 0 1
+value=0.1 uF
+T 45300 48200 5 10 0 0 0 0 1
+pn=VJ0603Y104JXJPW1BC
+}
+N 44100 49300 45300 49300 4
+N 45100 49100 45100 49300 4
+N 44100 48700 43800 48700 4
+N 45100 48200 45100 48100 4
diff --git a/bbb_cape/schematic/gafrc b/bbb_cape/schematic/gafrc
new file mode 100644
index 0000000..149e5a2
--- /dev/null
+++ b/bbb_cape/schematic/gafrc
@@ -0,0 +1,2 @@
+(component-library "./symbols" "971 Symbols")
+(source-library ".")
diff --git a/bbb_cape/schematic/generate_mouser_bom.rb b/bbb_cape/schematic/generate_mouser_bom.rb
new file mode 100755
index 0000000..8c2c0cd
--- /dev/null
+++ b/bbb_cape/schematic/generate_mouser_bom.rb
@@ -0,0 +1,54 @@
+#!/usr/bin/env ruby
+
+# This generates something designed to be copied into Mouser's BOM creation
+# copy/paste box. It turns out that it's usually easier to just manually add
+# everything to your cart with the "EZBuy" thingie, but it's still a reasonable
+# format.
+#
+# Usage: generate_mouser_bom.rb FILE [COPIES]
+
+lines = File.open(ARGV[0]) do |f|
+  lines = f.readlines
+  lines.shift
+  lines.collect do |line|
+    line.split(', ')
+  end
+end
+
+$parts = {}
+
+def print_part(pn_string)
+	#puts pn + '|1'
+	pn = pn_string.intern
+	if $parts[pn]
+		$parts[pn] = $parts[pn] + 1
+	else
+		$parts[pn] = 1
+	end
+end
+
+lines.each do |line|
+	pn = line[4]
+	if pn.index(';')
+		parts = pn.split('; ')
+		parts.each do |part_string|
+			part = part_string.match(/(.+) x([0-9]+)?/)
+			if part
+				name = part[1]
+				number = part[2]
+				number.to_i.times do
+					print_part name
+				end
+			else
+				print_part part_string
+			end
+		end
+	else
+		print_part pn unless pn.empty?
+	end
+end
+
+times = (ARGV[1] || 1).to_i
+$parts.each do |pn, number|
+	puts "#{pn}|#{number * times}"
+end
diff --git a/bbb_cape/schematic/gerbers/20131204/cape.bottom.gbr b/bbb_cape/schematic/gerbers/20131204/cape.bottom.gbr
new file mode 100644
index 0000000..7a80bff
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.bottom.gbr
@@ -0,0 +1,4398 @@
+G04 start of page 5 for group 3 idx 3 *

+G04 Title: 971 BBB Cape, bottom *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNBOTTOM*%

+%ADD247C,0.0350*%

+%ADD246C,0.0600*%

+%ADD245C,0.0200*%

+%ADD244C,0.0360*%

+%ADD243R,0.0345X0.0345*%

+%ADD242R,0.1220X0.1220*%

+%ADD241R,0.0560X0.0560*%

+%ADD240R,0.0512X0.0512*%

+%ADD239R,0.0180X0.0180*%

+%ADD238R,0.0130X0.0130*%

+%ADD237R,0.0295X0.0295*%

+%ADD236C,0.2100*%

+%ADD235C,0.0660*%

+%ADD234C,0.2200*%

+%ADD233C,0.1830*%

+%ADD232C,0.0650*%

+%ADD231C,0.0480*%

+%ADD230C,0.0380*%

+%ADD229C,0.0500*%

+%ADD228C,0.0250*%

+%ADD227C,0.0080*%

+%ADD226C,0.0100*%

+%ADD225C,0.0001*%

+G54D225*G36*

+X122941Y305000D02*Y331500D01*

+X92941D01*

+Y360000D01*

+X156941D01*

+Y342500D01*

+X130941D01*

+Y305000D01*

+X122941D01*

+G37*

+G36*

+X133441Y318000D02*Y340000D01*

+X155941D01*

+Y318000D01*

+X133441D01*

+G37*

+G36*

+X253098Y217146D02*X261941Y208303D01*

+Y201500D01*

+X253098D01*

+Y209121D01*

+X253218Y209223D01*

+X253402Y209439D01*

+X253550Y209680D01*

+X253658Y209942D01*

+X253724Y210218D01*

+X253741Y210500D01*

+X253724Y210782D01*

+X253658Y211058D01*

+X253550Y211320D01*

+X253402Y211561D01*

+X253218Y211777D01*

+X253098Y211879D01*

+Y217146D01*

+G37*

+G36*

+Y225646D02*X261941Y216803D01*

+Y215697D01*

+X253098Y224540D01*

+Y225646D01*

+G37*

+G36*

+Y230255D02*X261941Y221412D01*

+Y220197D01*

+X253098Y229040D01*

+Y230255D01*

+G37*

+G36*

+Y247050D02*X261941D01*

+Y224806D01*

+X253098Y233649D01*

+Y247050D01*

+G37*

+G36*

+Y264380D02*X261941D01*

+Y256200D01*

+X253098D01*

+Y259780D01*

+X253101Y259780D01*

+X253423Y259805D01*

+X253736Y259880D01*

+X254035Y260004D01*

+X254310Y260172D01*

+X254555Y260382D01*

+X254765Y260627D01*

+X254933Y260902D01*

+X255057Y261201D01*

+X255132Y261514D01*

+X255151Y261836D01*

+X255132Y262158D01*

+X255057Y262471D01*

+X254933Y262770D01*

+X254765Y263045D01*

+X254555Y263290D01*

+X254310Y263500D01*

+X254035Y263668D01*

+X253736Y263792D01*

+X253423Y263867D01*

+X253101Y263892D01*

+X253098Y263892D01*

+Y264380D01*

+G37*

+G36*

+Y270771D02*X261941D01*

+Y270656D01*

+X261816Y270604D01*

+X261541Y270436D01*

+X261296Y270226D01*

+X261086Y269981D01*

+X260918Y269706D01*

+X260794Y269407D01*

+X260719Y269094D01*

+X260694Y268772D01*

+X260719Y268450D01*

+X260794Y268137D01*

+X260918Y267838D01*

+X261086Y267563D01*

+X261296Y267318D01*

+X261541Y267108D01*

+X261816Y266940D01*

+X261941Y266888D01*

+Y266780D01*

+X253098D01*

+Y270771D01*

+G37*

+G36*

+Y273875D02*X261941D01*

+Y273171D01*

+X253098D01*

+Y273875D01*

+G37*

+G36*

+Y279016D02*X254239Y277875D01*

+X253098D01*

+Y279016D01*

+G37*

+G36*

+X239299Y247050D02*X253098D01*

+Y233649D01*

+X248741Y238006D01*

+X248724Y238282D01*

+X248658Y238558D01*

+X248550Y238820D01*

+X248402Y239061D01*

+X248218Y239277D01*

+X248002Y239461D01*

+X247761Y239609D01*

+X247499Y239717D01*

+X247223Y239783D01*

+X246941Y239806D01*

+X246659Y239783D01*

+X246383Y239717D01*

+X246121Y239609D01*

+X245880Y239461D01*

+X245664Y239277D01*

+X245480Y239061D01*

+X245332Y238820D01*

+X245224Y238558D01*

+X245158Y238282D01*

+X245135Y238000D01*

+X245158Y237718D01*

+X245224Y237442D01*

+X245332Y237180D01*

+X245480Y236939D01*

+X245664Y236723D01*

+X245880Y236539D01*

+X246121Y236391D01*

+X246383Y236283D01*

+X246659Y236217D01*

+X246941Y236194D01*

+X247143Y236210D01*

+X253098Y230255D01*

+Y229040D01*

+X252735Y229403D01*

+X252741Y229500D01*

+X252724Y229782D01*

+X252658Y230058D01*

+X252550Y230320D01*

+X252402Y230561D01*

+X252218Y230777D01*

+X252002Y230961D01*

+X251761Y231109D01*

+X251499Y231217D01*

+X251223Y231283D01*

+X250941Y231306D01*

+X250659Y231283D01*

+X250383Y231217D01*

+X250121Y231109D01*

+X249880Y230961D01*

+X249664Y230777D01*

+X249480Y230561D01*

+X249332Y230320D01*

+X249224Y230058D01*

+X249158Y229782D01*

+X249135Y229500D01*

+X249158Y229218D01*

+X249224Y228942D01*

+X249332Y228680D01*

+X249480Y228439D01*

+X249664Y228223D01*

+X249880Y228039D01*

+X250121Y227891D01*

+X250383Y227783D01*

+X250659Y227717D01*

+X250941Y227694D01*

+X251042Y227702D01*

+X253098Y225646D01*

+Y224540D01*

+X248235Y229403D01*

+X248241Y229500D01*

+X248224Y229782D01*

+X248158Y230058D01*

+X248050Y230320D01*

+X247902Y230561D01*

+X247718Y230777D01*

+X247502Y230961D01*

+X247261Y231109D01*

+X246999Y231217D01*

+X246723Y231283D01*

+X246441Y231306D01*

+X246159Y231283D01*

+X245883Y231217D01*

+X245621Y231109D01*

+X245380Y230961D01*

+X245164Y230777D01*

+X244980Y230561D01*

+X244832Y230320D01*

+X244724Y230058D01*

+X244658Y229782D01*

+X244635Y229500D01*

+X244658Y229218D01*

+X244724Y228942D01*

+X244743Y228895D01*

+X244235Y229403D01*

+X244241Y229500D01*

+X244224Y229782D01*

+X244158Y230058D01*

+X244050Y230320D01*

+X243902Y230561D01*

+X243718Y230777D01*

+X243502Y230961D01*

+X243261Y231109D01*

+X242999Y231217D01*

+X242723Y231283D01*

+X242441Y231306D01*

+X242159Y231283D01*

+X241883Y231217D01*

+X241621Y231109D01*

+X241380Y230961D01*

+X241164Y230777D01*

+X240980Y230561D01*

+X240832Y230320D01*

+X240724Y230058D01*

+X240658Y229782D01*

+X240635Y229500D01*

+X240658Y229218D01*

+X240724Y228942D01*

+X240832Y228680D01*

+X240980Y228439D01*

+X241164Y228223D01*

+X241380Y228039D01*

+X241621Y227891D01*

+X241883Y227783D01*

+X242159Y227717D01*

+X242441Y227694D01*

+X242542Y227702D01*

+X253098Y217146D01*

+Y211879D01*

+X253002Y211961D01*

+X252761Y212109D01*

+X252499Y212217D01*

+X252223Y212283D01*

+X251941Y212306D01*

+X251659Y212283D01*

+X251383Y212217D01*

+X251121Y212109D01*

+X250880Y211961D01*

+X250664Y211777D01*

+X250480Y211561D01*

+X250332Y211320D01*

+X250224Y211058D01*

+X250158Y210782D01*

+X250135Y210500D01*

+X250158Y210218D01*

+X250224Y209942D01*

+X250332Y209680D01*

+X250480Y209439D01*

+X250664Y209223D01*

+X250880Y209039D01*

+X251121Y208891D01*

+X251383Y208783D01*

+X251659Y208717D01*

+X251941Y208694D01*

+X252223Y208717D01*

+X252499Y208783D01*

+X252761Y208891D01*

+X253002Y209039D01*

+X253098Y209121D01*

+Y201500D01*

+X245672D01*

+X245724Y201718D01*

+X245741Y202000D01*

+X245724Y202282D01*

+X245658Y202558D01*

+X245550Y202820D01*

+X245402Y203061D01*

+X245218Y203277D01*

+X245002Y203461D01*

+X244761Y203609D01*

+X244499Y203717D01*

+X244223Y203783D01*

+X243941Y203806D01*

+X243659Y203783D01*

+X243383Y203717D01*

+X243121Y203609D01*

+X242880Y203461D01*

+X242664Y203277D01*

+X242480Y203061D01*

+X242332Y202820D01*

+X242224Y202558D01*

+X242158Y202282D01*

+X242135Y202000D01*

+X242158Y201718D01*

+X242210Y201500D01*

+X239299D01*

+Y247050D01*

+G37*

+G36*

+Y264380D02*X253098D01*

+Y263892D01*

+X252779Y263867D01*

+X252466Y263792D01*

+X252167Y263668D01*

+X251892Y263500D01*

+X251647Y263290D01*

+X251437Y263045D01*

+X251269Y262770D01*

+X251145Y262471D01*

+X251070Y262158D01*

+X251045Y261836D01*

+X251070Y261514D01*

+X251145Y261201D01*

+X251269Y260902D01*

+X251437Y260627D01*

+X251647Y260382D01*

+X251892Y260172D01*

+X252167Y260004D01*

+X252466Y259880D01*

+X252779Y259805D01*

+X253098Y259780D01*

+Y256200D01*

+X239299D01*

+Y260179D01*

+X239302Y260179D01*

+X239624Y260204D01*

+X239937Y260279D01*

+X240236Y260403D01*

+X240511Y260571D01*

+X240756Y260781D01*

+X240966Y261026D01*

+X241134Y261301D01*

+X241258Y261600D01*

+X241333Y261913D01*

+X241352Y262235D01*

+X241333Y262557D01*

+X241258Y262870D01*

+X241134Y263169D01*

+X240966Y263444D01*

+X240756Y263689D01*

+X240511Y263899D01*

+X240236Y264067D01*

+X239937Y264191D01*

+X239624Y264266D01*

+X239302Y264291D01*

+X239299Y264291D01*

+Y264380D01*

+G37*

+G36*

+Y270771D02*X253098D01*

+Y266780D01*

+X239299D01*

+Y270771D01*

+G37*

+G36*

+Y273875D02*X253098D01*

+Y273171D01*

+X239299D01*

+Y273875D01*

+G37*

+G36*

+Y277130D02*X239330Y277103D01*

+X239571Y276955D01*

+X239833Y276847D01*

+X240109Y276781D01*

+X240391Y276758D01*

+X240673Y276781D01*

+X240949Y276847D01*

+X241211Y276955D01*

+X241452Y277103D01*

+X241668Y277287D01*

+X241852Y277503D01*

+X242000Y277744D01*

+X242108Y278006D01*

+X242174Y278282D01*

+X242191Y278564D01*

+X242174Y278846D01*

+X242108Y279122D01*

+X242000Y279384D01*

+X241852Y279625D01*

+X241668Y279841D01*

+X241452Y280025D01*

+X241211Y280173D01*

+X240949Y280281D01*

+X240673Y280347D01*

+X240391Y280370D01*

+X240290Y280362D01*

+X239299Y281353D01*

+Y289533D01*

+X248871Y279961D01*

+X248902Y279925D01*

+X249045Y279802D01*

+X249108Y279764D01*

+X249207Y279703D01*

+X249279Y279674D01*

+X249381Y279631D01*

+X249565Y279587D01*

+X249565Y279587D01*

+X249753Y279572D01*

+X249800Y279576D01*

+X250553D01*

+X250554Y279576D01*

+X250554Y279576D01*

+X252538D01*

+X253098Y279016D01*

+Y277875D01*

+X248887D01*

+X247586Y279176D01*

+X247588Y279186D01*

+X247607Y279508D01*

+X247588Y279830D01*

+X247513Y280143D01*

+X247389Y280442D01*

+X247221Y280717D01*

+X247011Y280962D01*

+X246766Y281172D01*

+X246491Y281340D01*

+X246192Y281464D01*

+X245879Y281539D01*

+X245557Y281564D01*

+X245235Y281539D01*

+X244922Y281464D01*

+X244623Y281340D01*

+X244348Y281172D01*

+X244103Y280962D01*

+X243893Y280717D01*

+X243725Y280442D01*

+X243601Y280143D01*

+X243526Y279830D01*

+X243501Y279508D01*

+X243526Y279186D01*

+X243601Y278873D01*

+X243725Y278574D01*

+X243893Y278299D01*

+X244103Y278054D01*

+X244348Y277844D01*

+X244623Y277676D01*

+X244922Y277552D01*

+X245235Y277477D01*

+X245557Y277452D01*

+X245879Y277477D01*

+X245889Y277479D01*

+X247093Y276275D01*

+X239299D01*

+Y277130D01*

+G37*

+G36*

+Y281353D02*X231641Y289011D01*

+Y290500D01*

+X238332D01*

+X239299Y289533D01*

+Y281353D01*

+G37*

+G36*

+X236438Y247050D02*X239299D01*

+Y201500D01*

+X236845D01*

+X236474Y201589D01*

+X236438Y201592D01*

+Y233695D01*

+X236441Y233694D01*

+X236723Y233717D01*

+X236999Y233783D01*

+X237261Y233891D01*

+X237502Y234039D01*

+X237718Y234223D01*

+X237902Y234439D01*

+X238050Y234680D01*

+X238158Y234942D01*

+X238224Y235218D01*

+X238241Y235500D01*

+X238224Y235782D01*

+X238158Y236058D01*

+X238050Y236320D01*

+X237902Y236561D01*

+X237718Y236777D01*

+X237502Y236961D01*

+X237261Y237109D01*

+X236999Y237217D01*

+X236723Y237283D01*

+X236441Y237306D01*

+X236438Y237305D01*

+Y247050D01*

+G37*

+G36*

+X224438Y247503D02*X224621Y247391D01*

+X224883Y247283D01*

+X225159Y247217D01*

+X225441Y247194D01*

+X225723Y247217D01*

+X225999Y247283D01*

+X226261Y247391D01*

+X226502Y247539D01*

+X226718Y247723D01*

+X226902Y247939D01*

+X227050Y248180D01*

+X227158Y248442D01*

+X227224Y248718D01*

+X227229Y248800D01*

+X230371D01*

+X230159Y248783D01*

+X229883Y248717D01*

+X229621Y248609D01*

+X229380Y248461D01*

+X229164Y248277D01*

+X228980Y248061D01*

+X228832Y247820D01*

+X228724Y247558D01*

+X228658Y247282D01*

+X228635Y247000D01*

+X228658Y246718D01*

+X228724Y246442D01*

+X228832Y246180D01*

+X228980Y245939D01*

+X229164Y245723D01*

+X229380Y245539D01*

+X229621Y245391D01*

+X229883Y245283D01*

+X230159Y245217D01*

+X230441Y245194D01*

+X230723Y245217D01*

+X230999Y245283D01*

+X231261Y245391D01*

+X231502Y245539D01*

+X231718Y245723D01*

+X231902Y245939D01*

+X232050Y246180D01*

+X232158Y246442D01*

+X232224Y246718D01*

+X232241Y247000D01*

+X232238Y247050D01*

+X236438D01*

+Y237305D01*

+X236159Y237283D01*

+X235883Y237217D01*

+X235621Y237109D01*

+X235380Y236961D01*

+X235164Y236777D01*

+X234980Y236561D01*

+X234832Y236320D01*

+X234724Y236058D01*

+X234658Y235782D01*

+X234635Y235500D01*

+X234658Y235218D01*

+X234724Y234942D01*

+X234832Y234680D01*

+X234980Y234439D01*

+X235164Y234223D01*

+X235380Y234039D01*

+X235621Y233891D01*

+X235883Y233783D01*

+X236159Y233717D01*

+X236438Y233695D01*

+Y201592D01*

+X235799Y201642D01*

+X235124Y201589D01*

+X234753Y201500D01*

+X226845D01*

+X226474Y201589D01*

+X225799Y201642D01*

+X225124Y201589D01*

+X224753Y201500D01*

+X224438D01*

+Y218770D01*

+X224659Y218717D01*

+X224941Y218694D01*

+X225223Y218717D01*

+X225499Y218783D01*

+X225761Y218891D01*

+X226002Y219039D01*

+X226218Y219223D01*

+X226402Y219439D01*

+X226550Y219680D01*

+X226658Y219942D01*

+X226724Y220218D01*

+X226741Y220500D01*

+X226724Y220782D01*

+X226658Y221058D01*

+X226550Y221320D01*

+X226402Y221561D01*

+X226218Y221777D01*

+X226002Y221961D01*

+X225761Y222109D01*

+X225499Y222217D01*

+X225223Y222283D01*

+X224941Y222306D01*

+X224659Y222283D01*

+X224438Y222230D01*

+Y225003D01*

+X224621Y224891D01*

+X224883Y224783D01*

+X225159Y224717D01*

+X225441Y224694D01*

+X225723Y224717D01*

+X225999Y224783D01*

+X226261Y224891D01*

+X226502Y225039D01*

+X226718Y225223D01*

+X226902Y225439D01*

+X227050Y225680D01*

+X227158Y225942D01*

+X227224Y226218D01*

+X227241Y226500D01*

+X227224Y226782D01*

+X227158Y227058D01*

+X227050Y227320D01*

+X226902Y227561D01*

+X226718Y227777D01*

+X226502Y227961D01*

+X226261Y228109D01*

+X225999Y228217D01*

+X225723Y228283D01*

+X225441Y228306D01*

+X225159Y228283D01*

+X224883Y228217D01*

+X224621Y228109D01*

+X224438Y227997D01*

+Y233770D01*

+X224659Y233717D01*

+X224941Y233694D01*

+X225223Y233717D01*

+X225499Y233783D01*

+X225761Y233891D01*

+X226002Y234039D01*

+X226218Y234223D01*

+X226402Y234439D01*

+X226550Y234680D01*

+X226658Y234942D01*

+X226724Y235218D01*

+X226741Y235500D01*

+X226724Y235782D01*

+X226658Y236058D01*

+X226550Y236320D01*

+X226402Y236561D01*

+X226218Y236777D01*

+X226002Y236961D01*

+X225761Y237109D01*

+X225499Y237217D01*

+X225223Y237283D01*

+X224941Y237306D01*

+X224659Y237283D01*

+X224438Y237230D01*

+Y242195D01*

+X224441Y242194D01*

+X224723Y242217D01*

+X224999Y242283D01*

+X225261Y242391D01*

+X225502Y242539D01*

+X225718Y242723D01*

+X225902Y242939D01*

+X226050Y243180D01*

+X226158Y243442D01*

+X226224Y243718D01*

+X226241Y244000D01*

+X226224Y244282D01*

+X226158Y244558D01*

+X226050Y244820D01*

+X225902Y245061D01*

+X225718Y245277D01*

+X225502Y245461D01*

+X225261Y245609D01*

+X224999Y245717D01*

+X224723Y245783D01*

+X224441Y245806D01*

+X224438Y245805D01*

+Y247503D01*

+G37*

+G36*

+Y264380D02*X239299D01*

+Y264291D01*

+X238980Y264266D01*

+X238667Y264191D01*

+X238368Y264067D01*

+X238093Y263899D01*

+X237848Y263689D01*

+X237638Y263444D01*

+X237470Y263169D01*

+X237346Y262870D01*

+X237271Y262557D01*

+X237246Y262235D01*

+X237271Y261913D01*

+X237346Y261600D01*

+X237470Y261301D01*

+X237638Y261026D01*

+X237848Y260781D01*

+X238093Y260571D01*

+X238368Y260403D01*

+X238667Y260279D01*

+X238980Y260204D01*

+X239299Y260179D01*

+Y256200D01*

+X224438D01*

+Y264380D01*

+G37*

+G36*

+Y270771D02*X239299D01*

+Y266780D01*

+X224438D01*

+Y270771D01*

+G37*

+G36*

+Y273875D02*X239299D01*

+Y273171D01*

+X224438D01*

+Y273875D01*

+G37*

+G36*

+Y290500D02*X229241D01*

+Y288561D01*

+X229237Y288514D01*

+X229252Y288326D01*

+X229296Y288142D01*

+X229368Y287968D01*

+X229467Y287806D01*

+X229467Y287806D01*

+X229590Y287663D01*

+X229626Y287632D01*

+X238593Y278665D01*

+X238585Y278564D01*

+X238608Y278282D01*

+X238674Y278006D01*

+X238782Y277744D01*

+X238930Y277503D01*

+X239114Y277287D01*

+X239299Y277130D01*

+Y276275D01*

+X224438D01*

+Y290500D01*

+G37*

+G36*

+X220438Y252921D02*X220607Y252723D01*

+X220823Y252539D01*

+X221064Y252391D01*

+X221326Y252283D01*

+X221602Y252217D01*

+X221884Y252194D01*

+X222166Y252217D01*

+X222442Y252283D01*

+X222682Y252382D01*

+X222658Y252282D01*

+X222635Y252000D01*

+X222658Y251718D01*

+X222724Y251442D01*

+X222832Y251180D01*

+X222980Y250939D01*

+X223164Y250723D01*

+X223380Y250539D01*

+X223621Y250391D01*

+X223883Y250283D01*

+X224121Y250226D01*

+X223980Y250061D01*

+X223832Y249820D01*

+X223724Y249558D01*

+X223658Y249282D01*

+X223635Y249000D01*

+X223658Y248718D01*

+X223724Y248442D01*

+X223832Y248180D01*

+X223980Y247939D01*

+X224164Y247723D01*

+X224380Y247539D01*

+X224438Y247503D01*

+Y245805D01*

+X224159Y245783D01*

+X223883Y245717D01*

+X223621Y245609D01*

+X223380Y245461D01*

+X223164Y245277D01*

+X222980Y245061D01*

+X222832Y244820D01*

+X222724Y244558D01*

+X222658Y244282D01*

+X222635Y244000D01*

+X222658Y243718D01*

+X222724Y243442D01*

+X222832Y243180D01*

+X222980Y242939D01*

+X223164Y242723D01*

+X223380Y242539D01*

+X223621Y242391D01*

+X223883Y242283D01*

+X224159Y242217D01*

+X224438Y242195D01*

+Y237230D01*

+X224383Y237217D01*

+X224121Y237109D01*

+X223880Y236961D01*

+X223664Y236777D01*

+X223480Y236561D01*

+X223332Y236320D01*

+X223224Y236058D01*

+X223158Y235782D01*

+X223135Y235500D01*

+X223158Y235218D01*

+X223224Y234942D01*

+X223332Y234680D01*

+X223480Y234439D01*

+X223664Y234223D01*

+X223880Y234039D01*

+X224121Y233891D01*

+X224383Y233783D01*

+X224438Y233770D01*

+Y227997D01*

+X224380Y227961D01*

+X224164Y227777D01*

+X223980Y227561D01*

+X223832Y227320D01*

+X223724Y227058D01*

+X223658Y226782D01*

+X223635Y226500D01*

+X223658Y226218D01*

+X223724Y225942D01*

+X223832Y225680D01*

+X223980Y225439D01*

+X224164Y225223D01*

+X224380Y225039D01*

+X224438Y225003D01*

+Y222230D01*

+X224383Y222217D01*

+X224121Y222109D01*

+X223880Y221961D01*

+X223664Y221777D01*

+X223480Y221561D01*

+X223332Y221320D01*

+X223224Y221058D01*

+X223158Y220782D01*

+X223135Y220500D01*

+X223158Y220218D01*

+X223224Y219942D01*

+X223332Y219680D01*

+X223480Y219439D01*

+X223664Y219223D01*

+X223880Y219039D01*

+X224121Y218891D01*

+X224383Y218783D01*

+X224438Y218770D01*

+Y201500D01*

+X220438D01*

+Y213195D01*

+X220441Y213194D01*

+X220723Y213217D01*

+X220999Y213283D01*

+X221261Y213391D01*

+X221502Y213539D01*

+X221718Y213723D01*

+X221902Y213939D01*

+X222050Y214180D01*

+X222158Y214442D01*

+X222224Y214718D01*

+X222241Y215000D01*

+X222224Y215282D01*

+X222158Y215558D01*

+X222050Y215820D01*

+X221902Y216061D01*

+X221718Y216277D01*

+X221502Y216461D01*

+X221261Y216609D01*

+X220999Y216717D01*

+X220723Y216783D01*

+X220441Y216806D01*

+X220438Y216805D01*

+Y252921D01*

+G37*

+G36*

+Y263799D02*X220447Y263797D01*

+X220729Y263774D01*

+X221011Y263797D01*

+X221287Y263863D01*

+X221549Y263971D01*

+X221790Y264119D01*

+X222006Y264303D01*

+X222071Y264380D01*

+X224438D01*

+Y256200D01*

+X222931D01*

+X222884Y256204D01*

+X222696Y256189D01*

+X222512Y256145D01*

+X222338Y256073D01*

+X222176Y255974D01*

+X222176Y255974D01*

+X222033Y255851D01*

+X222002Y255815D01*

+X221985Y255798D01*

+X221884Y255806D01*

+X221602Y255783D01*

+X221326Y255717D01*

+X221064Y255609D01*

+X220823Y255461D01*

+X220607Y255277D01*

+X220438Y255079D01*

+Y257243D01*

+X220441Y257243D01*

+X220794Y257271D01*

+X221138Y257354D01*

+X221466Y257489D01*

+X221768Y257674D01*

+X222037Y257904D01*

+X222267Y258173D01*

+X222452Y258475D01*

+X222587Y258803D01*

+X222670Y259147D01*

+X222698Y259500D01*

+X222670Y259853D01*

+X222587Y260197D01*

+X222452Y260525D01*

+X222267Y260827D01*

+X222032Y261091D01*

+X220438Y262685D01*

+Y263799D01*

+G37*

+G36*

+Y270771D02*X223941D01*

+X223941Y270771D01*

+X224438D01*

+Y266780D01*

+X222071D01*

+X222006Y266857D01*

+X221790Y267041D01*

+X221549Y267189D01*

+X221287Y267297D01*

+X221011Y267363D01*

+X220729Y267386D01*

+X220447Y267363D01*

+X220438Y267361D01*

+Y270771D01*

+G37*

+G36*

+Y274426D02*X220617Y274252D01*

+X220642Y274224D01*

+X220785Y274101D01*

+X220795Y274096D01*

+X220801Y274090D01*

+X220874Y274047D01*

+X220947Y274002D01*

+X220955Y273999D01*

+X220964Y273994D01*

+X221043Y273963D01*

+X221121Y273930D01*

+X221130Y273928D01*

+X221139Y273924D01*

+X221222Y273906D01*

+X221305Y273886D01*

+X221313Y273886D01*

+X221324Y273883D01*

+X221512Y273871D01*

+X221550Y273875D01*

+X224438D01*

+Y273171D01*

+X223941D01*

+X223941Y273171D01*

+X221111D01*

+X221050Y273320D01*

+X220902Y273561D01*

+X220718Y273777D01*

+X220502Y273961D01*

+X220438Y274000D01*

+Y274426D01*

+G37*

+G36*

+Y290500D02*X224438D01*

+Y276275D01*

+X221979D01*

+X220438Y277767D01*

+Y290500D01*

+G37*

+G36*

+Y255079D02*X220423Y255061D01*

+X220275Y254820D01*

+X220167Y254558D01*

+X220101Y254282D01*

+X220078Y254000D01*

+X220101Y253718D01*

+X220167Y253442D01*

+X220275Y253180D01*

+X220423Y252939D01*

+X220438Y252921D01*

+Y216805D01*

+X220159Y216783D01*

+X219883Y216717D01*

+X219621Y216609D01*

+X219380Y216461D01*

+X219164Y216277D01*

+X218980Y216061D01*

+X218832Y215820D01*

+X218724Y215558D01*

+X218658Y215282D01*

+X218635Y215000D01*

+X218658Y214718D01*

+X218724Y214442D01*

+X218832Y214180D01*

+X218980Y213939D01*

+X219164Y213723D01*

+X219380Y213539D01*

+X219621Y213391D01*

+X219883Y213283D01*

+X220159Y213217D01*

+X220438Y213195D01*

+Y201500D01*

+X216845D01*

+X216474Y201589D01*

+X215799Y201642D01*

+X215124Y201589D01*

+X214753Y201500D01*

+X212938D01*

+Y218913D01*

+X214276Y218914D01*

+X214506Y218969D01*

+X214724Y219059D01*

+X214925Y219183D01*

+X215105Y219336D01*

+X215258Y219516D01*

+X215382Y219717D01*

+X215472Y219935D01*

+X215527Y220165D01*

+X215541Y220400D01*

+X215527Y232835D01*

+X215472Y233065D01*

+X215382Y233283D01*

+X215258Y233484D01*

+X215105Y233664D01*

+X214925Y233817D01*

+X214724Y233941D01*

+X214506Y234031D01*

+X214276Y234086D01*

+X214041Y234100D01*

+X212938Y234099D01*

+Y236195D01*

+X212941Y236194D01*

+X213223Y236217D01*

+X213499Y236283D01*

+X213761Y236391D01*

+X214002Y236539D01*

+X214218Y236723D01*

+X214402Y236939D01*

+X214550Y237180D01*

+X214658Y237442D01*

+X214724Y237718D01*

+X214741Y238000D01*

+X214724Y238282D01*

+X214658Y238558D01*

+X214550Y238820D01*

+X214402Y239061D01*

+X214218Y239277D01*

+X214002Y239461D01*

+X213761Y239609D01*

+X213499Y239717D01*

+X213223Y239783D01*

+X212941Y239806D01*

+X212938Y239805D01*

+Y243308D01*

+X215576Y243314D01*

+X215806Y243369D01*

+X216024Y243459D01*

+X216225Y243583D01*

+X216405Y243736D01*

+X216558Y243916D01*

+X216682Y244117D01*

+X216772Y244335D01*

+X216827Y244565D01*

+X216841Y244800D01*

+X216827Y257235D01*

+X216772Y257465D01*

+X216682Y257683D01*

+X216558Y257884D01*

+X216405Y258064D01*

+X216225Y258217D01*

+X216024Y258341D01*

+X215806Y258431D01*

+X215576Y258486D01*

+X215341Y258500D01*

+X214791Y258499D01*

+Y258957D01*

+X214800Y258957D01*

+X214953Y258994D01*

+X215098Y259054D01*

+X215233Y259136D01*

+X215352Y259239D01*

+X215455Y259358D01*

+X215537Y259493D01*

+X215597Y259638D01*

+X215634Y259791D01*

+X215643Y259948D01*

+X215641Y261043D01*

+X215716D01*

+X218850Y257909D01*

+X219114Y257674D01*

+X219416Y257489D01*

+X219744Y257354D01*

+X220088Y257271D01*

+X220438Y257243D01*

+Y255079D01*

+G37*

+G36*

+X212938Y290500D02*X220438D01*

+Y277767D01*

+X219237Y278931D01*

+X219241Y279000D01*

+X219224Y279282D01*

+X219158Y279558D01*

+X219050Y279820D01*

+X218902Y280061D01*

+X218718Y280277D01*

+X218502Y280461D01*

+X218261Y280609D01*

+X217999Y280717D01*

+X217723Y280783D01*

+X217441Y280806D01*

+X217159Y280783D01*

+X216883Y280717D01*

+X216621Y280609D01*

+X216380Y280461D01*

+X216164Y280277D01*

+X215980Y280061D01*

+X215832Y279820D01*

+X215724Y279558D01*

+X215658Y279282D01*

+X215635Y279000D01*

+X215658Y278718D01*

+X215724Y278442D01*

+X215832Y278180D01*

+X215980Y277939D01*

+X216164Y277723D01*

+X216380Y277539D01*

+X216621Y277391D01*

+X216883Y277283D01*

+X217159Y277217D01*

+X217441Y277194D01*

+X217570Y277205D01*

+X220438Y274426D01*

+Y274000D01*

+X220261Y274109D01*

+X219999Y274217D01*

+X219723Y274283D01*

+X219441Y274306D01*

+X219159Y274283D01*

+X218883Y274217D01*

+X218621Y274109D01*

+X218380Y273961D01*

+X218164Y273777D01*

+X217980Y273561D01*

+X217832Y273320D01*

+X217724Y273058D01*

+X217658Y272782D01*

+X217635Y272500D01*

+X217658Y272218D01*

+X217724Y271942D01*

+X217832Y271680D01*

+X217980Y271439D01*

+X218164Y271223D01*

+X218380Y271039D01*

+X218621Y270891D01*

+X218883Y270783D01*

+X219159Y270717D01*

+X219441Y270694D01*

+X219723Y270717D01*

+X219943Y270769D01*

+X219970Y270767D01*

+X220017Y270771D01*

+X220438D01*

+Y267361D01*

+X220171Y267297D01*

+X219909Y267189D01*

+X219668Y267041D01*

+X219452Y266857D01*

+X219268Y266641D01*

+X219120Y266400D01*

+X219012Y266138D01*

+X218946Y265862D01*

+X218923Y265580D01*

+X218946Y265298D01*

+X219012Y265022D01*

+X219120Y264760D01*

+X219268Y264519D01*

+X219452Y264303D01*

+X219668Y264119D01*

+X219909Y263971D01*

+X220171Y263863D01*

+X220438Y263799D01*

+Y262685D01*

+X218301Y264822D01*

+X218244Y264889D01*

+X217975Y265119D01*

+X217975Y265119D01*

+X217860Y265189D01*

+X217673Y265304D01*

+X217441Y265400D01*

+X217345Y265439D01*

+X217001Y265522D01*

+X216648Y265550D01*

+X216560Y265543D01*

+X215634D01*

+X215634Y266009D01*

+X215597Y266162D01*

+X215537Y266307D01*

+X215455Y266442D01*

+X215352Y266561D01*

+X215233Y266664D01*

+X215098Y266746D01*

+X214953Y266806D01*

+X214800Y266843D01*

+X214643Y266852D01*

+X214334Y266851D01*

+Y267948D01*

+X214341Y268036D01*

+X214313Y268389D01*

+X214313Y268389D01*

+X214230Y268733D01*

+X214095Y269061D01*

+X213910Y269363D01*

+X213680Y269632D01*

+X213613Y269689D01*

+X213268Y270034D01*

+X213266Y270954D01*

+X213229Y271107D01*

+X213169Y271252D01*

+X213087Y271387D01*

+X212984Y271506D01*

+X212938Y271546D01*

+Y290500D01*

+G37*

+G36*

+Y234099D02*X205438Y234094D01*

+Y236498D01*

+X205550Y236680D01*

+X205658Y236942D01*

+X205724Y237218D01*

+X205741Y237500D01*

+X205724Y237782D01*

+X205658Y238058D01*

+X205550Y238320D01*

+X205438Y238502D01*

+Y243311D01*

+X206476Y243314D01*

+X206706Y243369D01*

+X206924Y243459D01*

+X207125Y243583D01*

+X207305Y243736D01*

+X207458Y243916D01*

+X207582Y244117D01*

+X207672Y244335D01*

+X207727Y244565D01*

+X207741Y244800D01*

+X207727Y257235D01*

+X207672Y257465D01*

+X207582Y257683D01*

+X207458Y257884D01*

+X207305Y258064D01*

+X207125Y258217D01*

+X206924Y258341D01*

+X206706Y258431D01*

+X206476Y258486D01*

+X206241Y258500D01*

+X205438Y258498D01*

+Y258953D01*

+X207714Y258957D01*

+X207867Y258994D01*

+X208012Y259054D01*

+X208147Y259136D01*

+X208266Y259239D01*

+X208369Y259358D01*

+X208451Y259493D01*

+X208511Y259638D01*

+X208541Y259763D01*

+X208571Y259638D01*

+X208631Y259493D01*

+X208713Y259358D01*

+X208816Y259239D01*

+X208935Y259136D01*

+X209070Y259054D01*

+X209215Y258994D01*

+X209368Y258957D01*

+X209525Y258948D01*

+X210291Y258949D01*

+Y258488D01*

+X209506Y258486D01*

+X209276Y258431D01*

+X209058Y258341D01*

+X208857Y258217D01*

+X208677Y258064D01*

+X208524Y257884D01*

+X208400Y257683D01*

+X208310Y257465D01*

+X208255Y257235D01*

+X208241Y257000D01*

+X208255Y244565D01*

+X208310Y244335D01*

+X208400Y244117D01*

+X208524Y243916D01*

+X208677Y243736D01*

+X208857Y243583D01*

+X209058Y243459D01*

+X209276Y243369D01*

+X209506Y243314D01*

+X209741Y243300D01*

+X212938Y243308D01*

+Y239805D01*

+X212659Y239783D01*

+X212383Y239717D01*

+X212121Y239609D01*

+X211880Y239461D01*

+X211664Y239277D01*

+X211480Y239061D01*

+X211332Y238820D01*

+X211224Y238558D01*

+X211158Y238282D01*

+X211135Y238000D01*

+X211158Y237718D01*

+X211224Y237442D01*

+X211332Y237180D01*

+X211480Y236939D01*

+X211664Y236723D01*

+X211880Y236539D01*

+X212121Y236391D01*

+X212383Y236283D01*

+X212659Y236217D01*

+X212938Y236195D01*

+Y234099D01*

+G37*

+G36*

+Y201500D02*X210438D01*

+Y210695D01*

+X210441Y210694D01*

+X210723Y210717D01*

+X210999Y210783D01*

+X211261Y210891D01*

+X211502Y211039D01*

+X211718Y211223D01*

+X211902Y211439D01*

+X212050Y211680D01*

+X212158Y211942D01*

+X212224Y212218D01*

+X212241Y212500D01*

+X212224Y212782D01*

+X212158Y213058D01*

+X212050Y213320D01*

+X211902Y213561D01*

+X211718Y213777D01*

+X211502Y213961D01*

+X211261Y214109D01*

+X210999Y214217D01*

+X210723Y214283D01*

+X210441Y214306D01*

+X210438Y214305D01*

+Y218911D01*

+X212938Y218913D01*

+Y201500D01*

+G37*

+G36*

+X210438D02*X206845D01*

+X206474Y201589D01*

+X205799Y201642D01*

+X205438Y201614D01*

+Y218908D01*

+X210438Y218911D01*

+Y214305D01*

+X210159Y214283D01*

+X209883Y214217D01*

+X209621Y214109D01*

+X209380Y213961D01*

+X209164Y213777D01*

+X208980Y213561D01*

+X208832Y213320D01*

+X208724Y213058D01*

+X208658Y212782D01*

+X208635Y212500D01*

+X208658Y212218D01*

+X208724Y211942D01*

+X208832Y211680D01*

+X208980Y211439D01*

+X209164Y211223D01*

+X209380Y211039D01*

+X209621Y210891D01*

+X209883Y210783D01*

+X210159Y210717D01*

+X210438Y210695D01*

+Y201500D01*

+G37*

+G36*

+X205438Y290500D02*X212938D01*

+Y271546D01*

+X212865Y271609D01*

+X212730Y271691D01*

+X212585Y271751D01*

+X212432Y271788D01*

+X212275Y271797D01*

+X209166Y271788D01*

+X209013Y271751D01*

+X208868Y271691D01*

+X208733Y271609D01*

+X208614Y271506D01*

+X208511Y271387D01*

+X208429Y271252D01*

+X208369Y271107D01*

+X208332Y270954D01*

+X208323Y270797D01*

+X208332Y266704D01*

+X208369Y266551D01*

+X208429Y266406D01*

+X208511Y266271D01*

+X208582Y266189D01*

+X208571Y266162D01*

+X208541Y266037D01*

+X208511Y266162D01*

+X208451Y266307D01*

+X208369Y266442D01*

+X208266Y266561D01*

+X208147Y266664D01*

+X208139Y266668D01*

+X208148Y266704D01*

+X208157Y266861D01*

+X208148Y270954D01*

+X208111Y271107D01*

+X208051Y271252D01*

+X207969Y271387D01*

+X207866Y271506D01*

+X207747Y271609D01*

+X207612Y271691D01*

+X207467Y271751D01*

+X207314Y271788D01*

+X207157Y271797D01*

+X205438Y271792D01*

+Y275195D01*

+X205441Y275194D01*

+X205723Y275217D01*

+X205999Y275283D01*

+X206261Y275391D01*

+X206502Y275539D01*

+X206718Y275723D01*

+X206902Y275939D01*

+X207050Y276180D01*

+X207158Y276442D01*

+X207224Y276718D01*

+X207241Y277000D01*

+X207224Y277282D01*

+X207158Y277558D01*

+X207050Y277820D01*

+X206902Y278061D01*

+X206718Y278277D01*

+X206502Y278461D01*

+X206261Y278609D01*

+X205999Y278717D01*

+X205723Y278783D01*

+X205441Y278806D01*

+X205438Y278805D01*

+Y290500D01*

+G37*

+G36*

+Y258498D02*X203441Y258493D01*

+Y258950D01*

+X205438Y258953D01*

+Y258498D01*

+G37*

+G36*

+Y238502D02*X205402Y238561D01*

+X205218Y238777D01*

+X205002Y238961D01*

+X204761Y239109D01*

+X204499Y239217D01*

+X204223Y239283D01*

+X203941Y239306D01*

+X203659Y239283D01*

+X203441Y239231D01*

+Y243307D01*

+X205438Y243311D01*

+Y238502D01*

+G37*

+G36*

+Y234094D02*X203441Y234093D01*

+Y235769D01*

+X203659Y235717D01*

+X203941Y235694D01*

+X204223Y235717D01*

+X204499Y235783D01*

+X204761Y235891D01*

+X205002Y236039D01*

+X205218Y236223D01*

+X205402Y236439D01*

+X205438Y236498D01*

+Y234094D01*

+G37*

+G36*

+Y201614D02*X205124Y201589D01*

+X204753Y201500D01*

+X203441D01*

+Y211002D01*

+X203502Y211039D01*

+X203718Y211223D01*

+X203902Y211439D01*

+X204050Y211680D01*

+X204158Y211942D01*

+X204224Y212218D01*

+X204241Y212500D01*

+X204224Y212782D01*

+X204158Y213058D01*

+X204050Y213320D01*

+X203902Y213561D01*

+X203718Y213777D01*

+X203502Y213961D01*

+X203441Y213998D01*

+Y218907D01*

+X205438Y218908D01*

+Y201614D01*

+G37*

+G36*

+X203441Y290500D02*X205438D01*

+Y278805D01*

+X205159Y278783D01*

+X204883Y278717D01*

+X204621Y278609D01*

+X204380Y278461D01*

+X204164Y278277D01*

+X203980Y278061D01*

+X203832Y277820D01*

+X203724Y277558D01*

+X203658Y277282D01*

+X203635Y277000D01*

+X203658Y276718D01*

+X203724Y276442D01*

+X203832Y276180D01*

+X203980Y275939D01*

+X204164Y275723D01*

+X204380Y275539D01*

+X204621Y275391D01*

+X204883Y275283D01*

+X205159Y275217D01*

+X205438Y275195D01*

+Y271792D01*

+X204048Y271788D01*

+X203895Y271751D01*

+X203750Y271691D01*

+X203615Y271609D01*

+X203496Y271506D01*

+X203441Y271442D01*

+Y290500D01*

+G37*

+G36*

+X198438Y218904D02*X203441Y218907D01*

+Y213998D01*

+X203261Y214109D01*

+X202999Y214217D01*

+X202723Y214283D01*

+X202441Y214306D01*

+X202159Y214283D01*

+X201883Y214217D01*

+X201621Y214109D01*

+X201380Y213961D01*

+X201164Y213777D01*

+X200980Y213561D01*

+X200832Y213320D01*

+X200724Y213058D01*

+X200658Y212782D01*

+X200635Y212500D01*

+X200658Y212218D01*

+X200724Y211942D01*

+X200832Y211680D01*

+X200980Y211439D01*

+X201164Y211223D01*

+X201380Y211039D01*

+X201621Y210891D01*

+X201883Y210783D01*

+X202159Y210717D01*

+X202441Y210694D01*

+X202723Y210717D01*

+X202999Y210783D01*

+X203261Y210891D01*

+X203441Y211002D01*

+Y201500D01*

+X199592D01*

+X199554Y201523D01*

+X199409Y201583D01*

+X199256Y201620D01*

+X199099Y201629D01*

+X198438Y201628D01*

+Y218904D01*

+G37*

+G36*

+Y243892D02*X198458Y243916D01*

+X198582Y244117D01*

+X198672Y244335D01*

+X198727Y244565D01*

+X198741Y244800D01*

+X198727Y257235D01*

+X198672Y257465D01*

+X198582Y257683D01*

+X198458Y257884D01*

+X198438Y257908D01*

+Y260695D01*

+X198441Y260694D01*

+X198723Y260717D01*

+X198999Y260783D01*

+X199261Y260891D01*

+X199502Y261039D01*

+X199718Y261223D01*

+X199902Y261439D01*

+X200050Y261680D01*

+X200158Y261942D01*

+X200224Y262218D01*

+X200241Y262500D01*

+X200224Y262782D01*

+X200158Y263058D01*

+X200050Y263320D01*

+X199902Y263561D01*

+X199718Y263777D01*

+X199502Y263961D01*

+X199261Y264109D01*

+X198999Y264217D01*

+X198723Y264283D01*

+X198441Y264306D01*

+X198438Y264305D01*

+Y267695D01*

+X198441Y267694D01*

+X198723Y267717D01*

+X198999Y267783D01*

+X199261Y267891D01*

+X199502Y268039D01*

+X199718Y268223D01*

+X199902Y268439D01*

+X200050Y268680D01*

+X200158Y268942D01*

+X200224Y269218D01*

+X200241Y269500D01*

+X200224Y269782D01*

+X200158Y270058D01*

+X200050Y270320D01*

+X199902Y270561D01*

+X199718Y270777D01*

+X199502Y270961D01*

+X199261Y271109D01*

+X198999Y271217D01*

+X198723Y271283D01*

+X198441Y271306D01*

+X198438Y271305D01*

+Y290500D01*

+X203441D01*

+Y271442D01*

+X203393Y271387D01*

+X203311Y271252D01*

+X203251Y271107D01*

+X203214Y270954D01*

+X203205Y270797D01*

+X203214Y266844D01*

+X202282Y266843D01*

+X202129Y266806D01*

+X201984Y266746D01*

+X201849Y266664D01*

+X201730Y266561D01*

+X201627Y266442D01*

+X201545Y266307D01*

+X201485Y266162D01*

+X201448Y266009D01*

+X201439Y265852D01*

+X201448Y259791D01*

+X201485Y259638D01*

+X201545Y259493D01*

+X201627Y259358D01*

+X201730Y259239D01*

+X201849Y259136D01*

+X201984Y259054D01*

+X202129Y258994D01*

+X202282Y258957D01*

+X202439Y258948D01*

+X203441Y258950D01*

+Y258493D01*

+X200406Y258486D01*

+X200176Y258431D01*

+X199958Y258341D01*

+X199757Y258217D01*

+X199577Y258064D01*

+X199424Y257884D01*

+X199300Y257683D01*

+X199210Y257465D01*

+X199155Y257235D01*

+X199141Y257000D01*

+X199155Y244565D01*

+X199210Y244335D01*

+X199300Y244117D01*

+X199424Y243916D01*

+X199577Y243736D01*

+X199757Y243583D01*

+X199958Y243459D01*

+X200176Y243369D01*

+X200406Y243314D01*

+X200641Y243300D01*

+X203441Y243307D01*

+Y239231D01*

+X203383Y239217D01*

+X203121Y239109D01*

+X202880Y238961D01*

+X202664Y238777D01*

+X202480Y238561D01*

+X202332Y238320D01*

+X202224Y238058D01*

+X202158Y237782D01*

+X202135Y237500D01*

+X202158Y237218D01*

+X202224Y236942D01*

+X202332Y236680D01*

+X202480Y236439D01*

+X202664Y236223D01*

+X202880Y236039D01*

+X203121Y235891D01*

+X203383Y235783D01*

+X203441Y235769D01*

+Y234093D01*

+X198438Y234090D01*

+Y243892D01*

+G37*

+G36*

+Y257908D02*X198305Y258064D01*

+X198125Y258217D01*

+X197924Y258341D01*

+X197706Y258431D01*

+X197476Y258486D01*

+X197241Y258500D01*

+X191406Y258486D01*

+X191176Y258431D01*

+X190958Y258341D01*

+X190757Y258217D01*

+X190577Y258064D01*

+X190424Y257884D01*

+X190300Y257683D01*

+X190210Y257465D01*

+X190155Y257235D01*

+X190141Y257000D01*

+X190142Y256450D01*

+X188729D01*

+X188641Y256457D01*

+X188288Y256429D01*

+X187944Y256346D01*

+X187616Y256211D01*

+X187314Y256026D01*

+X187314Y256026D01*

+X187045Y255796D01*

+X186988Y255729D01*

+X182012Y250753D01*

+X181945Y250696D01*

+X181938Y250688D01*

+Y256695D01*

+X181941Y256694D01*

+X182223Y256717D01*

+X182499Y256783D01*

+X182761Y256891D01*

+X183002Y257039D01*

+X183218Y257223D01*

+X183402Y257439D01*

+X183550Y257680D01*

+X183658Y257942D01*

+X183724Y258218D01*

+X183741Y258500D01*

+X183724Y258782D01*

+X183658Y259058D01*

+X183550Y259320D01*

+X183402Y259561D01*

+X183218Y259777D01*

+X183002Y259961D01*

+X182761Y260109D01*

+X182499Y260217D01*

+X182223Y260283D01*

+X181941Y260306D01*

+X181938Y260305D01*

+Y290500D01*

+X198438D01*

+Y271305D01*

+X198159Y271283D01*

+X197883Y271217D01*

+X197621Y271109D01*

+X197380Y270961D01*

+X197164Y270777D01*

+X196980Y270561D01*

+X196832Y270320D01*

+X196724Y270058D01*

+X196658Y269782D01*

+X196635Y269500D01*

+X196658Y269218D01*

+X196724Y268942D01*

+X196832Y268680D01*

+X196980Y268439D01*

+X197164Y268223D01*

+X197380Y268039D01*

+X197621Y267891D01*

+X197883Y267783D01*

+X198159Y267717D01*

+X198438Y267695D01*

+Y264305D01*

+X198159Y264283D01*

+X197883Y264217D01*

+X197621Y264109D01*

+X197380Y263961D01*

+X197164Y263777D01*

+X196980Y263561D01*

+X196832Y263320D01*

+X196724Y263058D01*

+X196658Y262782D01*

+X196635Y262500D01*

+X196658Y262218D01*

+X196724Y261942D01*

+X196832Y261680D01*

+X196980Y261439D01*

+X197164Y261223D01*

+X197380Y261039D01*

+X197621Y260891D01*

+X197883Y260783D01*

+X198159Y260717D01*

+X198438Y260695D01*

+Y257908D01*

+G37*

+G36*

+X193938Y218901D02*X198438Y218904D01*

+Y201628D01*

+X193938Y201622D01*

+Y210695D01*

+X193941Y210694D01*

+X194223Y210717D01*

+X194499Y210783D01*

+X194761Y210891D01*

+X195002Y211039D01*

+X195218Y211223D01*

+X195402Y211439D01*

+X195550Y211680D01*

+X195658Y211942D01*

+X195724Y212218D01*

+X195741Y212500D01*

+X195724Y212782D01*

+X195658Y213058D01*

+X195550Y213320D01*

+X195402Y213561D01*

+X195218Y213777D01*

+X195002Y213961D01*

+X194761Y214109D01*

+X194499Y214217D01*

+X194223Y214283D01*

+X193941Y214306D01*

+X193938Y214305D01*

+Y218901D01*

+G37*

+G36*

+Y243305D02*X197476Y243314D01*

+X197706Y243369D01*

+X197924Y243459D01*

+X198125Y243583D01*

+X198305Y243736D01*

+X198438Y243892D01*

+Y234090D01*

+X193938Y234087D01*

+Y235195D01*

+X193941Y235194D01*

+X194223Y235217D01*

+X194499Y235283D01*

+X194761Y235391D01*

+X195002Y235539D01*

+X195218Y235723D01*

+X195402Y235939D01*

+X195550Y236180D01*

+X195658Y236442D01*

+X195724Y236718D01*

+X195741Y237000D01*

+X195724Y237282D01*

+X195658Y237558D01*

+X195550Y237820D01*

+X195402Y238061D01*

+X195218Y238277D01*

+X195002Y238461D01*

+X194761Y238609D01*

+X194499Y238717D01*

+X194223Y238783D01*

+X193941Y238806D01*

+X193938Y238805D01*

+Y243305D01*

+G37*

+G36*

+X185438Y231805D02*X186650Y231807D01*

+X186803Y231844D01*

+X186948Y231904D01*

+X187083Y231986D01*

+X187202Y232089D01*

+X187305Y232208D01*

+X187387Y232343D01*

+X187447Y232488D01*

+X187484Y232641D01*

+X187493Y232798D01*

+X187484Y238073D01*

+X187447Y238226D01*

+X187387Y238371D01*

+X187305Y238506D01*

+X187202Y238625D01*

+X187083Y238728D01*

+X186948Y238810D01*

+X186803Y238870D01*

+X186678Y238900D01*

+X186803Y238930D01*

+X186948Y238990D01*

+X187083Y239072D01*

+X187202Y239175D01*

+X187305Y239294D01*

+X187387Y239429D01*

+X187447Y239574D01*

+X187484Y239727D01*

+X187493Y239884D01*

+X187484Y245159D01*

+X187447Y245312D01*

+X187387Y245457D01*

+X187305Y245592D01*

+X187202Y245711D01*

+X187083Y245814D01*

+X186948Y245896D01*

+X186803Y245956D01*

+X186650Y245993D01*

+X186493Y246002D01*

+X185791Y246001D01*

+Y248168D01*

+X189573Y251950D01*

+X190147D01*

+X190155Y244565D01*

+X190210Y244335D01*

+X190300Y244117D01*

+X190424Y243916D01*

+X190577Y243736D01*

+X190757Y243583D01*

+X190958Y243459D01*

+X191176Y243369D01*

+X191406Y243314D01*

+X191641Y243300D01*

+X193938Y243305D01*

+Y238805D01*

+X193659Y238783D01*

+X193383Y238717D01*

+X193121Y238609D01*

+X192880Y238461D01*

+X192664Y238277D01*

+X192480Y238061D01*

+X192332Y237820D01*

+X192224Y237558D01*

+X192158Y237282D01*

+X192135Y237000D01*

+X192158Y236718D01*

+X192224Y236442D01*

+X192332Y236180D01*

+X192480Y235939D01*

+X192664Y235723D01*

+X192880Y235539D01*

+X193121Y235391D01*

+X193383Y235283D01*

+X193659Y235217D01*

+X193938Y235195D01*

+Y234087D01*

+X192606Y234086D01*

+X192376Y234031D01*

+X192158Y233941D01*

+X191957Y233817D01*

+X191777Y233664D01*

+X191624Y233484D01*

+X191500Y233283D01*

+X191410Y233065D01*

+X191355Y232835D01*

+X191341Y232600D01*

+X191355Y220165D01*

+X191410Y219935D01*

+X191500Y219717D01*

+X191624Y219516D01*

+X191777Y219336D01*

+X191957Y219183D01*

+X192158Y219059D01*

+X192376Y218969D01*

+X192606Y218914D01*

+X192841Y218900D01*

+X193938Y218901D01*

+Y214305D01*

+X193659Y214283D01*

+X193383Y214217D01*

+X193121Y214109D01*

+X192880Y213961D01*

+X192664Y213777D01*

+X192480Y213561D01*

+X192332Y213320D01*

+X192224Y213058D01*

+X192158Y212782D01*

+X192135Y212500D01*

+X192158Y212218D01*

+X192224Y211942D01*

+X192332Y211680D01*

+X192480Y211439D01*

+X192664Y211223D01*

+X192880Y211039D01*

+X193121Y210891D01*

+X193383Y210783D01*

+X193659Y210717D01*

+X193938Y210695D01*

+Y201622D01*

+X192342Y201620D01*

+X192189Y201583D01*

+X192044Y201523D01*

+X192006Y201500D01*

+X185438D01*

+Y215695D01*

+X185441Y215694D01*

+X185723Y215717D01*

+X185999Y215783D01*

+X186261Y215891D01*

+X186502Y216039D01*

+X186718Y216223D01*

+X186902Y216439D01*

+X187050Y216680D01*

+X187158Y216942D01*

+X187224Y217218D01*

+X187241Y217500D01*

+X187224Y217782D01*

+X187158Y218058D01*

+X187050Y218320D01*

+X186902Y218561D01*

+X186718Y218777D01*

+X186502Y218961D01*

+X186261Y219109D01*

+X185999Y219217D01*

+X185723Y219283D01*

+X185441Y219306D01*

+X185438Y219305D01*

+Y226195D01*

+X185441Y226194D01*

+X185723Y226217D01*

+X185999Y226283D01*

+X186261Y226391D01*

+X186502Y226539D01*

+X186718Y226723D01*

+X186902Y226939D01*

+X187050Y227180D01*

+X187158Y227442D01*

+X187224Y227718D01*

+X187241Y228000D01*

+X187224Y228282D01*

+X187158Y228558D01*

+X187050Y228820D01*

+X186902Y229061D01*

+X186718Y229277D01*

+X186502Y229461D01*

+X186261Y229609D01*

+X185999Y229717D01*

+X185723Y229783D01*

+X185441Y229806D01*

+X185438Y229805D01*

+Y231805D01*

+G37*

+G36*

+X181938Y231800D02*X185438Y231805D01*

+Y229805D01*

+X185159Y229783D01*

+X184883Y229717D01*

+X184621Y229609D01*

+X184380Y229461D01*

+X184164Y229277D01*

+X183980Y229061D01*

+X183832Y228820D01*

+X183724Y228558D01*

+X183658Y228282D01*

+X183635Y228000D01*

+X183658Y227718D01*

+X183724Y227442D01*

+X183832Y227180D01*

+X183980Y226939D01*

+X184164Y226723D01*

+X184380Y226539D01*

+X184621Y226391D01*

+X184883Y226283D01*

+X185159Y226217D01*

+X185438Y226195D01*

+Y219305D01*

+X185159Y219283D01*

+X184883Y219217D01*

+X184621Y219109D01*

+X184380Y218961D01*

+X184164Y218777D01*

+X183980Y218561D01*

+X183832Y218320D01*

+X183724Y218058D01*

+X183658Y217782D01*

+X183635Y217500D01*

+X183658Y217218D01*

+X183724Y216942D01*

+X183832Y216680D01*

+X183980Y216439D01*

+X184164Y216223D01*

+X184380Y216039D01*

+X184621Y215891D01*

+X184883Y215783D01*

+X185159Y215717D01*

+X185438Y215695D01*

+Y201500D01*

+X181938D01*

+Y231800D01*

+G37*

+G36*

+Y250688D02*X181715Y250427D01*

+X181530Y250125D01*

+X181395Y249797D01*

+X181312Y249453D01*

+X181312Y249453D01*

+X181284Y249100D01*

+X181291Y249012D01*

+Y245994D01*

+X180432Y245993D01*

+X180279Y245956D01*

+X180134Y245896D01*

+X179999Y245814D01*

+X179880Y245711D01*

+X179777Y245592D01*

+X179695Y245457D01*

+X179635Y245312D01*

+X179598Y245159D01*

+X179589Y245002D01*

+X179590Y244693D01*

+X178472D01*

+X178384Y244700D01*

+X178031Y244672D01*

+X177687Y244589D01*

+X177359Y244454D01*

+X177057Y244269D01*

+X177057Y244269D01*

+X176788Y244039D01*

+X176731Y243972D01*

+X172441Y239682D01*

+Y290500D01*

+X181938D01*

+Y260305D01*

+X181659Y260283D01*

+X181383Y260217D01*

+X181121Y260109D01*

+X180880Y259961D01*

+X180664Y259777D01*

+X180480Y259561D01*

+X180332Y259320D01*

+X180224Y259058D01*

+X180158Y258782D01*

+X180135Y258500D01*

+X180158Y258218D01*

+X180224Y257942D01*

+X180332Y257680D01*

+X180480Y257439D01*

+X180664Y257223D01*

+X180880Y257039D01*

+X181121Y256891D01*

+X181383Y256783D01*

+X181659Y256717D01*

+X181938Y256695D01*

+Y250688D01*

+G37*

+G36*

+X179589Y237916D02*X179598Y232641D01*

+X179635Y232488D01*

+X179695Y232343D01*

+X179777Y232208D01*

+X179880Y232089D01*

+X179999Y231986D01*

+X180134Y231904D01*

+X180279Y231844D01*

+X180432Y231807D01*

+X180589Y231798D01*

+X181938Y231800D01*

+Y201500D01*

+X177438D01*

+Y215695D01*

+X177441Y215694D01*

+X177723Y215717D01*

+X177999Y215783D01*

+X178261Y215891D01*

+X178502Y216039D01*

+X178718Y216223D01*

+X178902Y216439D01*

+X179050Y216680D01*

+X179158Y216942D01*

+X179224Y217218D01*

+X179241Y217500D01*

+X179224Y217782D01*

+X179158Y218058D01*

+X179050Y218320D01*

+X178902Y218561D01*

+X178718Y218777D01*

+X178502Y218961D01*

+X178261Y219109D01*

+X177999Y219217D01*

+X177723Y219283D01*

+X177441Y219306D01*

+X177438Y219305D01*

+Y226195D01*

+X177441Y226194D01*

+X177723Y226217D01*

+X177999Y226283D01*

+X178261Y226391D01*

+X178502Y226539D01*

+X178718Y226723D01*

+X178902Y226939D01*

+X179050Y227180D01*

+X179158Y227442D01*

+X179224Y227718D01*

+X179241Y228000D01*

+X179224Y228282D01*

+X179158Y228558D01*

+X179050Y228820D01*

+X178902Y229061D01*

+X178718Y229277D01*

+X178502Y229461D01*

+X178261Y229609D01*

+X177999Y229717D01*

+X177723Y229783D01*

+X177441Y229806D01*

+X177438Y229805D01*

+Y238315D01*

+X179316Y240193D01*

+X179597D01*

+X179598Y239727D01*

+X179635Y239574D01*

+X179695Y239429D01*

+X179777Y239294D01*

+X179880Y239175D01*

+X179999Y239072D01*

+X180134Y238990D01*

+X180279Y238930D01*

+X180404Y238900D01*

+X180279Y238870D01*

+X180134Y238810D01*

+X179999Y238728D01*

+X179880Y238625D01*

+X179777Y238506D01*

+X179695Y238371D01*

+X179635Y238226D01*

+X179598Y238073D01*

+X179589Y237916D01*

+G37*

+G36*

+X177438Y201500D02*X172441D01*

+Y233318D01*

+X177438Y238315D01*

+Y229805D01*

+X177159Y229783D01*

+X176883Y229717D01*

+X176621Y229609D01*

+X176380Y229461D01*

+X176164Y229277D01*

+X175980Y229061D01*

+X175832Y228820D01*

+X175724Y228558D01*

+X175658Y228282D01*

+X175635Y228000D01*

+X175658Y227718D01*

+X175724Y227442D01*

+X175832Y227180D01*

+X175980Y226939D01*

+X176164Y226723D01*

+X176380Y226539D01*

+X176621Y226391D01*

+X176883Y226283D01*

+X177159Y226217D01*

+X177438Y226195D01*

+Y219305D01*

+X177159Y219283D01*

+X176883Y219217D01*

+X176621Y219109D01*

+X176380Y218961D01*

+X176164Y218777D01*

+X175980Y218561D01*

+X175832Y218320D01*

+X175724Y218058D01*

+X175658Y217782D01*

+X175635Y217500D01*

+X175658Y217218D01*

+X175724Y216942D01*

+X175832Y216680D01*

+X175980Y216439D01*

+X176164Y216223D01*

+X176380Y216039D01*

+X176621Y215891D01*

+X176883Y215783D01*

+X177159Y215717D01*

+X177438Y215695D01*

+Y201500D01*

+G37*

+G36*

+X210441Y240500D02*X214941D01*

+Y235500D01*

+X210441D01*

+Y240500D01*

+G37*

+G36*

+X218441Y217500D02*X177941D01*

+Y238500D01*

+X218441D01*

+Y217500D01*

+G37*

+G36*

+X174941Y220000D02*X179441D01*

+Y215000D01*

+X174941D01*

+Y220000D01*

+G37*

+G36*

+X182941D02*X187441D01*

+Y215000D01*

+X182941D01*

+Y220000D01*

+G37*

+G36*

+X191441Y215000D02*X195941D01*

+Y210000D01*

+X191441D01*

+Y215000D01*

+G37*

+G36*

+X199941D02*X204441D01*

+Y210000D01*

+X199941D01*

+Y215000D01*

+G37*

+G36*

+X207941D02*X212441D01*

+Y210000D01*

+X207941D01*

+Y215000D01*

+G37*

+G36*

+X217941Y217500D02*X222441D01*

+Y212500D01*

+X217941D01*

+Y217500D01*

+G37*

+G36*

+X222441Y223000D02*X226941D01*

+Y218000D01*

+X222441D01*

+Y223000D01*

+G37*

+G36*

+X222941Y229000D02*X227441D01*

+Y224000D01*

+X222941D01*

+Y229000D01*

+G37*

+G36*

+X201441Y240000D02*X205941D01*

+Y235000D01*

+X201441D01*

+Y240000D01*

+G37*

+G36*

+X191441Y239500D02*X195941D01*

+Y234500D01*

+X191441D01*

+Y239500D01*

+G37*

+G36*

+X174941Y230500D02*X179441D01*

+Y225500D01*

+X174941D01*

+Y230500D01*

+G37*

+G36*

+X179441Y261000D02*X183941D01*

+Y256000D01*

+X179441D01*

+Y261000D01*

+G37*

+G36*

+X222441Y238000D02*X226941D01*

+Y233000D01*

+X222441D01*

+Y238000D01*

+G37*

+G36*

+X221941Y246500D02*X226441D01*

+Y241500D01*

+X221941D01*

+Y246500D01*

+G37*

+G36*

+X222441Y238000D02*X226941D01*

+Y233000D01*

+X222441D01*

+Y238000D01*

+G37*

+G36*

+X233941D02*X238441D01*

+Y233000D01*

+X233941D01*

+Y238000D01*

+G37*

+G36*

+X237001Y264297D02*X241501D01*

+Y259297D01*

+X237001D01*

+Y264297D01*

+G37*

+G36*

+X195941Y265000D02*X200441D01*

+Y260000D01*

+X195941D01*

+Y265000D01*

+G37*

+G36*

+Y272000D02*X200441D01*

+Y267000D01*

+X195941D01*

+Y272000D01*

+G37*

+G36*

+X202941Y279500D02*X207441D01*

+Y274500D01*

+X202941D01*

+Y279500D01*

+G37*

+G54D226*X404250Y300000D02*X376485D01*

+X402250Y305700D02*X391838D01*

+Y309311D02*Y305700D01*

+X394480Y314000D02*X398441D01*

+X394397Y313917D02*X394480Y314000D01*

+X389167Y311726D02*Y302000D01*

+X401750Y295000D02*X379044D01*

+Y290689D01*

+Y292839D02*Y290689D01*

+X382441Y293000D02*X381603Y292162D01*

+X391838Y293000D02*X382441D01*

+G54D227*X391838D02*X396441D01*

+X398441Y291000D01*

+G54D226*X373441Y319000D02*X368441Y314000D01*

+X374441Y317000D02*X369441Y312000D01*

+G54D227*X367441Y319000D02*Y337500D01*

+X363441Y319000D02*Y335904D01*

+X361698Y336799D02*Y320140D01*

+X360013Y337572D02*Y320860D01*

+G54D226*X382720Y319000D02*X373441D01*

+X379441Y317000D02*X374441D01*

+X389279Y324162D02*X387441Y326000D01*

+X381603Y314838D02*X379441Y317000D01*

+X381603Y313917D02*Y314838D01*

+G54D227*X382720Y319000D02*X386720Y315000D01*

+Y311614D01*

+X389279D02*Y324162D01*

+G54D226*X398441Y319441D02*Y314000D01*

+X395882Y324559D02*X393441Y327000D01*

+G54D227*X387441Y326000D02*X391338Y329897D01*

+G54D226*X398441Y324559D02*X395882D01*

+X389653Y278000D02*X371441D01*

+X381441Y282000D02*X371441D01*

+G54D227*Y278000D02*X368170Y281271D01*

+X370153Y283288D02*X371441Y282000D01*

+G54D226*X390441Y278788D02*X389653Y278000D01*

+X390441Y282588D02*Y278788D01*

+X389279Y283750D02*X390441Y282588D01*

+X389279Y290689D02*Y283750D01*

+X384162Y284721D02*X381441Y282000D01*

+X384162Y290689D02*Y284721D01*

+X386720Y288386D02*Y282000D01*

+X379044Y302000D02*X389167D01*

+X379044Y311614D02*Y302000D01*

+X376485Y311614D02*Y300000D01*

+X384162Y311614D02*Y306000D01*

+X381603Y292162D02*Y288386D01*

+X376485Y290689D02*X372441D01*

+X391838Y288386D02*Y293000D01*

+G54D227*Y290689D02*Y284085D01*

+X392388Y283535D01*

+G54D226*X402250Y314532D02*Y305700D01*

+X404250Y300000D02*Y311382D01*

+X402250Y293339D02*Y290653D01*

+Y293339D02*X401750D01*

+Y295000D02*Y293338D01*

+G54D228*X407000Y300618D02*Y294000D01*

+X409382Y303000D02*X407000Y300618D01*

+Y330618D02*Y324000D01*

+X427000Y301508D02*Y294000D01*

+X437000Y301508D02*Y294000D01*

+X453500Y300618D02*Y294000D01*

+X455882Y303000D02*X453500Y300618D01*

+X463500Y302508D02*Y294000D01*

+Y302508D03*

+X467882D02*X463500D01*

+X473500Y324000D02*Y316008D01*

+Y302508D02*Y294000D01*

+Y302508D02*X473000D01*

+X473500Y294000D02*Y286008D01*

+G54D226*X391338Y352897D02*Y348886D01*

+X393897Y341500D03*

+Y346583D02*Y341500D01*

+G54D227*X391338Y329897D02*Y349103D01*

+G54D226*X431882Y365468D03*

+X421882D01*

+X431882D02*Y361508D01*

+G54D228*X427000D02*Y354000D01*

+G54D226*X421882Y365468D02*Y362492D01*

+G54D228*X418441Y362000D02*X417000Y360559D01*

+Y354000D02*Y360500D01*

+X407000Y360618D02*Y354000D01*

+X409382Y363000D02*X407000Y360618D01*

+X421882Y362000D02*X418441D01*

+X417000Y360500D02*X414500Y363000D01*

+G54D226*X431882Y335468D03*

+X421882D01*

+X421823Y348468D02*X402250D01*

+X437433Y341500D02*X393897D01*

+X421882Y335468D02*Y332492D01*

+G54D228*X427000Y331508D02*Y324000D01*

+X437000Y331508D02*Y324000D01*

+X418559Y332000D02*X417000Y330441D01*

+Y330500D02*X414500Y333000D01*

+X409382D02*X407000Y330618D01*

+X421882Y332000D02*X418559D01*

+X473500Y333492D02*X473559D01*

+X473500Y332508D02*Y324000D01*

+X473559Y332508D02*X473500D01*

+X463500D03*

+D03*

+D03*

+D03*

+X468441D02*X463500D01*

+X461000D01*

+X463500D02*X461000D01*

+X463500D02*X461000Y333492D01*

+Y332508D02*X463500D01*

+X461000D02*X463500D01*

+X453500Y330618D02*Y324000D01*

+X455882Y333000D02*X453500Y330618D01*

+X463500Y332508D02*Y324000D01*

+X427000Y354000D03*

+Y346992D01*

+D03*

+Y354000D03*

+G54D226*X421823Y348468D02*Y346008D01*

+G54D228*X427000Y346992D02*X426941D01*

+X427000D01*

+X426941D02*X427000D01*

+G54D226*X421823D02*Y348468D01*

+Y346992D02*Y348468D01*

+G54D228*X427000Y346992D03*

+X437000Y354000D03*

+Y346618D01*

+Y354000D03*

+X463500Y362508D03*

+D03*

+X461059D01*

+X463500D02*X461059D01*

+X463500D03*

+G54D226*X459941Y346500D02*X458441Y345000D01*

+X468500Y346500D02*X459941D01*

+G54D228*X437433Y346618D03*

+D03*

+G54D226*X431882Y335468D02*Y331508D01*

+G54D228*X437000Y361508D02*Y354000D01*

+X463500D03*

+X453500Y360559D02*Y354000D01*

+X455941Y363000D02*X453500Y360559D01*

+X463500Y362508D02*Y354000D01*

+X468441Y362508D02*X463500D01*

+X473500D02*Y354000D01*

+X473559Y362508D02*X473500D01*

+G54D226*X401596Y360000D02*Y354234D01*

+Y348468D02*X402250D01*

+X401596Y360000D02*Y348468D01*

+X421823D03*

+G54D228*X427000Y354000D03*

+X437000D03*

+G54D226*X421823Y348468D03*

+G54D227*X376456Y382000D02*X367546Y373090D01*

+X376024Y378412D02*X369155Y371543D01*

+G54D226*X376394Y367661D02*Y365000D01*

+X378441Y363000D02*X376394Y365047D01*

+X378441Y367500D02*Y372114D01*

+X376394Y370090D03*

+Y369450D03*

+X375985Y369950D02*X376394Y369450D01*

+X375985Y369811D02*X376394Y369450D01*

+Y370090D02*X375985D01*

+X376394D03*

+X375985D02*X376394D01*

+X375985D02*X376394D01*

+X375985Y369950D01*

+X376394Y370090D02*Y369950D01*

+X375985D02*X376394Y370090D01*

+Y369950D02*Y370090D01*

+X375985Y369950D01*

+G54D227*X379029Y378412D02*X376024D01*

+X376456Y382000D02*X384405D01*

+X387441Y378964D01*

+Y377067D01*

+X386220Y375846D01*

+Y372114D01*

+G54D226*X391338Y377051D02*Y372000D01*

+X383662Y372114D02*Y378500D01*

+X388779Y372114D02*Y367500D01*

+X401750Y371500D02*Y365000D01*

+G54D227*X385941Y367500D02*Y366000D01*

+X381103Y374417D02*Y376338D01*

+X379029Y378412D01*

+G54D226*X401596Y360000D02*X378544D01*

+X393441Y355897D02*Y355000D01*

+X391338Y358000D02*X393441Y355897D01*

+X399750Y363000D02*X378441D01*

+X401750Y365000D02*X399750Y363000D01*

+X388779Y367500D02*X378441D01*

+X393441Y355000D02*X391338Y352897D01*

+X378544Y360000D02*Y357210D01*

+X381103Y358000D02*X391338D01*

+X378544Y360000D02*Y354419D01*

+Y355500D02*Y353339D01*

+X376394Y369450D02*Y367661D01*

+Y369450D02*Y367661D01*

+G54D227*X369155Y371543D02*Y344257D01*

+X367546Y373090D02*Y345105D01*

+X369155Y344257D02*X361698Y336799D01*

+X367546Y345105D02*X360013Y337572D01*

+X363441Y335904D02*X372270Y344733D01*

+X372661Y342720D02*X367441Y337500D01*

+G54D226*X386220Y354221D02*X385941Y354500D01*

+X381103Y353500D02*Y358000D01*

+X386220Y348886D02*Y354221D01*

+X381103Y348886D02*Y353500D01*

+X378544Y353339D02*Y351189D01*

+X375985D02*X372441D01*

+X378544Y353339D02*Y351189D01*

+G54D227*X372270Y344733D02*X382441D01*

+X383662Y345954D01*

+Y348886D01*

+X372661Y342720D02*X387161D01*

+X388779Y344338D01*

+Y351189D02*Y344338D01*

+G54D226*X422000Y377051D02*X391338D01*

+X437433Y371500D02*X401750D01*

+X396555Y372114D02*X397441Y373000D01*

+X393897Y372114D02*X396555D01*

+X391338Y376567D02*Y374417D01*

+X431941Y395468D03*

+X421882D01*

+X431941D02*Y391626D01*

+G54D228*X437000Y384000D03*

+X427000D03*

+D03*

+X437000D03*

+Y376618D01*

+Y384000D03*

+X437059Y391626D02*X437000D01*

+Y392610D02*X437059D01*

+Y391626D03*

+X437000D02*X437059D01*

+D03*

+X427000Y391508D02*Y384000D01*

+X437000Y391626D02*Y384000D01*

+X427000D02*Y377051D01*

+X427118D02*X427000D01*

+X427118D01*

+X427000D01*

+Y384000D03*

+X437433Y376618D03*

+D03*

+X427118Y377051D03*

+D03*

+D03*

+D03*

+G54D226*X421882Y395468D02*Y392492D01*

+G54D228*X417000Y390559D02*Y384000D01*

+X418441Y392000D02*X417000Y390559D01*

+X421882Y392000D02*X418441D01*

+X417000Y384000D02*Y390677D01*

+X414559Y393118D01*

+X407000Y390677D02*Y384000D01*

+X409441Y393118D02*X407000Y390677D01*

+X455882Y393000D02*X453500Y390618D01*

+Y384000D01*

+X473500D02*Y376008D01*

+X463500Y392508D02*Y384000D01*

+Y392508D03*

+X468441D02*X463500D01*

+X473500D02*Y384000D01*

+X473559Y392508D02*X473500D01*

+G54D226*X402250Y242000D02*X379394D01*

+X381953Y229157D02*Y234000D01*

+G54D227*X392188Y235000D02*X396441D01*

+G54D226*X381953Y239000D02*X392188D01*

+X387070Y229157D02*Y235000D01*

+X379394Y236000D02*Y231460D01*

+X402250Y242000D02*Y239000D01*

+X392188Y234000D02*Y239000D01*

+X402250Y240000D02*Y228468D01*

+X392188Y229157D02*Y234000D01*

+X375705Y221190D02*X369166Y227729D01*

+X385585Y221190D02*X375705D01*

+X389629Y225234D02*X385585Y221190D01*

+X376441Y223000D02*X370441Y229000D01*

+X381441Y223000D02*X376441D01*

+X384512Y226071D02*X381441Y223000D01*

+X389629Y231460D02*Y225234D01*

+X384512Y231460D02*Y226071D01*

+X379394Y238047D02*Y242000D01*

+X381953Y234000D02*Y239000D01*

+X376835Y229157D02*Y233606D01*

+X375441Y235000D01*

+X379394Y240000D02*Y231460D01*

+G54D227*X360441Y239000D02*X370441Y229000D01*

+X363895Y233000D02*X369168Y227727D01*

+G54D226*X381953Y256250D02*X378003Y260200D01*

+X377244Y250082D02*Y244700D01*

+Y250082D02*X376835D01*

+X379394Y252385D02*Y248000D01*

+G54D227*X378003Y260200D02*X375978D01*

+G54D226*X381953Y254688D02*Y256250D01*

+G54D227*X376441Y262000D02*X385441D01*

+X358839Y279602D02*X376441Y262000D01*

+X375978Y260200D02*X358541Y277637D01*

+X362315Y269515D02*X371602Y260228D01*

+X392388Y283535D02*Y263392D01*

+X390280Y261284D01*

+G54D226*X388441Y259000D02*X385441Y262000D01*

+X388441Y257000D02*Y259000D01*

+X384512Y252385D02*Y258000D01*

+G54D227*X390280Y261284D02*Y256058D01*

+G54D226*X387070Y255629D02*X388441Y257000D01*

+X387070Y254688D02*Y255629D01*

+X389629Y252385D02*Y248000D01*

+G54D227*X390280Y256058D02*X389629Y255407D01*

+Y252385D01*

+G54D226*X402250Y251441D02*Y244700D01*

+X394441Y252000D02*X397441D01*

+X398441Y253000D01*

+X402250Y244700D02*X377244D01*

+G54D227*X379394Y248000D02*X380114Y247280D01*

+X388909D01*

+X389629Y248000D01*

+G54D226*X437000Y191441D02*X411882D01*

+X431882Y185468D03*

+X421882D01*

+X431882D02*Y181508D01*

+X421882Y185468D02*Y182492D01*

+G54D228*Y182000D02*X418559D01*

+X437000Y181508D02*Y174000D01*

+X453500Y180618D02*Y174000D01*

+X455882Y183000D02*X453500Y180618D01*

+X463500Y182508D02*Y174000D01*

+Y182508D03*

+X468382D02*X463500D01*

+X473500D02*Y174000D01*

+Y165508D01*

+G54D226*X386720Y197721D02*X377441Y207000D01*

+X374441Y205000D02*X371441D01*

+X386720Y195917D02*Y197721D01*

+X381603Y197838D02*X374441Y205000D01*

+X381603Y195917D02*Y197838D01*

+X395882Y205559D02*X393441Y208000D01*

+X398441Y205559D02*X395882D01*

+X398441Y200441D02*Y196000D01*

+G54D227*X389279Y195917D02*Y212500D01*

+X392188Y215409D01*

+G54D228*X437492Y196559D03*

+D03*

+X437000Y204000D02*Y196559D01*

+Y204000D03*

+D03*

+D03*

+Y211508D02*Y204000D01*

+X427000D03*

+Y196492D01*

+Y204000D03*

+D03*

+Y196492D03*

+Y211508D02*Y204000D01*

+Y196492D02*X426941D01*

+X427000D03*

+X426941D02*X427000D01*

+X426941D02*X427000D01*

+X417000Y204000D02*Y210500D01*

+X407000Y210618D02*Y204000D01*

+X463500D03*

+D03*

+X453500Y210618D02*Y204000D01*

+X455882Y213000D02*X453500Y210618D01*

+X463500Y212508D02*Y204000D01*

+Y212508D03*

+X473500D02*Y204000D01*

+Y196008D01*

+G54D227*X361041Y205000D02*X371441D01*

+X368441Y198000D02*X363441Y203000D01*

+X362786Y201380D02*X366841Y197325D01*

+X363441Y203000D02*X359930D01*

+X359287Y201380D02*X362786D01*

+X361041Y205000D02*X358941Y207100D01*

+Y208500D01*

+G54D226*X421941Y228468D02*Y226008D01*

+Y228468D02*X402250D01*

+X437492Y221441D02*X394747D01*

+Y226854D02*Y221441D01*

+G54D228*X427059Y226992D02*X427000D01*

+X427059D03*

+X418441Y242000D02*X417000Y240559D01*

+X421882Y242000D02*X418441D01*

+X417000Y240559D02*X414559Y243000D01*

+X417000Y234000D02*Y240559D01*

+X407000D02*Y234000D01*

+X409441Y243000D02*X407000Y240559D01*

+X437000Y241508D02*Y234000D01*

+X437492Y226559D03*

+D03*

+X437000Y234000D03*

+Y226559D01*

+Y234000D03*

+D03*

+G54D226*X431882Y215468D02*X421882D01*

+X431882D03*

+G54D228*X427059Y226992D03*

+D03*

+X427000D01*

+X427059D01*

+D03*

+G54D226*X431882Y215468D02*Y211508D01*

+X421882Y215468D02*Y212492D01*

+G54D228*X418559Y212000D02*X417000Y210441D01*

+X421882Y212000D02*X418559D01*

+X417000Y210500D02*X414500Y213000D01*

+X409382D02*X407000Y210618D01*

+G54D226*X431882Y245468D03*

+Y241508D01*

+Y245468D02*X421882D01*

+Y242492D01*

+G54D228*X427000Y234000D02*Y226992D01*

+Y234000D03*

+D03*

+D03*

+Y241508D02*Y234000D01*

+G54D226*X460441Y256000D02*X458441Y254000D01*

+G54D228*X437492Y256559D03*

+D03*

+G54D226*X468382Y256000D02*X460441D01*

+G54D228*X463500Y264000D03*

+D03*

+X453500Y270618D02*Y264000D01*

+X463500Y272508D02*Y264000D01*

+Y272508D03*

+X473500D02*Y264000D01*

+Y255508D01*

+X468559Y272508D02*X463500D01*

+G54D226*X459941Y226500D02*X458441Y225000D01*

+G54D227*X392188Y215409D02*Y229500D01*

+G54D226*X468382Y226500D02*X459941D01*

+G54D228*X473500Y213492D02*X473559D01*

+X473500Y234000D02*Y226008D01*

+X473559Y212508D02*X473500D01*

+X463500D03*

+D03*

+D03*

+X461000D01*

+X463500D02*X461000D01*

+X463500D02*X461000Y213492D01*

+Y212508D02*X463500D01*

+X461000D02*X463500D01*

+X468441D02*X463500D01*

+G54D226*X437492Y251441D02*X402250D01*

+X421823Y256008D02*X402250D01*

+Y256838D02*Y256008D01*

+Y256838D02*X392188D01*

+Y254688D01*

+G54D228*X437000Y264000D03*

+Y256559D01*

+Y264000D03*

+D03*

+Y271508D02*Y264000D01*

+X427000D03*

+Y256992D01*

+Y264000D03*

+D03*

+Y256992D03*

+Y271508D02*Y264000D01*

+Y256992D02*X426941D01*

+X427000D03*

+X426941D02*X427000D01*

+X426941D02*X427000D01*

+X417000Y264000D02*Y270559D01*

+X407000D02*Y264000D01*

+X463500Y242508D03*

+D03*

+D03*

+Y234000D01*

+Y242508D03*

+Y234000D03*

+D03*

+X473500Y243492D02*X473559D01*

+X473500Y242508D02*Y234000D01*

+X473559Y242508D02*X473500D01*

+X463500D02*X461000D01*

+X463500D02*X461000D01*

+X463500D02*X461000Y243492D01*

+Y242508D02*X463500D01*

+X461000D02*X463500D01*

+X468441D02*X463500D01*

+X453500Y240618D02*Y234000D01*

+X455882Y243000D02*X453500Y240618D01*

+G54D226*X376485Y183956D02*X380441Y180000D01*

+X376485Y185700D02*Y183956D01*

+X379044Y177000D02*Y172689D01*

+G54D227*X377347Y162178D02*X380228D01*

+X384162Y166112D01*

+Y170386D01*

+G54D226*X381603D02*Y175000D01*

+X376485Y170386D02*X372441D01*

+G54D227*X366841Y192337D02*Y166300D01*

+X368441Y166963D02*Y198000D01*

+X366841Y197325D02*Y192220D01*

+X365241Y191616D02*Y165637D01*

+X363484Y191048D02*Y162503D01*

+X365241Y193163D02*Y190800D01*

+D03*

+X363484Y190957D02*Y192657D01*

+G54D226*X404441Y184000D02*X400441Y180000D01*

+X402441Y185000D02*X394441D01*

+X402250Y177000D02*Y168468D01*

+G54D228*X407000Y180618D02*Y174000D01*

+X409382Y183000D02*X407000Y180618D01*

+G54D227*X398441Y173000D02*X396441Y175000D01*

+G54D226*X404250Y183809D02*X411882Y191441D01*

+X413441Y196000D02*X402441Y185000D01*

+X421823Y196000D02*X413441D01*

+X398441D02*X400441Y194000D01*

+X394441D02*X400441D01*

+G54D228*X418559Y182000D02*X417000Y180441D01*

+Y174000D02*Y180500D01*

+X427000Y181508D02*Y174000D01*

+X417000Y180500D02*X414500Y183000D01*

+G54D226*X437433Y161382D02*X394397D01*

+Y168083D02*Y161382D01*

+X421823Y168468D02*Y166008D01*

+Y168468D02*X402250D01*

+G54D228*X437000Y174000D03*

+G54D226*X386720Y163279D02*X386441Y163000D01*

+X386720Y170386D02*Y163279D01*

+X391441Y164000D02*Y162000D01*

+X389279Y166162D02*X391441Y164000D01*

+X389279Y172689D02*Y166162D01*

+X391441Y162000D02*X388941Y159500D01*

+G54D227*X386023Y157813D02*X387710Y159500D01*

+X388941D01*

+G54D226*X389279Y184162D02*Y193614D01*

+X389441Y184000D02*X389279Y184162D01*

+X391838Y187603D02*X394441Y185000D01*

+X391838Y193614D02*Y187603D01*

+X380441Y180000D02*X400441D01*

+X402250Y177000D02*X379044D01*

+X381603Y175000D02*X391838D01*

+Y170386D02*Y175000D01*

+G54D227*X396441D02*X391838D01*

+G54D226*X384162Y193614D02*Y188000D01*

+X376485Y191311D02*Y185700D01*

+X379044Y184000D02*X389441D01*

+X379044Y193614D02*Y184000D01*

+X429765Y71000D02*X440000D01*

+X429765Y76324D02*Y71000D01*

+X440000Y76000D02*Y71000D01*

+X424647Y76206D02*X423441Y75000D01*

+X424647Y80772D02*Y76206D01*

+X427206Y78469D02*Y48468D01*

+X442559Y78469D02*Y76008D01*

+G54D227*X439941Y71000D02*X440941Y70000D01*

+Y65559D01*

+X440449D02*X434941D01*

+X434449Y60441D02*Y56500D01*

+X440449Y60441D02*Y56500D01*

+G54D226*X468441Y48468D02*Y46008D01*

+Y48468D02*X427206D01*

+G54D228*X473500Y46008D02*X473559D01*

+X463500Y54000D03*

+D03*

+X473500D02*Y46992D01*

+X473559D02*X473500D01*

+X473559Y54000D02*X473500D01*

+G54D226*X468382Y76008D02*X442559D01*

+G54D228*X463500Y84000D03*

+D03*

+X473500D02*Y76992D01*

+X473559Y84000D02*X473500D01*

+X463500Y62508D03*

+D03*

+D03*

+Y54000D01*

+Y62508D03*

+X473559D02*Y54000D01*

+X463500Y62508D02*X461059D01*

+X463500D02*X461059D01*

+X463500D02*X461059Y63492D01*

+Y62508D02*X463500D01*

+X461059D02*X463500D01*

+X468441D02*X463500D01*

+X453500Y60559D02*Y54000D01*

+X455941Y63000D02*X453500Y60559D01*

+G54D226*X418440Y101000D02*Y115875D01*

+X420441Y101546D02*Y115500D01*

+X424647Y134032D02*Y106303D01*

+G54D227*X420441Y127000D02*Y115500D01*

+X418440Y122001D02*Y115875D01*

+G54D226*X432030Y97015D02*X422425D01*

+X428241Y93000D02*X420941D01*

+X427941Y99000D02*X422987D01*

+X429441Y95000D02*X421895D01*

+X428441Y93200D02*X428241Y93000D01*

+X434882Y99867D02*X432030Y97015D01*

+X429765Y100824D02*X427941Y99000D01*

+X429765Y106303D02*Y100824D01*

+X432324Y89317D02*X428441Y93200D01*

+X437441Y87000D02*X429441Y95000D01*

+X437441D02*X440000Y92441D01*

+X432324Y83075D02*Y89317D01*

+X437441Y80000D02*Y87000D01*

+X432441Y80000D02*Y85000D01*

+X440000Y80772D02*Y92441D01*

+X434882Y80772D02*Y75000D01*

+X440000Y80772D02*Y76000D01*

+X434882Y101697D02*Y99867D01*

+X432324Y106303D02*Y111000D01*

+X434882Y106303D02*Y101118D01*

+X437441Y104000D02*Y95000D01*

+X440000Y108453D02*Y106303D01*

+X429765Y80772D02*Y76000D01*

+X422425Y97015D02*X418440Y101000D01*

+X422987Y99000D02*X420441Y101546D01*

+X444441Y104000D02*X446441Y102000D01*

+X442559Y104000D02*X444441D01*

+X427206Y115000D02*X428441D01*

+X427206Y109000D02*Y115000D01*

+X437441D02*X427441D01*

+X437441Y109000D02*Y115000D01*

+X427206Y104000D02*Y109000D01*

+X437441Y104000D02*Y109000D01*

+G54D228*Y115000D02*X440941Y118500D01*

+Y123000D01*

+G54D227*X421895Y95000D02*X416441Y100454D01*

+X420941Y93000D02*X414441Y99500D01*

+X416441Y100454D02*Y106000D01*

+X414441Y99500D02*Y106000D01*

+X416441Y114437D02*Y105455D01*

+X414441Y111546D02*Y105554D01*

+G54D226*X468382Y166000D02*X460441D01*

+G54D228*X463500Y182508D02*X461000D01*

+X463500D02*X461000D01*

+X463500D03*

+X461000D02*X463500D01*

+X461000D02*X463500D01*

+Y174000D03*

+D03*

+G54D226*X459941Y196500D02*X458441Y195000D01*

+X468382Y196500D02*X459941D01*

+G54D228*X463500Y182508D03*

+D03*

+X461000Y183492D01*

+G54D226*X460441Y166000D02*X458441Y164000D01*

+G54D228*X473500Y153492D02*X473559D01*

+X473500Y152508D02*Y144000D01*

+X473559Y152508D02*X473500D01*

+Y144000D02*Y135508D01*

+X463500Y152508D03*

+D03*

+D03*

+X468441D02*X463500D01*

+X461000D01*

+X463500D02*X461000D01*

+X463500D02*X461000Y153492D01*

+Y152508D02*X463500D01*

+X461000D02*X463500D01*

+X455882Y153000D02*X453500Y150618D01*

+X437000Y174000D03*

+Y166500D01*

+Y174000D03*

+X437433Y166500D03*

+D03*

+X427000Y174000D03*

+Y166992D01*

+Y174000D03*

+D03*

+Y166992D02*X426941D01*

+X427000D03*

+X426941D02*X427000D01*

+X426941D02*X427000D01*

+D03*

+G54D227*X368441Y166963D02*X380404Y155000D01*

+X366841Y166300D02*X380141Y153000D01*

+X380404Y155000D02*X392441D01*

+X420441Y127000D01*

+X380141Y153000D02*X387441D01*

+X418440Y122001D01*

+X365241Y165637D02*X416441Y114437D01*

+X363484Y162503D02*X414441Y111546D01*

+X250941Y229500D02*X269858Y210583D01*

+X268458Y207483D02*X246441Y229500D01*

+X242441D02*X267558Y204383D01*

+X272050Y213000D02*X247050Y238000D01*

+X269858Y210583D02*X304706D01*

+X304584Y207483D02*X268458D01*

+X267558Y204383D02*X305280D01*

+X309941Y213000D02*X272050D01*

+G54D228*X165941Y230000D02*Y217500D01*

+X169441Y214000D01*

+G54D227*X377441Y207000D02*X348441Y236000D01*

+X356441Y233000D02*X363895D01*

+X355441Y213124D02*Y207489D01*

+X359930Y203000D02*X355441Y207489D01*

+X353441Y207226D02*X359287Y201380D01*

+X350857Y206000D02*X352404D01*

+X365241Y193163D01*

+X363484Y192657D02*X351741Y204400D01*

+X351791Y204350D02*X350244D01*

+X309941Y213000D02*X334441Y188500D01*

+Y166000D01*

+X337441Y163000D01*

+X291441Y236000D02*X348441D01*

+X292207Y232971D02*X323886D01*

+X323183Y231349D02*X291092D01*

+X323245D02*X322092D01*

+X338441Y230124D02*X355441Y213124D01*

+X338441Y224192D02*X353441Y209192D01*

+Y207226D01*

+X323886Y232971D02*X350857Y206000D01*

+X350244Y204350D02*X323245Y231349D01*

+G54D226*X468382Y135508D02*X466906D01*

+Y134032D01*

+G54D228*X463500Y144000D03*

+D03*

+X453500Y150618D02*Y144000D01*

+X463500Y152508D02*Y144000D01*

+Y152508D03*

+G54D226*X466906Y134032D02*X424647D01*

+G54D228*X455882Y123000D02*X453500Y120618D01*

+X463500Y92508D03*

+D03*

+D03*

+D03*

+Y114000D03*

+D03*

+Y92508D02*X461059Y93492D01*

+X463500Y92508D02*X461059D01*

+X463500D02*X461059D01*

+X463500D01*

+X461059D02*X463500D01*

+Y84000D01*

+X473559Y92508D02*Y84000D01*

+X453500Y90559D02*Y84000D01*

+X455941Y93000D02*X453500Y90559D01*

+X468441Y92508D02*X463500D01*

+G54D226*X468382Y106008D02*X448750D01*

+Y108453D02*Y106008D01*

+Y108453D02*X440000D01*

+G54D228*X463500Y122508D03*

+D03*

+D03*

+Y114000D01*

+Y122508D03*

+X461000D01*

+X463500D02*X461000D01*

+X463500D02*X461000Y123492D01*

+Y122508D02*X463500D01*

+X461000D02*X463500D01*

+X468441D02*X463500D01*

+X453500Y120618D02*Y114000D01*

+X473500D02*Y106992D01*

+X473559Y122508D02*Y114000D01*

+X473500D01*

+X85441Y47500D02*X79882D01*

+X77441Y49941D01*

+X76949Y55059D02*X79390Y57500D01*

+X85441D01*

+X106949Y55059D02*X109390Y57500D01*

+X108941Y47500D02*X107441Y49000D01*

+X109390Y57500D02*X115441D01*

+Y47500D02*X108941D01*

+G54D227*X85441Y67500D02*X109941Y92000D01*

+G54D228*X136949Y49941D02*X139390Y47500D01*

+X145441D01*

+X166949Y49941D02*X169390Y47500D01*

+X175441D01*

+X145441Y57500D02*X139882D01*

+X137441Y55059D01*

+X166949D02*X169390Y57500D01*

+X175441D01*

+X196949Y55059D02*X199390Y57500D01*

+X205441D01*

+X196949Y49941D02*X199390Y47500D01*

+X205441D01*

+X226949Y49941D02*X229390Y47500D01*

+X235441D01*

+X226949Y55059D02*X229390Y57500D01*

+X235441D01*

+X256949Y55059D02*X259390Y57500D01*

+X265441D01*

+X256949Y49941D02*X259390Y47500D01*

+X265441D01*

+X286949Y49941D02*X289390Y47500D01*

+X295441D01*

+X286949Y55059D02*X289390Y57500D01*

+X295441D01*

+G54D227*Y67500D02*X275941D01*

+X115441D02*Y120500D01*

+X154941Y130500D02*X153441Y132000D01*

+X151941D01*

+X115441Y120500D02*X114441Y121500D01*

+X109941Y92000D02*Y130500D01*

+X111941Y132500D01*

+X115441D01*

+X145441Y67500D02*Y114500D01*

+X152441Y121500D01*

+X175441Y67500D02*X154941Y88000D01*

+Y130500D01*

+X235441Y67500D02*X198441Y104500D01*

+X265441Y67500D02*X234441Y98500D01*

+Y122500D01*

+X275941Y67500D02*X237441Y106000D01*

+Y131500D01*

+X235941Y133000D01*

+X198441Y104500D02*Y122500D01*

+X190941Y82000D02*Y130000D01*

+X193941Y133000D01*

+X195441D01*

+X205441Y67500D02*X190941Y82000D01*

+G54D226*X459941Y376500D02*X458441Y375000D01*

+G54D228*X463500Y384000D03*

+D03*

+X473500Y393492D02*X473559D01*

+X463500Y362508D03*

+X473500Y363492D02*X473559D01*

+X463500Y362508D02*X461059Y363492D01*

+Y362508D02*X463500D01*

+X461059D02*X463500D01*

+Y392508D03*

+D03*

+D03*

+X461000D01*

+X463500D02*X461000D01*

+X463500D02*X461000Y393492D01*

+Y392508D02*X463500D01*

+X461000D02*X463500D01*

+Y354000D03*

+X473618D02*Y346008D01*

+Y354000D02*X473500D01*

+G54D226*X468382Y376500D02*X459941D01*

+X421823Y316008D02*X420347D01*

+Y314532D01*

+X402250D01*

+X437433Y311382D02*X404250D01*

+X431882Y305468D03*

+X421882D01*

+X431882D02*Y301508D01*

+X421882Y305468D02*Y302492D01*

+G54D228*X418941Y302000D02*X417000Y300059D01*

+Y300500D02*X414500Y303000D01*

+X421882Y302000D02*X418941D01*

+G54D226*X459941Y316500D02*X458441Y315000D01*

+X468382Y316500D02*X459941D01*

+G54D228*X463500Y302508D03*

+D03*

+D03*

+X461000D01*

+X463500D02*X461000D01*

+X463500D01*

+X461000D02*X463500D01*

+X461000Y303492D01*

+X473500D02*X473000D01*

+X463500Y324000D03*

+D03*

+X437433Y316500D03*

+D03*

+X437000Y324000D02*Y316500D01*

+Y324000D03*

+X427000Y316992D02*X426941D01*

+X427000Y324000D02*Y316992D01*

+D03*

+X426941D02*X427000D01*

+X426941D02*X427000D01*

+D03*

+X437000Y324000D03*

+X427000D03*

+D03*

+X437000D03*

+X427000D03*

+X417000D02*Y330500D01*

+G54D226*X459941Y286500D02*X458441Y285000D01*

+G54D228*X463500Y294000D03*

+D03*

+G54D226*X468382Y286500D02*X459941D01*

+G54D228*X463500Y272508D03*

+D03*

+D03*

+X461000D01*

+X463500D02*X461000D01*

+X463500D01*

+X461000D02*X463500D01*

+X455882Y273000D02*X453500Y270618D01*

+X463500Y272508D02*X461000Y273492D01*

+X473500D02*X473677D01*

+Y272508D02*X473500D01*

+G54D226*X437492Y281441D02*X394397D01*

+X421823Y288468D02*X402250D01*

+Y292839D02*Y288468D01*

+X394397Y286083D02*Y281441D01*

+X431882Y275468D03*

+X421882D01*

+Y272492D01*

+G54D228*X437492Y286559D03*

+D03*

+X437000Y294000D03*

+Y286559D01*

+Y294000D03*

+D03*

+X427000Y286992D02*X426941D01*

+X427000Y294000D02*Y286992D01*

+D03*

+X426941D02*X427000D01*

+X426941D02*X427000D01*

+D03*

+G54D226*X431882Y275468D02*Y271508D01*

+G54D228*X427000Y294000D03*

+D03*

+D03*

+X417000D02*Y300500D01*

+G54D226*X421823Y288468D02*Y286008D01*

+G54D228*X418500Y272000D02*X417000Y270500D01*

+X421882Y272000D02*X418500D01*

+X417000Y270559D02*X414559Y273000D01*

+X409441D02*X407000Y270559D01*

+G54D227*X307716Y275075D02*X221756D01*

+X268735Y280294D02*X259870D01*

+X255221Y278590D02*X272141D01*

+X275815Y282263D01*

+X299852Y276675D02*X248390D01*

+X245557Y279508D01*

+X308992Y271971D02*X223868D01*

+X308872Y266522D02*X308083Y265733D01*

+X262750Y268772D02*X263493Y269515D01*

+X308872Y266522D02*X307930Y265580D01*

+X220729D01*

+X263493Y269515D02*X314645D01*

+X293902Y282263D02*X275804D01*

+X275815D02*X276842D01*

+X300814Y277637D02*X299852Y276675D01*

+X245557Y279508D02*X247216Y277849D01*

+X222884Y255000D02*X275441D01*

+X291441Y239000D01*

+X224441Y252000D02*X275441D01*

+X226441Y250000D02*X275178D01*

+X274191Y248250D02*X231691D01*

+X254740Y298329D02*Y295829D01*

+X266413Y296594D02*X266896Y296111D01*

+X269653Y298631D02*X272165Y296119D01*

+X273229Y298582D02*X271946Y299866D01*

+X254740Y295829D02*X261240Y289329D01*

+X260341Y284249D02*X257845Y286745D01*

+X260253Y288064D02*X259864D01*

+X256818Y291110D01*

+X264034Y284283D02*X260253Y288064D01*

+X259870Y280294D02*X256996Y283168D01*

+X257031Y290897D02*X252105Y295823D01*

+Y301771D01*

+X257850Y286740D02*X250348Y294242D01*

+Y301687D01*

+Y301846D02*Y302277D01*

+X256996Y283168D02*X251412D01*

+X261240Y289329D02*X268849D01*

+X263240Y295329D02*X264568Y294000D01*

+X266441D01*

+X266020Y291283D02*X265474Y291829D01*

+X262740D01*

+X268849Y289329D02*X270178Y288000D01*

+X266413Y296594D02*X268508Y294499D01*

+X266441Y294000D02*X267558Y292883D01*

+X270441Y290000D02*X269158Y291283D01*

+X266020D01*

+X279441Y285000D02*X273441D01*

+X268735Y280294D01*

+X221804Y275075D02*X221493D01*

+X217441Y279000D01*

+X223941Y271971D02*X219970D01*

+X219441Y272500D01*

+X250553Y280776D02*X249753D01*

+X250554D02*X253035D01*

+X247253Y277812D02*X248390Y276675D01*

+X253035Y280776D02*X255221Y278590D01*

+X287917Y302957D02*Y307829D01*

+X296779Y304963D02*X294773Y302957D01*

+X293035D01*

+X278224Y298517D02*Y303063D01*

+X275724Y297363D02*Y301494D01*

+X273634Y303585D01*

+X278224Y303063D02*X285494Y310333D01*

+X277174Y308219D02*X280976Y312022D01*

+X293441Y296111D02*X305330Y308000D01*

+X305993Y306400D02*X292476Y292883D01*

+X272165Y296119D02*X274480D01*

+X275724Y297363D01*

+X268508Y294499D02*X281091D01*

+X282702Y296111D01*

+X293441D01*

+X267558Y292883D02*X292476D01*

+X335673Y279602D02*X358839D01*

+X300104Y277637D02*X358541D01*

+X368170Y281271D02*X324922D01*

+X278225Y279602D02*X335757D01*

+X324922Y281271D02*X318193Y288000D01*

+X270178D02*X318193D01*

+X270441Y290000D02*X319525D01*

+X326237Y283288D01*

+X370153D01*

+X314441Y269515D02*X362315D01*

+X291441Y239000D02*X360441D01*

+X275441Y252000D02*X291441Y236000D01*

+X275178Y250000D02*X292207Y232971D01*

+X291092Y231349D02*X274191Y248250D01*

+X369441Y312000D02*X363841Y306400D01*

+X362441Y308000D02*X368441Y314000D01*

+X358774Y310333D02*X367441Y319000D01*

+X305993Y306400D02*X363841D01*

+X305330Y308000D02*X362441D01*

+X285494Y310333D02*X358774D01*

+X280976Y312022D02*X356463D01*

+X363441Y319000D01*

+X278661Y315434D02*X345216D01*

+X354587D02*X345007D01*

+X361698Y320140D02*X355188Y313631D01*

+X360013Y320860D02*X354587Y315434D01*

+X279121Y313631D02*X355188D01*

+G54D229*X118699Y327729D02*Y308829D01*

+G54D228*X127799Y327729D02*Y310858D01*

+X125941Y309000D01*

+G54D230*X124831Y302385D02*X120556D01*

+X118799Y304142D01*

+G54D231*Y308829D01*

+G54D227*X135724Y374939D02*X142712Y381927D01*

+X176106D01*

+X180672Y377361D01*

+Y361769D01*

+X222441Y320000D02*X180672Y361769D01*

+X187712Y342818D02*X178887D01*

+X218816Y316997D02*X191363Y344449D01*

+X268053Y317646D02*Y323343D01*

+X266453Y318382D02*Y324006D01*

+X295669Y353222D01*

+X268053Y323343D02*X296244Y351534D01*

+X295669Y353222D02*X328442D01*

+X339837Y341827D01*

+X296244Y351534D02*X326886D01*

+X338899Y339521D01*

+X353390D01*

+X249101Y328793D02*X229818Y348075D01*

+Y354988D01*

+X252105Y301698D02*X268053Y317646D01*

+X250348Y302277D02*X266453Y318382D01*

+X273634Y303585D02*Y308144D01*

+X279121Y313631D01*

+X271946Y299866D02*Y308718D01*

+Y308719D02*Y308505D01*

+X278661Y315434D02*X271946Y308719D01*

+X263441Y320000D02*X222441D01*

+X249753Y280776D02*X187712Y342818D01*

+X260568Y316997D02*X218816D01*

+X264034Y282931D02*Y284283D01*

+X240391Y278564D02*X230441Y288514D01*

+Y293000D01*

+X251412Y283168D02*X246731Y287850D01*

+Y303031D01*

+G54D228*X203441Y254200D02*Y237000D01*

+G54D227*X221884Y254000D02*X222884Y255000D01*

+G54D228*X194441Y254200D02*X188641D01*

+X183541Y249100D01*

+Y242443D01*

+X178384D01*

+X165941Y230000D01*

+G54D227*X225441Y249000D02*X226441Y250000D01*

+X231691Y248250D02*X230441Y247000D01*

+G54D228*X203441Y254200D02*X204998Y255757D01*

+Y262900D01*

+X203441Y254200D02*X199941Y257700D01*

+Y261000D01*

+X212084Y262900D02*X212541Y262443D01*

+X212084Y263293D02*X216648D01*

+X220441Y259500D01*

+X212541Y262443D02*Y250900D01*

+X204998Y262900D02*X205681Y263583D01*

+Y268829D01*

+X212084Y268036D02*Y262900D01*

+X204998Y263293D02*X204705Y263000D01*

+X205441Y269561D02*Y273500D01*

+X204705Y263000D02*X194441D01*

+X210799Y269321D02*X212084Y268036D01*

+X205681Y269321D02*X205360Y269000D01*

+X200941D01*

+X205681Y269321D02*X205441Y269561D01*

+G54D232*X417000Y384000D03*

+Y294000D03*

+Y354000D03*

+X427000Y384000D03*

+Y294000D03*

+Y354000D03*

+G54D225*G36*

+X403750Y357250D02*Y350750D01*

+X410250D01*

+Y357250D01*

+X403750D01*

+G37*

+G54D233*X345799Y357329D03*

+G54D234*X315799Y337329D03*

+G54D233*X85799Y369829D03*

+G54D235*X105799Y374829D03*

+G54D225*G36*

+X102499Y368129D02*Y361529D01*

+X109099D01*

+Y368129D01*

+X102499D01*

+G37*

+G54D235*X115799Y374829D03*

+Y364829D03*

+X125799Y374829D03*

+Y364829D03*

+X135799Y374829D03*

+Y364829D03*

+X145799Y374829D03*

+Y364829D03*

+X155799D03*

+X165799D03*

+X155799Y374829D03*

+X165799D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X175799Y364829D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X215799Y374829D03*

+X225799D03*

+X235799D03*

+X215799Y364829D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X265799D03*

+X245799Y374829D03*

+X255799D03*

+X265799D03*

+X275799D03*

+Y364829D03*

+X285799Y374829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X285799Y364829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D225*G36*

+X450250Y267250D02*Y260750D01*

+X456750D01*

+Y267250D01*

+X450250D01*

+G37*

+G36*

+Y207250D02*Y200750D01*

+X456750D01*

+Y207250D01*

+X450250D01*

+G37*

+G36*

+Y177250D02*Y170750D01*

+X456750D01*

+Y177250D01*

+X450250D01*

+G37*

+G54D232*X463500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+X473500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+G54D225*G36*

+X450250Y237250D02*Y230750D01*

+X456750D01*

+Y237250D01*

+X450250D01*

+G37*

+G54D232*X463500Y234000D03*

+X473500D03*

+G54D225*G36*

+X450250Y147250D02*Y140750D01*

+X456750D01*

+Y147250D01*

+X450250D01*

+G37*

+G36*

+Y117250D02*Y110750D01*

+X456750D01*

+Y117250D01*

+X450250D01*

+G37*

+G36*

+Y87250D02*Y80750D01*

+X456750D01*

+Y87250D01*

+X450250D01*

+G37*

+G36*

+Y57250D02*Y50750D01*

+X456750D01*

+Y57250D01*

+X450250D01*

+G37*

+G54D232*X463500Y54000D03*

+X473500D03*

+G54D225*G36*

+X450250Y327250D02*Y320750D01*

+X456750D01*

+Y327250D01*

+X450250D01*

+G37*

+G54D232*X463500Y324000D03*

+X473500D03*

+G54D225*G36*

+X450250Y297250D02*Y290750D01*

+X456750D01*

+Y297250D01*

+X450250D01*

+G37*

+G54D232*X463500Y294000D03*

+X473500D03*

+X437000Y324000D03*

+G54D225*G36*

+X309191Y252250D02*Y245750D01*

+X315691D01*

+Y252250D01*

+X309191D01*

+G37*

+G54D232*X322441Y249000D03*

+X332441D03*

+X342441D03*

+G54D236*X345799Y192329D03*

+G54D233*X353000Y150000D03*

+G54D225*G36*

+X450250Y387250D02*Y380750D01*

+X456750D01*

+Y387250D01*

+X450250D01*

+G37*

+G54D232*X463500Y384000D03*

+X473500D03*

+G54D225*G36*

+X403750Y387250D02*Y380750D01*

+X410250D01*

+Y387250D01*

+X403750D01*

+G37*

+G36*

+Y297250D02*Y290750D01*

+X410250D01*

+Y297250D01*

+X403750D01*

+G37*

+G36*

+Y327250D02*Y320750D01*

+X410250D01*

+Y327250D01*

+X403750D01*

+G37*

+G54D232*X417000Y324000D03*

+X427000D03*

+G54D225*G36*

+X450250Y357250D02*Y350750D01*

+X456750D01*

+Y357250D01*

+X450250D01*

+G37*

+G54D232*X437000Y354000D03*

+X463500D03*

+X473500D03*

+X437000Y384000D03*

+Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+Y294000D03*

+G54D225*G36*

+X403750Y177250D02*Y170750D01*

+X410250D01*

+Y177250D01*

+X403750D01*

+G37*

+G36*

+Y207250D02*Y200750D01*

+X410250D01*

+Y207250D01*

+X403750D01*

+G37*

+G36*

+Y237250D02*Y230750D01*

+X410250D01*

+Y237250D01*

+X403750D01*

+G37*

+G36*

+Y267250D02*Y260750D01*

+X410250D01*

+Y267250D01*

+X403750D01*

+G37*

+G54D232*X417000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+X427000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+G54D225*G36*

+X202191Y50750D02*Y44250D01*

+X208691D01*

+Y50750D01*

+X202191D01*

+G37*

+G54D232*X205441Y57500D03*

+Y67500D03*

+G54D225*G36*

+X232191Y50750D02*Y44250D01*

+X238691D01*

+Y50750D01*

+X232191D01*

+G37*

+G54D232*X235441Y57500D03*

+Y67500D03*

+G54D225*G36*

+X262191Y50750D02*Y44250D01*

+X268691D01*

+Y50750D01*

+X262191D01*

+G37*

+G36*

+X172191D02*Y44250D01*

+X178691D01*

+Y50750D01*

+X172191D01*

+G37*

+G36*

+X142191D02*Y44250D01*

+X148691D01*

+Y50750D01*

+X142191D01*

+G37*

+G36*

+X112191D02*Y44250D01*

+X118691D01*

+Y50750D01*

+X112191D01*

+G37*

+G36*

+X82191D02*Y44250D01*

+X88691D01*

+Y50750D01*

+X82191D01*

+G37*

+G54D232*X265441Y57500D03*

+X175441D03*

+X145441D03*

+X115441D03*

+X85441D03*

+X265441Y67500D03*

+X175441D03*

+G54D225*G36*

+X292191Y50750D02*Y44250D01*

+X298691D01*

+Y50750D01*

+X292191D01*

+G37*

+G54D232*X295441Y57500D03*

+Y67500D03*

+X145441D03*

+X115441D03*

+X85441D03*

+G54D233*X85799Y179829D03*

+G54D235*X105799Y184829D03*

+G54D225*G36*

+X102499Y178129D02*Y171529D01*

+X109099D01*

+Y178129D01*

+X102499D01*

+G37*

+G54D235*X115799Y184829D03*

+Y174829D03*

+X125799Y184829D03*

+Y174829D03*

+G54D225*G36*

+X82191Y243250D02*Y236750D01*

+X88691D01*

+Y243250D01*

+X82191D01*

+G37*

+G54D232*X85441Y230000D03*

+Y220000D03*

+G54D235*X135799Y184829D03*

+X145799D03*

+X155799D03*

+X135799Y174829D03*

+X145799D03*

+X155799D03*

+X165799Y184829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X165799Y174829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+G54D225*G36*

+X192499Y200629D02*Y194029D01*

+X199099D01*

+Y200629D01*

+X192499D01*

+G37*

+G54D235*X205799Y197329D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X205799Y184829D03*

+X215799D03*

+X225799D03*

+X205799Y174829D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X235799Y184829D03*

+X245799D03*

+X255799D03*

+X265799D03*

+Y174829D03*

+X275799Y184829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X275799Y174829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D237*X397949Y205559D02*X398933D01*

+X397949Y200441D02*X398933D01*

+G54D238*X376485Y195917D02*Y191311D01*

+X379044Y195917D02*Y191311D01*

+X381603Y195917D02*Y191311D01*

+X384162Y195917D02*Y191311D01*

+X386720Y195917D02*Y191311D01*

+X389279Y195917D02*Y191311D01*

+X391838Y195917D02*Y191311D01*

+X394397Y195917D02*Y191311D01*

+G54D237*X436449Y311382D02*X437433D01*

+X427000Y302492D02*Y301508D01*

+X421882Y302492D02*Y301508D01*

+X437000Y302492D02*Y301508D01*

+X431882Y302492D02*Y301508D01*

+X436508Y286559D02*X437492D01*

+X414500Y303492D02*Y302508D01*

+X409382Y303492D02*Y302508D01*

+X426941Y286992D02*Y286008D01*

+X427000Y272492D02*Y271508D01*

+X426941Y256992D02*Y256008D01*

+X427000Y242492D02*Y241508D01*

+X421823Y286992D02*Y286008D01*

+X421882Y272492D02*Y271508D01*

+X414559Y273492D02*Y272508D01*

+X409441Y273492D02*Y272508D01*

+X436508Y281441D02*X437492D01*

+X437000Y272492D02*Y271508D01*

+X431882Y272492D02*Y271508D01*

+X409441Y243492D02*Y242508D01*

+X436508Y196559D02*X437492D01*

+X436508Y191441D02*X437492D01*

+X434449Y65559D02*X435433D01*

+X434449Y60441D02*X435433D01*

+G54D238*X394747Y231460D02*Y226854D01*

+X392188Y231460D02*Y226854D01*

+X389629Y231460D02*Y226854D01*

+X387070Y231460D02*Y226854D01*

+X384512Y231460D02*Y226854D01*

+X381953Y231460D02*Y226854D01*

+X379394Y231460D02*Y226854D01*

+X376835Y231460D02*Y226854D01*

+Y254688D02*Y250082D01*

+X379394Y254688D02*Y250082D01*

+X381953Y254688D02*Y250082D01*

+X384512Y254688D02*Y250082D01*

+X387070Y254688D02*Y250082D01*

+X389629Y254688D02*Y250082D01*

+X392188Y254688D02*Y250082D01*

+X391838Y290689D02*Y286083D01*

+X394747Y254688D02*Y250082D01*

+X394397Y290689D02*Y286083D01*

+X389279Y290689D02*Y286083D01*

+X386720Y290689D02*Y286083D01*

+X384162Y290689D02*Y286083D01*

+X381603Y290689D02*Y286083D01*

+X379044Y290689D02*Y286083D01*

+X376485Y290689D02*Y286083D01*

+X393897Y351189D02*Y346583D01*

+X391338Y351189D02*Y346583D01*

+X388779Y351189D02*Y346583D01*

+X386220Y351189D02*Y346583D01*

+X383662Y351189D02*Y346583D01*

+X381103Y351189D02*Y346583D01*

+X378544Y351189D02*Y346583D01*

+X375985Y351189D02*Y346583D01*

+G54D237*X397949Y324559D02*X398933D01*

+X397949Y319441D02*X398933D01*

+G54D238*X384162Y313917D02*Y309311D01*

+X386720Y313917D02*Y309311D01*

+X381603Y313917D02*Y309311D01*

+X376485Y313917D02*Y309311D01*

+X379044Y313917D02*Y309311D01*

+X389279Y313917D02*Y309311D01*

+X391838Y313917D02*Y309311D01*

+X394397Y313917D02*Y309311D01*

+G54D237*X286949Y49941D02*X287933D01*

+X256949D02*X257933D01*

+X226949D02*X227933D01*

+X196949D02*X197933D01*

+X286949Y55059D02*X287933D01*

+X256949D02*X257933D01*

+X226949D02*X227933D01*

+X196949D02*X197933D01*

+X461000Y393492D02*Y392508D01*

+X455882Y393492D02*Y392508D01*

+X461059Y363492D02*Y362508D01*

+X473500Y376992D02*Y376008D01*

+X468382Y376992D02*Y376008D01*

+X468441Y363492D02*Y362508D01*

+X468500Y346992D02*Y346008D01*

+X455941Y363492D02*Y362508D01*

+X461000Y333492D02*Y332508D01*

+X455882Y333492D02*Y332508D01*

+X473500Y316992D02*Y316008D01*

+X468382Y316992D02*Y316008D01*

+X468441Y333492D02*Y332508D01*

+X473559Y393492D02*Y392508D01*

+X468441Y393492D02*Y392508D01*

+X427000Y392492D02*Y391508D01*

+X426941Y346992D02*Y346008D01*

+X427118Y377051D02*Y376067D01*

+X421882Y392492D02*Y391508D01*

+X421823Y346992D02*Y346008D01*

+X422000Y377051D02*Y376067D01*

+X427000Y362492D02*Y361508D01*

+X421882Y362492D02*Y361508D01*

+X414500Y363492D02*Y362508D01*

+X409382Y363492D02*Y362508D01*

+X437000Y362492D02*Y361508D01*

+X431882Y362492D02*Y361508D01*

+X436449Y346618D02*X437433D01*

+X437059Y392610D02*Y391626D01*

+X436449Y376618D02*X437433D01*

+X436449Y371500D02*X437433D01*

+X431941Y392610D02*Y391626D01*

+X414559Y393610D02*Y392626D01*

+X409441Y393610D02*Y392626D01*

+X436449Y341500D02*X437433D01*

+X427000Y332492D02*Y331508D01*

+X437000Y332492D02*Y331508D01*

+X431882Y332492D02*Y331508D01*

+X426941Y316992D02*Y316008D01*

+X421823Y316992D02*Y316008D01*

+X436449Y316500D02*X437433D01*

+X414500Y333492D02*Y332508D01*

+X409382Y333492D02*Y332508D01*

+X421882Y332492D02*Y331508D01*

+G54D238*X375985Y374417D02*Y369811D01*

+X378544Y374417D02*Y369811D01*

+X381103Y374417D02*Y369811D01*

+X383662Y374417D02*Y369811D01*

+X386220Y374417D02*Y369811D01*

+X388779Y374417D02*Y369811D01*

+X391338Y374417D02*Y369811D01*

+X393897Y374417D02*Y369811D01*

+X394397Y172689D02*Y168083D01*

+X391838Y172689D02*Y168083D01*

+X389279Y172689D02*Y168083D01*

+X386720Y172689D02*Y168083D01*

+X384162Y172689D02*Y168083D01*

+X381603Y172689D02*Y168083D01*

+X379044Y172689D02*Y168083D01*

+X376485Y172689D02*Y168083D01*

+G54D237*X461000Y153492D02*Y152508D01*

+X473500Y166492D02*Y165508D01*

+X468382Y166492D02*Y165508D01*

+X468441Y153492D02*Y152508D01*

+X455882Y153492D02*Y152508D01*

+X426941Y166992D02*Y166008D01*

+X421823Y166992D02*Y166008D01*

+X436449Y166500D02*X437433D01*

+X436449Y161382D02*X437433D01*

+X473559Y153492D02*Y152508D01*

+X461000Y123492D02*Y122508D01*

+X455882Y123492D02*Y122508D01*

+X473559Y123492D02*Y122508D01*

+X468441Y123492D02*Y122508D01*

+X473559Y93492D02*Y92508D01*

+X468441Y93492D02*Y92508D01*

+X461059Y93492D02*Y92508D01*

+X455941Y93492D02*Y92508D01*

+X473500Y106992D02*Y106008D01*

+X468382Y106992D02*Y106008D01*

+X473500Y136492D02*Y135508D01*

+X468382Y136492D02*Y135508D01*

+X461000Y213492D02*Y212508D01*

+X455882Y213492D02*Y212508D01*

+X461000Y243492D02*Y242508D01*

+X455882Y243492D02*Y242508D01*

+X468382Y226992D02*Y226008D01*

+X468441Y243492D02*Y242508D01*

+Y213492D02*Y212508D01*

+X473500Y196992D02*Y196008D01*

+Y183492D02*Y182508D01*

+X468382Y196992D02*Y196008D01*

+Y183492D02*Y182508D01*

+X461000Y183492D02*Y182508D01*

+X455882Y183492D02*Y182508D01*

+X461000Y273492D02*Y272508D01*

+Y303492D02*Y302508D01*

+X455882Y273492D02*Y272508D01*

+Y303492D02*Y302508D01*

+X436508Y256559D02*X437492D01*

+X436508Y251441D02*X437492D01*

+X437000Y242492D02*Y241508D01*

+X431882Y242492D02*Y241508D01*

+X427059Y226992D02*Y226008D01*

+X436508Y226559D02*X437492D01*

+X436508Y221441D02*X437492D01*

+X421941Y226992D02*Y226008D01*

+X421823Y256992D02*Y256008D01*

+X421882Y242492D02*Y241508D01*

+X414559Y243492D02*Y242508D01*

+X427000Y212492D02*Y211508D01*

+X437000Y212492D02*Y211508D01*

+X431882Y212492D02*Y211508D01*

+X414500Y213492D02*Y212508D01*

+X409382Y213492D02*Y212508D01*

+X421882Y212492D02*Y211508D01*

+X426941Y196492D02*Y195508D01*

+X421823Y196492D02*Y195508D01*

+X437000Y182492D02*Y181508D01*

+X431882Y182492D02*Y181508D01*

+X427000Y182492D02*Y181508D01*

+X421882Y182492D02*Y181508D01*

+X414500Y183492D02*Y182508D01*

+X409382Y183492D02*Y182508D01*

+X473500Y256492D02*Y255508D01*

+X468382Y256492D02*Y255508D01*

+X473677Y273492D02*Y272508D01*

+X468559Y273492D02*Y272508D01*

+X473500Y226992D02*Y226008D01*

+X473559Y243492D02*Y242508D01*

+Y213492D02*Y212508D01*

+Y363492D02*Y362508D01*

+Y333492D02*Y332508D01*

+X473000Y303492D02*Y302508D01*

+X473500Y286992D02*Y286008D01*

+X468382Y286992D02*Y286008D01*

+X467882Y303492D02*Y302508D01*

+X473618Y346992D02*Y346008D01*

+G54D238*X442559Y83075D02*Y78469D01*

+X440000Y83075D02*Y78469D01*

+G54D239*X437441Y83075D02*Y78469D01*

+G54D238*X434882Y83075D02*Y78469D01*

+X432324Y83075D02*Y78469D01*

+X429765Y83075D02*Y78469D01*

+X427206Y83075D02*Y78469D01*

+X424647Y83075D02*Y78469D01*

+G54D237*X440449Y65559D02*X441433D01*

+X440449Y60441D02*X441433D01*

+G54D238*X424647Y106303D02*Y101697D01*

+X427206Y106303D02*Y101697D01*

+X429765Y106303D02*Y101697D01*

+X432324Y106303D02*Y101697D01*

+X434882Y106303D02*Y101697D01*

+X437441Y106303D02*Y101697D01*

+X440000Y106303D02*Y101697D01*

+X442559Y106303D02*Y101697D01*

+G54D237*X461059Y63492D02*Y62508D01*

+X455941Y63492D02*Y62508D01*

+X468441Y63492D02*Y62508D01*

+X473559Y46992D02*Y46008D01*

+X468441Y46992D02*Y46008D01*

+X473559Y63492D02*Y62508D01*

+X473500Y76992D02*Y76008D01*

+X468382Y76992D02*Y76008D01*

+G54D240*X147048Y344543D02*X147834D01*

+X147048Y337457D02*X147834D01*

+G54D241*X136799Y327729D02*Y321129D01*

+X127799Y327729D02*Y321129D01*

+X118699Y327729D02*Y321129D01*

+G54D242*X123299Y348829D02*X132299D01*

+G54D240*X204998Y263293D02*Y262507D01*

+X183148Y235357D02*X183934D01*

+X183148Y242443D02*X183934D01*

+G54D241*X194441Y254200D02*Y247600D01*

+X203441Y254200D02*Y247600D01*

+G54D242*X198941Y226500D02*X207941D01*

+G54D240*X125885Y309222D02*Y308436D01*

+X118799Y309222D02*Y308436D01*

+G54D237*X76949Y49941D02*X77933D01*

+X76949Y55059D02*X77933D01*

+X106949Y49941D02*X107933D01*

+X106949Y55059D02*X107933D01*

+X166949Y49941D02*X167933D01*

+X166949Y55059D02*X167933D01*

+X136949Y49941D02*X137933D01*

+X136949Y55059D02*X137933D01*

+X205681Y269321D02*Y268337D01*

+X210799Y269321D02*Y268337D01*

+G54D240*X212084Y263293D02*Y262507D01*

+G54D241*X212541Y254200D02*Y247600D01*

+G54D243*X287917Y303449D02*Y302465D01*

+G54D237*X293035Y303449D02*Y302465D01*

+G54D244*X386441Y163000D03*

+X400441Y194000D03*

+X389441Y184000D03*

+X400441Y189000D03*

+G54D245*X386023Y157813D03*

+X398441Y173000D03*

+G54D244*X393441Y208000D03*

+G54D245*X358941Y208500D03*

+G54D244*X384162Y188000D03*

+X458441Y195000D03*

+Y164000D03*

+X372441Y170386D03*

+G54D245*X337441Y163000D03*

+X377347Y162178D03*

+X304584Y207483D03*

+X305280Y204383D03*

+X260941Y191500D03*

+X269441Y198500D03*

+X243941Y202000D03*

+X245863Y191524D03*

+G54D244*X432324Y111000D03*

+X446441Y102000D03*

+X434882Y75000D03*

+G54D246*X440941Y123000D03*

+G54D244*X423441Y75000D03*

+G54D245*X434449Y56500D03*

+X440449D03*

+X354441Y85000D03*

+Y89500D03*

+Y95500D03*

+Y101500D03*

+Y107500D03*

+Y113500D03*

+Y119500D03*

+X245441Y127500D03*

+X309441Y141568D03*

+Y136450D03*

+X310941Y115940D03*

+X305696Y107500D03*

+X387441Y119500D03*

+Y113500D03*

+Y107500D03*

+Y101500D03*

+Y95500D03*

+Y89500D03*

+Y85000D03*

+X390941Y76000D03*

+Y71500D03*

+X391441Y66000D03*

+X394941Y58500D03*

+X393941Y51500D03*

+X392441Y45000D03*

+G54D244*X387441Y326000D03*

+X393441Y355000D03*

+X386720Y282000D03*

+X393441Y327000D03*

+X384162Y306000D03*

+X385941Y354500D03*

+X458441Y375000D03*

+X383662Y378500D03*

+X397441Y373000D03*

+X397941Y367441D03*

+G54D245*X385941Y366000D03*

+G54D244*X458441Y345000D03*

+Y315000D03*

+Y285000D03*

+X398441Y314000D03*

+Y309000D03*

+G54D245*Y291000D03*

+G54D244*X372441Y290689D03*

+Y351189D03*

+G54D245*X339837Y341827D03*

+X353390Y339521D03*

+G54D244*X375441Y235000D03*

+G54D245*X356441Y233000D03*

+X338441Y224192D03*

+Y230124D03*

+G54D244*X384512Y258000D03*

+G54D245*X371602Y260228D03*

+G54D244*X458441Y254000D03*

+Y225000D03*

+X387070Y235000D03*

+X398441Y248000D03*

+Y253000D03*

+G54D245*X396441Y235000D03*

+X392188Y239000D03*

+X388207Y247280D03*

+G54D228*X307716Y275075D03*

+X308992Y271971D03*

+X308872Y266522D03*

+X287917Y307829D03*

+X293902Y282263D03*

+X296779Y304963D03*

+X295937Y243628D03*

+G54D245*X304706Y210583D03*

+G54D228*X296727Y256227D03*

+X312157Y300156D03*

+X312122Y295038D03*

+X303365Y330000D03*

+X285430Y325000D03*

+X302941Y340007D03*

+X245557Y279508D03*

+X242456Y293543D03*

+X254740Y298329D03*

+X242168Y298800D03*

+G54D245*X230441Y293000D03*

+X240391Y278564D03*

+G54D228*X266413Y296594D03*

+X263240Y295329D03*

+X262740Y291829D03*

+X260341Y284249D03*

+X264034Y282931D03*

+G54D245*X246731Y303031D03*

+G54D228*X262750Y268772D03*

+X253101Y261836D03*

+X239302Y262235D03*

+G54D245*X221884Y254000D03*

+X224441Y252000D03*

+X225441Y249000D03*

+X224441Y244000D03*

+X230441Y247000D03*

+G54D228*X269653Y298631D03*

+G54D245*X263441Y320000D03*

+G54D228*X268941Y314000D03*

+X273229Y298582D03*

+X278225Y279602D03*

+X278207Y298612D03*

+X277174Y308219D03*

+X277449Y347500D03*

+G54D245*X260568Y316997D03*

+X261502Y307367D03*

+X279441Y285000D03*

+X270441Y336000D03*

+X249101Y328793D03*

+X270441Y342500D03*

+Y349500D03*

+Y357000D03*

+X246941Y238000D03*

+X242441Y229500D03*

+X246441D03*

+X250941D03*

+X236441Y235500D03*

+X224941Y220500D03*

+X225441Y226500D03*

+X224941Y235500D03*

+X269941Y231500D03*

+X251941Y210500D03*

+X163941Y127500D03*

+X193390D03*

+X152441Y121500D03*

+X151941Y132000D03*

+X112222Y127340D03*

+X114441Y121500D03*

+X115441Y132500D03*

+X127941Y148000D03*

+X141441D03*

+X208941D03*

+X223941D03*

+X198441Y122500D03*

+X234441D03*

+X195441Y133000D03*

+X235941D03*

+X128941Y274500D03*

+Y268500D03*

+Y262500D03*

+Y255000D03*

+Y248500D03*

+Y242500D03*

+X162441Y248500D03*

+X161941Y255000D03*

+X181941Y258500D03*

+X162441Y262500D03*

+X198441D03*

+X219441Y272500D03*

+X217441Y279000D03*

+X198441Y269500D03*

+X205441Y277000D03*

+X220729Y265580D03*

+X220441Y259500D03*

+X218441Y261500D03*

+X162441Y242500D03*

+X165941Y231000D03*

+Y226500D03*

+Y220500D03*

+X169441Y214000D03*

+Y208500D03*

+Y201500D03*

+X185441Y228000D03*

+X212941Y238000D03*

+X203941Y237500D03*

+X193941Y237000D03*

+X177441Y228000D03*

+Y217500D03*

+X104441Y204500D03*

+X100941D03*

+X185441Y217500D03*

+X193941Y212500D03*

+X202441D03*

+X210441D03*

+X220441Y215000D03*

+X162941Y268500D03*

+Y274500D03*

+X158441Y323829D03*

+Y328829D03*

+Y326500D03*

+X141307Y300883D03*

+X197441Y314500D03*

+X195441Y311500D03*

+X197441Y308500D03*

+X124831Y302385D03*

+X135441Y338500D03*

+X126441Y340500D03*

+X111941Y341000D03*

+Y357500D03*

+X121941D03*

+X130941D03*

+X135441Y335000D03*

+X111941Y334000D03*

+X117941D03*

+X126441D03*

+X139941Y338000D03*

+X142441Y357500D03*

+Y349500D03*

+X153941Y338000D03*

+X154941Y345500D03*

+X149441Y349500D03*

+X178887Y342818D03*

+X168732Y350833D03*

+X191363Y344449D03*

+X229818Y354988D03*

+G54D226*G54D245*G54D226*G54D245*G54D226*G54D245*G54D247*G54D245*G54D226*G54D245*G54D226*G54D245*G54D226*G54D245*G54D226*G54D245*G54D226*G54D245*G54D226*G54D245*G54D226*M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.bottommask.gbr b/bbb_cape/schematic/gerbers/20131204/cape.bottommask.gbr
new file mode 100644
index 0000000..1f47cfd
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.bottommask.gbr
@@ -0,0 +1,668 @@
+G04 start of page 9 for group -4062 idx -4062 *

+G04 Title: 971 BBB Cape, soldermask *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNBOTTOMMASK*%

+%ADD285R,0.0405X0.0405*%

+%ADD284R,0.1280X0.1280*%

+%ADD283R,0.0620X0.0620*%

+%ADD282R,0.0572X0.0572*%

+%ADD281R,0.0280X0.0280*%

+%ADD280R,0.0230X0.0230*%

+%ADD279R,0.0355X0.0355*%

+%ADD278C,0.2300*%

+%ADD277C,0.0860*%

+%ADD276C,0.2400*%

+%ADD275C,0.1890*%

+%ADD274C,0.0001*%

+%ADD273C,0.0710*%

+G54D273*X417000Y384000D03*

+Y294000D03*

+Y354000D03*

+X427000Y384000D03*

+Y294000D03*

+Y354000D03*

+G54D274*G36*

+X403450Y357550D02*Y350450D01*

+X410550D01*

+Y357550D01*

+X403450D01*

+G37*

+G54D275*X345799Y357329D03*

+G54D276*X315799Y337329D03*

+G54D275*X85799Y369829D03*

+G54D277*X105799Y374829D03*

+G54D274*G36*

+X101499Y369129D02*Y360529D01*

+X110099D01*

+Y369129D01*

+X101499D01*

+G37*

+G54D277*X115799Y374829D03*

+Y364829D03*

+X125799Y374829D03*

+Y364829D03*

+X135799Y374829D03*

+Y364829D03*

+X145799Y374829D03*

+Y364829D03*

+X155799D03*

+X165799D03*

+X155799Y374829D03*

+X165799D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X175799Y364829D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X215799Y374829D03*

+X225799D03*

+X235799D03*

+X215799Y364829D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X265799D03*

+X245799Y374829D03*

+X255799D03*

+X265799D03*

+X275799D03*

+Y364829D03*

+X285799Y374829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X285799Y364829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D274*G36*

+X449950Y267550D02*Y260450D01*

+X457050D01*

+Y267550D01*

+X449950D01*

+G37*

+G36*

+Y207550D02*Y200450D01*

+X457050D01*

+Y207550D01*

+X449950D01*

+G37*

+G36*

+Y177550D02*Y170450D01*

+X457050D01*

+Y177550D01*

+X449950D01*

+G37*

+G54D273*X463500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+X473500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+G54D274*G36*

+X449950Y237550D02*Y230450D01*

+X457050D01*

+Y237550D01*

+X449950D01*

+G37*

+G54D273*X463500Y234000D03*

+X473500D03*

+G54D274*G36*

+X449950Y147550D02*Y140450D01*

+X457050D01*

+Y147550D01*

+X449950D01*

+G37*

+G36*

+Y117550D02*Y110450D01*

+X457050D01*

+Y117550D01*

+X449950D01*

+G37*

+G36*

+Y87550D02*Y80450D01*

+X457050D01*

+Y87550D01*

+X449950D01*

+G37*

+G36*

+Y57550D02*Y50450D01*

+X457050D01*

+Y57550D01*

+X449950D01*

+G37*

+G54D273*X463500Y54000D03*

+X473500D03*

+G54D274*G36*

+X449950Y327550D02*Y320450D01*

+X457050D01*

+Y327550D01*

+X449950D01*

+G37*

+G54D273*X463500Y324000D03*

+X473500D03*

+G54D274*G36*

+X449950Y297550D02*Y290450D01*

+X457050D01*

+Y297550D01*

+X449950D01*

+G37*

+G54D273*X463500Y294000D03*

+X473500D03*

+X437000Y324000D03*

+G54D274*G36*

+X308891Y252550D02*Y245450D01*

+X315991D01*

+Y252550D01*

+X308891D01*

+G37*

+G54D273*X322441Y249000D03*

+X332441D03*

+X342441D03*

+G54D278*X345799Y192329D03*

+G54D275*X353000Y150000D03*

+G54D274*G36*

+X449950Y387550D02*Y380450D01*

+X457050D01*

+Y387550D01*

+X449950D01*

+G37*

+G54D273*X463500Y384000D03*

+X473500D03*

+G54D274*G36*

+X403450Y387550D02*Y380450D01*

+X410550D01*

+Y387550D01*

+X403450D01*

+G37*

+G36*

+Y297550D02*Y290450D01*

+X410550D01*

+Y297550D01*

+X403450D01*

+G37*

+G36*

+Y327550D02*Y320450D01*

+X410550D01*

+Y327550D01*

+X403450D01*

+G37*

+G54D273*X417000Y324000D03*

+X427000D03*

+G54D274*G36*

+X449950Y357550D02*Y350450D01*

+X457050D01*

+Y357550D01*

+X449950D01*

+G37*

+G54D273*X437000Y354000D03*

+X463500D03*

+X473500D03*

+X437000Y384000D03*

+Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+Y294000D03*

+G54D274*G36*

+X403450Y177550D02*Y170450D01*

+X410550D01*

+Y177550D01*

+X403450D01*

+G37*

+G36*

+Y207550D02*Y200450D01*

+X410550D01*

+Y207550D01*

+X403450D01*

+G37*

+G36*

+Y237550D02*Y230450D01*

+X410550D01*

+Y237550D01*

+X403450D01*

+G37*

+G36*

+Y267550D02*Y260450D01*

+X410550D01*

+Y267550D01*

+X403450D01*

+G37*

+G54D273*X417000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+X427000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+G54D274*G36*

+X201891Y51050D02*Y43950D01*

+X208991D01*

+Y51050D01*

+X201891D01*

+G37*

+G54D273*X205441Y57500D03*

+Y67500D03*

+G54D274*G36*

+X231891Y51050D02*Y43950D01*

+X238991D01*

+Y51050D01*

+X231891D01*

+G37*

+G54D273*X235441Y57500D03*

+Y67500D03*

+G54D274*G36*

+X261891Y51050D02*Y43950D01*

+X268991D01*

+Y51050D01*

+X261891D01*

+G37*

+G36*

+X171891D02*Y43950D01*

+X178991D01*

+Y51050D01*

+X171891D01*

+G37*

+G36*

+X141891D02*Y43950D01*

+X148991D01*

+Y51050D01*

+X141891D01*

+G37*

+G36*

+X111891D02*Y43950D01*

+X118991D01*

+Y51050D01*

+X111891D01*

+G37*

+G36*

+X81891D02*Y43950D01*

+X88991D01*

+Y51050D01*

+X81891D01*

+G37*

+G54D273*X265441Y57500D03*

+X175441D03*

+X145441D03*

+X115441D03*

+X85441D03*

+X265441Y67500D03*

+X175441D03*

+G54D274*G36*

+X291891Y51050D02*Y43950D01*

+X298991D01*

+Y51050D01*

+X291891D01*

+G37*

+G54D273*X295441Y57500D03*

+Y67500D03*

+X145441D03*

+X115441D03*

+X85441D03*

+G54D275*X85799Y179829D03*

+G54D277*X105799Y184829D03*

+G54D274*G36*

+X101499Y179129D02*Y170529D01*

+X110099D01*

+Y179129D01*

+X101499D01*

+G37*

+G54D277*X115799Y184829D03*

+Y174829D03*

+X125799Y184829D03*

+Y174829D03*

+G54D274*G36*

+X81891Y243550D02*Y236450D01*

+X88991D01*

+Y243550D01*

+X81891D01*

+G37*

+G54D273*X85441Y230000D03*

+Y220000D03*

+G54D277*X135799Y184829D03*

+X145799D03*

+X155799D03*

+X135799Y174829D03*

+X145799D03*

+X155799D03*

+X165799Y184829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X165799Y174829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+G54D274*G36*

+X191499Y201629D02*Y193029D01*

+X200099D01*

+Y201629D01*

+X191499D01*

+G37*

+G54D277*X205799Y197329D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X205799Y184829D03*

+X215799D03*

+X225799D03*

+X205799Y174829D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X235799Y184829D03*

+X245799D03*

+X255799D03*

+X265799D03*

+Y174829D03*

+X275799Y184829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X275799Y174829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D279*X397949Y205559D02*X398933D01*

+X397949Y200441D02*X398933D01*

+G54D280*X376485Y195917D02*Y191311D01*

+X379044Y195917D02*Y191311D01*

+X381603Y195917D02*Y191311D01*

+X384162Y195917D02*Y191311D01*

+X386720Y195917D02*Y191311D01*

+X389279Y195917D02*Y191311D01*

+X391838Y195917D02*Y191311D01*

+X394397Y195917D02*Y191311D01*

+G54D279*X436449Y311382D02*X437433D01*

+X427000Y302492D02*Y301508D01*

+X421882Y302492D02*Y301508D01*

+X437000Y302492D02*Y301508D01*

+X431882Y302492D02*Y301508D01*

+X436508Y286559D02*X437492D01*

+X414500Y303492D02*Y302508D01*

+X409382Y303492D02*Y302508D01*

+X426941Y286992D02*Y286008D01*

+X427000Y272492D02*Y271508D01*

+X426941Y256992D02*Y256008D01*

+X427000Y242492D02*Y241508D01*

+X421823Y286992D02*Y286008D01*

+X421882Y272492D02*Y271508D01*

+X414559Y273492D02*Y272508D01*

+X409441Y273492D02*Y272508D01*

+X436508Y281441D02*X437492D01*

+X437000Y272492D02*Y271508D01*

+X431882Y272492D02*Y271508D01*

+X409441Y243492D02*Y242508D01*

+X436508Y196559D02*X437492D01*

+X436508Y191441D02*X437492D01*

+X434449Y65559D02*X435433D01*

+X434449Y60441D02*X435433D01*

+G54D280*X394747Y231460D02*Y226854D01*

+X392188Y231460D02*Y226854D01*

+X389629Y231460D02*Y226854D01*

+X387070Y231460D02*Y226854D01*

+X384512Y231460D02*Y226854D01*

+X381953Y231460D02*Y226854D01*

+X379394Y231460D02*Y226854D01*

+X376835Y231460D02*Y226854D01*

+Y254688D02*Y250082D01*

+X379394Y254688D02*Y250082D01*

+X381953Y254688D02*Y250082D01*

+X384512Y254688D02*Y250082D01*

+X387070Y254688D02*Y250082D01*

+X389629Y254688D02*Y250082D01*

+X392188Y254688D02*Y250082D01*

+X391838Y290689D02*Y286083D01*

+X394747Y254688D02*Y250082D01*

+X394397Y290689D02*Y286083D01*

+X389279Y290689D02*Y286083D01*

+X386720Y290689D02*Y286083D01*

+X384162Y290689D02*Y286083D01*

+X381603Y290689D02*Y286083D01*

+X379044Y290689D02*Y286083D01*

+X376485Y290689D02*Y286083D01*

+X393897Y351189D02*Y346583D01*

+X391338Y351189D02*Y346583D01*

+X388779Y351189D02*Y346583D01*

+X386220Y351189D02*Y346583D01*

+X383662Y351189D02*Y346583D01*

+X381103Y351189D02*Y346583D01*

+X378544Y351189D02*Y346583D01*

+X375985Y351189D02*Y346583D01*

+G54D279*X397949Y324559D02*X398933D01*

+X397949Y319441D02*X398933D01*

+G54D280*X384162Y313917D02*Y309311D01*

+X386720Y313917D02*Y309311D01*

+X381603Y313917D02*Y309311D01*

+X376485Y313917D02*Y309311D01*

+X379044Y313917D02*Y309311D01*

+X389279Y313917D02*Y309311D01*

+X391838Y313917D02*Y309311D01*

+X394397Y313917D02*Y309311D01*

+G54D279*X286949Y49941D02*X287933D01*

+X256949D02*X257933D01*

+X226949D02*X227933D01*

+X196949D02*X197933D01*

+X286949Y55059D02*X287933D01*

+X256949D02*X257933D01*

+X226949D02*X227933D01*

+X196949D02*X197933D01*

+X461000Y393492D02*Y392508D01*

+X455882Y393492D02*Y392508D01*

+X461059Y363492D02*Y362508D01*

+X473500Y376992D02*Y376008D01*

+X468382Y376992D02*Y376008D01*

+X468441Y363492D02*Y362508D01*

+X468500Y346992D02*Y346008D01*

+X455941Y363492D02*Y362508D01*

+X461000Y333492D02*Y332508D01*

+X455882Y333492D02*Y332508D01*

+X473500Y316992D02*Y316008D01*

+X468382Y316992D02*Y316008D01*

+X468441Y333492D02*Y332508D01*

+X473559Y393492D02*Y392508D01*

+X468441Y393492D02*Y392508D01*

+X427000Y392492D02*Y391508D01*

+X426941Y346992D02*Y346008D01*

+X427118Y377051D02*Y376067D01*

+X421882Y392492D02*Y391508D01*

+X421823Y346992D02*Y346008D01*

+X422000Y377051D02*Y376067D01*

+X427000Y362492D02*Y361508D01*

+X421882Y362492D02*Y361508D01*

+X414500Y363492D02*Y362508D01*

+X409382Y363492D02*Y362508D01*

+X437000Y362492D02*Y361508D01*

+X431882Y362492D02*Y361508D01*

+X436449Y346618D02*X437433D01*

+X437059Y392610D02*Y391626D01*

+X436449Y376618D02*X437433D01*

+X436449Y371500D02*X437433D01*

+X431941Y392610D02*Y391626D01*

+X414559Y393610D02*Y392626D01*

+X409441Y393610D02*Y392626D01*

+X436449Y341500D02*X437433D01*

+X427000Y332492D02*Y331508D01*

+X437000Y332492D02*Y331508D01*

+X431882Y332492D02*Y331508D01*

+X426941Y316992D02*Y316008D01*

+X421823Y316992D02*Y316008D01*

+X436449Y316500D02*X437433D01*

+X414500Y333492D02*Y332508D01*

+X409382Y333492D02*Y332508D01*

+X421882Y332492D02*Y331508D01*

+G54D280*X375985Y374417D02*Y369811D01*

+X378544Y374417D02*Y369811D01*

+X381103Y374417D02*Y369811D01*

+X383662Y374417D02*Y369811D01*

+X386220Y374417D02*Y369811D01*

+X388779Y374417D02*Y369811D01*

+X391338Y374417D02*Y369811D01*

+X393897Y374417D02*Y369811D01*

+X394397Y172689D02*Y168083D01*

+X391838Y172689D02*Y168083D01*

+X389279Y172689D02*Y168083D01*

+X386720Y172689D02*Y168083D01*

+X384162Y172689D02*Y168083D01*

+X381603Y172689D02*Y168083D01*

+X379044Y172689D02*Y168083D01*

+X376485Y172689D02*Y168083D01*

+G54D279*X461000Y153492D02*Y152508D01*

+X473500Y166492D02*Y165508D01*

+X468382Y166492D02*Y165508D01*

+X468441Y153492D02*Y152508D01*

+X455882Y153492D02*Y152508D01*

+X426941Y166992D02*Y166008D01*

+X421823Y166992D02*Y166008D01*

+X436449Y166500D02*X437433D01*

+X436449Y161382D02*X437433D01*

+X473559Y153492D02*Y152508D01*

+X461000Y123492D02*Y122508D01*

+X455882Y123492D02*Y122508D01*

+X473559Y123492D02*Y122508D01*

+X468441Y123492D02*Y122508D01*

+X473559Y93492D02*Y92508D01*

+X468441Y93492D02*Y92508D01*

+X461059Y93492D02*Y92508D01*

+X455941Y93492D02*Y92508D01*

+X473500Y106992D02*Y106008D01*

+X468382Y106992D02*Y106008D01*

+X473500Y136492D02*Y135508D01*

+X468382Y136492D02*Y135508D01*

+X461000Y213492D02*Y212508D01*

+X455882Y213492D02*Y212508D01*

+X461000Y243492D02*Y242508D01*

+X455882Y243492D02*Y242508D01*

+X468382Y226992D02*Y226008D01*

+X468441Y243492D02*Y242508D01*

+Y213492D02*Y212508D01*

+X473500Y196992D02*Y196008D01*

+Y183492D02*Y182508D01*

+X468382Y196992D02*Y196008D01*

+Y183492D02*Y182508D01*

+X461000Y183492D02*Y182508D01*

+X455882Y183492D02*Y182508D01*

+X461000Y273492D02*Y272508D01*

+Y303492D02*Y302508D01*

+X455882Y273492D02*Y272508D01*

+Y303492D02*Y302508D01*

+X436508Y256559D02*X437492D01*

+X436508Y251441D02*X437492D01*

+X437000Y242492D02*Y241508D01*

+X431882Y242492D02*Y241508D01*

+X427059Y226992D02*Y226008D01*

+X436508Y226559D02*X437492D01*

+X436508Y221441D02*X437492D01*

+X421941Y226992D02*Y226008D01*

+X421823Y256992D02*Y256008D01*

+X421882Y242492D02*Y241508D01*

+X414559Y243492D02*Y242508D01*

+X427000Y212492D02*Y211508D01*

+X437000Y212492D02*Y211508D01*

+X431882Y212492D02*Y211508D01*

+X414500Y213492D02*Y212508D01*

+X409382Y213492D02*Y212508D01*

+X421882Y212492D02*Y211508D01*

+X426941Y196492D02*Y195508D01*

+X421823Y196492D02*Y195508D01*

+X437000Y182492D02*Y181508D01*

+X431882Y182492D02*Y181508D01*

+X427000Y182492D02*Y181508D01*

+X421882Y182492D02*Y181508D01*

+X414500Y183492D02*Y182508D01*

+X409382Y183492D02*Y182508D01*

+X473500Y256492D02*Y255508D01*

+X468382Y256492D02*Y255508D01*

+X473677Y273492D02*Y272508D01*

+X468559Y273492D02*Y272508D01*

+X473500Y226992D02*Y226008D01*

+X473559Y243492D02*Y242508D01*

+Y213492D02*Y212508D01*

+Y363492D02*Y362508D01*

+Y333492D02*Y332508D01*

+X473000Y303492D02*Y302508D01*

+X473500Y286992D02*Y286008D01*

+X468382Y286992D02*Y286008D01*

+X467882Y303492D02*Y302508D01*

+X473618Y346992D02*Y346008D01*

+G54D280*X442559Y83075D02*Y78469D01*

+X440000Y83075D02*Y78469D01*

+G54D281*X437441Y83075D02*Y78469D01*

+G54D280*X434882Y83075D02*Y78469D01*

+X432324Y83075D02*Y78469D01*

+X429765Y83075D02*Y78469D01*

+X427206Y83075D02*Y78469D01*

+X424647Y83075D02*Y78469D01*

+G54D279*X440449Y65559D02*X441433D01*

+X440449Y60441D02*X441433D01*

+G54D280*X424647Y106303D02*Y101697D01*

+X427206Y106303D02*Y101697D01*

+X429765Y106303D02*Y101697D01*

+X432324Y106303D02*Y101697D01*

+X434882Y106303D02*Y101697D01*

+X437441Y106303D02*Y101697D01*

+X440000Y106303D02*Y101697D01*

+X442559Y106303D02*Y101697D01*

+G54D279*X461059Y63492D02*Y62508D01*

+X455941Y63492D02*Y62508D01*

+X468441Y63492D02*Y62508D01*

+X473559Y46992D02*Y46008D01*

+X468441Y46992D02*Y46008D01*

+X473559Y63492D02*Y62508D01*

+X473500Y76992D02*Y76008D01*

+X468382Y76992D02*Y76008D01*

+G54D282*X147048Y344543D02*X147834D01*

+X147048Y337457D02*X147834D01*

+G54D283*X136799Y327729D02*Y321129D01*

+X127799Y327729D02*Y321129D01*

+X118699Y327729D02*Y321129D01*

+G54D284*X123299Y348829D02*X132299D01*

+G54D282*X204998Y263293D02*Y262507D01*

+X183148Y235357D02*X183934D01*

+X183148Y242443D02*X183934D01*

+G54D283*X194441Y254200D02*Y247600D01*

+X203441Y254200D02*Y247600D01*

+G54D284*X198941Y226500D02*X207941D01*

+G54D282*X125885Y309222D02*Y308436D01*

+X118799Y309222D02*Y308436D01*

+G54D279*X76949Y49941D02*X77933D01*

+X76949Y55059D02*X77933D01*

+X106949Y49941D02*X107933D01*

+X106949Y55059D02*X107933D01*

+X166949Y49941D02*X167933D01*

+X166949Y55059D02*X167933D01*

+X136949Y49941D02*X137933D01*

+X136949Y55059D02*X137933D01*

+X205681Y269321D02*Y268337D01*

+X210799Y269321D02*Y268337D01*

+G54D282*X212084Y263293D02*Y262507D01*

+G54D283*X212541Y254200D02*Y247600D01*

+G54D285*X287917Y303449D02*Y302465D01*

+G54D279*X293035Y303449D02*Y302465D01*

+M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.bottompaste.gbr b/bbb_cape/schematic/gerbers/20131204/cape.bottompaste.gbr
new file mode 100644
index 0000000..931d268
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.bottompaste.gbr
@@ -0,0 +1,295 @@
+G04 start of page 13 for group -4014 idx -4014 *

+G04 Title: 971 BBB Cape, bottompaste *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNBOTTOMPASTE*%

+%ADD313R,0.1220X0.1220*%

+%ADD312R,0.0560X0.0560*%

+%ADD311R,0.0345X0.0345*%

+%ADD310R,0.0512X0.0512*%

+%ADD309R,0.0180X0.0180*%

+%ADD308R,0.0295X0.0295*%

+%ADD307R,0.0130X0.0130*%

+G54D307*X394397Y172689D02*Y168083D01*

+X391838Y172689D02*Y168083D01*

+X389279Y172689D02*Y168083D01*

+X386720Y172689D02*Y168083D01*

+X384162Y172689D02*Y168083D01*

+X381603Y172689D02*Y168083D01*

+X379044Y172689D02*Y168083D01*

+X376485Y172689D02*Y168083D01*

+Y195917D02*Y191311D01*

+X379044Y195917D02*Y191311D01*

+X381603Y195917D02*Y191311D01*

+X384162Y195917D02*Y191311D01*

+X386720Y195917D02*Y191311D01*

+X389279Y195917D02*Y191311D01*

+X391838Y195917D02*Y191311D01*

+X394397Y195917D02*Y191311D01*

+G54D308*X397949Y324559D02*X398933D01*

+X397949Y319441D02*X398933D01*

+G54D307*X424647Y106303D02*Y101697D01*

+X427206Y106303D02*Y101697D01*

+X429765Y106303D02*Y101697D01*

+X432324Y106303D02*Y101697D01*

+X434882Y106303D02*Y101697D01*

+X437441Y106303D02*Y101697D01*

+X440000Y106303D02*Y101697D01*

+X442559Y106303D02*Y101697D01*

+Y83075D02*Y78469D01*

+X440000Y83075D02*Y78469D01*

+G54D309*X437441Y83075D02*Y78469D01*

+G54D307*X434882Y83075D02*Y78469D01*

+X432324Y83075D02*Y78469D01*

+X429765Y83075D02*Y78469D01*

+X427206Y83075D02*Y78469D01*

+X424647Y83075D02*Y78469D01*

+G54D308*X427000Y392492D02*Y391508D01*

+X421882Y392492D02*Y391508D01*

+X461000Y153492D02*Y152508D01*

+X455882Y153492D02*Y152508D01*

+X461059Y63492D02*Y62508D01*

+X455941Y63492D02*Y62508D01*

+X461000Y123492D02*Y122508D01*

+X455882Y123492D02*Y122508D01*

+X461000Y213492D02*Y212508D01*

+X455882Y213492D02*Y212508D01*

+X461000Y243492D02*Y242508D01*

+X455882Y243492D02*Y242508D01*

+X461000Y393492D02*Y392508D01*

+X455882Y393492D02*Y392508D01*

+X461059Y363492D02*Y362508D01*

+X455941Y363492D02*Y362508D01*

+X461000Y333492D02*Y332508D01*

+X455882Y333492D02*Y332508D01*

+X473500Y376992D02*Y376008D01*

+X468382Y376992D02*Y376008D01*

+X473500Y316992D02*Y316008D01*

+X468382Y316992D02*Y316008D01*

+X473500Y286992D02*Y286008D01*

+X468382Y286992D02*Y286008D01*

+X473500Y256492D02*Y255508D01*

+X468382Y256492D02*Y255508D01*

+X473500Y226992D02*Y226008D01*

+X468382Y226992D02*Y226008D01*

+X473500Y196992D02*Y196008D01*

+X468382Y196992D02*Y196008D01*

+X473500Y166492D02*Y165508D01*

+X468382Y166492D02*Y165508D01*

+X427000Y362492D02*Y361508D01*

+X421882Y362492D02*Y361508D01*

+X437000Y362492D02*Y361508D01*

+X431882Y362492D02*Y361508D01*

+X426941Y346992D02*Y346008D01*

+X421823Y346992D02*Y346008D01*

+X414500Y363492D02*Y362508D01*

+X409382Y363492D02*Y362508D01*

+X436449Y346618D02*X437433D01*

+X436449Y341500D02*X437433D01*

+X426941Y316992D02*Y316008D01*

+X421823Y316992D02*Y316008D01*

+X436449Y316500D02*X437433D01*

+X436449Y311382D02*X437433D01*

+X414500Y333492D02*Y332508D01*

+X409382Y333492D02*Y332508D01*

+X427000Y332492D02*Y331508D01*

+X421882Y332492D02*Y331508D01*

+X437000Y332492D02*Y331508D01*

+X431882Y332492D02*Y331508D01*

+X427000Y302492D02*Y301508D01*

+X421882Y302492D02*Y301508D01*

+X437000Y302492D02*Y301508D01*

+X431882Y302492D02*Y301508D01*

+X426941Y286992D02*Y286008D01*

+X421823Y286992D02*Y286008D01*

+X436508Y286559D02*X437492D01*

+X436508Y281441D02*X437492D01*

+X414500Y303492D02*Y302508D01*

+X409382Y303492D02*Y302508D01*

+X427000Y272492D02*Y271508D01*

+X421882Y272492D02*Y271508D01*

+X437000Y272492D02*Y271508D01*

+X431882Y272492D02*Y271508D01*

+X426941Y256992D02*Y256008D01*

+X421823Y256992D02*Y256008D01*

+X436508Y256559D02*X437492D01*

+X436508Y251441D02*X437492D01*

+X414559Y273492D02*Y272508D01*

+X409441Y273492D02*Y272508D01*

+X427000Y242492D02*Y241508D01*

+X421882Y242492D02*Y241508D01*

+X437000Y242492D02*Y241508D01*

+X431882Y242492D02*Y241508D01*

+X427059Y226992D02*Y226008D01*

+X421941Y226992D02*Y226008D01*

+X436508Y226559D02*X437492D01*

+X436508Y221441D02*X437492D01*

+X414559Y243492D02*Y242508D01*

+X409441Y243492D02*Y242508D01*

+X427000Y212492D02*Y211508D01*

+X421882Y212492D02*Y211508D01*

+X437000Y212492D02*Y211508D01*

+X431882Y212492D02*Y211508D01*

+X426941Y196492D02*Y195508D01*

+X421823Y196492D02*Y195508D01*

+X414500Y213492D02*Y212508D01*

+X409382Y213492D02*Y212508D01*

+X437000Y182492D02*Y181508D01*

+X431882Y182492D02*Y181508D01*

+X427000Y182492D02*Y181508D01*

+X421882Y182492D02*Y181508D01*

+X426941Y166992D02*Y166008D01*

+X421823Y166992D02*Y166008D01*

+X436449Y166500D02*X437433D01*

+X436449Y161382D02*X437433D01*

+X414500Y183492D02*Y182508D01*

+X409382Y183492D02*Y182508D01*

+X437059Y392610D02*Y391626D01*

+X431941Y392610D02*Y391626D01*

+X427118Y377051D02*Y376067D01*

+X422000Y377051D02*Y376067D01*

+X414559Y393610D02*Y392626D01*

+X409441Y393610D02*Y392626D01*

+X473559Y123492D02*Y122508D01*

+X468441Y123492D02*Y122508D01*

+X473559Y153492D02*Y152508D01*

+X468441Y153492D02*Y152508D01*

+X473559Y93492D02*Y92508D01*

+X468441Y93492D02*Y92508D01*

+X473559Y63492D02*Y62508D01*

+X468441Y63492D02*Y62508D01*

+X473559Y243492D02*Y242508D01*

+X468441Y243492D02*Y242508D01*

+X473677Y273492D02*Y272508D01*

+X468559Y273492D02*Y272508D01*

+X473559Y213492D02*Y212508D01*

+X468441Y213492D02*Y212508D01*

+X473500Y183492D02*Y182508D01*

+X468382Y183492D02*Y182508D01*

+X473559Y363492D02*Y362508D01*

+X468441Y363492D02*Y362508D01*

+X473559Y333492D02*Y332508D01*

+X468441Y333492D02*Y332508D01*

+X473000Y303492D02*Y302508D01*

+X467882Y303492D02*Y302508D01*

+X473559Y393492D02*Y392508D01*

+X468441Y393492D02*Y392508D01*

+X436508Y196559D02*X437492D01*

+X436508Y191441D02*X437492D01*

+X436449Y376618D02*X437433D01*

+X436449Y371500D02*X437433D01*

+X397949Y205559D02*X398933D01*

+X397949Y200441D02*X398933D01*

+X461059Y93492D02*Y92508D01*

+X455941Y93492D02*Y92508D01*

+X473559Y46992D02*Y46008D01*

+X468441Y46992D02*Y46008D01*

+X473500Y76992D02*Y76008D01*

+X468382Y76992D02*Y76008D01*

+X473500Y106992D02*Y106008D01*

+X468382Y106992D02*Y106008D01*

+X473500Y136492D02*Y135508D01*

+X468382Y136492D02*Y135508D01*

+X461000Y273492D02*Y272508D01*

+X455882Y273492D02*Y272508D01*

+X461000Y183492D02*Y182508D01*

+X455882Y183492D02*Y182508D01*

+X473618Y346992D02*Y346008D01*

+X468500Y346992D02*Y346008D01*

+X461000Y303492D02*Y302508D01*

+X455882Y303492D02*Y302508D01*

+X205681Y269321D02*Y268337D01*

+X210799Y269321D02*Y268337D01*

+G54D310*X147048Y344543D02*X147834D01*

+X147048Y337457D02*X147834D01*

+X125885Y309222D02*Y308436D01*

+X118799Y309222D02*Y308436D01*

+G54D311*X287917Y303449D02*Y302465D01*

+G54D308*X293035Y303449D02*Y302465D01*

+G54D310*X183148Y235357D02*X183934D01*

+X183148Y242443D02*X183934D01*

+X204998Y263293D02*Y262507D01*

+X212084Y263293D02*Y262507D01*

+G54D312*X194441Y254200D02*Y247600D01*

+X203441Y254200D02*Y247600D01*

+X212541Y254200D02*Y247600D01*

+G54D313*X198941Y226500D02*X207941D01*

+G54D308*X76949Y49941D02*X77933D01*

+X76949Y55059D02*X77933D01*

+X286949Y49941D02*X287933D01*

+X286949Y55059D02*X287933D01*

+X256949Y49941D02*X257933D01*

+X256949Y55059D02*X257933D01*

+X226949Y49941D02*X227933D01*

+X226949Y55059D02*X227933D01*

+X196949Y49941D02*X197933D01*

+X196949Y55059D02*X197933D01*

+X166949Y49941D02*X167933D01*

+X166949Y55059D02*X167933D01*

+X136949Y49941D02*X137933D01*

+X136949Y55059D02*X137933D01*

+X106949Y49941D02*X107933D01*

+X106949Y55059D02*X107933D01*

+X440449Y65559D02*X441433D01*

+X440449Y60441D02*X441433D01*

+X434449Y65559D02*X435433D01*

+X434449Y60441D02*X435433D01*

+G54D312*X136799Y327729D02*Y321129D01*

+X127799Y327729D02*Y321129D01*

+X118699Y327729D02*Y321129D01*

+G54D313*X123299Y348829D02*X132299D01*

+G54D307*X394747Y231460D02*Y226854D01*

+X392188Y231460D02*Y226854D01*

+X389629Y231460D02*Y226854D01*

+X387070Y231460D02*Y226854D01*

+X384512Y231460D02*Y226854D01*

+X381953Y231460D02*Y226854D01*

+X379394Y231460D02*Y226854D01*

+X376835Y231460D02*Y226854D01*

+Y254688D02*Y250082D01*

+X379394Y254688D02*Y250082D01*

+X381953Y254688D02*Y250082D01*

+X384512Y254688D02*Y250082D01*

+X387070Y254688D02*Y250082D01*

+X389629Y254688D02*Y250082D01*

+X392188Y254688D02*Y250082D01*

+X394747Y254688D02*Y250082D01*

+X394397Y290689D02*Y286083D01*

+X391838Y290689D02*Y286083D01*

+X389279Y290689D02*Y286083D01*

+X386720Y290689D02*Y286083D01*

+X384162Y290689D02*Y286083D01*

+X381603Y290689D02*Y286083D01*

+X379044Y290689D02*Y286083D01*

+X376485Y290689D02*Y286083D01*

+Y313917D02*Y309311D01*

+X379044Y313917D02*Y309311D01*

+X381603Y313917D02*Y309311D01*

+X384162Y313917D02*Y309311D01*

+X386720Y313917D02*Y309311D01*

+X389279Y313917D02*Y309311D01*

+X391838Y313917D02*Y309311D01*

+X394397Y313917D02*Y309311D01*

+X393897Y351189D02*Y346583D01*

+X391338Y351189D02*Y346583D01*

+X388779Y351189D02*Y346583D01*

+X386220Y351189D02*Y346583D01*

+X383662Y351189D02*Y346583D01*

+X381103Y351189D02*Y346583D01*

+X378544Y351189D02*Y346583D01*

+X375985Y351189D02*Y346583D01*

+Y374417D02*Y369811D01*

+X378544Y374417D02*Y369811D01*

+X381103Y374417D02*Y369811D01*

+X383662Y374417D02*Y369811D01*

+X386220Y374417D02*Y369811D01*

+X388779Y374417D02*Y369811D01*

+X391338Y374417D02*Y369811D01*

+X393897Y374417D02*Y369811D01*

+M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.bottomsilk.gbr b/bbb_cape/schematic/gerbers/20131204/cape.bottomsilk.gbr
new file mode 100644
index 0000000..63245b3
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.bottomsilk.gbr
@@ -0,0 +1,60 @@
+G04 start of page 11 for group -4078 idx -4078 *

+G04 Title: 971 BBB Cape, bottomsilk *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNBOTTOMSILK*%

+%ADD296C,0.0080*%

+%ADD295C,0.0100*%

+G54D295*X422997Y107952D02*X444209D01*

+Y76820D01*

+X422997D02*X444209D01*

+X422997Y107952D02*Y94886D01*

+Y89886D02*Y76820D01*

+Y89886D02*G75*G03X422997Y94886I0J2500D01*G01*

+X374335Y344934D02*X395547D01*

+X374335Y376066D02*Y344934D01*

+Y376066D02*X395547D01*

+Y358000D02*Y344934D01*

+Y376066D02*Y363000D01*

+G75*G03X395547Y358000I0J-2500D01*G01*

+X374835Y284434D02*X396047D01*

+X374835Y315566D02*Y284434D01*

+Y315566D02*X396047D01*

+Y297500D02*Y284434D01*

+Y315566D02*Y302500D01*

+G75*G03X396047Y297500I0J-2500D01*G01*

+G54D296*X144686Y341393D02*Y340607D01*

+X150196Y341393D02*Y340607D01*

+X121949Y311584D02*X122735D01*

+X121949Y306074D02*X122735D01*

+G54D295*X141999Y357329D02*Y315929D01*

+X113499D02*X141999D01*

+X113499Y357329D02*Y315929D01*

+Y357329D02*X141999D01*

+G54D296*X186296Y238507D02*Y239293D01*

+X180786Y238507D02*Y239293D01*

+X208148Y260145D02*X208934D01*

+X208148Y265655D02*X208934D01*

+G54D295*X189241Y218000D02*Y259400D01*

+X217741D01*

+Y218000D01*

+X189241D01*

+X374835Y166434D02*X396047D01*

+X374835Y197566D02*Y166434D01*

+Y197566D02*X396047D01*

+Y179500D02*Y166434D01*

+Y197566D02*Y184500D01*

+G75*G03X396047Y179500I0J-2500D01*G01*

+X375185Y225205D02*X396397D01*

+X375185Y256337D02*Y225205D01*

+Y256337D02*X396397D01*

+Y238271D02*Y225205D01*

+Y256337D02*Y243271D01*

+G75*G03X396397Y238271I0J-2500D01*G01*

+M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.fab.gbr b/bbb_cape/schematic/gerbers/20131204/cape.fab.gbr
new file mode 100644
index 0000000..f17ed9c
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.fab.gbr
@@ -0,0 +1,3010 @@
+G04 start of page 14 for group -3984 idx -3984 *

+G04 Title: 971 BBB Cape, fab *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNFAB*%

+%ADD318C,0.0100*%

+%ADD317C,0.0075*%

+%ADD316C,0.0060*%

+%ADD315R,0.0080X0.0080*%

+%ADD314C,0.0001*%

+G54D314*G36*

+X313399Y340295D02*X318765Y334929D01*

+X318199Y334363D01*

+X312833Y339729D01*

+X313399Y340295D01*

+G37*

+G36*

+X312833Y334929D02*X318199Y340295D01*

+X318765Y339729D01*

+X313399Y334363D01*

+X312833Y334929D01*

+G37*

+G54D315*X314199Y338929D02*X317399D01*

+X314199D02*Y335729D01*

+X317399D01*

+Y338929D02*Y335729D01*

+G54D314*G36*

+X12600Y414216D02*X17966Y408850D01*

+X17400Y408284D01*

+X12034Y413650D01*

+X12600Y414216D01*

+G37*

+G36*

+X12034Y408850D02*X17400Y414216D01*

+X17966Y413650D01*

+X12600Y408284D01*

+X12034Y408850D01*

+G37*

+G54D315*X13400Y412850D02*X16600D01*

+X13400D02*Y409650D01*

+X16600D01*

+Y412850D02*Y409650D01*

+G54D316*X135000Y413500D02*X136500Y410500D01*

+X138000Y413500D01*

+X136500Y410500D02*Y407500D01*

+X139800Y410800D02*X142050D01*

+X139800Y407500D02*X142800D01*

+X139800Y413500D02*Y407500D01*

+Y413500D02*X142800D01*

+X147600D02*X148350Y412750D01*

+X145350Y413500D02*X147600D01*

+X144600Y412750D02*X145350Y413500D01*

+X144600Y412750D02*Y411250D01*

+X145350Y410500D01*

+X147600D01*

+X148350Y409750D01*

+Y408250D01*

+X147600Y407500D02*X148350Y408250D01*

+X145350Y407500D02*X147600D01*

+X144600Y408250D02*X145350Y407500D01*

+X98000Y412300D02*X99200Y413500D01*

+Y407500D01*

+X98000D02*X100250D01*

+X45000Y408250D02*X45750Y407500D01*

+X45000Y412750D02*Y408250D01*

+Y412750D02*X45750Y413500D01*

+X47250D01*

+X48000Y412750D01*

+Y408250D01*

+X47250Y407500D02*X48000Y408250D01*

+X45750Y407500D02*X47250D01*

+X45000Y409000D02*X48000Y412000D01*

+X49800Y407500D02*X50550D01*

+X52350Y412750D02*X53100Y413500D01*

+X55350D01*

+X56100Y412750D01*

+Y411250D01*

+X52350Y407500D02*X56100Y411250D01*

+X52350Y407500D02*X56100D01*

+X57900Y408250D02*X58650Y407500D01*

+X57900Y412750D02*Y408250D01*

+Y412750D02*X58650Y413500D01*

+X60150D01*

+X60900Y412750D01*

+Y408250D01*

+X60150Y407500D02*X60900Y408250D01*

+X58650Y407500D02*X60150D01*

+X57900Y409000D02*X60900Y412000D01*

+X62700Y408250D02*X63450Y407500D01*

+X62700Y412750D02*Y408250D01*

+Y412750D02*X63450Y413500D01*

+X64950D01*

+X65700Y412750D01*

+Y408250D01*

+X64950Y407500D02*X65700Y408250D01*

+X63450Y407500D02*X64950D01*

+X62700Y409000D02*X65700Y412000D01*

+X345799Y195529D02*Y189129D01*

+X342599Y192329D02*X348999D01*

+X344199Y193929D02*X347399D01*

+X344199D02*Y190729D01*

+X347399D01*

+Y193929D02*Y190729D01*

+X15000Y429450D02*Y423050D01*

+X11800Y426250D02*X18200D01*

+X13400Y427850D02*X16600D01*

+X13400D02*Y424650D01*

+X16600D01*

+Y427850D02*Y424650D01*

+X135000Y428500D02*X136500Y425500D01*

+X138000Y428500D01*

+X136500Y425500D02*Y422500D01*

+X139800Y425800D02*X142050D01*

+X139800Y422500D02*X142800D01*

+X139800Y428500D02*Y422500D01*

+Y428500D02*X142800D01*

+X147600D02*X148350Y427750D01*

+X145350Y428500D02*X147600D01*

+X144600Y427750D02*X145350Y428500D01*

+X144600Y427750D02*Y426250D01*

+X145350Y425500D01*

+X147600D01*

+X148350Y424750D01*

+Y423250D01*

+X147600Y422500D02*X148350Y423250D01*

+X145350Y422500D02*X147600D01*

+X144600Y423250D02*X145350Y422500D01*

+X98000Y427300D02*X99200Y428500D01*

+Y422500D01*

+X98000D02*X100250D01*

+X45000Y423250D02*X45750Y422500D01*

+X45000Y427750D02*Y423250D01*

+Y427750D02*X45750Y428500D01*

+X47250D01*

+X48000Y427750D01*

+Y423250D01*

+X47250Y422500D02*X48000Y423250D01*

+X45750Y422500D02*X47250D01*

+X45000Y424000D02*X48000Y427000D01*

+X49800Y422500D02*X50550D01*

+X52350Y427300D02*X53550Y428500D01*

+Y422500D01*

+X52350D02*X54600D01*

+X57150D02*X59400Y425500D01*

+Y427750D02*Y425500D01*

+X58650Y428500D02*X59400Y427750D01*

+X57150Y428500D02*X58650D01*

+X56400Y427750D02*X57150Y428500D01*

+X56400Y427750D02*Y426250D01*

+X57150Y425500D01*

+X59400D01*

+X61200Y423250D02*X61950Y422500D01*

+X61200Y427750D02*Y423250D01*

+Y427750D02*X61950Y428500D01*

+X63450D01*

+X64200Y427750D01*

+Y423250D01*

+X63450Y422500D02*X64200Y423250D01*

+X61950Y422500D02*X63450D01*

+X61200Y424000D02*X64200Y427000D01*

+X85799Y179829D02*Y176629D01*

+Y179829D02*X88572Y181429D01*

+X85799Y179829D02*X83026Y181429D01*

+X84199Y179829D02*G75*G03X87399Y179829I1600J0D01*G01*

+G75*G03X84199Y179829I-1600J0D01*G01*

+X85799Y369829D02*Y366629D01*

+Y369829D02*X88572Y371429D01*

+X85799Y369829D02*X83026Y371429D01*

+X84199Y369829D02*G75*G03X87399Y369829I1600J0D01*G01*

+G75*G03X84199Y369829I-1600J0D01*G01*

+X345799Y357329D02*Y354129D01*

+Y357329D02*X348572Y358929D01*

+X345799Y357329D02*X343026Y358929D01*

+X344199Y357329D02*G75*G03X347399Y357329I1600J0D01*G01*

+G75*G03X344199Y357329I-1600J0D01*G01*

+X353000Y150000D02*Y146800D01*

+Y150000D02*X355773Y151600D01*

+X353000Y150000D02*X350227Y151600D01*

+X351400Y150000D02*G75*G03X354600Y150000I1600J0D01*G01*

+G75*G03X351400Y150000I-1600J0D01*G01*

+X15000Y441250D02*Y438050D01*

+Y441250D02*X17773Y442850D01*

+X15000Y441250D02*X12227Y442850D01*

+X13400Y441250D02*G75*G03X16600Y441250I1600J0D01*G01*

+G75*G03X13400Y441250I-1600J0D01*G01*

+X135000Y443500D02*X136500Y440500D01*

+X138000Y443500D01*

+X136500Y440500D02*Y437500D01*

+X139800Y440800D02*X142050D01*

+X139800Y437500D02*X142800D01*

+X139800Y443500D02*Y437500D01*

+Y443500D02*X142800D01*

+X147600D02*X148350Y442750D01*

+X145350Y443500D02*X147600D01*

+X144600Y442750D02*X145350Y443500D01*

+X144600Y442750D02*Y441250D01*

+X145350Y440500D01*

+X147600D01*

+X148350Y439750D01*

+Y438250D01*

+X147600Y437500D02*X148350Y438250D01*

+X145350Y437500D02*X147600D01*

+X144600Y438250D02*X145350Y437500D01*

+X98000Y439750D02*X101000Y443500D01*

+X98000Y439750D02*X101750D01*

+X101000Y443500D02*Y437500D01*

+X45000Y438250D02*X45750Y437500D01*

+X45000Y442750D02*Y438250D01*

+Y442750D02*X45750Y443500D01*

+X47250D01*

+X48000Y442750D01*

+Y438250D01*

+X47250Y437500D02*X48000Y438250D01*

+X45750Y437500D02*X47250D01*

+X45000Y439000D02*X48000Y442000D01*

+X49800Y437500D02*X50550D01*

+X52350Y442300D02*X53550Y443500D01*

+Y437500D01*

+X52350D02*X54600D01*

+X56400Y442750D02*X57150Y443500D01*

+X59400D01*

+X60150Y442750D01*

+Y441250D01*

+X56400Y437500D02*X60150Y441250D01*

+X56400Y437500D02*X60150D01*

+X62700D02*X64950Y440500D01*

+Y442750D02*Y440500D01*

+X64200Y443500D02*X64950Y442750D01*

+X62700Y443500D02*X64200D01*

+X61950Y442750D02*X62700Y443500D01*

+X61950Y442750D02*Y441250D01*

+X62700Y440500D01*

+X64950D01*

+X104199Y186429D02*X107399D01*

+X104199D02*Y183229D01*

+X107399D01*

+Y186429D02*Y183229D01*

+X104199Y176429D02*X107399D01*

+X104199D02*Y173229D01*

+X107399D01*

+Y176429D02*Y173229D01*

+X114199Y186429D02*X117399D01*

+X114199D02*Y183229D01*

+X117399D01*

+Y186429D02*Y183229D01*

+X114199Y176429D02*X117399D01*

+X114199D02*Y173229D01*

+X117399D01*

+Y176429D02*Y173229D01*

+X124199Y186429D02*X127399D01*

+X124199D02*Y183229D01*

+X127399D01*

+Y186429D02*Y183229D01*

+X124199Y176429D02*X127399D01*

+X124199D02*Y173229D01*

+X127399D01*

+Y176429D02*Y173229D01*

+X134199Y186429D02*X137399D01*

+X134199D02*Y183229D01*

+X137399D01*

+Y186429D02*Y183229D01*

+X134199Y176429D02*X137399D01*

+X134199D02*Y173229D01*

+X137399D01*

+Y176429D02*Y173229D01*

+X144199Y186429D02*X147399D01*

+X144199D02*Y183229D01*

+X147399D01*

+Y186429D02*Y183229D01*

+X144199Y176429D02*X147399D01*

+X144199D02*Y173229D01*

+X147399D01*

+Y176429D02*Y173229D01*

+X154199Y186429D02*X157399D01*

+X154199D02*Y183229D01*

+X157399D01*

+Y186429D02*Y183229D01*

+X154199Y176429D02*X157399D01*

+X154199D02*Y173229D01*

+X157399D01*

+Y176429D02*Y173229D01*

+X164199Y186429D02*X167399D01*

+X164199D02*Y183229D01*

+X167399D01*

+Y186429D02*Y183229D01*

+X164199Y176429D02*X167399D01*

+X164199D02*Y173229D01*

+X167399D01*

+Y176429D02*Y173229D01*

+X174199Y186429D02*X177399D01*

+X174199D02*Y183229D01*

+X177399D01*

+Y186429D02*Y183229D01*

+X174199Y176429D02*X177399D01*

+X174199D02*Y173229D01*

+X177399D01*

+Y176429D02*Y173229D01*

+X184199Y186429D02*X187399D01*

+X184199D02*Y183229D01*

+X187399D01*

+Y186429D02*Y183229D01*

+X184199Y176429D02*X187399D01*

+X184199D02*Y173229D01*

+X187399D01*

+Y176429D02*Y173229D01*

+X194199Y186429D02*X197399D01*

+X194199D02*Y183229D01*

+X197399D01*

+Y186429D02*Y183229D01*

+X194199Y176429D02*X197399D01*

+X194199D02*Y173229D01*

+X197399D01*

+Y176429D02*Y173229D01*

+X204199Y186429D02*X207399D01*

+X204199D02*Y183229D01*

+X207399D01*

+Y186429D02*Y183229D01*

+X204199Y176429D02*X207399D01*

+X204199D02*Y173229D01*

+X207399D01*

+Y176429D02*Y173229D01*

+X214199Y186429D02*X217399D01*

+X214199D02*Y183229D01*

+X217399D01*

+Y186429D02*Y183229D01*

+X214199Y176429D02*X217399D01*

+X214199D02*Y173229D01*

+X217399D01*

+Y176429D02*Y173229D01*

+X224199Y186429D02*X227399D01*

+X224199D02*Y183229D01*

+X227399D01*

+Y186429D02*Y183229D01*

+X224199Y176429D02*X227399D01*

+X224199D02*Y173229D01*

+X227399D01*

+Y176429D02*Y173229D01*

+X234199Y186429D02*X237399D01*

+X234199D02*Y183229D01*

+X237399D01*

+Y186429D02*Y183229D01*

+X234199Y176429D02*X237399D01*

+X234199D02*Y173229D01*

+X237399D01*

+Y176429D02*Y173229D01*

+X244199Y186429D02*X247399D01*

+X244199D02*Y183229D01*

+X247399D01*

+Y186429D02*Y183229D01*

+X244199Y176429D02*X247399D01*

+X244199D02*Y173229D01*

+X247399D01*

+Y176429D02*Y173229D01*

+X254199Y186429D02*X257399D01*

+X254199D02*Y183229D01*

+X257399D01*

+Y186429D02*Y183229D01*

+X254199Y176429D02*X257399D01*

+X254199D02*Y173229D01*

+X257399D01*

+Y176429D02*Y173229D01*

+X264199Y186429D02*X267399D01*

+X264199D02*Y183229D01*

+X267399D01*

+Y186429D02*Y183229D01*

+X264199Y176429D02*X267399D01*

+X264199D02*Y173229D01*

+X267399D01*

+Y176429D02*Y173229D01*

+X274199Y186429D02*X277399D01*

+X274199D02*Y183229D01*

+X277399D01*

+Y186429D02*Y183229D01*

+X274199Y176429D02*X277399D01*

+X274199D02*Y173229D01*

+X277399D01*

+Y176429D02*Y173229D01*

+X284199Y186429D02*X287399D01*

+X284199D02*Y183229D01*

+X287399D01*

+Y186429D02*Y183229D01*

+X284199Y176429D02*X287399D01*

+X284199D02*Y173229D01*

+X287399D01*

+Y176429D02*Y173229D01*

+X294199Y186429D02*X297399D01*

+X294199D02*Y183229D01*

+X297399D01*

+Y186429D02*Y183229D01*

+X294199Y176429D02*X297399D01*

+X294199D02*Y173229D01*

+X297399D01*

+Y176429D02*Y173229D01*

+X304199Y186429D02*X307399D01*

+X304199D02*Y183229D01*

+X307399D01*

+Y186429D02*Y183229D01*

+X304199Y176429D02*X307399D01*

+X304199D02*Y173229D01*

+X307399D01*

+Y176429D02*Y173229D01*

+X314199Y186429D02*X317399D01*

+X314199D02*Y183229D01*

+X317399D01*

+Y186429D02*Y183229D01*

+X314199Y176429D02*X317399D01*

+X314199D02*Y173229D01*

+X317399D01*

+Y176429D02*Y173229D01*

+X324199Y186429D02*X327399D01*

+X324199D02*Y183229D01*

+X327399D01*

+Y186429D02*Y183229D01*

+X324199Y176429D02*X327399D01*

+X324199D02*Y173229D01*

+X327399D01*

+Y176429D02*Y173229D01*

+X104199Y376429D02*X107399D01*

+X104199D02*Y373229D01*

+X107399D01*

+Y376429D02*Y373229D01*

+X104199Y366429D02*X107399D01*

+X104199D02*Y363229D01*

+X107399D01*

+Y366429D02*Y363229D01*

+X114199Y376429D02*X117399D01*

+X114199D02*Y373229D01*

+X117399D01*

+Y376429D02*Y373229D01*

+X114199Y366429D02*X117399D01*

+X114199D02*Y363229D01*

+X117399D01*

+Y366429D02*Y363229D01*

+X124199Y376429D02*X127399D01*

+X124199D02*Y373229D01*

+X127399D01*

+Y376429D02*Y373229D01*

+X124199Y366429D02*X127399D01*

+X124199D02*Y363229D01*

+X127399D01*

+Y366429D02*Y363229D01*

+X134199Y376429D02*X137399D01*

+X134199D02*Y373229D01*

+X137399D01*

+Y376429D02*Y373229D01*

+X134199Y366429D02*X137399D01*

+X134199D02*Y363229D01*

+X137399D01*

+Y366429D02*Y363229D01*

+X144199Y376429D02*X147399D01*

+X144199D02*Y373229D01*

+X147399D01*

+Y376429D02*Y373229D01*

+X144199Y366429D02*X147399D01*

+X144199D02*Y363229D01*

+X147399D01*

+Y366429D02*Y363229D01*

+X154199Y376429D02*X157399D01*

+X154199D02*Y373229D01*

+X157399D01*

+Y376429D02*Y373229D01*

+X154199Y366429D02*X157399D01*

+X154199D02*Y363229D01*

+X157399D01*

+Y366429D02*Y363229D01*

+X164199Y376429D02*X167399D01*

+X164199D02*Y373229D01*

+X167399D01*

+Y376429D02*Y373229D01*

+X164199Y366429D02*X167399D01*

+X164199D02*Y363229D01*

+X167399D01*

+Y366429D02*Y363229D01*

+X174199Y376429D02*X177399D01*

+X174199D02*Y373229D01*

+X177399D01*

+Y376429D02*Y373229D01*

+X174199Y366429D02*X177399D01*

+X174199D02*Y363229D01*

+X177399D01*

+Y366429D02*Y363229D01*

+X184199Y376429D02*X187399D01*

+X184199D02*Y373229D01*

+X187399D01*

+Y376429D02*Y373229D01*

+X184199Y366429D02*X187399D01*

+X184199D02*Y363229D01*

+X187399D01*

+Y366429D02*Y363229D01*

+X194199Y376429D02*X197399D01*

+X194199D02*Y373229D01*

+X197399D01*

+Y376429D02*Y373229D01*

+X194199Y366429D02*X197399D01*

+X194199D02*Y363229D01*

+X197399D01*

+Y366429D02*Y363229D01*

+X204199Y376429D02*X207399D01*

+X204199D02*Y373229D01*

+X207399D01*

+Y376429D02*Y373229D01*

+X204199Y366429D02*X207399D01*

+X204199D02*Y363229D01*

+X207399D01*

+Y366429D02*Y363229D01*

+X214199Y376429D02*X217399D01*

+X214199D02*Y373229D01*

+X217399D01*

+Y376429D02*Y373229D01*

+X214199Y366429D02*X217399D01*

+X214199D02*Y363229D01*

+X217399D01*

+Y366429D02*Y363229D01*

+X224199Y376429D02*X227399D01*

+X224199D02*Y373229D01*

+X227399D01*

+Y376429D02*Y373229D01*

+X224199Y366429D02*X227399D01*

+X224199D02*Y363229D01*

+X227399D01*

+Y366429D02*Y363229D01*

+X234199Y376429D02*X237399D01*

+X234199D02*Y373229D01*

+X237399D01*

+Y376429D02*Y373229D01*

+X234199Y366429D02*X237399D01*

+X234199D02*Y363229D01*

+X237399D01*

+Y366429D02*Y363229D01*

+X244199Y376429D02*X247399D01*

+X244199D02*Y373229D01*

+X247399D01*

+Y376429D02*Y373229D01*

+X244199Y366429D02*X247399D01*

+X244199D02*Y363229D01*

+X247399D01*

+Y366429D02*Y363229D01*

+X254199Y376429D02*X257399D01*

+X254199D02*Y373229D01*

+X257399D01*

+Y376429D02*Y373229D01*

+X254199Y366429D02*X257399D01*

+X254199D02*Y363229D01*

+X257399D01*

+Y366429D02*Y363229D01*

+X264199Y376429D02*X267399D01*

+X264199D02*Y373229D01*

+X267399D01*

+Y376429D02*Y373229D01*

+X264199Y366429D02*X267399D01*

+X264199D02*Y363229D01*

+X267399D01*

+Y366429D02*Y363229D01*

+X274199Y376429D02*X277399D01*

+X274199D02*Y373229D01*

+X277399D01*

+Y376429D02*Y373229D01*

+X274199Y366429D02*X277399D01*

+X274199D02*Y363229D01*

+X277399D01*

+Y366429D02*Y363229D01*

+X284199Y376429D02*X287399D01*

+X284199D02*Y373229D01*

+X287399D01*

+Y376429D02*Y373229D01*

+X284199Y366429D02*X287399D01*

+X284199D02*Y363229D01*

+X287399D01*

+Y366429D02*Y363229D01*

+X294199Y376429D02*X297399D01*

+X294199D02*Y373229D01*

+X297399D01*

+Y376429D02*Y373229D01*

+X294199Y366429D02*X297399D01*

+X294199D02*Y363229D01*

+X297399D01*

+Y366429D02*Y363229D01*

+X304199Y376429D02*X307399D01*

+X304199D02*Y373229D01*

+X307399D01*

+Y376429D02*Y373229D01*

+X304199Y366429D02*X307399D01*

+X304199D02*Y363229D01*

+X307399D01*

+Y366429D02*Y363229D01*

+X314199Y376429D02*X317399D01*

+X314199D02*Y373229D01*

+X317399D01*

+Y376429D02*Y373229D01*

+X314199Y366429D02*X317399D01*

+X314199D02*Y363229D01*

+X317399D01*

+Y366429D02*Y363229D01*

+X324199Y376429D02*X327399D01*

+X324199D02*Y373229D01*

+X327399D01*

+Y376429D02*Y373229D01*

+X324199Y366429D02*X327399D01*

+X324199D02*Y363229D01*

+X327399D01*

+Y366429D02*Y363229D01*

+X194199Y198929D02*X197399D01*

+X194199D02*Y195729D01*

+X197399D01*

+Y198929D02*Y195729D01*

+X204199Y198929D02*X207399D01*

+X204199D02*Y195729D01*

+X207399D01*

+Y198929D02*Y195729D01*

+X214199Y198929D02*X217399D01*

+X214199D02*Y195729D01*

+X217399D01*

+Y198929D02*Y195729D01*

+X224199Y198929D02*X227399D01*

+X224199D02*Y195729D01*

+X227399D01*

+Y198929D02*Y195729D01*

+X234199Y198929D02*X237399D01*

+X234199D02*Y195729D01*

+X237399D01*

+Y198929D02*Y195729D01*

+X13400Y457850D02*X16600D01*

+X13400D02*Y454650D01*

+X16600D01*

+Y457850D02*Y454650D01*

+X135000Y458500D02*X136500Y455500D01*

+X138000Y458500D01*

+X136500Y455500D02*Y452500D01*

+X139800Y455800D02*X142050D01*

+X139800Y452500D02*X142800D01*

+X139800Y458500D02*Y452500D01*

+Y458500D02*X142800D01*

+X147600D02*X148350Y457750D01*

+X145350Y458500D02*X147600D01*

+X144600Y457750D02*X145350Y458500D01*

+X144600Y457750D02*Y456250D01*

+X145350Y455500D01*

+X147600D01*

+X148350Y454750D01*

+Y453250D01*

+X147600Y452500D02*X148350Y453250D01*

+X145350Y452500D02*X147600D01*

+X144600Y453250D02*X145350Y452500D01*

+X98750D02*X101000Y455500D01*

+Y457750D02*Y455500D01*

+X100250Y458500D02*X101000Y457750D01*

+X98750Y458500D02*X100250D01*

+X98000Y457750D02*X98750Y458500D01*

+X98000Y457750D02*Y456250D01*

+X98750Y455500D01*

+X101000D01*

+X103550Y452500D02*X106550Y458500D01*

+X102800D02*X106550D01*

+X45000Y453250D02*X45750Y452500D01*

+X45000Y457750D02*Y453250D01*

+Y457750D02*X45750Y458500D01*

+X47250D01*

+X48000Y457750D01*

+Y453250D01*

+X47250Y452500D02*X48000Y453250D01*

+X45750Y452500D02*X47250D01*

+X45000Y454000D02*X48000Y457000D01*

+X49800Y452500D02*X50550D01*

+X52350Y453250D02*X53100Y452500D01*

+X52350Y457750D02*Y453250D01*

+Y457750D02*X53100Y458500D01*

+X54600D01*

+X55350Y457750D01*

+Y453250D01*

+X54600Y452500D02*X55350Y453250D01*

+X53100Y452500D02*X54600D01*

+X52350Y454000D02*X55350Y457000D01*

+X57150Y454750D02*X60150Y458500D01*

+X57150Y454750D02*X60900D01*

+X60150Y458500D02*Y452500D01*

+X64950Y458500D02*X65700Y457750D01*

+X63450Y458500D02*X64950D01*

+X62700Y457750D02*X63450Y458500D01*

+X62700Y457750D02*Y453250D01*

+X63450Y452500D01*

+X64950Y455800D02*X65700Y455050D01*

+X62700Y455800D02*X64950D01*

+X63450Y452500D02*X64950D01*

+X65700Y453250D01*

+Y455050D02*Y453250D01*

+X452700Y384000D02*G75*G03X454300Y384000I800J0D01*G01*

+G75*G03X452700Y384000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y384000I800J0D01*G01*

+G75*G03X462700Y384000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y384000I800J0D01*G01*

+G75*G03X472700Y384000I-800J0D01*G01*

+X452700Y324000D02*G75*G03X454300Y324000I800J0D01*G01*

+G75*G03X452700Y324000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y324000I800J0D01*G01*

+G75*G03X462700Y324000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y324000I800J0D01*G01*

+G75*G03X472700Y324000I-800J0D01*G01*

+X452700Y294000D02*G75*G03X454300Y294000I800J0D01*G01*

+G75*G03X452700Y294000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y294000I800J0D01*G01*

+G75*G03X462700Y294000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y294000I800J0D01*G01*

+G75*G03X472700Y294000I-800J0D01*G01*

+X452700Y264000D02*G75*G03X454300Y264000I800J0D01*G01*

+G75*G03X452700Y264000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y264000I800J0D01*G01*

+G75*G03X462700Y264000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y264000I800J0D01*G01*

+G75*G03X472700Y264000I-800J0D01*G01*

+X452700Y234000D02*G75*G03X454300Y234000I800J0D01*G01*

+G75*G03X452700Y234000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y234000I800J0D01*G01*

+G75*G03X462700Y234000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y234000I800J0D01*G01*

+G75*G03X472700Y234000I-800J0D01*G01*

+X452700Y204000D02*G75*G03X454300Y204000I800J0D01*G01*

+G75*G03X452700Y204000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y204000I800J0D01*G01*

+G75*G03X462700Y204000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y204000I800J0D01*G01*

+G75*G03X472700Y204000I-800J0D01*G01*

+X452700Y174000D02*G75*G03X454300Y174000I800J0D01*G01*

+G75*G03X452700Y174000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y174000I800J0D01*G01*

+G75*G03X462700Y174000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y174000I800J0D01*G01*

+G75*G03X472700Y174000I-800J0D01*G01*

+X452700Y144000D02*G75*G03X454300Y144000I800J0D01*G01*

+G75*G03X452700Y144000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y144000I800J0D01*G01*

+G75*G03X462700Y144000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y144000I800J0D01*G01*

+G75*G03X472700Y144000I-800J0D01*G01*

+X452700Y114000D02*G75*G03X454300Y114000I800J0D01*G01*

+G75*G03X452700Y114000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y114000I800J0D01*G01*

+G75*G03X462700Y114000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y114000I800J0D01*G01*

+G75*G03X472700Y114000I-800J0D01*G01*

+X452700Y84000D02*G75*G03X454300Y84000I800J0D01*G01*

+G75*G03X452700Y84000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y84000I800J0D01*G01*

+G75*G03X462700Y84000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y84000I800J0D01*G01*

+G75*G03X472700Y84000I-800J0D01*G01*

+X452700Y54000D02*G75*G03X454300Y54000I800J0D01*G01*

+G75*G03X452700Y54000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y54000I800J0D01*G01*

+G75*G03X462700Y54000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y54000I800J0D01*G01*

+G75*G03X472700Y54000I-800J0D01*G01*

+X406200Y384000D02*G75*G03X407800Y384000I800J0D01*G01*

+G75*G03X406200Y384000I-800J0D01*G01*

+X416200D02*G75*G03X417800Y384000I800J0D01*G01*

+G75*G03X416200Y384000I-800J0D01*G01*

+X426200D02*G75*G03X427800Y384000I800J0D01*G01*

+G75*G03X426200Y384000I-800J0D01*G01*

+X436200D02*G75*G03X437800Y384000I800J0D01*G01*

+G75*G03X436200Y384000I-800J0D01*G01*

+X406200Y174000D02*G75*G03X407800Y174000I800J0D01*G01*

+G75*G03X406200Y174000I-800J0D01*G01*

+X416200D02*G75*G03X417800Y174000I800J0D01*G01*

+G75*G03X416200Y174000I-800J0D01*G01*

+X426200D02*G75*G03X427800Y174000I800J0D01*G01*

+G75*G03X426200Y174000I-800J0D01*G01*

+X436200D02*G75*G03X437800Y174000I800J0D01*G01*

+G75*G03X436200Y174000I-800J0D01*G01*

+X406200Y204000D02*G75*G03X407800Y204000I800J0D01*G01*

+G75*G03X406200Y204000I-800J0D01*G01*

+X416200D02*G75*G03X417800Y204000I800J0D01*G01*

+G75*G03X416200Y204000I-800J0D01*G01*

+X426200D02*G75*G03X427800Y204000I800J0D01*G01*

+G75*G03X426200Y204000I-800J0D01*G01*

+X436200D02*G75*G03X437800Y204000I800J0D01*G01*

+G75*G03X436200Y204000I-800J0D01*G01*

+X406200Y234000D02*G75*G03X407800Y234000I800J0D01*G01*

+G75*G03X406200Y234000I-800J0D01*G01*

+X416200D02*G75*G03X417800Y234000I800J0D01*G01*

+G75*G03X416200Y234000I-800J0D01*G01*

+X426200D02*G75*G03X427800Y234000I800J0D01*G01*

+G75*G03X426200Y234000I-800J0D01*G01*

+X436200D02*G75*G03X437800Y234000I800J0D01*G01*

+G75*G03X436200Y234000I-800J0D01*G01*

+X406200Y264000D02*G75*G03X407800Y264000I800J0D01*G01*

+G75*G03X406200Y264000I-800J0D01*G01*

+X416200D02*G75*G03X417800Y264000I800J0D01*G01*

+G75*G03X416200Y264000I-800J0D01*G01*

+X426200D02*G75*G03X427800Y264000I800J0D01*G01*

+G75*G03X426200Y264000I-800J0D01*G01*

+X436200D02*G75*G03X437800Y264000I800J0D01*G01*

+G75*G03X436200Y264000I-800J0D01*G01*

+X406200Y294000D02*G75*G03X407800Y294000I800J0D01*G01*

+G75*G03X406200Y294000I-800J0D01*G01*

+X416200D02*G75*G03X417800Y294000I800J0D01*G01*

+G75*G03X416200Y294000I-800J0D01*G01*

+X426200D02*G75*G03X427800Y294000I800J0D01*G01*

+G75*G03X426200Y294000I-800J0D01*G01*

+X436200D02*G75*G03X437800Y294000I800J0D01*G01*

+G75*G03X436200Y294000I-800J0D01*G01*

+X406200Y324000D02*G75*G03X407800Y324000I800J0D01*G01*

+G75*G03X406200Y324000I-800J0D01*G01*

+X416200D02*G75*G03X417800Y324000I800J0D01*G01*

+G75*G03X416200Y324000I-800J0D01*G01*

+X426200D02*G75*G03X427800Y324000I800J0D01*G01*

+G75*G03X426200Y324000I-800J0D01*G01*

+X436200D02*G75*G03X437800Y324000I800J0D01*G01*

+G75*G03X436200Y324000I-800J0D01*G01*

+X452700Y354000D02*G75*G03X454300Y354000I800J0D01*G01*

+G75*G03X452700Y354000I-800J0D01*G01*

+X462700D02*G75*G03X464300Y354000I800J0D01*G01*

+G75*G03X462700Y354000I-800J0D01*G01*

+X472700D02*G75*G03X474300Y354000I800J0D01*G01*

+G75*G03X472700Y354000I-800J0D01*G01*

+X406200D02*G75*G03X407800Y354000I800J0D01*G01*

+G75*G03X406200Y354000I-800J0D01*G01*

+X416200D02*G75*G03X417800Y354000I800J0D01*G01*

+G75*G03X416200Y354000I-800J0D01*G01*

+X426200D02*G75*G03X427800Y354000I800J0D01*G01*

+G75*G03X426200Y354000I-800J0D01*G01*

+X436200D02*G75*G03X437800Y354000I800J0D01*G01*

+G75*G03X436200Y354000I-800J0D01*G01*

+X204641Y47500D02*G75*G03X206241Y47500I800J0D01*G01*

+G75*G03X204641Y47500I-800J0D01*G01*

+Y57500D02*G75*G03X206241Y57500I800J0D01*G01*

+G75*G03X204641Y57500I-800J0D01*G01*

+Y67500D02*G75*G03X206241Y67500I800J0D01*G01*

+G75*G03X204641Y67500I-800J0D01*G01*

+X234641Y47500D02*G75*G03X236241Y47500I800J0D01*G01*

+G75*G03X234641Y47500I-800J0D01*G01*

+Y57500D02*G75*G03X236241Y57500I800J0D01*G01*

+G75*G03X234641Y57500I-800J0D01*G01*

+Y67500D02*G75*G03X236241Y67500I800J0D01*G01*

+G75*G03X234641Y67500I-800J0D01*G01*

+X264641Y47500D02*G75*G03X266241Y47500I800J0D01*G01*

+G75*G03X264641Y47500I-800J0D01*G01*

+Y57500D02*G75*G03X266241Y57500I800J0D01*G01*

+G75*G03X264641Y57500I-800J0D01*G01*

+Y67500D02*G75*G03X266241Y67500I800J0D01*G01*

+G75*G03X264641Y67500I-800J0D01*G01*

+X294641Y47500D02*G75*G03X296241Y47500I800J0D01*G01*

+G75*G03X294641Y47500I-800J0D01*G01*

+Y57500D02*G75*G03X296241Y57500I800J0D01*G01*

+G75*G03X294641Y57500I-800J0D01*G01*

+Y67500D02*G75*G03X296241Y67500I800J0D01*G01*

+G75*G03X294641Y67500I-800J0D01*G01*

+X174641Y47500D02*G75*G03X176241Y47500I800J0D01*G01*

+G75*G03X174641Y47500I-800J0D01*G01*

+Y57500D02*G75*G03X176241Y57500I800J0D01*G01*

+G75*G03X174641Y57500I-800J0D01*G01*

+Y67500D02*G75*G03X176241Y67500I800J0D01*G01*

+G75*G03X174641Y67500I-800J0D01*G01*

+X144641Y47500D02*G75*G03X146241Y47500I800J0D01*G01*

+G75*G03X144641Y47500I-800J0D01*G01*

+Y57500D02*G75*G03X146241Y57500I800J0D01*G01*

+G75*G03X144641Y57500I-800J0D01*G01*

+Y67500D02*G75*G03X146241Y67500I800J0D01*G01*

+G75*G03X144641Y67500I-800J0D01*G01*

+X114641Y47500D02*G75*G03X116241Y47500I800J0D01*G01*

+G75*G03X114641Y47500I-800J0D01*G01*

+Y57500D02*G75*G03X116241Y57500I800J0D01*G01*

+G75*G03X114641Y57500I-800J0D01*G01*

+Y67500D02*G75*G03X116241Y67500I800J0D01*G01*

+G75*G03X114641Y67500I-800J0D01*G01*

+X84641Y47500D02*G75*G03X86241Y47500I800J0D01*G01*

+G75*G03X84641Y47500I-800J0D01*G01*

+Y57500D02*G75*G03X86241Y57500I800J0D01*G01*

+G75*G03X84641Y57500I-800J0D01*G01*

+Y67500D02*G75*G03X86241Y67500I800J0D01*G01*

+G75*G03X84641Y67500I-800J0D01*G01*

+X311641Y249000D02*G75*G03X313241Y249000I800J0D01*G01*

+G75*G03X311641Y249000I-800J0D01*G01*

+X321641D02*G75*G03X323241Y249000I800J0D01*G01*

+G75*G03X321641Y249000I-800J0D01*G01*

+X331641D02*G75*G03X333241Y249000I800J0D01*G01*

+G75*G03X331641Y249000I-800J0D01*G01*

+X341641D02*G75*G03X343241Y249000I800J0D01*G01*

+G75*G03X341641Y249000I-800J0D01*G01*

+X84641Y240000D02*G75*G03X86241Y240000I800J0D01*G01*

+G75*G03X84641Y240000I-800J0D01*G01*

+Y230000D02*G75*G03X86241Y230000I800J0D01*G01*

+G75*G03X84641Y230000I-800J0D01*G01*

+Y220000D02*G75*G03X86241Y220000I800J0D01*G01*

+G75*G03X84641Y220000I-800J0D01*G01*

+X14200Y471250D02*G75*G03X15800Y471250I800J0D01*G01*

+G75*G03X14200Y471250I-800J0D01*G01*

+X135000Y473500D02*X136500Y470500D01*

+X138000Y473500D01*

+X136500Y470500D02*Y467500D01*

+X139800Y470800D02*X142050D01*

+X139800Y467500D02*X142800D01*

+X139800Y473500D02*Y467500D01*

+Y473500D02*X142800D01*

+X147600D02*X148350Y472750D01*

+X145350Y473500D02*X147600D01*

+X144600Y472750D02*X145350Y473500D01*

+X144600Y472750D02*Y471250D01*

+X145350Y470500D01*

+X147600D01*

+X148350Y469750D01*

+Y468250D01*

+X147600Y467500D02*X148350Y468250D01*

+X145350Y467500D02*X147600D01*

+X144600Y468250D02*X145350Y467500D01*

+X98750D02*X101000Y470500D01*

+Y472750D02*Y470500D01*

+X100250Y473500D02*X101000Y472750D01*

+X98750Y473500D02*X100250D01*

+X98000Y472750D02*X98750Y473500D01*

+X98000Y472750D02*Y471250D01*

+X98750Y470500D01*

+X101000D01*

+X103550Y467500D02*X105800Y470500D01*

+Y472750D02*Y470500D01*

+X105050Y473500D02*X105800Y472750D01*

+X103550Y473500D02*X105050D01*

+X102800Y472750D02*X103550Y473500D01*

+X102800Y472750D02*Y471250D01*

+X103550Y470500D01*

+X105800D01*

+X45000Y468250D02*X45750Y467500D01*

+X45000Y472750D02*Y468250D01*

+Y472750D02*X45750Y473500D01*

+X47250D01*

+X48000Y472750D01*

+Y468250D01*

+X47250Y467500D02*X48000Y468250D01*

+X45750Y467500D02*X47250D01*

+X45000Y469000D02*X48000Y472000D01*

+X49800Y467500D02*X50550D01*

+X52350Y468250D02*X53100Y467500D01*

+X52350Y472750D02*Y468250D01*

+Y472750D02*X53100Y473500D01*

+X54600D01*

+X55350Y472750D01*

+Y468250D01*

+X54600Y467500D02*X55350Y468250D01*

+X53100Y467500D02*X54600D01*

+X52350Y469000D02*X55350Y472000D01*

+X57150Y469750D02*X60150Y473500D01*

+X57150Y469750D02*X60900D01*

+X60150Y473500D02*Y467500D01*

+X62700Y468250D02*X63450Y467500D01*

+X62700Y472750D02*Y468250D01*

+Y472750D02*X63450Y473500D01*

+X64950D01*

+X65700Y472750D01*

+Y468250D01*

+X64950Y467500D02*X65700Y468250D01*

+X63450Y467500D02*X64950D01*

+X62700Y469000D02*X65700Y472000D01*

+X439741Y124200D02*X442141Y121800D01*

+X439741D02*X442141Y124200D01*

+X13800Y487450D02*X16200Y485050D01*

+X13800D02*X16200Y487450D01*

+X135000Y488500D02*X136500Y485500D01*

+X138000Y488500D01*

+X136500Y485500D02*Y482500D01*

+X139800Y485800D02*X142050D01*

+X139800Y482500D02*X142800D01*

+X139800Y488500D02*Y482500D01*

+Y488500D02*X142800D01*

+X147600D02*X148350Y487750D01*

+X145350Y488500D02*X147600D01*

+X144600Y487750D02*X145350Y488500D01*

+X144600Y487750D02*Y486250D01*

+X145350Y485500D01*

+X147600D01*

+X148350Y484750D01*

+Y483250D01*

+X147600Y482500D02*X148350Y483250D01*

+X145350Y482500D02*X147600D01*

+X144600Y483250D02*X145350Y482500D01*

+X98000Y487300D02*X99200Y488500D01*

+Y482500D01*

+X98000D02*X100250D01*

+X45000Y483250D02*X45750Y482500D01*

+X45000Y487750D02*Y483250D01*

+Y487750D02*X45750Y488500D01*

+X47250D01*

+X48000Y487750D01*

+Y483250D01*

+X47250Y482500D02*X48000Y483250D01*

+X45750Y482500D02*X47250D01*

+X45000Y484000D02*X48000Y487000D01*

+X49800Y482500D02*X50550D01*

+X52350Y483250D02*X53100Y482500D01*

+X52350Y487750D02*Y483250D01*

+Y487750D02*X53100Y488500D01*

+X54600D01*

+X55350Y487750D01*

+Y483250D01*

+X54600Y482500D02*X55350Y483250D01*

+X53100Y482500D02*X54600D01*

+X52350Y484000D02*X55350Y487000D01*

+X57150Y487750D02*X57900Y488500D01*

+X59400D01*

+X60150Y487750D01*

+X59400Y482500D02*X60150Y483250D01*

+X57900Y482500D02*X59400D01*

+X57150Y483250D02*X57900Y482500D01*

+Y485800D02*X59400D01*

+X60150Y487750D02*Y486550D01*

+Y485050D02*Y483250D01*

+Y485050D02*X59400Y485800D01*

+X60150Y486550D02*X59400Y485800D01*

+X61950Y488500D02*X64950D01*

+X61950D02*Y485500D01*

+X62700Y486250D01*

+X64200D01*

+X64950Y485500D01*

+Y483250D01*

+X64200Y482500D02*X64950Y483250D01*

+X62700Y482500D02*X64200D01*

+X61950Y483250D02*X62700Y482500D01*

+X432324Y112600D02*Y109400D01*

+X430724Y111000D02*X433924D01*

+X386441Y164600D02*Y161400D01*

+X384841Y163000D02*X388041D01*

+X387441Y327600D02*Y324400D01*

+X385841Y326000D02*X389041D01*

+X393441Y356600D02*Y353400D01*

+X391841Y355000D02*X395041D01*

+X386720Y283600D02*Y280400D01*

+X385120Y282000D02*X388320D01*

+X400441Y195600D02*Y192400D01*

+X398841Y194000D02*X402041D01*

+X389441Y185600D02*Y182400D01*

+X387841Y184000D02*X391041D01*

+X400441Y190600D02*Y187400D01*

+X398841Y189000D02*X402041D01*

+X393441Y209600D02*Y206400D01*

+X391841Y208000D02*X395041D01*

+X393441Y328600D02*Y325400D01*

+X391841Y327000D02*X395041D01*

+X385941Y356100D02*Y352900D01*

+X384341Y354500D02*X387541D01*

+X375441Y236600D02*Y233400D01*

+X373841Y235000D02*X377041D01*

+X384162Y189600D02*Y186400D01*

+X382562Y188000D02*X385762D01*

+X387070Y236600D02*Y233400D01*

+X385470Y235000D02*X388670D01*

+X384162Y307600D02*Y304400D01*

+X382562Y306000D02*X385762D01*

+X458441Y376600D02*Y373400D01*

+X456841Y375000D02*X460041D01*

+X458441Y346600D02*Y343400D01*

+X456841Y345000D02*X460041D01*

+X458441Y316600D02*Y313400D01*

+X456841Y315000D02*X460041D01*

+X458441Y286600D02*Y283400D01*

+X456841Y285000D02*X460041D01*

+X458441Y255600D02*Y252400D01*

+X456841Y254000D02*X460041D01*

+X458441Y226600D02*Y223400D01*

+X456841Y225000D02*X460041D01*

+X458441Y196600D02*Y193400D01*

+X456841Y195000D02*X460041D01*

+X458441Y165600D02*Y162400D01*

+X456841Y164000D02*X460041D01*

+X446441Y103600D02*Y100400D01*

+X444841Y102000D02*X448041D01*

+X434882Y76600D02*Y73400D01*

+X433282Y75000D02*X436482D01*

+X423441Y76600D02*Y73400D01*

+X421841Y75000D02*X425041D01*

+X372441Y171986D02*Y168786D01*

+X370841Y170386D02*X374041D01*

+X398441Y249600D02*Y246400D01*

+X396841Y248000D02*X400041D01*

+X398441Y254600D02*Y251400D01*

+X396841Y253000D02*X400041D01*

+X384512Y259600D02*Y256400D01*

+X382912Y258000D02*X386112D01*

+X398441Y315600D02*Y312400D01*

+X396841Y314000D02*X400041D01*

+X398441Y310600D02*Y307400D01*

+X396841Y309000D02*X400041D01*

+X372441Y292289D02*Y289089D01*

+X370841Y290689D02*X374041D01*

+X372441Y352789D02*Y349589D01*

+X370841Y351189D02*X374041D01*

+X383662Y380100D02*Y376900D01*

+X382062Y378500D02*X385262D01*

+X397441Y374600D02*Y371400D01*

+X395841Y373000D02*X399041D01*

+X397941Y369041D02*Y365841D01*

+X396341Y367441D02*X399541D01*

+X15000Y502850D02*Y499650D01*

+X13400Y501250D02*X16600D01*

+X135000Y503500D02*X136500Y500500D01*

+X138000Y503500D01*

+X136500Y500500D02*Y497500D01*

+X139800Y500800D02*X142050D01*

+X139800Y497500D02*X142800D01*

+X139800Y503500D02*Y497500D01*

+Y503500D02*X142800D01*

+X147600D02*X148350Y502750D01*

+X145350Y503500D02*X147600D01*

+X144600Y502750D02*X145350Y503500D01*

+X144600Y502750D02*Y501250D01*

+X145350Y500500D01*

+X147600D01*

+X148350Y499750D01*

+Y498250D01*

+X147600Y497500D02*X148350Y498250D01*

+X145350Y497500D02*X147600D01*

+X144600Y498250D02*X145350Y497500D01*

+X98000Y502750D02*X98750Y503500D01*

+X100250D01*

+X101000Y502750D01*

+X100250Y497500D02*X101000Y498250D01*

+X98750Y497500D02*X100250D01*

+X98000Y498250D02*X98750Y497500D01*

+Y500800D02*X100250D01*

+X101000Y502750D02*Y501550D01*

+Y500050D02*Y498250D01*

+Y500050D02*X100250Y500800D01*

+X101000Y501550D02*X100250Y500800D01*

+X103550Y497500D02*X106550Y503500D01*

+X102800D02*X106550D01*

+X45000Y498250D02*X45750Y497500D01*

+X45000Y502750D02*Y498250D01*

+Y502750D02*X45750Y503500D01*

+X47250D01*

+X48000Y502750D01*

+Y498250D01*

+X47250Y497500D02*X48000Y498250D01*

+X45750Y497500D02*X47250D01*

+X45000Y499000D02*X48000Y502000D01*

+X49800Y497500D02*X50550D01*

+X52350Y498250D02*X53100Y497500D01*

+X52350Y502750D02*Y498250D01*

+Y502750D02*X53100Y503500D01*

+X54600D01*

+X55350Y502750D01*

+Y498250D01*

+X54600Y497500D02*X55350Y498250D01*

+X53100Y497500D02*X54600D01*

+X52350Y499000D02*X55350Y502000D01*

+X57150Y502750D02*X57900Y503500D01*

+X60150D01*

+X60900Y502750D01*

+Y501250D01*

+X57150Y497500D02*X60900Y501250D01*

+X57150Y497500D02*X60900D01*

+X62700Y498250D02*X63450Y497500D01*

+X62700Y502750D02*Y498250D01*

+Y502750D02*X63450Y503500D01*

+X64950D01*

+X65700Y502750D01*

+Y498250D01*

+X64950Y497500D02*X65700Y498250D01*

+X63450Y497500D02*X64950D01*

+X62700Y499000D02*X65700Y502000D01*

+X307716Y275075D02*Y273475D01*

+Y275075D02*X309103Y275875D01*

+X307716Y275075D02*X306329Y275875D01*

+X308992Y271971D02*Y270371D01*

+Y271971D02*X310379Y272771D01*

+X308992Y271971D02*X307605Y272771D01*

+X308872Y266522D02*Y264922D01*

+Y266522D02*X310259Y267322D01*

+X308872Y266522D02*X307485Y267322D01*

+X245557Y279508D02*Y277908D01*

+Y279508D02*X246944Y280308D01*

+X245557Y279508D02*X244170Y280308D01*

+X266413Y296594D02*Y294994D01*

+Y296594D02*X267800Y297394D01*

+X266413Y296594D02*X265026Y297394D01*

+X263240Y295329D02*Y293729D01*

+Y295329D02*X264627Y296129D01*

+X263240Y295329D02*X261853Y296129D01*

+X262740Y291829D02*Y290229D01*

+Y291829D02*X264127Y292629D01*

+X262740Y291829D02*X261353Y292629D01*

+X254740Y298329D02*Y296729D01*

+Y298329D02*X256127Y299129D01*

+X254740Y298329D02*X253353Y299129D01*

+X287917Y307829D02*Y306229D01*

+Y307829D02*X289304Y308629D01*

+X287917Y307829D02*X286530Y308629D01*

+X269653Y298631D02*Y297031D01*

+Y298631D02*X271040Y299431D01*

+X269653Y298631D02*X268266Y299431D01*

+X273229Y298582D02*Y296982D01*

+Y298582D02*X274616Y299382D01*

+X273229Y298582D02*X271842Y299382D01*

+X278225Y279602D02*Y278002D01*

+Y279602D02*X279612Y280402D01*

+X278225Y279602D02*X276838Y280402D01*

+X262750Y268772D02*Y267172D01*

+Y268772D02*X264137Y269572D01*

+X262750Y268772D02*X261363Y269572D01*

+X293902Y282263D02*Y280663D01*

+Y282263D02*X295289Y283063D01*

+X293902Y282263D02*X292515Y283063D01*

+X260341Y284249D02*Y282649D01*

+Y284249D02*X261728Y285049D01*

+X260341Y284249D02*X258954Y285049D01*

+X296779Y304963D02*Y303363D01*

+Y304963D02*X298166Y305763D01*

+X296779Y304963D02*X295392Y305763D01*

+X253101Y261836D02*Y260236D01*

+Y261836D02*X254488Y262636D01*

+X253101Y261836D02*X251714Y262636D01*

+X239302Y262235D02*Y260635D01*

+Y262235D02*X240689Y263035D01*

+X239302Y262235D02*X237915Y263035D01*

+X295937Y243628D02*Y242028D01*

+Y243628D02*X297324Y244428D01*

+X295937Y243628D02*X294550Y244428D01*

+X278207Y298612D02*Y297012D01*

+Y298612D02*X279594Y299412D01*

+X278207Y298612D02*X276820Y299412D01*

+X277174Y308219D02*Y306619D01*

+Y308219D02*X278561Y309019D01*

+X277174Y308219D02*X275787Y309019D01*

+X242456Y293543D02*Y291943D01*

+Y293543D02*X243843Y294343D01*

+X242456Y293543D02*X241069Y294343D01*

+X242168Y298800D02*Y297200D01*

+Y298800D02*X243555Y299600D01*

+X242168Y298800D02*X240781Y299600D01*

+X312157Y300156D02*Y298556D01*

+Y300156D02*X313544Y300956D01*

+X312157Y300156D02*X310770Y300956D01*

+X312122Y295038D02*Y293438D01*

+Y295038D02*X313509Y295838D01*

+X312122Y295038D02*X310735Y295838D01*

+X277449Y347500D02*Y345900D01*

+Y347500D02*X278836Y348300D01*

+X277449Y347500D02*X276062Y348300D01*

+X303365Y330000D02*Y328400D01*

+Y330000D02*X304752Y330800D01*

+X303365Y330000D02*X301978Y330800D01*

+X285430Y325000D02*Y323400D01*

+Y325000D02*X286817Y325800D01*

+X285430Y325000D02*X284043Y325800D01*

+X302941Y340007D02*Y338407D01*

+Y340007D02*X304328Y340807D01*

+X302941Y340007D02*X301554Y340807D01*

+X371602Y260228D02*Y258628D01*

+Y260228D02*X372989Y261028D01*

+X371602Y260228D02*X370215Y261028D01*

+X396441Y235000D02*Y233400D01*

+Y235000D02*X397828Y235800D01*

+X396441Y235000D02*X395054Y235800D01*

+X385941Y366000D02*Y364400D01*

+Y366000D02*X387328Y366800D01*

+X385941Y366000D02*X384554Y366800D01*

+X398441Y291000D02*Y289400D01*

+Y291000D02*X399828Y291800D01*

+X398441Y291000D02*X397054Y291800D01*

+X386023Y157813D02*Y156213D01*

+Y157813D02*X387410Y158613D01*

+X386023Y157813D02*X384636Y158613D01*

+X398441Y173000D02*Y171400D01*

+Y173000D02*X399828Y173800D01*

+X398441Y173000D02*X397054Y173800D01*

+X354441Y85000D02*Y83400D01*

+Y85000D02*X355828Y85800D01*

+X354441Y85000D02*X353054Y85800D01*

+X354441Y89500D02*Y87900D01*

+Y89500D02*X355828Y90300D01*

+X354441Y89500D02*X353054Y90300D01*

+X354441Y95500D02*Y93900D01*

+Y95500D02*X355828Y96300D01*

+X354441Y95500D02*X353054Y96300D01*

+X354441Y101500D02*Y99900D01*

+Y101500D02*X355828Y102300D01*

+X354441Y101500D02*X353054Y102300D01*

+X354441Y107500D02*Y105900D01*

+Y107500D02*X355828Y108300D01*

+X354441Y107500D02*X353054Y108300D01*

+X354441Y113500D02*Y111900D01*

+Y113500D02*X355828Y114300D01*

+X354441Y113500D02*X353054Y114300D01*

+X354441Y119500D02*Y117900D01*

+Y119500D02*X355828Y120300D01*

+X354441Y119500D02*X353054Y120300D01*

+X387441Y119500D02*Y117900D01*

+Y119500D02*X388828Y120300D01*

+X387441Y119500D02*X386054Y120300D01*

+X387441Y113500D02*Y111900D01*

+Y113500D02*X388828Y114300D01*

+X387441Y113500D02*X386054Y114300D01*

+X387441Y107500D02*Y105900D01*

+Y107500D02*X388828Y108300D01*

+X387441Y107500D02*X386054Y108300D01*

+X387441Y101500D02*Y99900D01*

+Y101500D02*X388828Y102300D01*

+X387441Y101500D02*X386054Y102300D01*

+X387441Y89500D02*Y87900D01*

+Y89500D02*X388828Y90300D01*

+X387441Y89500D02*X386054Y90300D01*

+X387441Y85000D02*Y83400D01*

+Y85000D02*X388828Y85800D01*

+X387441Y85000D02*X386054Y85800D01*

+X387441Y95500D02*Y93900D01*

+Y95500D02*X388828Y96300D01*

+X387441Y95500D02*X386054Y96300D01*

+X390941Y76000D02*Y74400D01*

+Y76000D02*X392328Y76800D01*

+X390941Y76000D02*X389554Y76800D01*

+X390941Y71500D02*Y69900D01*

+Y71500D02*X392328Y72300D01*

+X390941Y71500D02*X389554Y72300D01*

+X391441Y66000D02*Y64400D01*

+Y66000D02*X392828Y66800D01*

+X391441Y66000D02*X390054Y66800D01*

+X394941Y58500D02*Y56900D01*

+Y58500D02*X396328Y59300D01*

+X394941Y58500D02*X393554Y59300D01*

+X393941Y51500D02*Y49900D01*

+Y51500D02*X395328Y52300D01*

+X393941Y51500D02*X392554Y52300D01*

+X392441Y45000D02*Y43400D01*

+Y45000D02*X393828Y45800D01*

+X392441Y45000D02*X391054Y45800D01*

+X434449Y56500D02*Y54900D01*

+Y56500D02*X435836Y57300D01*

+X434449Y56500D02*X433062Y57300D01*

+X440449Y56500D02*Y54900D01*

+Y56500D02*X441836Y57300D01*

+X440449Y56500D02*X439062Y57300D01*

+X163941Y127500D02*Y125900D01*

+Y127500D02*X165328Y128300D01*

+X163941Y127500D02*X162554Y128300D01*

+X193390Y127500D02*Y125900D01*

+Y127500D02*X194777Y128300D01*

+X193390Y127500D02*X192003Y128300D01*

+X112222Y127340D02*Y125740D01*

+Y127340D02*X113609Y128140D01*

+X112222Y127340D02*X110835Y128140D01*

+X245441Y127500D02*Y125900D01*

+Y127500D02*X246828Y128300D01*

+X245441Y127500D02*X244054Y128300D01*

+X114441Y121500D02*Y119900D01*

+Y121500D02*X115828Y122300D01*

+X114441Y121500D02*X113054Y122300D01*

+X115441Y132500D02*Y130900D01*

+Y132500D02*X116828Y133300D01*

+X115441Y132500D02*X114054Y133300D01*

+X152441Y121500D02*Y119900D01*

+Y121500D02*X153828Y122300D01*

+X152441Y121500D02*X151054Y122300D01*

+X151941Y132000D02*Y130400D01*

+Y132000D02*X153328Y132800D01*

+X151941Y132000D02*X150554Y132800D01*

+X127941Y148000D02*Y146400D01*

+Y148000D02*X129328Y148800D01*

+X127941Y148000D02*X126554Y148800D01*

+X141441Y148000D02*Y146400D01*

+Y148000D02*X142828Y148800D01*

+X141441Y148000D02*X140054Y148800D01*

+X198441Y122500D02*Y120900D01*

+Y122500D02*X199828Y123300D01*

+X198441Y122500D02*X197054Y123300D01*

+X195441Y133000D02*Y131400D01*

+Y133000D02*X196828Y133800D01*

+X195441Y133000D02*X194054Y133800D01*

+X208941Y148000D02*Y146400D01*

+Y148000D02*X210328Y148800D01*

+X208941Y148000D02*X207554Y148800D01*

+X223941Y148000D02*Y146400D01*

+Y148000D02*X225328Y148800D01*

+X223941Y148000D02*X222554Y148800D01*

+X234441Y122500D02*Y120900D01*

+Y122500D02*X235828Y123300D01*

+X234441Y122500D02*X233054Y123300D01*

+X235941Y133000D02*Y131400D01*

+Y133000D02*X237328Y133800D01*

+X235941Y133000D02*X234554Y133800D01*

+X128941Y274500D02*Y272900D01*

+Y274500D02*X130328Y275300D01*

+X128941Y274500D02*X127554Y275300D01*

+X128941Y268500D02*Y266900D01*

+Y268500D02*X130328Y269300D01*

+X128941Y268500D02*X127554Y269300D01*

+X128941Y262500D02*Y260900D01*

+Y262500D02*X130328Y263300D01*

+X128941Y262500D02*X127554Y263300D01*

+X128941Y255000D02*Y253400D01*

+Y255000D02*X130328Y255800D01*

+X128941Y255000D02*X127554Y255800D01*

+X128941Y248500D02*Y246900D01*

+Y248500D02*X130328Y249300D01*

+X128941Y248500D02*X127554Y249300D01*

+X128941Y242500D02*Y240900D01*

+Y242500D02*X130328Y243300D01*

+X128941Y242500D02*X127554Y243300D01*

+X162441Y242500D02*Y240900D01*

+Y242500D02*X163828Y243300D01*

+X162441Y242500D02*X161054Y243300D01*

+X162441Y248500D02*Y246900D01*

+Y248500D02*X163828Y249300D01*

+X162441Y248500D02*X161054Y249300D01*

+X161941Y255000D02*Y253400D01*

+Y255000D02*X163328Y255800D01*

+X161941Y255000D02*X160554Y255800D01*

+X162441Y262500D02*Y260900D01*

+Y262500D02*X163828Y263300D01*

+X162441Y262500D02*X161054Y263300D01*

+X162941Y268500D02*Y266900D01*

+Y268500D02*X164328Y269300D01*

+X162941Y268500D02*X161554Y269300D01*

+X162941Y274500D02*Y272900D01*

+Y274500D02*X164328Y275300D01*

+X162941Y274500D02*X161554Y275300D01*

+X165941Y231000D02*Y229400D01*

+Y231000D02*X167328Y231800D01*

+X165941Y231000D02*X164554Y231800D01*

+X165941Y226500D02*Y224900D01*

+Y226500D02*X167328Y227300D01*

+X165941Y226500D02*X164554Y227300D01*

+X165941Y220500D02*Y218900D01*

+Y220500D02*X167328Y221300D01*

+X165941Y220500D02*X164554Y221300D01*

+X169441Y214000D02*Y212400D01*

+Y214000D02*X170828Y214800D01*

+X169441Y214000D02*X168054Y214800D01*

+X169441Y208500D02*Y206900D01*

+Y208500D02*X170828Y209300D01*

+X169441Y208500D02*X168054Y209300D01*

+X169441Y201500D02*Y199900D01*

+Y201500D02*X170828Y202300D01*

+X169441Y201500D02*X168054Y202300D01*

+X141307Y300883D02*Y299283D01*

+Y300883D02*X142694Y301683D01*

+X141307Y300883D02*X139920Y301683D01*

+X158441Y323829D02*Y322229D01*

+Y323829D02*X159828Y324629D01*

+X158441Y323829D02*X157054Y324629D01*

+X158441Y328829D02*Y327229D01*

+Y328829D02*X159828Y329629D01*

+X158441Y328829D02*X157054Y329629D01*

+X158441Y326500D02*Y324900D01*

+Y326500D02*X159828Y327300D01*

+X158441Y326500D02*X157054Y327300D01*

+X197441Y314500D02*Y312900D01*

+Y314500D02*X198828Y315300D01*

+X197441Y314500D02*X196054Y315300D01*

+X195441Y311500D02*Y309900D01*

+Y311500D02*X196828Y312300D01*

+X195441Y311500D02*X194054Y312300D01*

+X197441Y308500D02*Y306900D01*

+Y308500D02*X198828Y309300D01*

+X197441Y308500D02*X196054Y309300D01*

+X124831Y302385D02*Y300785D01*

+Y302385D02*X126218Y303185D01*

+X124831Y302385D02*X123444Y303185D01*

+X135441Y338500D02*Y336900D01*

+Y338500D02*X136828Y339300D01*

+X135441Y338500D02*X134054Y339300D01*

+X135441Y335000D02*Y333400D01*

+Y335000D02*X136828Y335800D01*

+X135441Y335000D02*X134054Y335800D01*

+X139941Y338000D02*Y336400D01*

+Y338000D02*X141328Y338800D01*

+X139941Y338000D02*X138554Y338800D01*

+X153941Y338000D02*Y336400D01*

+Y338000D02*X155328Y338800D01*

+X153941Y338000D02*X152554Y338800D01*

+X111941Y334000D02*Y332400D01*

+Y334000D02*X113328Y334800D01*

+X111941Y334000D02*X110554Y334800D01*

+X117941Y334000D02*Y332400D01*

+Y334000D02*X119328Y334800D01*

+X117941Y334000D02*X116554Y334800D01*

+X126441Y334000D02*Y332400D01*

+Y334000D02*X127828Y334800D01*

+X126441Y334000D02*X125054Y334800D01*

+X126441Y340500D02*Y338900D01*

+Y340500D02*X127828Y341300D01*

+X126441Y340500D02*X125054Y341300D01*

+X111941Y341000D02*Y339400D01*

+Y341000D02*X113328Y341800D01*

+X111941Y341000D02*X110554Y341800D01*

+X111941Y357500D02*Y355900D01*

+Y357500D02*X113328Y358300D01*

+X111941Y357500D02*X110554Y358300D01*

+X142441Y357500D02*Y355900D01*

+Y357500D02*X143828Y358300D01*

+X142441Y357500D02*X141054Y358300D01*

+X142441Y349500D02*Y347900D01*

+Y349500D02*X143828Y350300D01*

+X142441Y349500D02*X141054Y350300D01*

+X154941Y345500D02*Y343900D01*

+Y345500D02*X156328Y346300D01*

+X154941Y345500D02*X153554Y346300D01*

+X149441Y349500D02*Y347900D01*

+Y349500D02*X150828Y350300D01*

+X149441Y349500D02*X148054Y350300D01*

+X121941Y357500D02*Y355900D01*

+Y357500D02*X123328Y358300D01*

+X121941Y357500D02*X120554Y358300D01*

+X130941Y357500D02*Y355900D01*

+Y357500D02*X132328Y358300D01*

+X130941Y357500D02*X129554Y358300D01*

+X309441Y141568D02*Y139968D01*

+Y141568D02*X310828Y142368D01*

+X309441Y141568D02*X308054Y142368D01*

+X309441Y136450D02*Y134850D01*

+Y136450D02*X310828Y137250D01*

+X309441Y136450D02*X308054Y137250D01*

+X310941Y115940D02*Y114340D01*

+Y115940D02*X312328Y116740D01*

+X310941Y115940D02*X309554Y116740D01*

+X305696Y107500D02*Y105900D01*

+Y107500D02*X307083Y108300D01*

+X305696Y107500D02*X304309Y108300D01*

+X263441Y320000D02*Y318400D01*

+Y320000D02*X264828Y320800D01*

+X263441Y320000D02*X262054Y320800D01*

+X304584Y207483D02*Y205883D01*

+Y207483D02*X305971Y208283D01*

+X304584Y207483D02*X303197Y208283D01*

+X304706Y210583D02*Y208983D01*

+Y210583D02*X306093Y211383D01*

+X304706Y210583D02*X303319Y211383D01*

+X305280Y204383D02*Y202783D01*

+Y204383D02*X306667Y205183D01*

+X305280Y204383D02*X303893Y205183D01*

+X246941Y238000D02*Y236400D01*

+Y238000D02*X248328Y238800D01*

+X246941Y238000D02*X245554Y238800D01*

+X242441Y229500D02*Y227900D01*

+Y229500D02*X243828Y230300D01*

+X242441Y229500D02*X241054Y230300D01*

+X246441Y229500D02*Y227900D01*

+Y229500D02*X247828Y230300D01*

+X246441Y229500D02*X245054Y230300D01*

+X250941Y229500D02*Y227900D01*

+Y229500D02*X252328Y230300D01*

+X250941Y229500D02*X249554Y230300D01*

+X221884Y254000D02*Y252400D01*

+Y254000D02*X223271Y254800D01*

+X221884Y254000D02*X220497Y254800D01*

+X224441Y252000D02*Y250400D01*

+Y252000D02*X225828Y252800D01*

+X224441Y252000D02*X223054Y252800D01*

+X356441Y233000D02*Y231400D01*

+Y233000D02*X357828Y233800D01*

+X356441Y233000D02*X355054Y233800D01*

+X338441Y224192D02*Y222592D01*

+Y224192D02*X339828Y224992D01*

+X338441Y224192D02*X337054Y224992D01*

+X338441Y230124D02*Y228524D01*

+Y230124D02*X339828Y230924D01*

+X338441Y230124D02*X337054Y230924D01*

+X225441Y249000D02*Y247400D01*

+Y249000D02*X226828Y249800D01*

+X225441Y249000D02*X224054Y249800D01*

+X219441Y272500D02*Y270900D01*

+Y272500D02*X220828Y273300D01*

+X219441Y272500D02*X218054Y273300D01*

+X220729Y265580D02*Y263980D01*

+Y265580D02*X222116Y266380D01*

+X220729Y265580D02*X219342Y266380D01*

+X217441Y279000D02*Y277400D01*

+Y279000D02*X218828Y279800D01*

+X217441Y279000D02*X216054Y279800D01*

+X260568Y316997D02*Y315397D01*

+Y316997D02*X261955Y317797D01*

+X260568Y316997D02*X259181Y317797D01*

+X240391Y278564D02*Y276964D01*

+Y278564D02*X241778Y279364D01*

+X240391Y278564D02*X239004Y279364D01*

+X230441Y293000D02*Y291400D01*

+Y293000D02*X231828Y293800D01*

+X230441Y293000D02*X229054Y293800D01*

+X264034Y282931D02*Y281331D01*

+Y282931D02*X265421Y283731D01*

+X264034Y282931D02*X262647Y283731D01*

+X279441Y285000D02*Y283400D01*

+Y285000D02*X280828Y285800D01*

+X279441Y285000D02*X278054Y285800D01*

+X246731Y303031D02*Y301431D01*

+Y303031D02*X248118Y303831D01*

+X246731Y303031D02*X245344Y303831D01*

+X270441Y336000D02*Y334400D01*

+Y336000D02*X271828Y336800D01*

+X270441Y336000D02*X269054Y336800D01*

+X270441Y342500D02*Y340900D01*

+Y342500D02*X271828Y343300D01*

+X270441Y342500D02*X269054Y343300D01*

+X270441Y349500D02*Y347900D01*

+Y349500D02*X271828Y350300D01*

+X270441Y349500D02*X269054Y350300D01*

+X392188Y239000D02*Y237400D01*

+Y239000D02*X393575Y239800D01*

+X392188Y239000D02*X390801Y239800D01*

+X388207Y247280D02*Y245680D01*

+Y247280D02*X389594Y248080D01*

+X388207Y247280D02*X386820Y248080D01*

+X191363Y344449D02*Y342849D01*

+Y344449D02*X192750Y345249D01*

+X191363Y344449D02*X189976Y345249D01*

+X178887Y342818D02*Y341218D01*

+Y342818D02*X180274Y343618D01*

+X178887Y342818D02*X177500Y343618D01*

+X168732Y350833D02*Y349233D01*

+Y350833D02*X170119Y351633D01*

+X168732Y350833D02*X167345Y351633D01*

+X296727Y256227D02*Y254627D01*

+Y256227D02*X298114Y257027D01*

+X296727Y256227D02*X295340Y257027D01*

+X339837Y341827D02*Y340227D01*

+Y341827D02*X341224Y342627D01*

+X339837Y341827D02*X338450Y342627D01*

+X353390Y339521D02*Y337921D01*

+Y339521D02*X354777Y340321D01*

+X353390Y339521D02*X352003Y340321D01*

+X337441Y163000D02*Y161400D01*

+Y163000D02*X338828Y163800D01*

+X337441Y163000D02*X336054Y163800D01*

+X377347Y162178D02*Y160578D01*

+Y162178D02*X378734Y162978D01*

+X377347Y162178D02*X375960Y162978D01*

+X230441Y247000D02*Y245400D01*

+Y247000D02*X231828Y247800D01*

+X230441Y247000D02*X229054Y247800D01*

+X358941Y208500D02*Y206900D01*

+Y208500D02*X360328Y209300D01*

+X358941Y208500D02*X357554Y209300D01*

+X220441Y259500D02*Y257900D01*

+Y259500D02*X221828Y260300D01*

+X220441Y259500D02*X219054Y260300D01*

+X218441Y261500D02*Y259900D01*

+Y261500D02*X219828Y262300D01*

+X218441Y261500D02*X217054Y262300D01*

+X198441Y262500D02*Y260900D01*

+Y262500D02*X199828Y263300D01*

+X198441Y262500D02*X197054Y263300D01*

+X198441Y269500D02*Y267900D01*

+Y269500D02*X199828Y270300D01*

+X198441Y269500D02*X197054Y270300D01*

+X205441Y277000D02*Y275400D01*

+Y277000D02*X206828Y277800D01*

+X205441Y277000D02*X204054Y277800D01*

+X185441Y228000D02*Y226400D01*

+Y228000D02*X186828Y228800D01*

+X185441Y228000D02*X184054Y228800D01*

+X177441Y228000D02*Y226400D01*

+Y228000D02*X178828Y228800D01*

+X177441Y228000D02*X176054Y228800D01*

+X177441Y217500D02*Y215900D01*

+Y217500D02*X178828Y218300D01*

+X177441Y217500D02*X176054Y218300D01*

+X185441Y217500D02*Y215900D01*

+Y217500D02*X186828Y218300D01*

+X185441Y217500D02*X184054Y218300D01*

+X193941Y212500D02*Y210900D01*

+Y212500D02*X195328Y213300D01*

+X193941Y212500D02*X192554Y213300D01*

+X202441Y212500D02*Y210900D01*

+Y212500D02*X203828Y213300D01*

+X202441Y212500D02*X201054Y213300D01*

+X210441Y212500D02*Y210900D01*

+Y212500D02*X211828Y213300D01*

+X210441Y212500D02*X209054Y213300D01*

+X220441Y215000D02*Y213400D01*

+Y215000D02*X221828Y215800D01*

+X220441Y215000D02*X219054Y215800D01*

+X224941Y220500D02*Y218900D01*

+Y220500D02*X226328Y221300D01*

+X224941Y220500D02*X223554Y221300D01*

+X225441Y226500D02*Y224900D01*

+Y226500D02*X226828Y227300D01*

+X225441Y226500D02*X224054Y227300D01*

+X224941Y235500D02*Y233900D01*

+Y235500D02*X226328Y236300D01*

+X224941Y235500D02*X223554Y236300D01*

+X224441Y244000D02*Y242400D01*

+Y244000D02*X225828Y244800D01*

+X224441Y244000D02*X223054Y244800D01*

+X212941Y238000D02*Y236400D01*

+Y238000D02*X214328Y238800D01*

+X212941Y238000D02*X211554Y238800D01*

+X203941Y237500D02*Y235900D01*

+Y237500D02*X205328Y238300D01*

+X203941Y237500D02*X202554Y238300D01*

+X193941Y237000D02*Y235400D01*

+Y237000D02*X195328Y237800D01*

+X193941Y237000D02*X192554Y237800D01*

+X236441Y235500D02*Y233900D01*

+Y235500D02*X237828Y236300D01*

+X236441Y235500D02*X235054Y236300D01*

+X181941Y258500D02*Y256900D01*

+Y258500D02*X183328Y259300D01*

+X181941Y258500D02*X180554Y259300D01*

+X104441Y204500D02*Y202900D01*

+Y204500D02*X105828Y205300D01*

+X104441Y204500D02*X103054Y205300D01*

+X100941Y204500D02*Y202900D01*

+Y204500D02*X102328Y205300D01*

+X100941Y204500D02*X99554Y205300D01*

+X260941Y191500D02*Y189900D01*

+Y191500D02*X262328Y192300D01*

+X260941Y191500D02*X259554Y192300D01*

+X269441Y198500D02*Y196900D01*

+Y198500D02*X270828Y199300D01*

+X269441Y198500D02*X268054Y199300D01*

+X269941Y231500D02*Y229900D01*

+Y231500D02*X271328Y232300D01*

+X269941Y231500D02*X268554Y232300D01*

+X251941Y210500D02*Y208900D01*

+Y210500D02*X253328Y211300D01*

+X251941Y210500D02*X250554Y211300D01*

+X243941Y202000D02*Y200400D01*

+Y202000D02*X245328Y202800D01*

+X243941Y202000D02*X242554Y202800D01*

+X245863Y191524D02*Y189924D01*

+Y191524D02*X247250Y192324D01*

+X245863Y191524D02*X244476Y192324D01*

+X261502Y307367D02*Y305767D01*

+Y307367D02*X262889Y308167D01*

+X261502Y307367D02*X260115Y308167D01*

+X268941Y314000D02*Y312400D01*

+Y314000D02*X270328Y314800D01*

+X268941Y314000D02*X267554Y314800D01*

+X249101Y328793D02*Y327193D01*

+Y328793D02*X250488Y329593D01*

+X249101Y328793D02*X247714Y329593D01*

+X229818Y354988D02*Y353388D01*

+Y354988D02*X231205Y355788D01*

+X229818Y354988D02*X228431Y355788D01*

+X270441Y357000D02*Y355400D01*

+Y357000D02*X271828Y357800D01*

+X270441Y357000D02*X269054Y357800D01*

+X15000Y516250D02*Y514650D01*

+Y516250D02*X16387Y517050D01*

+X15000Y516250D02*X13613Y517050D01*

+X135000Y518500D02*X136500Y515500D01*

+X138000Y518500D01*

+X136500Y515500D02*Y512500D01*

+X139800Y515800D02*X142050D01*

+X139800Y512500D02*X142800D01*

+X139800Y518500D02*Y512500D01*

+Y518500D02*X142800D01*

+X147600D02*X148350Y517750D01*

+X145350Y518500D02*X147600D01*

+X144600Y517750D02*X145350Y518500D01*

+X144600Y517750D02*Y516250D01*

+X145350Y515500D01*

+X147600D01*

+X148350Y514750D01*

+Y513250D01*

+X147600Y512500D02*X148350Y513250D01*

+X145350Y512500D02*X147600D01*

+X144600Y513250D02*X145350Y512500D01*

+X98000Y517300D02*X99200Y518500D01*

+Y512500D01*

+X98000D02*X100250D01*

+X102800D02*X105050Y515500D01*

+Y517750D02*Y515500D01*

+X104300Y518500D02*X105050Y517750D01*

+X102800Y518500D02*X104300D01*

+X102050Y517750D02*X102800Y518500D01*

+X102050Y517750D02*Y516250D01*

+X102800Y515500D01*

+X105050D01*

+X106850Y517750D02*X107600Y518500D01*

+X109850D01*

+X110600Y517750D01*

+Y516250D01*

+X106850Y512500D02*X110600Y516250D01*

+X106850Y512500D02*X110600D01*

+X45000Y513250D02*X45750Y512500D01*

+X45000Y517750D02*Y513250D01*

+Y517750D02*X45750Y518500D01*

+X47250D01*

+X48000Y517750D01*

+Y513250D01*

+X47250Y512500D02*X48000Y513250D01*

+X45750Y512500D02*X47250D01*

+X45000Y514000D02*X48000Y517000D01*

+X49800Y512500D02*X50550D01*

+X52350Y513250D02*X53100Y512500D01*

+X52350Y517750D02*Y513250D01*

+Y517750D02*X53100Y518500D01*

+X54600D01*

+X55350Y517750D01*

+Y513250D01*

+X54600Y512500D02*X55350Y513250D01*

+X53100Y512500D02*X54600D01*

+X52350Y514000D02*X55350Y517000D01*

+X57150Y517300D02*X58350Y518500D01*

+Y512500D01*

+X57150D02*X59400D01*

+X61200Y513250D02*X61950Y512500D01*

+X61200Y517750D02*Y513250D01*

+Y517750D02*X61950Y518500D01*

+X63450D01*

+X64200Y517750D01*

+Y513250D01*

+X63450Y512500D02*X64200Y513250D01*

+X61950Y512500D02*X63450D01*

+X61200Y514000D02*X64200Y517000D01*

+X3000Y533500D02*X3750Y532750D01*

+X750Y533500D02*X3000D01*

+X0Y532750D02*X750Y533500D01*

+X0Y532750D02*Y531250D01*

+X750Y530500D01*

+X3000D01*

+X3750Y529750D01*

+Y528250D01*

+X3000Y527500D02*X3750Y528250D01*

+X750Y527500D02*X3000D01*

+X0Y528250D02*X750Y527500D01*

+X5550Y530500D02*Y528250D01*

+X6300Y527500D01*

+X8550Y530500D02*Y526000D01*

+X7800Y525250D02*X8550Y526000D01*

+X6300Y525250D02*X7800D01*

+X5550Y526000D02*X6300Y525250D01*

+Y527500D02*X7800D01*

+X8550Y528250D01*

+X11100Y529750D02*Y527500D01*

+Y529750D02*X11850Y530500D01*

+X12600D01*

+X13350Y529750D01*

+Y527500D01*

+Y529750D02*X14100Y530500D01*

+X14850D01*

+X15600Y529750D01*

+Y527500D01*

+X10350Y530500D02*X11100Y529750D01*

+X17400Y533500D02*Y527500D01*

+Y528250D02*X18150Y527500D01*

+X19650D01*

+X20400Y528250D01*

+Y529750D02*Y528250D01*

+X19650Y530500D02*X20400Y529750D01*

+X18150Y530500D02*X19650D01*

+X17400Y529750D02*X18150Y530500D01*

+X22200Y529750D02*Y528250D01*

+Y529750D02*X22950Y530500D01*

+X24450D01*

+X25200Y529750D01*

+Y528250D01*

+X24450Y527500D02*X25200Y528250D01*

+X22950Y527500D02*X24450D01*

+X22200Y528250D02*X22950Y527500D01*

+X27000Y533500D02*Y528250D01*

+X27750Y527500D01*

+X0Y524250D02*X29250D01*

+X41750Y533500D02*Y527500D01*

+X43700Y533500D02*X44750Y532450D01*

+Y528550D01*

+X43700Y527500D02*X44750Y528550D01*

+X41000Y527500D02*X43700D01*

+X41000Y533500D02*X43700D01*

+G54D317*X46550Y532000D02*Y531850D01*

+G54D316*Y529750D02*Y527500D01*

+X50300Y530500D02*X51050Y529750D01*

+X48800Y530500D02*X50300D01*

+X48050Y529750D02*X48800Y530500D01*

+X48050Y529750D02*Y528250D01*

+X48800Y527500D01*

+X51050Y530500D02*Y528250D01*

+X51800Y527500D01*

+X48800D02*X50300D01*

+X51050Y528250D01*

+X54350Y529750D02*Y527500D01*

+Y529750D02*X55100Y530500D01*

+X55850D01*

+X56600Y529750D01*

+Y527500D01*

+Y529750D02*X57350Y530500D01*

+X58100D01*

+X58850Y529750D01*

+Y527500D01*

+X53600Y530500D02*X54350Y529750D01*

+X60650Y527500D02*X61400D01*

+X65900Y528250D02*X66650Y527500D01*

+X65900Y532750D02*X66650Y533500D01*

+X65900Y532750D02*Y528250D01*

+X68450Y533500D02*X69950D01*

+X69200D02*Y527500D01*

+X68450D02*X69950D01*

+X72500Y529750D02*Y527500D01*

+Y529750D02*X73250Y530500D01*

+X74000D01*

+X74750Y529750D01*

+Y527500D01*

+X71750Y530500D02*X72500Y529750D01*

+X77300Y530500D02*X79550D01*

+X76550Y529750D02*X77300Y530500D01*

+X76550Y529750D02*Y528250D01*

+X77300Y527500D01*

+X79550D01*

+X81350Y533500D02*Y527500D01*

+Y529750D02*X82100Y530500D01*

+X83600D01*

+X84350Y529750D01*

+Y527500D01*

+X86150Y533500D02*X86900Y532750D01*

+Y528250D01*

+X86150Y527500D02*X86900Y528250D01*

+X41000Y524250D02*X88700D01*

+X96050Y527500D02*X98000D01*

+X95000Y528550D02*X96050Y527500D01*

+X95000Y532450D02*Y528550D01*

+Y532450D02*X96050Y533500D01*

+X98000D01*

+X99800Y529750D02*Y528250D01*

+Y529750D02*X100550Y530500D01*

+X102050D01*

+X102800Y529750D01*

+Y528250D01*

+X102050Y527500D02*X102800Y528250D01*

+X100550Y527500D02*X102050D01*

+X99800Y528250D02*X100550Y527500D01*

+X104600Y530500D02*Y528250D01*

+X105350Y527500D01*

+X106850D01*

+X107600Y528250D01*

+Y530500D02*Y528250D01*

+X110150Y529750D02*Y527500D01*

+Y529750D02*X110900Y530500D01*

+X111650D01*

+X112400Y529750D01*

+Y527500D01*

+X109400Y530500D02*X110150Y529750D01*

+X114950Y533500D02*Y528250D01*

+X115700Y527500D01*

+X114200Y531250D02*X115700D01*

+X95000Y524250D02*X117200D01*

+X130750Y533500D02*Y527500D01*

+X130000Y533500D02*X133000D01*

+X133750Y532750D01*

+Y531250D01*

+X133000Y530500D02*X133750Y531250D01*

+X130750Y530500D02*X133000D01*

+X135550Y533500D02*Y528250D01*

+X136300Y527500D01*

+X140050Y530500D02*X140800Y529750D01*

+X138550Y530500D02*X140050D01*

+X137800Y529750D02*X138550Y530500D01*

+X137800Y529750D02*Y528250D01*

+X138550Y527500D01*

+X140800Y530500D02*Y528250D01*

+X141550Y527500D01*

+X138550D02*X140050D01*

+X140800Y528250D01*

+X144100Y533500D02*Y528250D01*

+X144850Y527500D01*

+X143350Y531250D02*X144850D01*

+X147100Y527500D02*X149350D01*

+X146350Y528250D02*X147100Y527500D01*

+X146350Y529750D02*Y528250D01*

+Y529750D02*X147100Y530500D01*

+X148600D01*

+X149350Y529750D01*

+X146350Y529000D02*X149350D01*

+Y529750D02*Y529000D01*

+X154150Y533500D02*Y527500D01*

+X153400D02*X154150Y528250D01*

+X151900Y527500D02*X153400D01*

+X151150Y528250D02*X151900Y527500D01*

+X151150Y529750D02*Y528250D01*

+Y529750D02*X151900Y530500D01*

+X153400D01*

+X154150Y529750D01*

+X157450Y530500D02*Y529750D01*

+Y528250D02*Y527500D01*

+X155950Y532750D02*Y532000D01*

+Y532750D02*X156700Y533500D01*

+X158200D01*

+X158950Y532750D01*

+Y532000D01*

+X157450Y530500D02*X158950Y532000D01*

+X130000Y524250D02*X160750D01*

+X0Y548500D02*X3000D01*

+X1500D02*Y542500D01*

+X4800Y548500D02*Y542500D01*

+Y544750D02*X5550Y545500D01*

+X7050D01*

+X7800Y544750D01*

+Y542500D01*

+X10350D02*X12600D01*

+X9600Y543250D02*X10350Y542500D01*

+X9600Y544750D02*Y543250D01*

+Y544750D02*X10350Y545500D01*

+X11850D01*

+X12600Y544750D01*

+X9600Y544000D02*X12600D01*

+Y544750D02*Y544000D01*

+X15150Y544750D02*Y542500D01*

+Y544750D02*X15900Y545500D01*

+X17400D01*

+X14400D02*X15150Y544750D01*

+X19950Y542500D02*X22200D01*

+X19200Y543250D02*X19950Y542500D01*

+X19200Y544750D02*Y543250D01*

+Y544750D02*X19950Y545500D01*

+X21450D01*

+X22200Y544750D01*

+X19200Y544000D02*X22200D01*

+Y544750D02*Y544000D01*

+X28950Y545500D02*X29700Y544750D01*

+X27450Y545500D02*X28950D01*

+X26700Y544750D02*X27450Y545500D01*

+X26700Y544750D02*Y543250D01*

+X27450Y542500D01*

+X29700Y545500D02*Y543250D01*

+X30450Y542500D01*

+X27450D02*X28950D01*

+X29700Y543250D01*

+X33000Y544750D02*Y542500D01*

+Y544750D02*X33750Y545500D01*

+X35250D01*

+X32250D02*X33000Y544750D01*

+X37800Y542500D02*X40050D01*

+X37050Y543250D02*X37800Y542500D01*

+X37050Y544750D02*Y543250D01*

+Y544750D02*X37800Y545500D01*

+X39300D01*

+X40050Y544750D01*

+X37050Y544000D02*X40050D01*

+Y544750D02*Y544000D01*

+X44550Y543250D02*X45300Y542500D01*

+X44550Y544450D02*Y543250D01*

+Y544450D02*X45600Y545500D01*

+X46500D01*

+X47550Y544450D01*

+Y543250D01*

+X46800Y542500D02*X47550Y543250D01*

+X45300Y542500D02*X46800D01*

+X44550Y546550D02*X45600Y545500D01*

+X44550Y547750D02*Y546550D01*

+Y547750D02*X45300Y548500D01*

+X46800D01*

+X47550Y547750D01*

+Y546550D01*

+X46500Y545500D02*X47550Y546550D01*

+X55050Y548500D02*Y542500D01*

+X54300D02*X55050Y543250D01*

+X52800Y542500D02*X54300D01*

+X52050Y543250D02*X52800Y542500D01*

+X52050Y544750D02*Y543250D01*

+Y544750D02*X52800Y545500D01*

+X54300D01*

+X55050Y544750D01*

+G54D317*X56850Y547000D02*Y546850D01*

+G54D316*Y544750D02*Y542500D01*

+X59100Y547750D02*Y542500D01*

+Y547750D02*X59850Y548500D01*

+X60600D01*

+X58350Y545500D02*X59850D01*

+X62850Y547750D02*Y542500D01*

+Y547750D02*X63600Y548500D01*

+X64350D01*

+X62100Y545500D02*X63600D01*

+X66600Y542500D02*X68850D01*

+X65850Y543250D02*X66600Y542500D01*

+X65850Y544750D02*Y543250D01*

+Y544750D02*X66600Y545500D01*

+X68100D01*

+X68850Y544750D01*

+X65850Y544000D02*X68850D01*

+Y544750D02*Y544000D01*

+X71400Y544750D02*Y542500D01*

+Y544750D02*X72150Y545500D01*

+X73650D01*

+X70650D02*X71400Y544750D01*

+X76200Y542500D02*X78450D01*

+X75450Y543250D02*X76200Y542500D01*

+X75450Y544750D02*Y543250D01*

+Y544750D02*X76200Y545500D01*

+X77700D01*

+X78450Y544750D01*

+X75450Y544000D02*X78450D01*

+Y544750D02*Y544000D01*

+X81000Y544750D02*Y542500D01*

+Y544750D02*X81750Y545500D01*

+X82500D01*

+X83250Y544750D01*

+Y542500D01*

+X80250Y545500D02*X81000Y544750D01*

+X85800Y548500D02*Y543250D01*

+X86550Y542500D01*

+X85050Y546250D02*X86550D01*

+X93750Y548500D02*Y542500D01*

+X93000D02*X93750Y543250D01*

+X91500Y542500D02*X93000D01*

+X90750Y543250D02*X91500Y542500D01*

+X90750Y544750D02*Y543250D01*

+Y544750D02*X91500Y545500D01*

+X93000D01*

+X93750Y544750D01*

+X96300D02*Y542500D01*

+Y544750D02*X97050Y545500D01*

+X98550D01*

+X95550D02*X96300Y544750D01*

+G54D317*X100350Y547000D02*Y546850D01*

+G54D316*Y544750D02*Y542500D01*

+X101850Y548500D02*Y543250D01*

+X102600Y542500D01*

+X104100Y548500D02*Y543250D01*

+X104850Y542500D01*

+X109800D02*X112050D01*

+X112800Y543250D01*

+X112050Y544000D02*X112800Y543250D01*

+X109800Y544000D02*X112050D01*

+X109050Y544750D02*X109800Y544000D01*

+X109050Y544750D02*X109800Y545500D01*

+X112050D01*

+X112800Y544750D01*

+X109050Y543250D02*X109800Y542500D01*

+G54D317*X114600Y547000D02*Y546850D01*

+G54D316*Y544750D02*Y542500D01*

+X116100Y545500D02*X119100D01*

+X116100Y542500D02*X119100Y545500D01*

+X116100Y542500D02*X119100D01*

+X121650D02*X123900D01*

+X120900Y543250D02*X121650Y542500D01*

+X120900Y544750D02*Y543250D01*

+Y544750D02*X121650Y545500D01*

+X123150D01*

+X123900Y544750D01*

+X120900Y544000D02*X123900D01*

+Y544750D02*Y544000D01*

+X126450Y542500D02*X128700D01*

+X129450Y543250D01*

+X128700Y544000D02*X129450Y543250D01*

+X126450Y544000D02*X128700D01*

+X125700Y544750D02*X126450Y544000D01*

+X125700Y544750D02*X126450Y545500D01*

+X128700D01*

+X129450Y544750D01*

+X125700Y543250D02*X126450Y542500D01*

+X133950Y545500D02*Y543250D01*

+X134700Y542500D01*

+X136200D01*

+X136950Y543250D01*

+Y545500D02*Y543250D01*

+X139500Y542500D02*X141750D01*

+X142500Y543250D01*

+X141750Y544000D02*X142500Y543250D01*

+X139500Y544000D02*X141750D01*

+X138750Y544750D02*X139500Y544000D01*

+X138750Y544750D02*X139500Y545500D01*

+X141750D01*

+X142500Y544750D01*

+X138750Y543250D02*X139500Y542500D01*

+X145050D02*X147300D01*

+X144300Y543250D02*X145050Y542500D01*

+X144300Y544750D02*Y543250D01*

+Y544750D02*X145050Y545500D01*

+X146550D01*

+X147300Y544750D01*

+X144300Y544000D02*X147300D01*

+Y544750D02*Y544000D01*

+X152100Y548500D02*Y542500D01*

+X151350D02*X152100Y543250D01*

+X149850Y542500D02*X151350D01*

+X149100Y543250D02*X149850Y542500D01*

+X149100Y544750D02*Y543250D01*

+Y544750D02*X149850Y545500D01*

+X151350D01*

+X152100Y544750D01*

+G54D317*X156600Y547000D02*Y546850D01*

+G54D316*Y544750D02*Y542500D01*

+X158850Y544750D02*Y542500D01*

+Y544750D02*X159600Y545500D01*

+X160350D01*

+X161100Y544750D01*

+Y542500D01*

+X158100Y545500D02*X158850Y544750D01*

+X166350Y548500D02*Y543250D01*

+X167100Y542500D01*

+X165600Y546250D02*X167100D01*

+X168600Y548500D02*Y542500D01*

+Y544750D02*X169350Y545500D01*

+X170850D01*

+X171600Y544750D01*

+Y542500D01*

+G54D317*X173400Y547000D02*Y546850D01*

+G54D316*Y544750D02*Y542500D01*

+X175650D02*X177900D01*

+X178650Y543250D01*

+X177900Y544000D02*X178650Y543250D01*

+X175650Y544000D02*X177900D01*

+X174900Y544750D02*X175650Y544000D01*

+X174900Y544750D02*X175650Y545500D01*

+X177900D01*

+X178650Y544750D01*

+X174900Y543250D02*X175650Y542500D01*

+X183150Y548500D02*Y543250D01*

+X183900Y542500D01*

+X187650Y545500D02*X188400Y544750D01*

+X186150Y545500D02*X187650D01*

+X185400Y544750D02*X186150Y545500D01*

+X185400Y544750D02*Y543250D01*

+X186150Y542500D01*

+X188400Y545500D02*Y543250D01*

+X189150Y542500D01*

+X186150D02*X187650D01*

+X188400Y543250D01*

+X190950Y545500D02*Y543250D01*

+X191700Y542500D01*

+X193950Y545500D02*Y541000D01*

+X193200Y540250D02*X193950Y541000D01*

+X191700Y540250D02*X193200D01*

+X190950Y541000D02*X191700Y540250D01*

+Y542500D02*X193200D01*

+X193950Y543250D01*

+X195750Y544750D02*Y543250D01*

+Y544750D02*X196500Y545500D01*

+X198000D01*

+X198750Y544750D01*

+Y543250D01*

+X198000Y542500D02*X198750Y543250D01*

+X196500Y542500D02*X198000D01*

+X195750Y543250D02*X196500Y542500D01*

+X200550Y545500D02*Y543250D01*

+X201300Y542500D01*

+X202800D01*

+X203550Y543250D01*

+Y545500D02*Y543250D01*

+X206100Y548500D02*Y543250D01*

+X206850Y542500D01*

+X205350Y546250D02*X206850D01*

+X208350Y541000D02*X209850Y542500D01*

+X214350Y544750D02*X217350Y548500D01*

+X214350Y544750D02*X218100D01*

+X217350Y548500D02*Y542500D01*

+X219900Y547750D02*X220650Y548500D01*

+X222150D01*

+X222900Y547750D01*

+X222150Y542500D02*X222900Y543250D01*

+X220650Y542500D02*X222150D01*

+X219900Y543250D02*X220650Y542500D01*

+Y545800D02*X222150D01*

+X222900Y547750D02*Y546550D01*

+Y545050D02*Y543250D01*

+Y545050D02*X222150Y545800D01*

+X222900Y546550D02*X222150Y545800D01*

+X224700Y547750D02*X225450Y548500D01*

+X227700D01*

+X228450Y547750D01*

+Y546250D01*

+X224700Y542500D02*X228450Y546250D01*

+X224700Y542500D02*X228450D01*

+X232950Y548500D02*Y542500D01*

+Y544750D02*X233700Y545500D01*

+X235200D01*

+X235950Y544750D01*

+Y542500D01*

+X237750Y544750D02*Y543250D01*

+Y544750D02*X238500Y545500D01*

+X240000D01*

+X240750Y544750D01*

+Y543250D01*

+X240000Y542500D02*X240750Y543250D01*

+X238500Y542500D02*X240000D01*

+X237750Y543250D02*X238500Y542500D01*

+X242550Y548500D02*Y543250D01*

+X243300Y542500D01*

+X245550D02*X247800D01*

+X244800Y543250D02*X245550Y542500D01*

+X244800Y544750D02*Y543250D01*

+Y544750D02*X245550Y545500D01*

+X247050D01*

+X247800Y544750D01*

+X244800Y544000D02*X247800D01*

+Y544750D02*Y544000D01*

+X250350Y542500D02*X252600D01*

+X253350Y543250D01*

+X252600Y544000D02*X253350Y543250D01*

+X250350Y544000D02*X252600D01*

+X249600Y544750D02*X250350Y544000D01*

+X249600Y544750D02*X250350Y545500D01*

+X252600D01*

+X253350Y544750D01*

+X249600Y543250D02*X250350Y542500D01*

+X258600Y548500D02*Y543250D01*

+X259350Y542500D01*

+X257850Y546250D02*X259350D01*

+X260850Y544750D02*Y543250D01*

+Y544750D02*X261600Y545500D01*

+X263100D01*

+X263850Y544750D01*

+Y543250D01*

+X263100Y542500D02*X263850Y543250D01*

+X261600Y542500D02*X263100D01*

+X260850Y543250D02*X261600Y542500D01*

+X266400Y548500D02*Y543250D01*

+X267150Y542500D01*

+X265650Y546250D02*X267150D01*

+X270900Y545500D02*X271650Y544750D01*

+X269400Y545500D02*X270900D01*

+X268650Y544750D02*X269400Y545500D01*

+X268650Y544750D02*Y543250D01*

+X269400Y542500D01*

+X271650Y545500D02*Y543250D01*

+X272400Y542500D01*

+X269400D02*X270900D01*

+X271650Y543250D01*

+X274200Y548500D02*Y543250D01*

+X274950Y542500D01*

+G54D318*X74500Y399800D02*X478100D01*

+X484600Y393300D02*Y42000D01*

+X479100Y35500D02*X73500D01*

+X68000Y42000D02*Y244000D01*

+X74500Y250500D02*X101000D01*

+X107500Y256000D02*Y312500D01*

+X101000Y319000D02*X74500D01*

+X68000Y325500D02*Y393300D01*

+X478100Y399800D02*G75*G02X484600Y393300I0J-6500D01*G01*

+Y42000D02*G75*G02X478100Y35500I-6500J0D01*G01*

+X74500D02*G75*G02X68000Y42000I0J6500D01*G01*

+Y244000D02*G75*G02X74500Y250500I6500J0D01*G01*

+X107500Y257000D02*G75*G02X101000Y250500I-6500J0D01*G01*

+Y319000D02*G75*G02X107500Y312500I0J-6500D01*G01*

+X74500Y319000D02*G75*G02X68000Y325500I0J6500D01*G01*

+Y393300D02*G75*G02X74500Y399800I6500J0D01*G01*

+G54D316*X163675Y-9500D02*X166675D01*

+X167425Y-8750D01*

+Y-6950D02*Y-8750D01*

+X166675Y-6200D02*X167425Y-6950D01*

+X164425Y-6200D02*X166675D01*

+X164425Y-3500D02*Y-9500D01*

+X163675Y-3500D02*X166675D01*

+X167425Y-4250D01*

+Y-5450D01*

+X166675Y-6200D02*X167425Y-5450D01*

+X169225Y-7250D02*Y-8750D01*

+Y-7250D02*X169975Y-6500D01*

+X171475D01*

+X172225Y-7250D01*

+Y-8750D01*

+X171475Y-9500D02*X172225Y-8750D01*

+X169975Y-9500D02*X171475D01*

+X169225Y-8750D02*X169975Y-9500D01*

+X176275Y-6500D02*X177025Y-7250D01*

+X174775Y-6500D02*X176275D01*

+X174025Y-7250D02*X174775Y-6500D01*

+X174025Y-7250D02*Y-8750D01*

+X174775Y-9500D01*

+X177025Y-6500D02*Y-8750D01*

+X177775Y-9500D01*

+X174775D02*X176275D01*

+X177025Y-8750D01*

+X180325Y-7250D02*Y-9500D01*

+Y-7250D02*X181075Y-6500D01*

+X182575D01*

+X179575D02*X180325Y-7250D01*

+X187375Y-3500D02*Y-9500D01*

+X186625D02*X187375Y-8750D01*

+X185125Y-9500D02*X186625D01*

+X184375Y-8750D02*X185125Y-9500D01*

+X184375Y-7250D02*Y-8750D01*

+Y-7250D02*X185125Y-6500D01*

+X186625D01*

+X187375Y-7250D01*

+X191875D02*Y-8750D01*

+Y-7250D02*X192625Y-6500D01*

+X194125D01*

+X194875Y-7250D01*

+Y-8750D01*

+X194125Y-9500D02*X194875Y-8750D01*

+X192625Y-9500D02*X194125D01*

+X191875Y-8750D02*X192625Y-9500D01*

+X196675Y-6500D02*Y-8750D01*

+X197425Y-9500D01*

+X198925D01*

+X199675Y-8750D01*

+Y-6500D02*Y-8750D01*

+X202225Y-3500D02*Y-8750D01*

+X202975Y-9500D01*

+X201475Y-5750D02*X202975D01*

+X204475Y-3500D02*Y-8750D01*

+X205225Y-9500D01*

+G54D317*X206725Y-5000D02*Y-5150D01*

+G54D316*Y-7250D02*Y-9500D01*

+X208975Y-7250D02*Y-9500D01*

+Y-7250D02*X209725Y-6500D01*

+X210475D01*

+X211225Y-7250D01*

+Y-9500D01*

+X208225Y-6500D02*X208975Y-7250D01*

+X213775Y-9500D02*X216025D01*

+X213025Y-8750D02*X213775Y-9500D01*

+X213025Y-7250D02*Y-8750D01*

+Y-7250D02*X213775Y-6500D01*

+X215275D01*

+X216025Y-7250D01*

+X213025Y-8000D02*X216025D01*

+Y-7250D02*Y-8000D01*

+G54D317*X220525Y-5000D02*Y-5150D01*

+G54D316*Y-7250D02*Y-9500D01*

+X222775D02*X225025D01*

+X225775Y-8750D01*

+X225025Y-8000D02*X225775Y-8750D01*

+X222775Y-8000D02*X225025D01*

+X222025Y-7250D02*X222775Y-8000D01*

+X222025Y-7250D02*X222775Y-6500D01*

+X225025D01*

+X225775Y-7250D01*

+X222025Y-8750D02*X222775Y-9500D01*

+X231025Y-3500D02*Y-8750D01*

+X231775Y-9500D01*

+X230275Y-5750D02*X231775D01*

+X233275Y-3500D02*Y-9500D01*

+Y-7250D02*X234025Y-6500D01*

+X235525D01*

+X236275Y-7250D01*

+Y-9500D01*

+X238825D02*X241075D01*

+X238075Y-8750D02*X238825Y-9500D01*

+X238075Y-7250D02*Y-8750D01*

+Y-7250D02*X238825Y-6500D01*

+X240325D01*

+X241075Y-7250D01*

+X238075Y-8000D02*X241075D01*

+Y-7250D02*Y-8000D01*

+X246325Y-6500D02*X248575D01*

+X245575Y-7250D02*X246325Y-6500D01*

+X245575Y-7250D02*Y-8750D01*

+X246325Y-9500D01*

+X248575D01*

+X251125D02*X253375D01*

+X250375Y-8750D02*X251125Y-9500D01*

+X250375Y-7250D02*Y-8750D01*

+Y-7250D02*X251125Y-6500D01*

+X252625D01*

+X253375Y-7250D01*

+X250375Y-8000D02*X253375D01*

+Y-7250D02*Y-8000D01*

+X255925Y-7250D02*Y-9500D01*

+Y-7250D02*X256675Y-6500D01*

+X257425D01*

+X258175Y-7250D01*

+Y-9500D01*

+X255175Y-6500D02*X255925Y-7250D01*

+X260725Y-3500D02*Y-8750D01*

+X261475Y-9500D01*

+X259975Y-5750D02*X261475D01*

+X263725Y-9500D02*X265975D01*

+X262975Y-8750D02*X263725Y-9500D01*

+X262975Y-7250D02*Y-8750D01*

+Y-7250D02*X263725Y-6500D01*

+X265225D01*

+X265975Y-7250D01*

+X262975Y-8000D02*X265975D01*

+Y-7250D02*Y-8000D01*

+X268525Y-7250D02*Y-9500D01*

+Y-7250D02*X269275Y-6500D01*

+X270775D01*

+X267775D02*X268525Y-7250D01*

+X272575Y-3500D02*Y-8750D01*

+X273325Y-9500D01*

+G54D317*X274825Y-5000D02*Y-5150D01*

+G54D316*Y-7250D02*Y-9500D01*

+X277075Y-7250D02*Y-9500D01*

+Y-7250D02*X277825Y-6500D01*

+X278575D01*

+X279325Y-7250D01*

+Y-9500D01*

+X276325Y-6500D02*X277075Y-7250D01*

+X281875Y-9500D02*X284125D01*

+X281125Y-8750D02*X281875Y-9500D01*

+X281125Y-7250D02*Y-8750D01*

+Y-7250D02*X281875Y-6500D01*

+X283375D01*

+X284125Y-7250D01*

+X281125Y-8000D02*X284125D01*

+Y-7250D02*Y-8000D01*

+X288625Y-7250D02*Y-8750D01*

+Y-7250D02*X289375Y-6500D01*

+X290875D01*

+X291625Y-7250D01*

+Y-8750D01*

+X290875Y-9500D02*X291625Y-8750D01*

+X289375Y-9500D02*X290875D01*

+X288625Y-8750D02*X289375Y-9500D01*

+X294175Y-4250D02*Y-9500D01*

+Y-4250D02*X294925Y-3500D01*

+X295675D01*

+X293425Y-6500D02*X294925D01*

+X300625Y-3500D02*Y-8750D01*

+X301375Y-9500D01*

+X299875Y-5750D02*X301375D01*

+X302875Y-3500D02*Y-9500D01*

+Y-7250D02*X303625Y-6500D01*

+X305125D01*

+X305875Y-7250D01*

+Y-9500D01*

+G54D317*X307675Y-5000D02*Y-5150D01*

+G54D316*Y-7250D02*Y-9500D01*

+X309925D02*X312175D01*

+X312925Y-8750D01*

+X312175Y-8000D02*X312925Y-8750D01*

+X309925Y-8000D02*X312175D01*

+X309175Y-7250D02*X309925Y-8000D01*

+X309175Y-7250D02*X309925Y-6500D01*

+X312175D01*

+X312925Y-7250D01*

+X309175Y-8750D02*X309925Y-9500D01*

+X318175Y-7250D02*Y-11750D01*

+X317425Y-6500D02*X318175Y-7250D01*

+X318925Y-6500D01*

+X320425D01*

+X321175Y-7250D01*

+Y-8750D01*

+X320425Y-9500D02*X321175Y-8750D01*

+X318925Y-9500D02*X320425D01*

+X318175Y-8750D02*X318925Y-9500D01*

+X325225Y-6500D02*X325975Y-7250D01*

+X323725Y-6500D02*X325225D01*

+X322975Y-7250D02*X323725Y-6500D01*

+X322975Y-7250D02*Y-8750D01*

+X323725Y-9500D01*

+X325975Y-6500D02*Y-8750D01*

+X326725Y-9500D01*

+X323725D02*X325225D01*

+X325975Y-8750D01*

+X329275Y-3500D02*Y-8750D01*

+X330025Y-9500D01*

+X328525Y-5750D02*X330025D01*

+X331525Y-3500D02*Y-9500D01*

+Y-7250D02*X332275Y-6500D01*

+X333775D01*

+X334525Y-7250D01*

+Y-9500D01*

+X200750Y428500D02*Y422500D01*

+X202700Y428500D02*X203750Y427450D01*

+Y423550D01*

+X202700Y422500D02*X203750Y423550D01*

+X200000Y422500D02*X202700D01*

+X200000Y428500D02*X202700D01*

+X207800Y425500D02*X208550Y424750D01*

+X206300Y425500D02*X207800D01*

+X205550Y424750D02*X206300Y425500D01*

+X205550Y424750D02*Y423250D01*

+X206300Y422500D01*

+X208550Y425500D02*Y423250D01*

+X209300Y422500D01*

+X206300D02*X207800D01*

+X208550Y423250D01*

+X211850Y428500D02*Y423250D01*

+X212600Y422500D01*

+X211100Y426250D02*X212600D01*

+X214850Y422500D02*X217100D01*

+X214100Y423250D02*X214850Y422500D01*

+X214100Y424750D02*Y423250D01*

+Y424750D02*X214850Y425500D01*

+X216350D01*

+X217100Y424750D01*

+X214100Y424000D02*X217100D01*

+Y424750D02*Y424000D01*

+X218900Y426250D02*X219650D01*

+X218900Y424750D02*X219650D01*

+X224150Y428500D02*X227150D01*

+X225650D02*Y422500D01*

+X228950Y428500D02*Y422500D01*

+Y424750D02*X229700Y425500D01*

+X231200D01*

+X231950Y424750D01*

+Y422500D01*

+X233750Y425500D02*Y423250D01*

+X234500Y422500D01*

+X236000D01*

+X236750Y423250D01*

+Y425500D02*Y423250D01*

+X242000Y428500D02*Y422500D01*

+X243950Y428500D02*X245000Y427450D01*

+Y423550D01*

+X243950Y422500D02*X245000Y423550D01*

+X241250Y422500D02*X243950D01*

+X241250Y428500D02*X243950D01*

+X247550Y422500D02*X249800D01*

+X246800Y423250D02*X247550Y422500D01*

+X246800Y424750D02*Y423250D01*

+Y424750D02*X247550Y425500D01*

+X249050D01*

+X249800Y424750D01*

+X246800Y424000D02*X249800D01*

+Y424750D02*Y424000D01*

+X252350Y425500D02*X254600D01*

+X251600Y424750D02*X252350Y425500D01*

+X251600Y424750D02*Y423250D01*

+X252350Y422500D01*

+X254600D01*

+X261800Y428500D02*X264800D01*

+X261800D02*Y425500D01*

+X262550Y426250D01*

+X264050D01*

+X264800Y425500D01*

+Y423250D01*

+X264050Y422500D02*X264800Y423250D01*

+X262550Y422500D02*X264050D01*

+X261800Y423250D02*X262550Y422500D01*

+X269300Y423250D02*X270050Y422500D01*

+X269300Y427750D02*Y423250D01*

+Y427750D02*X270050Y428500D01*

+X271550D01*

+X272300Y427750D01*

+Y423250D01*

+X271550Y422500D02*X272300Y423250D01*

+X270050Y422500D02*X271550D01*

+X269300Y424000D02*X272300Y427000D01*

+X274100Y428500D02*X277100D01*

+X274100D02*Y425500D01*

+X274850Y426250D01*

+X276350D01*

+X277100Y425500D01*

+Y423250D01*

+X276350Y422500D02*X277100Y423250D01*

+X274850Y422500D02*X276350D01*

+X274100Y423250D02*X274850Y422500D01*

+X278900Y426250D02*X279650D01*

+X278900Y424750D02*X279650D01*

+X281450D02*X284450Y428500D01*

+X281450Y424750D02*X285200D01*

+X284450Y428500D02*Y422500D01*

+X289250Y428500D02*X290000Y427750D01*

+X287750Y428500D02*X289250D01*

+X287000Y427750D02*X287750Y428500D01*

+X287000Y427750D02*Y423250D01*

+X287750Y422500D01*

+X289250Y425800D02*X290000Y425050D01*

+X287000Y425800D02*X289250D01*

+X287750Y422500D02*X289250D01*

+X290000Y423250D01*

+Y425050D02*Y423250D01*

+X291800Y426250D02*X292550D01*

+X291800Y424750D02*X292550D01*

+X294350Y428500D02*X297350D01*

+X294350D02*Y425500D01*

+X295100Y426250D01*

+X296600D01*

+X297350Y425500D01*

+Y423250D01*

+X296600Y422500D02*X297350Y423250D01*

+X295100Y422500D02*X296600D01*

+X294350Y423250D02*X295100Y422500D01*

+X299150Y424750D02*X302150Y428500D01*

+X299150Y424750D02*X302900D01*

+X302150Y428500D02*Y422500D01*

+X307400Y427750D02*X308150Y428500D01*

+X310400D01*

+X311150Y427750D01*

+Y426250D01*

+X307400Y422500D02*X311150Y426250D01*

+X307400Y422500D02*X311150D01*

+X312950Y423250D02*X313700Y422500D01*

+X312950Y427750D02*Y423250D01*

+Y427750D02*X313700Y428500D01*

+X315200D01*

+X315950Y427750D01*

+Y423250D01*

+X315200Y422500D02*X315950Y423250D01*

+X313700Y422500D02*X315200D01*

+X312950Y424000D02*X315950Y427000D01*

+X317750Y427300D02*X318950Y428500D01*

+Y422500D01*

+X317750D02*X320000D01*

+X321800Y427750D02*X322550Y428500D01*

+X324050D01*

+X324800Y427750D01*

+X324050Y422500D02*X324800Y423250D01*

+X322550Y422500D02*X324050D01*

+X321800Y423250D02*X322550Y422500D01*

+Y425800D02*X324050D01*

+X324800Y427750D02*Y426550D01*

+Y425050D02*Y423250D01*

+Y425050D02*X324050Y425800D01*

+X324800Y426550D02*X324050Y425800D01*

+X329300Y428500D02*Y423250D01*

+X330050Y422500D01*

+X331550D01*

+X332300Y423250D01*

+Y428500D02*Y423250D01*

+X334100Y428500D02*X337100D01*

+X335600D02*Y422500D01*

+X339950D02*X341900D01*

+X338900Y423550D02*X339950Y422500D01*

+X338900Y427450D02*Y423550D01*

+Y427450D02*X339950Y428500D01*

+X341900D01*

+X200000Y442000D02*Y437500D01*

+Y442000D02*X201050Y443500D01*

+X202700D01*

+X203750Y442000D01*

+Y437500D01*

+X200000Y440500D02*X203750D01*

+X205550D02*Y438250D01*

+X206300Y437500D01*

+X207800D01*

+X208550Y438250D01*

+Y440500D02*Y438250D01*

+X211100Y443500D02*Y438250D01*

+X211850Y437500D01*

+X210350Y441250D02*X211850D01*

+X213350Y443500D02*Y437500D01*

+Y439750D02*X214100Y440500D01*

+X215600D01*

+X216350Y439750D01*

+Y437500D01*

+X218150Y439750D02*Y438250D01*

+Y439750D02*X218900Y440500D01*

+X220400D01*

+X221150Y439750D01*

+Y438250D01*

+X220400Y437500D02*X221150Y438250D01*

+X218900Y437500D02*X220400D01*

+X218150Y438250D02*X218900Y437500D01*

+X223700Y439750D02*Y437500D01*

+Y439750D02*X224450Y440500D01*

+X225950D01*

+X222950D02*X223700Y439750D01*

+X227750Y441250D02*X228500D01*

+X227750Y439750D02*X228500D01*

+X233000Y437500D02*X236000D01*

+X236750Y438250D01*

+Y440050D02*Y438250D01*

+X236000Y440800D02*X236750Y440050D01*

+X233750Y440800D02*X236000D01*

+X233750Y443500D02*Y437500D01*

+X233000Y443500D02*X236000D01*

+X236750Y442750D01*

+Y441550D01*

+X236000Y440800D02*X236750Y441550D01*

+X239300Y439750D02*Y437500D01*

+Y439750D02*X240050Y440500D01*

+X241550D01*

+X238550D02*X239300Y439750D01*

+G54D317*X243350Y442000D02*Y441850D01*

+G54D316*Y439750D02*Y437500D01*

+X247100Y440500D02*X247850Y439750D01*

+X245600Y440500D02*X247100D01*

+X244850Y439750D02*X245600Y440500D01*

+X244850Y439750D02*Y438250D01*

+X245600Y437500D01*

+X247850Y440500D02*Y438250D01*

+X248600Y437500D01*

+X245600D02*X247100D01*

+X247850Y438250D01*

+X251150Y439750D02*Y437500D01*

+Y439750D02*X251900Y440500D01*

+X252650D01*

+X253400Y439750D01*

+Y437500D01*

+X250400Y440500D02*X251150Y439750D01*

+X260900Y443500D02*X261650Y442750D01*

+X258650Y443500D02*X260900D01*

+X257900Y442750D02*X258650Y443500D01*

+X257900Y442750D02*Y441250D01*

+X258650Y440500D01*

+X260900D01*

+X261650Y439750D01*

+Y438250D01*

+X260900Y437500D02*X261650Y438250D01*

+X258650Y437500D02*X260900D01*

+X257900Y438250D02*X258650Y437500D01*

+G54D317*X263450Y442000D02*Y441850D01*

+G54D316*Y439750D02*Y437500D01*

+X264950Y443500D02*Y438250D01*

+X265700Y437500D01*

+X267200Y440500D02*X268700Y437500D01*

+X270200Y440500D02*X268700Y437500D01*

+X272750D02*X275000D01*

+X272000Y438250D02*X272750Y437500D01*

+X272000Y439750D02*Y438250D01*

+Y439750D02*X272750Y440500D01*

+X274250D01*

+X275000Y439750D01*

+X272000Y439000D02*X275000D01*

+Y439750D02*Y439000D01*

+X277550Y439750D02*Y437500D01*

+Y439750D02*X278300Y440500D01*

+X279800D01*

+X276800D02*X277550Y439750D01*

+X282350D02*Y437500D01*

+Y439750D02*X283100Y440500D01*

+X283850D01*

+X284600Y439750D01*

+Y437500D01*

+Y439750D02*X285350Y440500D01*

+X286100D01*

+X286850Y439750D01*

+Y437500D01*

+X281600Y440500D02*X282350Y439750D01*

+X290900Y440500D02*X291650Y439750D01*

+X289400Y440500D02*X290900D01*

+X288650Y439750D02*X289400Y440500D01*

+X288650Y439750D02*Y438250D01*

+X289400Y437500D01*

+X291650Y440500D02*Y438250D01*

+X292400Y437500D01*

+X289400D02*X290900D01*

+X291650Y438250D01*

+X294950Y439750D02*Y437500D01*

+Y439750D02*X295700Y440500D01*

+X296450D01*

+X297200Y439750D01*

+Y437500D01*

+X294200Y440500D02*X294950Y439750D01*

+X200000Y458500D02*X203000D01*

+X201500D02*Y452500D01*

+G54D317*X204800Y457000D02*Y456850D01*

+G54D316*Y454750D02*Y452500D01*

+X207050Y458500D02*Y453250D01*

+X207800Y452500D01*

+X206300Y456250D02*X207800D01*

+X209300Y458500D02*Y453250D01*

+X210050Y452500D01*

+X212300D02*X214550D01*

+X211550Y453250D02*X212300Y452500D01*

+X211550Y454750D02*Y453250D01*

+Y454750D02*X212300Y455500D01*

+X213800D01*

+X214550Y454750D01*

+X211550Y454000D02*X214550D01*

+Y454750D02*Y454000D01*

+X216350Y456250D02*X217100D01*

+X216350Y454750D02*X217100D01*

+X222350Y452500D02*X224600Y455500D01*

+Y457750D02*Y455500D01*

+X223850Y458500D02*X224600Y457750D01*

+X222350Y458500D02*X223850D01*

+X221600Y457750D02*X222350Y458500D01*

+X221600Y457750D02*Y456250D01*

+X222350Y455500D01*

+X224600D01*

+X227150Y452500D02*X230150Y458500D01*

+X226400D02*X230150D01*

+X231950Y457300D02*X233150Y458500D01*

+Y452500D01*

+X231950D02*X234200D01*

+X238700D02*X241700D01*

+X242450Y453250D01*

+Y455050D02*Y453250D01*

+X241700Y455800D02*X242450Y455050D01*

+X239450Y455800D02*X241700D01*

+X239450Y458500D02*Y452500D01*

+X238700Y458500D02*X241700D01*

+X242450Y457750D01*

+Y456550D01*

+X241700Y455800D02*X242450Y456550D01*

+X244250Y452500D02*X247250D01*

+X248000Y453250D01*

+Y455050D02*Y453250D01*

+X247250Y455800D02*X248000Y455050D01*

+X245000Y455800D02*X247250D01*

+X245000Y458500D02*Y452500D01*

+X244250Y458500D02*X247250D01*

+X248000Y457750D01*

+Y456550D01*

+X247250Y455800D02*X248000Y456550D01*

+X249800Y452500D02*X252800D01*

+X253550Y453250D01*

+Y455050D02*Y453250D01*

+X252800Y455800D02*X253550Y455050D01*

+X250550Y455800D02*X252800D01*

+X250550Y458500D02*Y452500D01*

+X249800Y458500D02*X252800D01*

+X253550Y457750D01*

+Y456550D01*

+X252800Y455800D02*X253550Y456550D01*

+X259100Y452500D02*X261050D01*

+X258050Y453550D02*X259100Y452500D01*

+X258050Y457450D02*Y453550D01*

+Y457450D02*X259100Y458500D01*

+X261050D01*

+X265100Y455500D02*X265850Y454750D01*

+X263600Y455500D02*X265100D01*

+X262850Y454750D02*X263600Y455500D01*

+X262850Y454750D02*Y453250D01*

+X263600Y452500D01*

+X265850Y455500D02*Y453250D01*

+X266600Y452500D01*

+X263600D02*X265100D01*

+X265850Y453250D01*

+X269150Y454750D02*Y450250D01*

+X268400Y455500D02*X269150Y454750D01*

+X269900Y455500D01*

+X271400D01*

+X272150Y454750D01*

+Y453250D01*

+X271400Y452500D02*X272150Y453250D01*

+X269900Y452500D02*X271400D01*

+X269150Y453250D02*X269900Y452500D01*

+X274700D02*X276950D01*

+X273950Y453250D02*X274700Y452500D01*

+X273950Y454750D02*Y453250D01*

+Y454750D02*X274700Y455500D01*

+X276200D01*

+X276950Y454750D01*

+X273950Y454000D02*X276950D01*

+Y454750D02*Y454000D01*

+X281450Y455500D02*X284450D01*

+X288950Y458500D02*Y452500D01*

+Y458500D02*X291950D01*

+X288950Y455800D02*X291200D01*

+X296000Y455500D02*X296750Y454750D01*

+X294500Y455500D02*X296000D01*

+X293750Y454750D02*X294500Y455500D01*

+X293750Y454750D02*Y453250D01*

+X294500Y452500D01*

+X296750Y455500D02*Y453250D01*

+X297500Y452500D01*

+X294500D02*X296000D01*

+X296750Y453250D01*

+X299300Y458500D02*Y452500D01*

+Y453250D02*X300050Y452500D01*

+X301550D01*

+X302300Y453250D01*

+Y454750D02*Y453250D01*

+X301550Y455500D02*X302300Y454750D01*

+X300050Y455500D02*X301550D01*

+X299300Y454750D02*X300050Y455500D01*

+X304850Y454750D02*Y452500D01*

+Y454750D02*X305600Y455500D01*

+X307100D01*

+X304100D02*X304850Y454750D01*

+G54D317*X308900Y457000D02*Y456850D01*

+G54D316*Y454750D02*Y452500D01*

+X311150Y455500D02*X313400D01*

+X310400Y454750D02*X311150Y455500D01*

+X310400Y454750D02*Y453250D01*

+X311150Y452500D01*

+X313400D01*

+X317450Y455500D02*X318200Y454750D01*

+X315950Y455500D02*X317450D01*

+X315200Y454750D02*X315950Y455500D01*

+X315200Y454750D02*Y453250D01*

+X315950Y452500D01*

+X318200Y455500D02*Y453250D01*

+X318950Y452500D01*

+X315950D02*X317450D01*

+X318200Y453250D01*

+X321500Y458500D02*Y453250D01*

+X322250Y452500D01*

+X320750Y456250D02*X322250D01*

+G54D317*X323750Y457000D02*Y456850D01*

+G54D316*Y454750D02*Y452500D01*

+X325250Y454750D02*Y453250D01*

+Y454750D02*X326000Y455500D01*

+X327500D01*

+X328250Y454750D01*

+Y453250D01*

+X327500Y452500D02*X328250Y453250D01*

+X326000Y452500D02*X327500D01*

+X325250Y453250D02*X326000Y452500D01*

+X330800Y454750D02*Y452500D01*

+Y454750D02*X331550Y455500D01*

+X332300D01*

+X333050Y454750D01*

+Y452500D01*

+X330050Y455500D02*X330800Y454750D01*

+X338300Y458500D02*Y452500D01*

+X340250Y458500D02*X341300Y457450D01*

+Y453550D01*

+X340250Y452500D02*X341300Y453550D01*

+X337550Y452500D02*X340250D01*

+X337550Y458500D02*X340250D01*

+X343850Y454750D02*Y452500D01*

+Y454750D02*X344600Y455500D01*

+X346100D01*

+X343100D02*X343850Y454750D01*

+X350150Y455500D02*X350900Y454750D01*

+X348650Y455500D02*X350150D01*

+X347900Y454750D02*X348650Y455500D01*

+X347900Y454750D02*Y453250D01*

+X348650Y452500D01*

+X350900Y455500D02*Y453250D01*

+X351650Y452500D01*

+X348650D02*X350150D01*

+X350900Y453250D01*

+X353450Y455500D02*Y453250D01*

+X354200Y452500D01*

+X354950D01*

+X355700Y453250D01*

+Y455500D02*Y453250D01*

+X356450Y452500D01*

+X357200D01*

+X357950Y453250D01*

+Y455500D02*Y453250D01*

+G54D317*X359750Y457000D02*Y456850D01*

+G54D316*Y454750D02*Y452500D01*

+X362000Y454750D02*Y452500D01*

+Y454750D02*X362750Y455500D01*

+X363500D01*

+X364250Y454750D01*

+Y452500D01*

+X361250Y455500D02*X362000Y454750D01*

+X368300Y455500D02*X369050Y454750D01*

+X366800Y455500D02*X368300D01*

+X366050Y454750D02*X366800Y455500D01*

+X366050Y454750D02*Y453250D01*

+X366800Y452500D01*

+X368300D01*

+X369050Y453250D01*

+X366050Y451000D02*X366800Y450250D01*

+X368300D01*

+X369050Y451000D01*

+Y455500D02*Y451000D01*

+M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.group1.gbr b/bbb_cape/schematic/gerbers/20131204/cape.group1.gbr
new file mode 100644
index 0000000..07cccd6
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.group1.gbr
@@ -0,0 +1,26585 @@
+G04 start of page 3 for group 1 idx 2 *

+G04 Title: 971 BBB Cape, ground *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:53 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNGROUP1*%

+%ADD212C,0.0350*%

+%ADD211C,0.0100*%

+%ADD210C,0.0600*%

+%ADD209C,0.0200*%

+%ADD208C,0.0360*%

+%ADD207C,0.2100*%

+%ADD206C,0.0660*%

+%ADD205C,0.2200*%

+%ADD204C,0.1830*%

+%ADD203C,0.0650*%

+%ADD202C,0.0700*%

+%ADD201C,0.0250*%

+%ADD200C,0.0001*%

+G54D200*G36*

+X414441Y86000D02*X425441D01*

+Y78000D01*

+X414441D01*

+Y86000D01*

+G37*

+G36*

+X388441Y211000D02*X396441D01*

+Y204000D01*

+X388441D01*

+Y211000D01*

+G37*

+G36*

+X428941Y80000D02*X439941D01*

+Y72000D01*

+X428941D01*

+Y80000D01*

+G37*

+G36*

+X384441Y122000D02*X389941D01*

+Y82500D01*

+X384441D01*

+Y122000D01*

+G37*

+G36*

+X351441Y122500D02*X356941D01*

+Y83000D01*

+X351441D01*

+Y122500D01*

+G37*

+G36*

+X430941Y59500D02*X437441D01*

+Y53500D01*

+X430941D01*

+Y59500D01*

+G37*

+G36*

+X366441Y294689D02*X377441D01*

+Y286689D01*

+X366441D01*

+Y294689D01*

+G37*

+G36*

+X379512Y261000D02*X390512D01*

+Y253000D01*

+X379512D01*

+Y261000D01*

+G37*

+G36*

+X370441Y239157D02*X381441D01*

+Y231157D01*

+X370441D01*

+Y239157D01*

+G37*

+G36*

+X367485Y175386D02*X378485D01*

+Y167386D01*

+X367485D01*

+Y175386D01*

+G37*

+G36*

+X375937Y193161D02*X386937D01*

+Y185161D01*

+X375937D01*

+Y193161D01*

+G37*

+G36*

+X378441Y383000D02*X389441D01*

+Y375000D01*

+X378441D01*

+Y383000D01*

+G37*

+G36*

+X368441Y355000D02*X379441D01*

+Y347000D01*

+X368441D01*

+Y355000D01*

+G37*

+G36*

+X379162Y309000D02*X390162D01*

+Y301000D01*

+X379162D01*

+Y309000D01*

+G37*

+G36*

+X390441Y330118D02*X396441Y330000D01*

+Y323000D01*

+X390441Y323118D01*

+Y330118D01*

+G37*

+G36*

+X284262Y310800D02*X292262D01*

+Y303800D01*

+X284262D01*

+Y310800D01*

+G37*

+G36*

+X266207Y317716D02*X274207D01*

+Y310716D01*

+X266207D01*

+Y317716D01*

+G37*

+G36*

+X236218Y303166D02*X244218D01*

+Y296166D01*

+X236218D01*

+Y303166D01*

+G37*

+G36*

+X308941Y297500D02*X315441D01*

+Y291500D01*

+X308941D01*

+Y297500D01*

+G37*

+G36*

+X282148Y328134D02*X288648D01*

+Y322134D01*

+X282148D01*

+Y328134D01*

+G37*

+G36*

+X300719Y333466D02*X304150Y333438D01*

+X307219Y327466D01*

+X300719D01*

+Y333466D01*

+G37*

+G36*

+X274167Y350634D02*X280667D01*

+Y344634D01*

+X274167D01*

+Y350634D01*

+G37*

+G36*

+X266441Y202000D02*X272941D01*

+Y195000D01*

+X266441D01*

+Y202000D01*

+G37*

+G36*

+X266941Y235000D02*X273441D01*

+Y228000D01*

+X266941D01*

+Y235000D01*

+G37*

+G36*

+X257941Y196500D02*X264441D01*

+Y189500D01*

+X257941D01*

+Y196500D01*

+G37*

+G36*

+X242941D02*X249441D01*

+Y189500D01*

+X242941D01*

+Y196500D01*

+G37*

+G36*

+X240941Y205500D02*X247441D01*

+Y198500D01*

+X240941D01*

+Y205500D01*

+G37*

+G36*

+X248941Y214000D02*X255441D01*

+Y207000D01*

+X248941D01*

+Y214000D01*

+G37*

+G36*

+X481441Y41500D02*X478941Y39000D01*

+X473493D01*

+Y49236D01*

+X473500Y49235D01*

+X474245Y49294D01*

+X474972Y49469D01*

+X475663Y49755D01*

+X476301Y50145D01*

+X476869Y50631D01*

+X477355Y51199D01*

+X477745Y51837D01*

+X478031Y52528D01*

+X478206Y53255D01*

+X478250Y54000D01*

+X478206Y54745D01*

+X478031Y55472D01*

+X477745Y56163D01*

+X477355Y56801D01*

+X476869Y57369D01*

+X476301Y57855D01*

+X475663Y58245D01*

+X474972Y58531D01*

+X474245Y58706D01*

+X473500Y58765D01*

+X473493Y58764D01*

+Y79236D01*

+X473500Y79235D01*

+X474245Y79294D01*

+X474972Y79469D01*

+X475663Y79755D01*

+X476301Y80145D01*

+X476869Y80631D01*

+X477355Y81199D01*

+X477745Y81837D01*

+X478031Y82528D01*

+X478206Y83255D01*

+X478250Y84000D01*

+X478206Y84745D01*

+X478031Y85472D01*

+X477745Y86163D01*

+X477355Y86801D01*

+X476869Y87369D01*

+X476301Y87855D01*

+X475663Y88245D01*

+X474972Y88531D01*

+X474245Y88706D01*

+X473500Y88765D01*

+X473493Y88764D01*

+Y109236D01*

+X473500Y109235D01*

+X474245Y109294D01*

+X474972Y109469D01*

+X475663Y109755D01*

+X476301Y110145D01*

+X476869Y110631D01*

+X477355Y111199D01*

+X477745Y111837D01*

+X478031Y112528D01*

+X478206Y113255D01*

+X478250Y114000D01*

+X478206Y114745D01*

+X478031Y115472D01*

+X477745Y116163D01*

+X477355Y116801D01*

+X476869Y117369D01*

+X476301Y117855D01*

+X475663Y118245D01*

+X474972Y118531D01*

+X474245Y118706D01*

+X473500Y118765D01*

+X473493Y118764D01*

+Y139236D01*

+X473500Y139235D01*

+X474245Y139294D01*

+X474972Y139469D01*

+X475663Y139755D01*

+X476301Y140145D01*

+X476869Y140631D01*

+X477355Y141199D01*

+X477745Y141837D01*

+X478031Y142528D01*

+X478206Y143255D01*

+X478250Y144000D01*

+X478206Y144745D01*

+X478031Y145472D01*

+X477745Y146163D01*

+X477355Y146801D01*

+X476869Y147369D01*

+X476301Y147855D01*

+X475663Y148245D01*

+X474972Y148531D01*

+X474245Y148706D01*

+X473500Y148765D01*

+X473493Y148764D01*

+Y169236D01*

+X473500Y169235D01*

+X474245Y169294D01*

+X474972Y169469D01*

+X475663Y169755D01*

+X476301Y170145D01*

+X476869Y170631D01*

+X477355Y171199D01*

+X477745Y171837D01*

+X478031Y172528D01*

+X478206Y173255D01*

+X478250Y174000D01*

+X478206Y174745D01*

+X478031Y175472D01*

+X477745Y176163D01*

+X477355Y176801D01*

+X476869Y177369D01*

+X476301Y177855D01*

+X475663Y178245D01*

+X474972Y178531D01*

+X474245Y178706D01*

+X473500Y178765D01*

+X473493Y178764D01*

+Y199236D01*

+X473500Y199235D01*

+X474245Y199294D01*

+X474972Y199469D01*

+X475663Y199755D01*

+X476301Y200145D01*

+X476869Y200631D01*

+X477355Y201199D01*

+X477745Y201837D01*

+X478031Y202528D01*

+X478206Y203255D01*

+X478250Y204000D01*

+X478206Y204745D01*

+X478031Y205472D01*

+X477745Y206163D01*

+X477355Y206801D01*

+X476869Y207369D01*

+X476301Y207855D01*

+X475663Y208245D01*

+X474972Y208531D01*

+X474245Y208706D01*

+X473500Y208765D01*

+X473493Y208764D01*

+Y229236D01*

+X473500Y229235D01*

+X474245Y229294D01*

+X474972Y229469D01*

+X475663Y229755D01*

+X476301Y230145D01*

+X476869Y230631D01*

+X477355Y231199D01*

+X477745Y231837D01*

+X478031Y232528D01*

+X478206Y233255D01*

+X478250Y234000D01*

+X478206Y234745D01*

+X478031Y235472D01*

+X477745Y236163D01*

+X477355Y236801D01*

+X476869Y237369D01*

+X476301Y237855D01*

+X475663Y238245D01*

+X474972Y238531D01*

+X474245Y238706D01*

+X473500Y238765D01*

+X473493Y238764D01*

+Y259236D01*

+X473500Y259235D01*

+X474245Y259294D01*

+X474972Y259469D01*

+X475663Y259755D01*

+X476301Y260145D01*

+X476869Y260631D01*

+X477355Y261199D01*

+X477745Y261837D01*

+X478031Y262528D01*

+X478206Y263255D01*

+X478250Y264000D01*

+X478206Y264745D01*

+X478031Y265472D01*

+X477745Y266163D01*

+X477355Y266801D01*

+X476869Y267369D01*

+X476301Y267855D01*

+X475663Y268245D01*

+X474972Y268531D01*

+X474245Y268706D01*

+X473500Y268765D01*

+X473493Y268764D01*

+Y289236D01*

+X473500Y289235D01*

+X474245Y289294D01*

+X474972Y289469D01*

+X475663Y289755D01*

+X476301Y290145D01*

+X476869Y290631D01*

+X477355Y291199D01*

+X477745Y291837D01*

+X478031Y292528D01*

+X478206Y293255D01*

+X478250Y294000D01*

+X478206Y294745D01*

+X478031Y295472D01*

+X477745Y296163D01*

+X477355Y296801D01*

+X476869Y297369D01*

+X476301Y297855D01*

+X475663Y298245D01*

+X474972Y298531D01*

+X474245Y298706D01*

+X473500Y298765D01*

+X473493Y298764D01*

+Y319236D01*

+X473500Y319235D01*

+X474245Y319294D01*

+X474972Y319469D01*

+X475663Y319755D01*

+X476301Y320145D01*

+X476869Y320631D01*

+X477355Y321199D01*

+X477745Y321837D01*

+X478031Y322528D01*

+X478206Y323255D01*

+X478250Y324000D01*

+X478206Y324745D01*

+X478031Y325472D01*

+X477745Y326163D01*

+X477355Y326801D01*

+X476869Y327369D01*

+X476301Y327855D01*

+X475663Y328245D01*

+X474972Y328531D01*

+X474245Y328706D01*

+X473500Y328765D01*

+X473493Y328764D01*

+Y349236D01*

+X473500Y349235D01*

+X474245Y349294D01*

+X474972Y349469D01*

+X475663Y349755D01*

+X476301Y350145D01*

+X476869Y350631D01*

+X477355Y351199D01*

+X477745Y351837D01*

+X478031Y352528D01*

+X478206Y353255D01*

+X478250Y354000D01*

+X478206Y354745D01*

+X478031Y355472D01*

+X477745Y356163D01*

+X477355Y356801D01*

+X476869Y357369D01*

+X476301Y357855D01*

+X475663Y358245D01*

+X474972Y358531D01*

+X474245Y358706D01*

+X473500Y358765D01*

+X473493Y358764D01*

+Y379236D01*

+X473500Y379235D01*

+X474245Y379294D01*

+X474972Y379469D01*

+X475663Y379755D01*

+X476301Y380145D01*

+X476869Y380631D01*

+X477355Y381199D01*

+X477745Y381837D01*

+X478031Y382528D01*

+X478206Y383255D01*

+X478250Y384000D01*

+X478206Y384745D01*

+X478031Y385472D01*

+X477745Y386163D01*

+X477355Y386801D01*

+X476869Y387369D01*

+X476301Y387855D01*

+X475663Y388245D01*

+X474972Y388531D01*

+X474245Y388706D01*

+X473500Y388765D01*

+X473493Y388764D01*

+Y397000D01*

+X478941D01*

+X481441Y394000D01*

+Y41500D01*

+G37*

+G36*

+X473493Y39000D02*X463493D01*

+Y49236D01*

+X463500Y49235D01*

+X464245Y49294D01*

+X464972Y49469D01*

+X465663Y49755D01*

+X466301Y50145D01*

+X466869Y50631D01*

+X467355Y51199D01*

+X467745Y51837D01*

+X468031Y52528D01*

+X468206Y53255D01*

+X468250Y54000D01*

+X468206Y54745D01*

+X468031Y55472D01*

+X467745Y56163D01*

+X467355Y56801D01*

+X466869Y57369D01*

+X466301Y57855D01*

+X465663Y58245D01*

+X464972Y58531D01*

+X464245Y58706D01*

+X463500Y58765D01*

+X463493Y58764D01*

+Y79236D01*

+X463500Y79235D01*

+X464245Y79294D01*

+X464972Y79469D01*

+X465663Y79755D01*

+X466301Y80145D01*

+X466869Y80631D01*

+X467355Y81199D01*

+X467745Y81837D01*

+X468031Y82528D01*

+X468206Y83255D01*

+X468250Y84000D01*

+X468206Y84745D01*

+X468031Y85472D01*

+X467745Y86163D01*

+X467355Y86801D01*

+X466869Y87369D01*

+X466301Y87855D01*

+X465663Y88245D01*

+X464972Y88531D01*

+X464245Y88706D01*

+X463500Y88765D01*

+X463493Y88764D01*

+Y109236D01*

+X463500Y109235D01*

+X464245Y109294D01*

+X464972Y109469D01*

+X465663Y109755D01*

+X466301Y110145D01*

+X466869Y110631D01*

+X467355Y111199D01*

+X467745Y111837D01*

+X468031Y112528D01*

+X468206Y113255D01*

+X468250Y114000D01*

+X468206Y114745D01*

+X468031Y115472D01*

+X467745Y116163D01*

+X467355Y116801D01*

+X466869Y117369D01*

+X466301Y117855D01*

+X465663Y118245D01*

+X464972Y118531D01*

+X464245Y118706D01*

+X463500Y118765D01*

+X463493Y118764D01*

+Y139236D01*

+X463500Y139235D01*

+X464245Y139294D01*

+X464972Y139469D01*

+X465663Y139755D01*

+X466301Y140145D01*

+X466869Y140631D01*

+X467355Y141199D01*

+X467745Y141837D01*

+X468031Y142528D01*

+X468206Y143255D01*

+X468250Y144000D01*

+X468206Y144745D01*

+X468031Y145472D01*

+X467745Y146163D01*

+X467355Y146801D01*

+X466869Y147369D01*

+X466301Y147855D01*

+X465663Y148245D01*

+X464972Y148531D01*

+X464245Y148706D01*

+X463500Y148765D01*

+X463493Y148764D01*

+Y169236D01*

+X463500Y169235D01*

+X464245Y169294D01*

+X464972Y169469D01*

+X465663Y169755D01*

+X466301Y170145D01*

+X466869Y170631D01*

+X467355Y171199D01*

+X467745Y171837D01*

+X468031Y172528D01*

+X468206Y173255D01*

+X468250Y174000D01*

+X468206Y174745D01*

+X468031Y175472D01*

+X467745Y176163D01*

+X467355Y176801D01*

+X466869Y177369D01*

+X466301Y177855D01*

+X465663Y178245D01*

+X464972Y178531D01*

+X464245Y178706D01*

+X463500Y178765D01*

+X463493Y178764D01*

+Y199236D01*

+X463500Y199235D01*

+X464245Y199294D01*

+X464972Y199469D01*

+X465663Y199755D01*

+X466301Y200145D01*

+X466869Y200631D01*

+X467355Y201199D01*

+X467745Y201837D01*

+X468031Y202528D01*

+X468206Y203255D01*

+X468250Y204000D01*

+X468206Y204745D01*

+X468031Y205472D01*

+X467745Y206163D01*

+X467355Y206801D01*

+X466869Y207369D01*

+X466301Y207855D01*

+X465663Y208245D01*

+X464972Y208531D01*

+X464245Y208706D01*

+X463500Y208765D01*

+X463493Y208764D01*

+Y229236D01*

+X463500Y229235D01*

+X464245Y229294D01*

+X464972Y229469D01*

+X465663Y229755D01*

+X466301Y230145D01*

+X466869Y230631D01*

+X467355Y231199D01*

+X467745Y231837D01*

+X468031Y232528D01*

+X468206Y233255D01*

+X468250Y234000D01*

+X468206Y234745D01*

+X468031Y235472D01*

+X467745Y236163D01*

+X467355Y236801D01*

+X466869Y237369D01*

+X466301Y237855D01*

+X465663Y238245D01*

+X464972Y238531D01*

+X464245Y238706D01*

+X463500Y238765D01*

+X463493Y238764D01*

+Y259236D01*

+X463500Y259235D01*

+X464245Y259294D01*

+X464972Y259469D01*

+X465663Y259755D01*

+X466301Y260145D01*

+X466869Y260631D01*

+X467355Y261199D01*

+X467745Y261837D01*

+X468031Y262528D01*

+X468206Y263255D01*

+X468250Y264000D01*

+X468206Y264745D01*

+X468031Y265472D01*

+X467745Y266163D01*

+X467355Y266801D01*

+X466869Y267369D01*

+X466301Y267855D01*

+X465663Y268245D01*

+X464972Y268531D01*

+X464245Y268706D01*

+X463500Y268765D01*

+X463493Y268764D01*

+Y289236D01*

+X463500Y289235D01*

+X464245Y289294D01*

+X464972Y289469D01*

+X465663Y289755D01*

+X466301Y290145D01*

+X466869Y290631D01*

+X467355Y291199D01*

+X467745Y291837D01*

+X468031Y292528D01*

+X468206Y293255D01*

+X468250Y294000D01*

+X468206Y294745D01*

+X468031Y295472D01*

+X467745Y296163D01*

+X467355Y296801D01*

+X466869Y297369D01*

+X466301Y297855D01*

+X465663Y298245D01*

+X464972Y298531D01*

+X464245Y298706D01*

+X463500Y298765D01*

+X463493Y298764D01*

+Y319236D01*

+X463500Y319235D01*

+X464245Y319294D01*

+X464972Y319469D01*

+X465663Y319755D01*

+X466301Y320145D01*

+X466869Y320631D01*

+X467355Y321199D01*

+X467745Y321837D01*

+X468031Y322528D01*

+X468206Y323255D01*

+X468250Y324000D01*

+X468206Y324745D01*

+X468031Y325472D01*

+X467745Y326163D01*

+X467355Y326801D01*

+X466869Y327369D01*

+X466301Y327855D01*

+X465663Y328245D01*

+X464972Y328531D01*

+X464245Y328706D01*

+X463500Y328765D01*

+X463493Y328764D01*

+Y349236D01*

+X463500Y349235D01*

+X464245Y349294D01*

+X464972Y349469D01*

+X465663Y349755D01*

+X466301Y350145D01*

+X466869Y350631D01*

+X467355Y351199D01*

+X467745Y351837D01*

+X468031Y352528D01*

+X468206Y353255D01*

+X468250Y354000D01*

+X468206Y354745D01*

+X468031Y355472D01*

+X467745Y356163D01*

+X467355Y356801D01*

+X466869Y357369D01*

+X466301Y357855D01*

+X465663Y358245D01*

+X464972Y358531D01*

+X464245Y358706D01*

+X463500Y358765D01*

+X463493Y358764D01*

+Y379236D01*

+X463500Y379235D01*

+X464245Y379294D01*

+X464972Y379469D01*

+X465663Y379755D01*

+X466301Y380145D01*

+X466869Y380631D01*

+X467355Y381199D01*

+X467745Y381837D01*

+X468031Y382528D01*

+X468206Y383255D01*

+X468250Y384000D01*

+X468206Y384745D01*

+X468031Y385472D01*

+X467745Y386163D01*

+X467355Y386801D01*

+X466869Y387369D01*

+X466301Y387855D01*

+X465663Y388245D01*

+X464972Y388531D01*

+X464245Y388706D01*

+X463500Y388765D01*

+X463493Y388764D01*

+Y397000D01*

+X473493D01*

+Y388764D01*

+X472755Y388706D01*

+X472028Y388531D01*

+X471337Y388245D01*

+X470699Y387855D01*

+X470131Y387369D01*

+X469645Y386801D01*

+X469255Y386163D01*

+X468969Y385472D01*

+X468794Y384745D01*

+X468735Y384000D01*

+X468794Y383255D01*

+X468969Y382528D01*

+X469255Y381837D01*

+X469645Y381199D01*

+X470131Y380631D01*

+X470699Y380145D01*

+X471337Y379755D01*

+X472028Y379469D01*

+X472755Y379294D01*

+X473493Y379236D01*

+Y358764D01*

+X472755Y358706D01*

+X472028Y358531D01*

+X471337Y358245D01*

+X470699Y357855D01*

+X470131Y357369D01*

+X469645Y356801D01*

+X469255Y356163D01*

+X468969Y355472D01*

+X468794Y354745D01*

+X468735Y354000D01*

+X468794Y353255D01*

+X468969Y352528D01*

+X469255Y351837D01*

+X469645Y351199D01*

+X470131Y350631D01*

+X470699Y350145D01*

+X471337Y349755D01*

+X472028Y349469D01*

+X472755Y349294D01*

+X473493Y349236D01*

+Y328764D01*

+X472755Y328706D01*

+X472028Y328531D01*

+X471337Y328245D01*

+X470699Y327855D01*

+X470131Y327369D01*

+X469645Y326801D01*

+X469255Y326163D01*

+X468969Y325472D01*

+X468794Y324745D01*

+X468735Y324000D01*

+X468794Y323255D01*

+X468969Y322528D01*

+X469255Y321837D01*

+X469645Y321199D01*

+X470131Y320631D01*

+X470699Y320145D01*

+X471337Y319755D01*

+X472028Y319469D01*

+X472755Y319294D01*

+X473493Y319236D01*

+Y298764D01*

+X472755Y298706D01*

+X472028Y298531D01*

+X471337Y298245D01*

+X470699Y297855D01*

+X470131Y297369D01*

+X469645Y296801D01*

+X469255Y296163D01*

+X468969Y295472D01*

+X468794Y294745D01*

+X468735Y294000D01*

+X468794Y293255D01*

+X468969Y292528D01*

+X469255Y291837D01*

+X469645Y291199D01*

+X470131Y290631D01*

+X470699Y290145D01*

+X471337Y289755D01*

+X472028Y289469D01*

+X472755Y289294D01*

+X473493Y289236D01*

+Y268764D01*

+X472755Y268706D01*

+X472028Y268531D01*

+X471337Y268245D01*

+X470699Y267855D01*

+X470131Y267369D01*

+X469645Y266801D01*

+X469255Y266163D01*

+X468969Y265472D01*

+X468794Y264745D01*

+X468735Y264000D01*

+X468794Y263255D01*

+X468969Y262528D01*

+X469255Y261837D01*

+X469645Y261199D01*

+X470131Y260631D01*

+X470699Y260145D01*

+X471337Y259755D01*

+X472028Y259469D01*

+X472755Y259294D01*

+X473493Y259236D01*

+Y238764D01*

+X472755Y238706D01*

+X472028Y238531D01*

+X471337Y238245D01*

+X470699Y237855D01*

+X470131Y237369D01*

+X469645Y236801D01*

+X469255Y236163D01*

+X468969Y235472D01*

+X468794Y234745D01*

+X468735Y234000D01*

+X468794Y233255D01*

+X468969Y232528D01*

+X469255Y231837D01*

+X469645Y231199D01*

+X470131Y230631D01*

+X470699Y230145D01*

+X471337Y229755D01*

+X472028Y229469D01*

+X472755Y229294D01*

+X473493Y229236D01*

+Y208764D01*

+X472755Y208706D01*

+X472028Y208531D01*

+X471337Y208245D01*

+X470699Y207855D01*

+X470131Y207369D01*

+X469645Y206801D01*

+X469255Y206163D01*

+X468969Y205472D01*

+X468794Y204745D01*

+X468735Y204000D01*

+X468794Y203255D01*

+X468969Y202528D01*

+X469255Y201837D01*

+X469645Y201199D01*

+X470131Y200631D01*

+X470699Y200145D01*

+X471337Y199755D01*

+X472028Y199469D01*

+X472755Y199294D01*

+X473493Y199236D01*

+Y178764D01*

+X472755Y178706D01*

+X472028Y178531D01*

+X471337Y178245D01*

+X470699Y177855D01*

+X470131Y177369D01*

+X469645Y176801D01*

+X469255Y176163D01*

+X468969Y175472D01*

+X468794Y174745D01*

+X468735Y174000D01*

+X468794Y173255D01*

+X468969Y172528D01*

+X469255Y171837D01*

+X469645Y171199D01*

+X470131Y170631D01*

+X470699Y170145D01*

+X471337Y169755D01*

+X472028Y169469D01*

+X472755Y169294D01*

+X473493Y169236D01*

+Y148764D01*

+X472755Y148706D01*

+X472028Y148531D01*

+X471337Y148245D01*

+X470699Y147855D01*

+X470131Y147369D01*

+X469645Y146801D01*

+X469255Y146163D01*

+X468969Y145472D01*

+X468794Y144745D01*

+X468735Y144000D01*

+X468794Y143255D01*

+X468969Y142528D01*

+X469255Y141837D01*

+X469645Y141199D01*

+X470131Y140631D01*

+X470699Y140145D01*

+X471337Y139755D01*

+X472028Y139469D01*

+X472755Y139294D01*

+X473493Y139236D01*

+Y118764D01*

+X472755Y118706D01*

+X472028Y118531D01*

+X471337Y118245D01*

+X470699Y117855D01*

+X470131Y117369D01*

+X469645Y116801D01*

+X469255Y116163D01*

+X468969Y115472D01*

+X468794Y114745D01*

+X468735Y114000D01*

+X468794Y113255D01*

+X468969Y112528D01*

+X469255Y111837D01*

+X469645Y111199D01*

+X470131Y110631D01*

+X470699Y110145D01*

+X471337Y109755D01*

+X472028Y109469D01*

+X472755Y109294D01*

+X473493Y109236D01*

+Y88764D01*

+X472755Y88706D01*

+X472028Y88531D01*

+X471337Y88245D01*

+X470699Y87855D01*

+X470131Y87369D01*

+X469645Y86801D01*

+X469255Y86163D01*

+X468969Y85472D01*

+X468794Y84745D01*

+X468735Y84000D01*

+X468794Y83255D01*

+X468969Y82528D01*

+X469255Y81837D01*

+X469645Y81199D01*

+X470131Y80631D01*

+X470699Y80145D01*

+X471337Y79755D01*

+X472028Y79469D01*

+X472755Y79294D01*

+X473493Y79236D01*

+Y58764D01*

+X472755Y58706D01*

+X472028Y58531D01*

+X471337Y58245D01*

+X470699Y57855D01*

+X470131Y57369D01*

+X469645Y56801D01*

+X469255Y56163D01*

+X468969Y55472D01*

+X468794Y54745D01*

+X468735Y54000D01*

+X468794Y53255D01*

+X468969Y52528D01*

+X469255Y51837D01*

+X469645Y51199D01*

+X470131Y50631D01*

+X470699Y50145D01*

+X471337Y49755D01*

+X472028Y49469D01*

+X472755Y49294D01*

+X473493Y49236D01*

+Y39000D01*

+G37*

+G36*

+X463493D02*X458437D01*

+Y161192D01*

+X458441Y161191D01*

+X458880Y161226D01*

+X459309Y161329D01*

+X459716Y161497D01*

+X460092Y161728D01*

+X460427Y162014D01*

+X460713Y162349D01*

+X460944Y162725D01*

+X461112Y163132D01*

+X461215Y163561D01*

+X461241Y164000D01*

+X461215Y164439D01*

+X461112Y164868D01*

+X460944Y165275D01*

+X460713Y165651D01*

+X460427Y165986D01*

+X460092Y166272D01*

+X459716Y166503D01*

+X459309Y166671D01*

+X458880Y166774D01*

+X458441Y166809D01*

+X458437Y166808D01*

+Y192192D01*

+X458441Y192191D01*

+X458880Y192226D01*

+X459309Y192329D01*

+X459716Y192497D01*

+X460092Y192728D01*

+X460427Y193014D01*

+X460713Y193349D01*

+X460944Y193725D01*

+X461112Y194132D01*

+X461215Y194561D01*

+X461241Y195000D01*

+X461215Y195439D01*

+X461112Y195868D01*

+X460944Y196275D01*

+X460713Y196651D01*

+X460427Y196986D01*

+X460092Y197272D01*

+X459716Y197503D01*

+X459309Y197671D01*

+X458880Y197774D01*

+X458441Y197809D01*

+X458437Y197808D01*

+Y222192D01*

+X458441Y222191D01*

+X458880Y222226D01*

+X459309Y222329D01*

+X459716Y222497D01*

+X460092Y222728D01*

+X460427Y223014D01*

+X460713Y223349D01*

+X460944Y223725D01*

+X461112Y224132D01*

+X461215Y224561D01*

+X461241Y225000D01*

+X461215Y225439D01*

+X461112Y225868D01*

+X460944Y226275D01*

+X460713Y226651D01*

+X460427Y226986D01*

+X460092Y227272D01*

+X459716Y227503D01*

+X459309Y227671D01*

+X458880Y227774D01*

+X458441Y227809D01*

+X458437Y227808D01*

+Y251192D01*

+X458441Y251191D01*

+X458880Y251226D01*

+X459309Y251329D01*

+X459716Y251497D01*

+X460092Y251728D01*

+X460427Y252014D01*

+X460713Y252349D01*

+X460944Y252725D01*

+X461112Y253132D01*

+X461215Y253561D01*

+X461241Y254000D01*

+X461215Y254439D01*

+X461112Y254868D01*

+X460944Y255275D01*

+X460713Y255651D01*

+X460427Y255986D01*

+X460092Y256272D01*

+X459716Y256503D01*

+X459309Y256671D01*

+X458880Y256774D01*

+X458441Y256809D01*

+X458437Y256808D01*

+Y282192D01*

+X458441Y282191D01*

+X458880Y282226D01*

+X459309Y282329D01*

+X459716Y282497D01*

+X460092Y282728D01*

+X460427Y283014D01*

+X460713Y283349D01*

+X460944Y283725D01*

+X461112Y284132D01*

+X461215Y284561D01*

+X461241Y285000D01*

+X461215Y285439D01*

+X461112Y285868D01*

+X460944Y286275D01*

+X460713Y286651D01*

+X460427Y286986D01*

+X460092Y287272D01*

+X459716Y287503D01*

+X459309Y287671D01*

+X458880Y287774D01*

+X458441Y287809D01*

+X458437Y287808D01*

+Y312192D01*

+X458441Y312191D01*

+X458880Y312226D01*

+X459309Y312329D01*

+X459716Y312497D01*

+X460092Y312728D01*

+X460427Y313014D01*

+X460713Y313349D01*

+X460944Y313725D01*

+X461112Y314132D01*

+X461215Y314561D01*

+X461241Y315000D01*

+X461215Y315439D01*

+X461112Y315868D01*

+X460944Y316275D01*

+X460713Y316651D01*

+X460427Y316986D01*

+X460092Y317272D01*

+X459716Y317503D01*

+X459309Y317671D01*

+X458880Y317774D01*

+X458441Y317809D01*

+X458437Y317808D01*

+Y342192D01*

+X458441Y342191D01*

+X458880Y342226D01*

+X459309Y342329D01*

+X459716Y342497D01*

+X460092Y342728D01*

+X460427Y343014D01*

+X460713Y343349D01*

+X460944Y343725D01*

+X461112Y344132D01*

+X461215Y344561D01*

+X461241Y345000D01*

+X461215Y345439D01*

+X461112Y345868D01*

+X460944Y346275D01*

+X460713Y346651D01*

+X460427Y346986D01*

+X460092Y347272D01*

+X459716Y347503D01*

+X459309Y347671D01*

+X458880Y347774D01*

+X458441Y347809D01*

+X458437Y347808D01*

+Y372192D01*

+X458441Y372191D01*

+X458880Y372226D01*

+X459309Y372329D01*

+X459716Y372497D01*

+X460092Y372728D01*

+X460427Y373014D01*

+X460713Y373349D01*

+X460944Y373725D01*

+X461112Y374132D01*

+X461215Y374561D01*

+X461241Y375000D01*

+X461215Y375439D01*

+X461112Y375868D01*

+X460944Y376275D01*

+X460713Y376651D01*

+X460427Y376986D01*

+X460092Y377272D01*

+X459716Y377503D01*

+X459309Y377671D01*

+X458880Y377774D01*

+X458441Y377809D01*

+X458437Y377808D01*

+Y397000D01*

+X463493D01*

+Y388764D01*

+X462755Y388706D01*

+X462028Y388531D01*

+X461337Y388245D01*

+X460699Y387855D01*

+X460131Y387369D01*

+X459645Y386801D01*

+X459255Y386163D01*

+X458969Y385472D01*

+X458794Y384745D01*

+X458735Y384000D01*

+X458794Y383255D01*

+X458969Y382528D01*

+X459255Y381837D01*

+X459645Y381199D01*

+X460131Y380631D01*

+X460699Y380145D01*

+X461337Y379755D01*

+X462028Y379469D01*

+X462755Y379294D01*

+X463493Y379236D01*

+Y358764D01*

+X462755Y358706D01*

+X462028Y358531D01*

+X461337Y358245D01*

+X460699Y357855D01*

+X460131Y357369D01*

+X459645Y356801D01*

+X459255Y356163D01*

+X458969Y355472D01*

+X458794Y354745D01*

+X458735Y354000D01*

+X458794Y353255D01*

+X458969Y352528D01*

+X459255Y351837D01*

+X459645Y351199D01*

+X460131Y350631D01*

+X460699Y350145D01*

+X461337Y349755D01*

+X462028Y349469D01*

+X462755Y349294D01*

+X463493Y349236D01*

+Y328764D01*

+X462755Y328706D01*

+X462028Y328531D01*

+X461337Y328245D01*

+X460699Y327855D01*

+X460131Y327369D01*

+X459645Y326801D01*

+X459255Y326163D01*

+X458969Y325472D01*

+X458794Y324745D01*

+X458735Y324000D01*

+X458794Y323255D01*

+X458969Y322528D01*

+X459255Y321837D01*

+X459645Y321199D01*

+X460131Y320631D01*

+X460699Y320145D01*

+X461337Y319755D01*

+X462028Y319469D01*

+X462755Y319294D01*

+X463493Y319236D01*

+Y298764D01*

+X462755Y298706D01*

+X462028Y298531D01*

+X461337Y298245D01*

+X460699Y297855D01*

+X460131Y297369D01*

+X459645Y296801D01*

+X459255Y296163D01*

+X458969Y295472D01*

+X458794Y294745D01*

+X458735Y294000D01*

+X458794Y293255D01*

+X458969Y292528D01*

+X459255Y291837D01*

+X459645Y291199D01*

+X460131Y290631D01*

+X460699Y290145D01*

+X461337Y289755D01*

+X462028Y289469D01*

+X462755Y289294D01*

+X463493Y289236D01*

+Y268764D01*

+X462755Y268706D01*

+X462028Y268531D01*

+X461337Y268245D01*

+X460699Y267855D01*

+X460131Y267369D01*

+X459645Y266801D01*

+X459255Y266163D01*

+X458969Y265472D01*

+X458794Y264745D01*

+X458735Y264000D01*

+X458794Y263255D01*

+X458969Y262528D01*

+X459255Y261837D01*

+X459645Y261199D01*

+X460131Y260631D01*

+X460699Y260145D01*

+X461337Y259755D01*

+X462028Y259469D01*

+X462755Y259294D01*

+X463493Y259236D01*

+Y238764D01*

+X462755Y238706D01*

+X462028Y238531D01*

+X461337Y238245D01*

+X460699Y237855D01*

+X460131Y237369D01*

+X459645Y236801D01*

+X459255Y236163D01*

+X458969Y235472D01*

+X458794Y234745D01*

+X458735Y234000D01*

+X458794Y233255D01*

+X458969Y232528D01*

+X459255Y231837D01*

+X459645Y231199D01*

+X460131Y230631D01*

+X460699Y230145D01*

+X461337Y229755D01*

+X462028Y229469D01*

+X462755Y229294D01*

+X463493Y229236D01*

+Y208764D01*

+X462755Y208706D01*

+X462028Y208531D01*

+X461337Y208245D01*

+X460699Y207855D01*

+X460131Y207369D01*

+X459645Y206801D01*

+X459255Y206163D01*

+X458969Y205472D01*

+X458794Y204745D01*

+X458735Y204000D01*

+X458794Y203255D01*

+X458969Y202528D01*

+X459255Y201837D01*

+X459645Y201199D01*

+X460131Y200631D01*

+X460699Y200145D01*

+X461337Y199755D01*

+X462028Y199469D01*

+X462755Y199294D01*

+X463493Y199236D01*

+Y178764D01*

+X462755Y178706D01*

+X462028Y178531D01*

+X461337Y178245D01*

+X460699Y177855D01*

+X460131Y177369D01*

+X459645Y176801D01*

+X459255Y176163D01*

+X458969Y175472D01*

+X458794Y174745D01*

+X458735Y174000D01*

+X458794Y173255D01*

+X458969Y172528D01*

+X459255Y171837D01*

+X459645Y171199D01*

+X460131Y170631D01*

+X460699Y170145D01*

+X461337Y169755D01*

+X462028Y169469D01*

+X462755Y169294D01*

+X463493Y169236D01*

+Y148764D01*

+X462755Y148706D01*

+X462028Y148531D01*

+X461337Y148245D01*

+X460699Y147855D01*

+X460131Y147369D01*

+X459645Y146801D01*

+X459255Y146163D01*

+X458969Y145472D01*

+X458794Y144745D01*

+X458735Y144000D01*

+X458794Y143255D01*

+X458969Y142528D01*

+X459255Y141837D01*

+X459645Y141199D01*

+X460131Y140631D01*

+X460699Y140145D01*

+X461337Y139755D01*

+X462028Y139469D01*

+X462755Y139294D01*

+X463493Y139236D01*

+Y118764D01*

+X462755Y118706D01*

+X462028Y118531D01*

+X461337Y118245D01*

+X460699Y117855D01*

+X460131Y117369D01*

+X459645Y116801D01*

+X459255Y116163D01*

+X458969Y115472D01*

+X458794Y114745D01*

+X458735Y114000D01*

+X458794Y113255D01*

+X458969Y112528D01*

+X459255Y111837D01*

+X459645Y111199D01*

+X460131Y110631D01*

+X460699Y110145D01*

+X461337Y109755D01*

+X462028Y109469D01*

+X462755Y109294D01*

+X463493Y109236D01*

+Y88764D01*

+X462755Y88706D01*

+X462028Y88531D01*

+X461337Y88245D01*

+X460699Y87855D01*

+X460131Y87369D01*

+X459645Y86801D01*

+X459255Y86163D01*

+X458969Y85472D01*

+X458794Y84745D01*

+X458735Y84000D01*

+X458794Y83255D01*

+X458969Y82528D01*

+X459255Y81837D01*

+X459645Y81199D01*

+X460131Y80631D01*

+X460699Y80145D01*

+X461337Y79755D01*

+X462028Y79469D01*

+X462755Y79294D01*

+X463493Y79236D01*

+Y58764D01*

+X462755Y58706D01*

+X462028Y58531D01*

+X461337Y58245D01*

+X460699Y57855D01*

+X460131Y57369D01*

+X459645Y56801D01*

+X459255Y56163D01*

+X458969Y55472D01*

+X458794Y54745D01*

+X458735Y54000D01*

+X458794Y53255D01*

+X458969Y52528D01*

+X459255Y51837D01*

+X459645Y51199D01*

+X460131Y50631D01*

+X460699Y50145D01*

+X461337Y49755D01*

+X462028Y49469D01*

+X462755Y49294D01*

+X463493Y49236D01*

+Y39000D01*

+G37*

+G36*

+X457500Y192359D02*X457573Y192329D01*

+X458002Y192226D01*

+X458437Y192192D01*

+Y166808D01*

+X458002Y166774D01*

+X457573Y166671D01*

+X457500Y166641D01*

+Y171498D01*

+X457618Y171507D01*

+X457732Y171535D01*

+X457842Y171580D01*

+X457942Y171641D01*

+X458032Y171718D01*

+X458109Y171808D01*

+X458170Y171908D01*

+X458215Y172018D01*

+X458243Y172132D01*

+X458250Y172250D01*

+Y175750D01*

+X458243Y175868D01*

+X458215Y175982D01*

+X458170Y176092D01*

+X458109Y176192D01*

+X458032Y176282D01*

+X457942Y176359D01*

+X457842Y176420D01*

+X457732Y176465D01*

+X457618Y176493D01*

+X457500Y176502D01*

+Y192359D01*

+G37*

+G36*

+Y222359D02*X457573Y222329D01*

+X458002Y222226D01*

+X458437Y222192D01*

+Y197808D01*

+X458002Y197774D01*

+X457573Y197671D01*

+X457500Y197641D01*

+Y201498D01*

+X457618Y201507D01*

+X457732Y201535D01*

+X457842Y201580D01*

+X457942Y201641D01*

+X458032Y201718D01*

+X458109Y201808D01*

+X458170Y201908D01*

+X458215Y202018D01*

+X458243Y202132D01*

+X458250Y202250D01*

+Y205750D01*

+X458243Y205868D01*

+X458215Y205982D01*

+X458170Y206092D01*

+X458109Y206192D01*

+X458032Y206282D01*

+X457942Y206359D01*

+X457842Y206420D01*

+X457732Y206465D01*

+X457618Y206493D01*

+X457500Y206502D01*

+Y222359D01*

+G37*

+G36*

+Y251359D02*X457573Y251329D01*

+X458002Y251226D01*

+X458437Y251192D01*

+Y227808D01*

+X458002Y227774D01*

+X457573Y227671D01*

+X457500Y227641D01*

+Y231498D01*

+X457618Y231507D01*

+X457732Y231535D01*

+X457842Y231580D01*

+X457942Y231641D01*

+X458032Y231718D01*

+X458109Y231808D01*

+X458170Y231908D01*

+X458215Y232018D01*

+X458243Y232132D01*

+X458250Y232250D01*

+Y235750D01*

+X458243Y235868D01*

+X458215Y235982D01*

+X458170Y236092D01*

+X458109Y236192D01*

+X458032Y236282D01*

+X457942Y236359D01*

+X457842Y236420D01*

+X457732Y236465D01*

+X457618Y236493D01*

+X457500Y236502D01*

+Y251359D01*

+G37*

+G36*

+Y282359D02*X457573Y282329D01*

+X458002Y282226D01*

+X458437Y282192D01*

+Y256808D01*

+X458002Y256774D01*

+X457573Y256671D01*

+X457500Y256641D01*

+Y261498D01*

+X457618Y261507D01*

+X457732Y261535D01*

+X457842Y261580D01*

+X457942Y261641D01*

+X458032Y261718D01*

+X458109Y261808D01*

+X458170Y261908D01*

+X458215Y262018D01*

+X458243Y262132D01*

+X458250Y262250D01*

+Y265750D01*

+X458243Y265868D01*

+X458215Y265982D01*

+X458170Y266092D01*

+X458109Y266192D01*

+X458032Y266282D01*

+X457942Y266359D01*

+X457842Y266420D01*

+X457732Y266465D01*

+X457618Y266493D01*

+X457500Y266502D01*

+Y282359D01*

+G37*

+G36*

+Y312359D02*X457573Y312329D01*

+X458002Y312226D01*

+X458437Y312192D01*

+Y287808D01*

+X458002Y287774D01*

+X457573Y287671D01*

+X457500Y287641D01*

+Y291498D01*

+X457618Y291507D01*

+X457732Y291535D01*

+X457842Y291580D01*

+X457942Y291641D01*

+X458032Y291718D01*

+X458109Y291808D01*

+X458170Y291908D01*

+X458215Y292018D01*

+X458243Y292132D01*

+X458250Y292250D01*

+Y295750D01*

+X458243Y295868D01*

+X458215Y295982D01*

+X458170Y296092D01*

+X458109Y296192D01*

+X458032Y296282D01*

+X457942Y296359D01*

+X457842Y296420D01*

+X457732Y296465D01*

+X457618Y296493D01*

+X457500Y296502D01*

+Y312359D01*

+G37*

+G36*

+Y342359D02*X457573Y342329D01*

+X458002Y342226D01*

+X458437Y342192D01*

+Y317808D01*

+X458002Y317774D01*

+X457573Y317671D01*

+X457500Y317641D01*

+Y321498D01*

+X457618Y321507D01*

+X457732Y321535D01*

+X457842Y321580D01*

+X457942Y321641D01*

+X458032Y321718D01*

+X458109Y321808D01*

+X458170Y321908D01*

+X458215Y322018D01*

+X458243Y322132D01*

+X458250Y322250D01*

+Y325750D01*

+X458243Y325868D01*

+X458215Y325982D01*

+X458170Y326092D01*

+X458109Y326192D01*

+X458032Y326282D01*

+X457942Y326359D01*

+X457842Y326420D01*

+X457732Y326465D01*

+X457618Y326493D01*

+X457500Y326502D01*

+Y342359D01*

+G37*

+G36*

+Y372359D02*X457573Y372329D01*

+X458002Y372226D01*

+X458437Y372192D01*

+Y347808D01*

+X458002Y347774D01*

+X457573Y347671D01*

+X457500Y347641D01*

+Y351498D01*

+X457618Y351507D01*

+X457732Y351535D01*

+X457842Y351580D01*

+X457942Y351641D01*

+X458032Y351718D01*

+X458109Y351808D01*

+X458170Y351908D01*

+X458215Y352018D01*

+X458243Y352132D01*

+X458250Y352250D01*

+Y355750D01*

+X458243Y355868D01*

+X458215Y355982D01*

+X458170Y356092D01*

+X458109Y356192D01*

+X458032Y356282D01*

+X457942Y356359D01*

+X457842Y356420D01*

+X457732Y356465D01*

+X457618Y356493D01*

+X457500Y356502D01*

+Y372359D01*

+G37*

+G36*

+Y397000D02*X458437D01*

+Y377808D01*

+X458002Y377774D01*

+X457573Y377671D01*

+X457500Y377641D01*

+Y381498D01*

+X457618Y381507D01*

+X457732Y381535D01*

+X457842Y381580D01*

+X457942Y381641D01*

+X458032Y381718D01*

+X458109Y381808D01*

+X458170Y381908D01*

+X458215Y382018D01*

+X458243Y382132D01*

+X458250Y382250D01*

+Y385750D01*

+X458243Y385868D01*

+X458215Y385982D01*

+X458170Y386092D01*

+X458109Y386192D01*

+X458032Y386282D01*

+X457942Y386359D01*

+X457842Y386420D01*

+X457732Y386465D01*

+X457618Y386493D01*

+X457500Y386502D01*

+Y397000D01*

+G37*

+G36*

+X458437Y39000D02*X457500D01*

+Y51498D01*

+X457618Y51507D01*

+X457732Y51535D01*

+X457842Y51580D01*

+X457942Y51641D01*

+X458032Y51718D01*

+X458109Y51808D01*

+X458170Y51908D01*

+X458215Y52018D01*

+X458243Y52132D01*

+X458250Y52250D01*

+Y55750D01*

+X458243Y55868D01*

+X458215Y55982D01*

+X458170Y56092D01*

+X458109Y56192D01*

+X458032Y56282D01*

+X457942Y56359D01*

+X457842Y56420D01*

+X457732Y56465D01*

+X457618Y56493D01*

+X457500Y56502D01*

+Y81498D01*

+X457618Y81507D01*

+X457732Y81535D01*

+X457842Y81580D01*

+X457942Y81641D01*

+X458032Y81718D01*

+X458109Y81808D01*

+X458170Y81908D01*

+X458215Y82018D01*

+X458243Y82132D01*

+X458250Y82250D01*

+Y85750D01*

+X458243Y85868D01*

+X458215Y85982D01*

+X458170Y86092D01*

+X458109Y86192D01*

+X458032Y86282D01*

+X457942Y86359D01*

+X457842Y86420D01*

+X457732Y86465D01*

+X457618Y86493D01*

+X457500Y86502D01*

+Y111498D01*

+X457618Y111507D01*

+X457732Y111535D01*

+X457842Y111580D01*

+X457942Y111641D01*

+X458032Y111718D01*

+X458109Y111808D01*

+X458170Y111908D01*

+X458215Y112018D01*

+X458243Y112132D01*

+X458250Y112250D01*

+Y115750D01*

+X458243Y115868D01*

+X458215Y115982D01*

+X458170Y116092D01*

+X458109Y116192D01*

+X458032Y116282D01*

+X457942Y116359D01*

+X457842Y116420D01*

+X457732Y116465D01*

+X457618Y116493D01*

+X457500Y116502D01*

+Y141498D01*

+X457618Y141507D01*

+X457732Y141535D01*

+X457842Y141580D01*

+X457942Y141641D01*

+X458032Y141718D01*

+X458109Y141808D01*

+X458170Y141908D01*

+X458215Y142018D01*

+X458243Y142132D01*

+X458250Y142250D01*

+Y145750D01*

+X458243Y145868D01*

+X458215Y145982D01*

+X458170Y146092D01*

+X458109Y146192D01*

+X458032Y146282D01*

+X457942Y146359D01*

+X457842Y146420D01*

+X457732Y146465D01*

+X457618Y146493D01*

+X457500Y146502D01*

+Y161359D01*

+X457573Y161329D01*

+X458002Y161226D01*

+X458437Y161192D01*

+Y39000D01*

+G37*

+G36*

+X457500D02*X453500D01*

+Y49250D01*

+X455250D01*

+X455368Y49257D01*

+X455482Y49285D01*

+X455592Y49330D01*

+X455692Y49391D01*

+X455782Y49468D01*

+X455859Y49558D01*

+X455920Y49658D01*

+X455965Y49768D01*

+X455993Y49882D01*

+X456002Y50000D01*

+X455993Y50118D01*

+X455965Y50232D01*

+X455920Y50342D01*

+X455859Y50442D01*

+X455782Y50532D01*

+X455692Y50609D01*

+X455592Y50670D01*

+X455482Y50715D01*

+X455368Y50743D01*

+X455250Y50750D01*

+X453500D01*

+Y57250D01*

+X455250D01*

+X455368Y57257D01*

+X455482Y57285D01*

+X455592Y57330D01*

+X455692Y57391D01*

+X455782Y57468D01*

+X455859Y57558D01*

+X455920Y57658D01*

+X455965Y57768D01*

+X455993Y57882D01*

+X456002Y58000D01*

+X455993Y58118D01*

+X455965Y58232D01*

+X455920Y58342D01*

+X455859Y58442D01*

+X455782Y58532D01*

+X455692Y58609D01*

+X455592Y58670D01*

+X455482Y58715D01*

+X455368Y58743D01*

+X455250Y58750D01*

+X453500D01*

+Y79250D01*

+X455250D01*

+X455368Y79257D01*

+X455482Y79285D01*

+X455592Y79330D01*

+X455692Y79391D01*

+X455782Y79468D01*

+X455859Y79558D01*

+X455920Y79658D01*

+X455965Y79768D01*

+X455993Y79882D01*

+X456002Y80000D01*

+X455993Y80118D01*

+X455965Y80232D01*

+X455920Y80342D01*

+X455859Y80442D01*

+X455782Y80532D01*

+X455692Y80609D01*

+X455592Y80670D01*

+X455482Y80715D01*

+X455368Y80743D01*

+X455250Y80750D01*

+X453500D01*

+Y87250D01*

+X455250D01*

+X455368Y87257D01*

+X455482Y87285D01*

+X455592Y87330D01*

+X455692Y87391D01*

+X455782Y87468D01*

+X455859Y87558D01*

+X455920Y87658D01*

+X455965Y87768D01*

+X455993Y87882D01*

+X456002Y88000D01*

+X455993Y88118D01*

+X455965Y88232D01*

+X455920Y88342D01*

+X455859Y88442D01*

+X455782Y88532D01*

+X455692Y88609D01*

+X455592Y88670D01*

+X455482Y88715D01*

+X455368Y88743D01*

+X455250Y88750D01*

+X453500D01*

+Y109250D01*

+X455250D01*

+X455368Y109257D01*

+X455482Y109285D01*

+X455592Y109330D01*

+X455692Y109391D01*

+X455782Y109468D01*

+X455859Y109558D01*

+X455920Y109658D01*

+X455965Y109768D01*

+X455993Y109882D01*

+X456002Y110000D01*

+X455993Y110118D01*

+X455965Y110232D01*

+X455920Y110342D01*

+X455859Y110442D01*

+X455782Y110532D01*

+X455692Y110609D01*

+X455592Y110670D01*

+X455482Y110715D01*

+X455368Y110743D01*

+X455250Y110750D01*

+X453500D01*

+Y117250D01*

+X455250D01*

+X455368Y117257D01*

+X455482Y117285D01*

+X455592Y117330D01*

+X455692Y117391D01*

+X455782Y117468D01*

+X455859Y117558D01*

+X455920Y117658D01*

+X455965Y117768D01*

+X455993Y117882D01*

+X456002Y118000D01*

+X455993Y118118D01*

+X455965Y118232D01*

+X455920Y118342D01*

+X455859Y118442D01*

+X455782Y118532D01*

+X455692Y118609D01*

+X455592Y118670D01*

+X455482Y118715D01*

+X455368Y118743D01*

+X455250Y118750D01*

+X453500D01*

+Y139250D01*

+X455250D01*

+X455368Y139257D01*

+X455482Y139285D01*

+X455592Y139330D01*

+X455692Y139391D01*

+X455782Y139468D01*

+X455859Y139558D01*

+X455920Y139658D01*

+X455965Y139768D01*

+X455993Y139882D01*

+X456002Y140000D01*

+X455993Y140118D01*

+X455965Y140232D01*

+X455920Y140342D01*

+X455859Y140442D01*

+X455782Y140532D01*

+X455692Y140609D01*

+X455592Y140670D01*

+X455482Y140715D01*

+X455368Y140743D01*

+X455250Y140750D01*

+X453500D01*

+Y147250D01*

+X455250D01*

+X455368Y147257D01*

+X455482Y147285D01*

+X455592Y147330D01*

+X455692Y147391D01*

+X455782Y147468D01*

+X455859Y147558D01*

+X455920Y147658D01*

+X455965Y147768D01*

+X455993Y147882D01*

+X456002Y148000D01*

+X455993Y148118D01*

+X455965Y148232D01*

+X455920Y148342D01*

+X455859Y148442D01*

+X455782Y148532D01*

+X455692Y148609D01*

+X455592Y148670D01*

+X455482Y148715D01*

+X455368Y148743D01*

+X455250Y148750D01*

+X453500D01*

+Y169250D01*

+X455250D01*

+X455368Y169257D01*

+X455482Y169285D01*

+X455592Y169330D01*

+X455692Y169391D01*

+X455782Y169468D01*

+X455859Y169558D01*

+X455920Y169658D01*

+X455965Y169768D01*

+X455993Y169882D01*

+X456002Y170000D01*

+X455993Y170118D01*

+X455965Y170232D01*

+X455920Y170342D01*

+X455859Y170442D01*

+X455782Y170532D01*

+X455692Y170609D01*

+X455592Y170670D01*

+X455482Y170715D01*

+X455368Y170743D01*

+X455250Y170750D01*

+X453500D01*

+Y177250D01*

+X455250D01*

+X455368Y177257D01*

+X455482Y177285D01*

+X455592Y177330D01*

+X455692Y177391D01*

+X455782Y177468D01*

+X455859Y177558D01*

+X455920Y177658D01*

+X455965Y177768D01*

+X455993Y177882D01*

+X456002Y178000D01*

+X455993Y178118D01*

+X455965Y178232D01*

+X455920Y178342D01*

+X455859Y178442D01*

+X455782Y178532D01*

+X455692Y178609D01*

+X455592Y178670D01*

+X455482Y178715D01*

+X455368Y178743D01*

+X455250Y178750D01*

+X453500D01*

+Y199250D01*

+X455250D01*

+X455368Y199257D01*

+X455482Y199285D01*

+X455592Y199330D01*

+X455692Y199391D01*

+X455782Y199468D01*

+X455859Y199558D01*

+X455920Y199658D01*

+X455965Y199768D01*

+X455993Y199882D01*

+X456002Y200000D01*

+X455993Y200118D01*

+X455965Y200232D01*

+X455920Y200342D01*

+X455859Y200442D01*

+X455782Y200532D01*

+X455692Y200609D01*

+X455592Y200670D01*

+X455482Y200715D01*

+X455368Y200743D01*

+X455250Y200750D01*

+X453500D01*

+Y207250D01*

+X455250D01*

+X455368Y207257D01*

+X455482Y207285D01*

+X455592Y207330D01*

+X455692Y207391D01*

+X455782Y207468D01*

+X455859Y207558D01*

+X455920Y207658D01*

+X455965Y207768D01*

+X455993Y207882D01*

+X456002Y208000D01*

+X455993Y208118D01*

+X455965Y208232D01*

+X455920Y208342D01*

+X455859Y208442D01*

+X455782Y208532D01*

+X455692Y208609D01*

+X455592Y208670D01*

+X455482Y208715D01*

+X455368Y208743D01*

+X455250Y208750D01*

+X453500D01*

+Y229250D01*

+X455250D01*

+X455368Y229257D01*

+X455482Y229285D01*

+X455592Y229330D01*

+X455692Y229391D01*

+X455782Y229468D01*

+X455859Y229558D01*

+X455920Y229658D01*

+X455965Y229768D01*

+X455993Y229882D01*

+X456002Y230000D01*

+X455993Y230118D01*

+X455965Y230232D01*

+X455920Y230342D01*

+X455859Y230442D01*

+X455782Y230532D01*

+X455692Y230609D01*

+X455592Y230670D01*

+X455482Y230715D01*

+X455368Y230743D01*

+X455250Y230750D01*

+X453500D01*

+Y237250D01*

+X455250D01*

+X455368Y237257D01*

+X455482Y237285D01*

+X455592Y237330D01*

+X455692Y237391D01*

+X455782Y237468D01*

+X455859Y237558D01*

+X455920Y237658D01*

+X455965Y237768D01*

+X455993Y237882D01*

+X456002Y238000D01*

+X455993Y238118D01*

+X455965Y238232D01*

+X455920Y238342D01*

+X455859Y238442D01*

+X455782Y238532D01*

+X455692Y238609D01*

+X455592Y238670D01*

+X455482Y238715D01*

+X455368Y238743D01*

+X455250Y238750D01*

+X453500D01*

+Y259250D01*

+X455250D01*

+X455368Y259257D01*

+X455482Y259285D01*

+X455592Y259330D01*

+X455692Y259391D01*

+X455782Y259468D01*

+X455859Y259558D01*

+X455920Y259658D01*

+X455965Y259768D01*

+X455993Y259882D01*

+X456002Y260000D01*

+X455993Y260118D01*

+X455965Y260232D01*

+X455920Y260342D01*

+X455859Y260442D01*

+X455782Y260532D01*

+X455692Y260609D01*

+X455592Y260670D01*

+X455482Y260715D01*

+X455368Y260743D01*

+X455250Y260750D01*

+X453500D01*

+Y267250D01*

+X455250D01*

+X455368Y267257D01*

+X455482Y267285D01*

+X455592Y267330D01*

+X455692Y267391D01*

+X455782Y267468D01*

+X455859Y267558D01*

+X455920Y267658D01*

+X455965Y267768D01*

+X455993Y267882D01*

+X456002Y268000D01*

+X455993Y268118D01*

+X455965Y268232D01*

+X455920Y268342D01*

+X455859Y268442D01*

+X455782Y268532D01*

+X455692Y268609D01*

+X455592Y268670D01*

+X455482Y268715D01*

+X455368Y268743D01*

+X455250Y268750D01*

+X453500D01*

+Y289250D01*

+X455250D01*

+X455368Y289257D01*

+X455482Y289285D01*

+X455592Y289330D01*

+X455692Y289391D01*

+X455782Y289468D01*

+X455859Y289558D01*

+X455920Y289658D01*

+X455965Y289768D01*

+X455993Y289882D01*

+X456002Y290000D01*

+X455993Y290118D01*

+X455965Y290232D01*

+X455920Y290342D01*

+X455859Y290442D01*

+X455782Y290532D01*

+X455692Y290609D01*

+X455592Y290670D01*

+X455482Y290715D01*

+X455368Y290743D01*

+X455250Y290750D01*

+X453500D01*

+Y297250D01*

+X455250D01*

+X455368Y297257D01*

+X455482Y297285D01*

+X455592Y297330D01*

+X455692Y297391D01*

+X455782Y297468D01*

+X455859Y297558D01*

+X455920Y297658D01*

+X455965Y297768D01*

+X455993Y297882D01*

+X456002Y298000D01*

+X455993Y298118D01*

+X455965Y298232D01*

+X455920Y298342D01*

+X455859Y298442D01*

+X455782Y298532D01*

+X455692Y298609D01*

+X455592Y298670D01*

+X455482Y298715D01*

+X455368Y298743D01*

+X455250Y298750D01*

+X453500D01*

+Y319250D01*

+X455250D01*

+X455368Y319257D01*

+X455482Y319285D01*

+X455592Y319330D01*

+X455692Y319391D01*

+X455782Y319468D01*

+X455859Y319558D01*

+X455920Y319658D01*

+X455965Y319768D01*

+X455993Y319882D01*

+X456002Y320000D01*

+X455993Y320118D01*

+X455965Y320232D01*

+X455920Y320342D01*

+X455859Y320442D01*

+X455782Y320532D01*

+X455692Y320609D01*

+X455592Y320670D01*

+X455482Y320715D01*

+X455368Y320743D01*

+X455250Y320750D01*

+X453500D01*

+Y327250D01*

+X455250D01*

+X455368Y327257D01*

+X455482Y327285D01*

+X455592Y327330D01*

+X455692Y327391D01*

+X455782Y327468D01*

+X455859Y327558D01*

+X455920Y327658D01*

+X455965Y327768D01*

+X455993Y327882D01*

+X456002Y328000D01*

+X455993Y328118D01*

+X455965Y328232D01*

+X455920Y328342D01*

+X455859Y328442D01*

+X455782Y328532D01*

+X455692Y328609D01*

+X455592Y328670D01*

+X455482Y328715D01*

+X455368Y328743D01*

+X455250Y328750D01*

+X453500D01*

+Y349250D01*

+X455250D01*

+X455368Y349257D01*

+X455482Y349285D01*

+X455592Y349330D01*

+X455692Y349391D01*

+X455782Y349468D01*

+X455859Y349558D01*

+X455920Y349658D01*

+X455965Y349768D01*

+X455993Y349882D01*

+X456002Y350000D01*

+X455993Y350118D01*

+X455965Y350232D01*

+X455920Y350342D01*

+X455859Y350442D01*

+X455782Y350532D01*

+X455692Y350609D01*

+X455592Y350670D01*

+X455482Y350715D01*

+X455368Y350743D01*

+X455250Y350750D01*

+X453500D01*

+Y357250D01*

+X455250D01*

+X455368Y357257D01*

+X455482Y357285D01*

+X455592Y357330D01*

+X455692Y357391D01*

+X455782Y357468D01*

+X455859Y357558D01*

+X455920Y357658D01*

+X455965Y357768D01*

+X455993Y357882D01*

+X456002Y358000D01*

+X455993Y358118D01*

+X455965Y358232D01*

+X455920Y358342D01*

+X455859Y358442D01*

+X455782Y358532D01*

+X455692Y358609D01*

+X455592Y358670D01*

+X455482Y358715D01*

+X455368Y358743D01*

+X455250Y358750D01*

+X453500D01*

+Y379250D01*

+X455250D01*

+X455368Y379257D01*

+X455482Y379285D01*

+X455592Y379330D01*

+X455692Y379391D01*

+X455782Y379468D01*

+X455859Y379558D01*

+X455920Y379658D01*

+X455965Y379768D01*

+X455993Y379882D01*

+X456002Y380000D01*

+X455993Y380118D01*

+X455965Y380232D01*

+X455920Y380342D01*

+X455859Y380442D01*

+X455782Y380532D01*

+X455692Y380609D01*

+X455592Y380670D01*

+X455482Y380715D01*

+X455368Y380743D01*

+X455250Y380750D01*

+X453500D01*

+Y387250D01*

+X455250D01*

+X455368Y387257D01*

+X455482Y387285D01*

+X455592Y387330D01*

+X455692Y387391D01*

+X455782Y387468D01*

+X455859Y387558D01*

+X455920Y387658D01*

+X455965Y387768D01*

+X455993Y387882D01*

+X456002Y388000D01*

+X455993Y388118D01*

+X455965Y388232D01*

+X455920Y388342D01*

+X455859Y388442D01*

+X455782Y388532D01*

+X455692Y388609D01*

+X455592Y388670D01*

+X455482Y388715D01*

+X455368Y388743D01*

+X455250Y388750D01*

+X453500D01*

+Y397000D01*

+X457500D01*

+Y386502D01*

+X457382Y386493D01*

+X457268Y386465D01*

+X457158Y386420D01*

+X457058Y386359D01*

+X456968Y386282D01*

+X456891Y386192D01*

+X456830Y386092D01*

+X456785Y385982D01*

+X456757Y385868D01*

+X456750Y385750D01*

+Y382250D01*

+X456757Y382132D01*

+X456785Y382018D01*

+X456830Y381908D01*

+X456891Y381808D01*

+X456968Y381718D01*

+X457058Y381641D01*

+X457158Y381580D01*

+X457268Y381535D01*

+X457382Y381507D01*

+X457500Y381498D01*

+Y377641D01*

+X457166Y377503D01*

+X456790Y377272D01*

+X456455Y376986D01*

+X456169Y376651D01*

+X455938Y376275D01*

+X455770Y375868D01*

+X455667Y375439D01*

+X455632Y375000D01*

+X455667Y374561D01*

+X455770Y374132D01*

+X455938Y373725D01*

+X456169Y373349D01*

+X456455Y373014D01*

+X456790Y372728D01*

+X457166Y372497D01*

+X457500Y372359D01*

+Y356502D01*

+X457382Y356493D01*

+X457268Y356465D01*

+X457158Y356420D01*

+X457058Y356359D01*

+X456968Y356282D01*

+X456891Y356192D01*

+X456830Y356092D01*

+X456785Y355982D01*

+X456757Y355868D01*

+X456750Y355750D01*

+Y352250D01*

+X456757Y352132D01*

+X456785Y352018D01*

+X456830Y351908D01*

+X456891Y351808D01*

+X456968Y351718D01*

+X457058Y351641D01*

+X457158Y351580D01*

+X457268Y351535D01*

+X457382Y351507D01*

+X457500Y351498D01*

+Y347641D01*

+X457166Y347503D01*

+X456790Y347272D01*

+X456455Y346986D01*

+X456169Y346651D01*

+X455938Y346275D01*

+X455770Y345868D01*

+X455667Y345439D01*

+X455632Y345000D01*

+X455667Y344561D01*

+X455770Y344132D01*

+X455938Y343725D01*

+X456169Y343349D01*

+X456455Y343014D01*

+X456790Y342728D01*

+X457166Y342497D01*

+X457500Y342359D01*

+Y326502D01*

+X457382Y326493D01*

+X457268Y326465D01*

+X457158Y326420D01*

+X457058Y326359D01*

+X456968Y326282D01*

+X456891Y326192D01*

+X456830Y326092D01*

+X456785Y325982D01*

+X456757Y325868D01*

+X456750Y325750D01*

+Y322250D01*

+X456757Y322132D01*

+X456785Y322018D01*

+X456830Y321908D01*

+X456891Y321808D01*

+X456968Y321718D01*

+X457058Y321641D01*

+X457158Y321580D01*

+X457268Y321535D01*

+X457382Y321507D01*

+X457500Y321498D01*

+Y317641D01*

+X457166Y317503D01*

+X456790Y317272D01*

+X456455Y316986D01*

+X456169Y316651D01*

+X455938Y316275D01*

+X455770Y315868D01*

+X455667Y315439D01*

+X455632Y315000D01*

+X455667Y314561D01*

+X455770Y314132D01*

+X455938Y313725D01*

+X456169Y313349D01*

+X456455Y313014D01*

+X456790Y312728D01*

+X457166Y312497D01*

+X457500Y312359D01*

+Y296502D01*

+X457382Y296493D01*

+X457268Y296465D01*

+X457158Y296420D01*

+X457058Y296359D01*

+X456968Y296282D01*

+X456891Y296192D01*

+X456830Y296092D01*

+X456785Y295982D01*

+X456757Y295868D01*

+X456750Y295750D01*

+Y292250D01*

+X456757Y292132D01*

+X456785Y292018D01*

+X456830Y291908D01*

+X456891Y291808D01*

+X456968Y291718D01*

+X457058Y291641D01*

+X457158Y291580D01*

+X457268Y291535D01*

+X457382Y291507D01*

+X457500Y291498D01*

+Y287641D01*

+X457166Y287503D01*

+X456790Y287272D01*

+X456455Y286986D01*

+X456169Y286651D01*

+X455938Y286275D01*

+X455770Y285868D01*

+X455667Y285439D01*

+X455632Y285000D01*

+X455667Y284561D01*

+X455770Y284132D01*

+X455938Y283725D01*

+X456169Y283349D01*

+X456455Y283014D01*

+X456790Y282728D01*

+X457166Y282497D01*

+X457500Y282359D01*

+Y266502D01*

+X457382Y266493D01*

+X457268Y266465D01*

+X457158Y266420D01*

+X457058Y266359D01*

+X456968Y266282D01*

+X456891Y266192D01*

+X456830Y266092D01*

+X456785Y265982D01*

+X456757Y265868D01*

+X456750Y265750D01*

+Y262250D01*

+X456757Y262132D01*

+X456785Y262018D01*

+X456830Y261908D01*

+X456891Y261808D01*

+X456968Y261718D01*

+X457058Y261641D01*

+X457158Y261580D01*

+X457268Y261535D01*

+X457382Y261507D01*

+X457500Y261498D01*

+Y256641D01*

+X457166Y256503D01*

+X456790Y256272D01*

+X456455Y255986D01*

+X456169Y255651D01*

+X455938Y255275D01*

+X455770Y254868D01*

+X455667Y254439D01*

+X455632Y254000D01*

+X455667Y253561D01*

+X455770Y253132D01*

+X455938Y252725D01*

+X456169Y252349D01*

+X456455Y252014D01*

+X456790Y251728D01*

+X457166Y251497D01*

+X457500Y251359D01*

+Y236502D01*

+X457382Y236493D01*

+X457268Y236465D01*

+X457158Y236420D01*

+X457058Y236359D01*

+X456968Y236282D01*

+X456891Y236192D01*

+X456830Y236092D01*

+X456785Y235982D01*

+X456757Y235868D01*

+X456750Y235750D01*

+Y232250D01*

+X456757Y232132D01*

+X456785Y232018D01*

+X456830Y231908D01*

+X456891Y231808D01*

+X456968Y231718D01*

+X457058Y231641D01*

+X457158Y231580D01*

+X457268Y231535D01*

+X457382Y231507D01*

+X457500Y231498D01*

+Y227641D01*

+X457166Y227503D01*

+X456790Y227272D01*

+X456455Y226986D01*

+X456169Y226651D01*

+X455938Y226275D01*

+X455770Y225868D01*

+X455667Y225439D01*

+X455632Y225000D01*

+X455667Y224561D01*

+X455770Y224132D01*

+X455938Y223725D01*

+X456169Y223349D01*

+X456455Y223014D01*

+X456790Y222728D01*

+X457166Y222497D01*

+X457500Y222359D01*

+Y206502D01*

+X457382Y206493D01*

+X457268Y206465D01*

+X457158Y206420D01*

+X457058Y206359D01*

+X456968Y206282D01*

+X456891Y206192D01*

+X456830Y206092D01*

+X456785Y205982D01*

+X456757Y205868D01*

+X456750Y205750D01*

+Y202250D01*

+X456757Y202132D01*

+X456785Y202018D01*

+X456830Y201908D01*

+X456891Y201808D01*

+X456968Y201718D01*

+X457058Y201641D01*

+X457158Y201580D01*

+X457268Y201535D01*

+X457382Y201507D01*

+X457500Y201498D01*

+Y197641D01*

+X457166Y197503D01*

+X456790Y197272D01*

+X456455Y196986D01*

+X456169Y196651D01*

+X455938Y196275D01*

+X455770Y195868D01*

+X455667Y195439D01*

+X455632Y195000D01*

+X455667Y194561D01*

+X455770Y194132D01*

+X455938Y193725D01*

+X456169Y193349D01*

+X456455Y193014D01*

+X456790Y192728D01*

+X457166Y192497D01*

+X457500Y192359D01*

+Y176502D01*

+X457382Y176493D01*

+X457268Y176465D01*

+X457158Y176420D01*

+X457058Y176359D01*

+X456968Y176282D01*

+X456891Y176192D01*

+X456830Y176092D01*

+X456785Y175982D01*

+X456757Y175868D01*

+X456750Y175750D01*

+Y172250D01*

+X456757Y172132D01*

+X456785Y172018D01*

+X456830Y171908D01*

+X456891Y171808D01*

+X456968Y171718D01*

+X457058Y171641D01*

+X457158Y171580D01*

+X457268Y171535D01*

+X457382Y171507D01*

+X457500Y171498D01*

+Y166641D01*

+X457166Y166503D01*

+X456790Y166272D01*

+X456455Y165986D01*

+X456169Y165651D01*

+X455938Y165275D01*

+X455770Y164868D01*

+X455667Y164439D01*

+X455632Y164000D01*

+X455667Y163561D01*

+X455770Y163132D01*

+X455938Y162725D01*

+X456169Y162349D01*

+X456455Y162014D01*

+X456790Y161728D01*

+X457166Y161497D01*

+X457500Y161359D01*

+Y146502D01*

+X457382Y146493D01*

+X457268Y146465D01*

+X457158Y146420D01*

+X457058Y146359D01*

+X456968Y146282D01*

+X456891Y146192D01*

+X456830Y146092D01*

+X456785Y145982D01*

+X456757Y145868D01*

+X456750Y145750D01*

+Y142250D01*

+X456757Y142132D01*

+X456785Y142018D01*

+X456830Y141908D01*

+X456891Y141808D01*

+X456968Y141718D01*

+X457058Y141641D01*

+X457158Y141580D01*

+X457268Y141535D01*

+X457382Y141507D01*

+X457500Y141498D01*

+Y116502D01*

+X457382Y116493D01*

+X457268Y116465D01*

+X457158Y116420D01*

+X457058Y116359D01*

+X456968Y116282D01*

+X456891Y116192D01*

+X456830Y116092D01*

+X456785Y115982D01*

+X456757Y115868D01*

+X456750Y115750D01*

+Y112250D01*

+X456757Y112132D01*

+X456785Y112018D01*

+X456830Y111908D01*

+X456891Y111808D01*

+X456968Y111718D01*

+X457058Y111641D01*

+X457158Y111580D01*

+X457268Y111535D01*

+X457382Y111507D01*

+X457500Y111498D01*

+Y86502D01*

+X457382Y86493D01*

+X457268Y86465D01*

+X457158Y86420D01*

+X457058Y86359D01*

+X456968Y86282D01*

+X456891Y86192D01*

+X456830Y86092D01*

+X456785Y85982D01*

+X456757Y85868D01*

+X456750Y85750D01*

+Y82250D01*

+X456757Y82132D01*

+X456785Y82018D01*

+X456830Y81908D01*

+X456891Y81808D01*

+X456968Y81718D01*

+X457058Y81641D01*

+X457158Y81580D01*

+X457268Y81535D01*

+X457382Y81507D01*

+X457500Y81498D01*

+Y56502D01*

+X457382Y56493D01*

+X457268Y56465D01*

+X457158Y56420D01*

+X457058Y56359D01*

+X456968Y56282D01*

+X456891Y56192D01*

+X456830Y56092D01*

+X456785Y55982D01*

+X456757Y55868D01*

+X456750Y55750D01*

+Y52250D01*

+X456757Y52132D01*

+X456785Y52018D01*

+X456830Y51908D01*

+X456891Y51808D01*

+X456968Y51718D01*

+X457058Y51641D01*

+X457158Y51580D01*

+X457268Y51535D01*

+X457382Y51507D01*

+X457500Y51498D01*

+Y39000D01*

+G37*

+G36*

+X453500D02*X449500D01*

+Y51498D01*

+X449618Y51507D01*

+X449732Y51535D01*

+X449842Y51580D01*

+X449942Y51641D01*

+X450032Y51718D01*

+X450109Y51808D01*

+X450170Y51908D01*

+X450215Y52018D01*

+X450243Y52132D01*

+X450250Y52250D01*

+Y55750D01*

+X450243Y55868D01*

+X450215Y55982D01*

+X450170Y56092D01*

+X450109Y56192D01*

+X450032Y56282D01*

+X449942Y56359D01*

+X449842Y56420D01*

+X449732Y56465D01*

+X449618Y56493D01*

+X449500Y56502D01*

+Y81498D01*

+X449618Y81507D01*

+X449732Y81535D01*

+X449842Y81580D01*

+X449942Y81641D01*

+X450032Y81718D01*

+X450109Y81808D01*

+X450170Y81908D01*

+X450215Y82018D01*

+X450243Y82132D01*

+X450250Y82250D01*

+Y85750D01*

+X450243Y85868D01*

+X450215Y85982D01*

+X450170Y86092D01*

+X450109Y86192D01*

+X450032Y86282D01*

+X449942Y86359D01*

+X449842Y86420D01*

+X449732Y86465D01*

+X449618Y86493D01*

+X449500Y86502D01*

+Y111498D01*

+X449618Y111507D01*

+X449732Y111535D01*

+X449842Y111580D01*

+X449942Y111641D01*

+X450032Y111718D01*

+X450109Y111808D01*

+X450170Y111908D01*

+X450215Y112018D01*

+X450243Y112132D01*

+X450250Y112250D01*

+Y115750D01*

+X450243Y115868D01*

+X450215Y115982D01*

+X450170Y116092D01*

+X450109Y116192D01*

+X450032Y116282D01*

+X449942Y116359D01*

+X449842Y116420D01*

+X449732Y116465D01*

+X449618Y116493D01*

+X449500Y116502D01*

+Y141498D01*

+X449618Y141507D01*

+X449732Y141535D01*

+X449842Y141580D01*

+X449942Y141641D01*

+X450032Y141718D01*

+X450109Y141808D01*

+X450170Y141908D01*

+X450215Y142018D01*

+X450243Y142132D01*

+X450250Y142250D01*

+Y145750D01*

+X450243Y145868D01*

+X450215Y145982D01*

+X450170Y146092D01*

+X450109Y146192D01*

+X450032Y146282D01*

+X449942Y146359D01*

+X449842Y146420D01*

+X449732Y146465D01*

+X449618Y146493D01*

+X449500Y146502D01*

+Y171498D01*

+X449618Y171507D01*

+X449732Y171535D01*

+X449842Y171580D01*

+X449942Y171641D01*

+X450032Y171718D01*

+X450109Y171808D01*

+X450170Y171908D01*

+X450215Y172018D01*

+X450243Y172132D01*

+X450250Y172250D01*

+Y175750D01*

+X450243Y175868D01*

+X450215Y175982D01*

+X450170Y176092D01*

+X450109Y176192D01*

+X450032Y176282D01*

+X449942Y176359D01*

+X449842Y176420D01*

+X449732Y176465D01*

+X449618Y176493D01*

+X449500Y176502D01*

+Y201498D01*

+X449618Y201507D01*

+X449732Y201535D01*

+X449842Y201580D01*

+X449942Y201641D01*

+X450032Y201718D01*

+X450109Y201808D01*

+X450170Y201908D01*

+X450215Y202018D01*

+X450243Y202132D01*

+X450250Y202250D01*

+Y205750D01*

+X450243Y205868D01*

+X450215Y205982D01*

+X450170Y206092D01*

+X450109Y206192D01*

+X450032Y206282D01*

+X449942Y206359D01*

+X449842Y206420D01*

+X449732Y206465D01*

+X449618Y206493D01*

+X449500Y206502D01*

+Y231498D01*

+X449618Y231507D01*

+X449732Y231535D01*

+X449842Y231580D01*

+X449942Y231641D01*

+X450032Y231718D01*

+X450109Y231808D01*

+X450170Y231908D01*

+X450215Y232018D01*

+X450243Y232132D01*

+X450250Y232250D01*

+Y235750D01*

+X450243Y235868D01*

+X450215Y235982D01*

+X450170Y236092D01*

+X450109Y236192D01*

+X450032Y236282D01*

+X449942Y236359D01*

+X449842Y236420D01*

+X449732Y236465D01*

+X449618Y236493D01*

+X449500Y236502D01*

+Y261498D01*

+X449618Y261507D01*

+X449732Y261535D01*

+X449842Y261580D01*

+X449942Y261641D01*

+X450032Y261718D01*

+X450109Y261808D01*

+X450170Y261908D01*

+X450215Y262018D01*

+X450243Y262132D01*

+X450250Y262250D01*

+Y265750D01*

+X450243Y265868D01*

+X450215Y265982D01*

+X450170Y266092D01*

+X450109Y266192D01*

+X450032Y266282D01*

+X449942Y266359D01*

+X449842Y266420D01*

+X449732Y266465D01*

+X449618Y266493D01*

+X449500Y266502D01*

+Y291498D01*

+X449618Y291507D01*

+X449732Y291535D01*

+X449842Y291580D01*

+X449942Y291641D01*

+X450032Y291718D01*

+X450109Y291808D01*

+X450170Y291908D01*

+X450215Y292018D01*

+X450243Y292132D01*

+X450250Y292250D01*

+Y295750D01*

+X450243Y295868D01*

+X450215Y295982D01*

+X450170Y296092D01*

+X450109Y296192D01*

+X450032Y296282D01*

+X449942Y296359D01*

+X449842Y296420D01*

+X449732Y296465D01*

+X449618Y296493D01*

+X449500Y296502D01*

+Y321498D01*

+X449618Y321507D01*

+X449732Y321535D01*

+X449842Y321580D01*

+X449942Y321641D01*

+X450032Y321718D01*

+X450109Y321808D01*

+X450170Y321908D01*

+X450215Y322018D01*

+X450243Y322132D01*

+X450250Y322250D01*

+Y325750D01*

+X450243Y325868D01*

+X450215Y325982D01*

+X450170Y326092D01*

+X450109Y326192D01*

+X450032Y326282D01*

+X449942Y326359D01*

+X449842Y326420D01*

+X449732Y326465D01*

+X449618Y326493D01*

+X449500Y326502D01*

+Y351498D01*

+X449618Y351507D01*

+X449732Y351535D01*

+X449842Y351580D01*

+X449942Y351641D01*

+X450032Y351718D01*

+X450109Y351808D01*

+X450170Y351908D01*

+X450215Y352018D01*

+X450243Y352132D01*

+X450250Y352250D01*

+Y355750D01*

+X450243Y355868D01*

+X450215Y355982D01*

+X450170Y356092D01*

+X450109Y356192D01*

+X450032Y356282D01*

+X449942Y356359D01*

+X449842Y356420D01*

+X449732Y356465D01*

+X449618Y356493D01*

+X449500Y356502D01*

+Y381498D01*

+X449618Y381507D01*

+X449732Y381535D01*

+X449842Y381580D01*

+X449942Y381641D01*

+X450032Y381718D01*

+X450109Y381808D01*

+X450170Y381908D01*

+X450215Y382018D01*

+X450243Y382132D01*

+X450250Y382250D01*

+Y385750D01*

+X450243Y385868D01*

+X450215Y385982D01*

+X450170Y386092D01*

+X450109Y386192D01*

+X450032Y386282D01*

+X449942Y386359D01*

+X449842Y386420D01*

+X449732Y386465D01*

+X449618Y386493D01*

+X449500Y386502D01*

+Y397000D01*

+X453500D01*

+Y388750D01*

+X451750D01*

+X451632Y388743D01*

+X451518Y388715D01*

+X451408Y388670D01*

+X451308Y388609D01*

+X451218Y388532D01*

+X451141Y388442D01*

+X451080Y388342D01*

+X451035Y388232D01*

+X451007Y388118D01*

+X450998Y388000D01*

+X451007Y387882D01*

+X451035Y387768D01*

+X451080Y387658D01*

+X451141Y387558D01*

+X451218Y387468D01*

+X451308Y387391D01*

+X451408Y387330D01*

+X451518Y387285D01*

+X451632Y387257D01*

+X451750Y387250D01*

+X453500D01*

+Y380750D01*

+X451750D01*

+X451632Y380743D01*

+X451518Y380715D01*

+X451408Y380670D01*

+X451308Y380609D01*

+X451218Y380532D01*

+X451141Y380442D01*

+X451080Y380342D01*

+X451035Y380232D01*

+X451007Y380118D01*

+X450998Y380000D01*

+X451007Y379882D01*

+X451035Y379768D01*

+X451080Y379658D01*

+X451141Y379558D01*

+X451218Y379468D01*

+X451308Y379391D01*

+X451408Y379330D01*

+X451518Y379285D01*

+X451632Y379257D01*

+X451750Y379250D01*

+X453500D01*

+Y358750D01*

+X451750D01*

+X451632Y358743D01*

+X451518Y358715D01*

+X451408Y358670D01*

+X451308Y358609D01*

+X451218Y358532D01*

+X451141Y358442D01*

+X451080Y358342D01*

+X451035Y358232D01*

+X451007Y358118D01*

+X450998Y358000D01*

+X451007Y357882D01*

+X451035Y357768D01*

+X451080Y357658D01*

+X451141Y357558D01*

+X451218Y357468D01*

+X451308Y357391D01*

+X451408Y357330D01*

+X451518Y357285D01*

+X451632Y357257D01*

+X451750Y357250D01*

+X453500D01*

+Y350750D01*

+X451750D01*

+X451632Y350743D01*

+X451518Y350715D01*

+X451408Y350670D01*

+X451308Y350609D01*

+X451218Y350532D01*

+X451141Y350442D01*

+X451080Y350342D01*

+X451035Y350232D01*

+X451007Y350118D01*

+X450998Y350000D01*

+X451007Y349882D01*

+X451035Y349768D01*

+X451080Y349658D01*

+X451141Y349558D01*

+X451218Y349468D01*

+X451308Y349391D01*

+X451408Y349330D01*

+X451518Y349285D01*

+X451632Y349257D01*

+X451750Y349250D01*

+X453500D01*

+Y328750D01*

+X451750D01*

+X451632Y328743D01*

+X451518Y328715D01*

+X451408Y328670D01*

+X451308Y328609D01*

+X451218Y328532D01*

+X451141Y328442D01*

+X451080Y328342D01*

+X451035Y328232D01*

+X451007Y328118D01*

+X450998Y328000D01*

+X451007Y327882D01*

+X451035Y327768D01*

+X451080Y327658D01*

+X451141Y327558D01*

+X451218Y327468D01*

+X451308Y327391D01*

+X451408Y327330D01*

+X451518Y327285D01*

+X451632Y327257D01*

+X451750Y327250D01*

+X453500D01*

+Y320750D01*

+X451750D01*

+X451632Y320743D01*

+X451518Y320715D01*

+X451408Y320670D01*

+X451308Y320609D01*

+X451218Y320532D01*

+X451141Y320442D01*

+X451080Y320342D01*

+X451035Y320232D01*

+X451007Y320118D01*

+X450998Y320000D01*

+X451007Y319882D01*

+X451035Y319768D01*

+X451080Y319658D01*

+X451141Y319558D01*

+X451218Y319468D01*

+X451308Y319391D01*

+X451408Y319330D01*

+X451518Y319285D01*

+X451632Y319257D01*

+X451750Y319250D01*

+X453500D01*

+Y298750D01*

+X451750D01*

+X451632Y298743D01*

+X451518Y298715D01*

+X451408Y298670D01*

+X451308Y298609D01*

+X451218Y298532D01*

+X451141Y298442D01*

+X451080Y298342D01*

+X451035Y298232D01*

+X451007Y298118D01*

+X450998Y298000D01*

+X451007Y297882D01*

+X451035Y297768D01*

+X451080Y297658D01*

+X451141Y297558D01*

+X451218Y297468D01*

+X451308Y297391D01*

+X451408Y297330D01*

+X451518Y297285D01*

+X451632Y297257D01*

+X451750Y297250D01*

+X453500D01*

+Y290750D01*

+X451750D01*

+X451632Y290743D01*

+X451518Y290715D01*

+X451408Y290670D01*

+X451308Y290609D01*

+X451218Y290532D01*

+X451141Y290442D01*

+X451080Y290342D01*

+X451035Y290232D01*

+X451007Y290118D01*

+X450998Y290000D01*

+X451007Y289882D01*

+X451035Y289768D01*

+X451080Y289658D01*

+X451141Y289558D01*

+X451218Y289468D01*

+X451308Y289391D01*

+X451408Y289330D01*

+X451518Y289285D01*

+X451632Y289257D01*

+X451750Y289250D01*

+X453500D01*

+Y268750D01*

+X451750D01*

+X451632Y268743D01*

+X451518Y268715D01*

+X451408Y268670D01*

+X451308Y268609D01*

+X451218Y268532D01*

+X451141Y268442D01*

+X451080Y268342D01*

+X451035Y268232D01*

+X451007Y268118D01*

+X450998Y268000D01*

+X451007Y267882D01*

+X451035Y267768D01*

+X451080Y267658D01*

+X451141Y267558D01*

+X451218Y267468D01*

+X451308Y267391D01*

+X451408Y267330D01*

+X451518Y267285D01*

+X451632Y267257D01*

+X451750Y267250D01*

+X453500D01*

+Y260750D01*

+X451750D01*

+X451632Y260743D01*

+X451518Y260715D01*

+X451408Y260670D01*

+X451308Y260609D01*

+X451218Y260532D01*

+X451141Y260442D01*

+X451080Y260342D01*

+X451035Y260232D01*

+X451007Y260118D01*

+X450998Y260000D01*

+X451007Y259882D01*

+X451035Y259768D01*

+X451080Y259658D01*

+X451141Y259558D01*

+X451218Y259468D01*

+X451308Y259391D01*

+X451408Y259330D01*

+X451518Y259285D01*

+X451632Y259257D01*

+X451750Y259250D01*

+X453500D01*

+Y238750D01*

+X451750D01*

+X451632Y238743D01*

+X451518Y238715D01*

+X451408Y238670D01*

+X451308Y238609D01*

+X451218Y238532D01*

+X451141Y238442D01*

+X451080Y238342D01*

+X451035Y238232D01*

+X451007Y238118D01*

+X450998Y238000D01*

+X451007Y237882D01*

+X451035Y237768D01*

+X451080Y237658D01*

+X451141Y237558D01*

+X451218Y237468D01*

+X451308Y237391D01*

+X451408Y237330D01*

+X451518Y237285D01*

+X451632Y237257D01*

+X451750Y237250D01*

+X453500D01*

+Y230750D01*

+X451750D01*

+X451632Y230743D01*

+X451518Y230715D01*

+X451408Y230670D01*

+X451308Y230609D01*

+X451218Y230532D01*

+X451141Y230442D01*

+X451080Y230342D01*

+X451035Y230232D01*

+X451007Y230118D01*

+X450998Y230000D01*

+X451007Y229882D01*

+X451035Y229768D01*

+X451080Y229658D01*

+X451141Y229558D01*

+X451218Y229468D01*

+X451308Y229391D01*

+X451408Y229330D01*

+X451518Y229285D01*

+X451632Y229257D01*

+X451750Y229250D01*

+X453500D01*

+Y208750D01*

+X451750D01*

+X451632Y208743D01*

+X451518Y208715D01*

+X451408Y208670D01*

+X451308Y208609D01*

+X451218Y208532D01*

+X451141Y208442D01*

+X451080Y208342D01*

+X451035Y208232D01*

+X451007Y208118D01*

+X450998Y208000D01*

+X451007Y207882D01*

+X451035Y207768D01*

+X451080Y207658D01*

+X451141Y207558D01*

+X451218Y207468D01*

+X451308Y207391D01*

+X451408Y207330D01*

+X451518Y207285D01*

+X451632Y207257D01*

+X451750Y207250D01*

+X453500D01*

+Y200750D01*

+X451750D01*

+X451632Y200743D01*

+X451518Y200715D01*

+X451408Y200670D01*

+X451308Y200609D01*

+X451218Y200532D01*

+X451141Y200442D01*

+X451080Y200342D01*

+X451035Y200232D01*

+X451007Y200118D01*

+X450998Y200000D01*

+X451007Y199882D01*

+X451035Y199768D01*

+X451080Y199658D01*

+X451141Y199558D01*

+X451218Y199468D01*

+X451308Y199391D01*

+X451408Y199330D01*

+X451518Y199285D01*

+X451632Y199257D01*

+X451750Y199250D01*

+X453500D01*

+Y178750D01*

+X451750D01*

+X451632Y178743D01*

+X451518Y178715D01*

+X451408Y178670D01*

+X451308Y178609D01*

+X451218Y178532D01*

+X451141Y178442D01*

+X451080Y178342D01*

+X451035Y178232D01*

+X451007Y178118D01*

+X450998Y178000D01*

+X451007Y177882D01*

+X451035Y177768D01*

+X451080Y177658D01*

+X451141Y177558D01*

+X451218Y177468D01*

+X451308Y177391D01*

+X451408Y177330D01*

+X451518Y177285D01*

+X451632Y177257D01*

+X451750Y177250D01*

+X453500D01*

+Y170750D01*

+X451750D01*

+X451632Y170743D01*

+X451518Y170715D01*

+X451408Y170670D01*

+X451308Y170609D01*

+X451218Y170532D01*

+X451141Y170442D01*

+X451080Y170342D01*

+X451035Y170232D01*

+X451007Y170118D01*

+X450998Y170000D01*

+X451007Y169882D01*

+X451035Y169768D01*

+X451080Y169658D01*

+X451141Y169558D01*

+X451218Y169468D01*

+X451308Y169391D01*

+X451408Y169330D01*

+X451518Y169285D01*

+X451632Y169257D01*

+X451750Y169250D01*

+X453500D01*

+Y148750D01*

+X451750D01*

+X451632Y148743D01*

+X451518Y148715D01*

+X451408Y148670D01*

+X451308Y148609D01*

+X451218Y148532D01*

+X451141Y148442D01*

+X451080Y148342D01*

+X451035Y148232D01*

+X451007Y148118D01*

+X450998Y148000D01*

+X451007Y147882D01*

+X451035Y147768D01*

+X451080Y147658D01*

+X451141Y147558D01*

+X451218Y147468D01*

+X451308Y147391D01*

+X451408Y147330D01*

+X451518Y147285D01*

+X451632Y147257D01*

+X451750Y147250D01*

+X453500D01*

+Y140750D01*

+X451750D01*

+X451632Y140743D01*

+X451518Y140715D01*

+X451408Y140670D01*

+X451308Y140609D01*

+X451218Y140532D01*

+X451141Y140442D01*

+X451080Y140342D01*

+X451035Y140232D01*

+X451007Y140118D01*

+X450998Y140000D01*

+X451007Y139882D01*

+X451035Y139768D01*

+X451080Y139658D01*

+X451141Y139558D01*

+X451218Y139468D01*

+X451308Y139391D01*

+X451408Y139330D01*

+X451518Y139285D01*

+X451632Y139257D01*

+X451750Y139250D01*

+X453500D01*

+Y118750D01*

+X451750D01*

+X451632Y118743D01*

+X451518Y118715D01*

+X451408Y118670D01*

+X451308Y118609D01*

+X451218Y118532D01*

+X451141Y118442D01*

+X451080Y118342D01*

+X451035Y118232D01*

+X451007Y118118D01*

+X450998Y118000D01*

+X451007Y117882D01*

+X451035Y117768D01*

+X451080Y117658D01*

+X451141Y117558D01*

+X451218Y117468D01*

+X451308Y117391D01*

+X451408Y117330D01*

+X451518Y117285D01*

+X451632Y117257D01*

+X451750Y117250D01*

+X453500D01*

+Y110750D01*

+X451750D01*

+X451632Y110743D01*

+X451518Y110715D01*

+X451408Y110670D01*

+X451308Y110609D01*

+X451218Y110532D01*

+X451141Y110442D01*

+X451080Y110342D01*

+X451035Y110232D01*

+X451007Y110118D01*

+X450998Y110000D01*

+X451007Y109882D01*

+X451035Y109768D01*

+X451080Y109658D01*

+X451141Y109558D01*

+X451218Y109468D01*

+X451308Y109391D01*

+X451408Y109330D01*

+X451518Y109285D01*

+X451632Y109257D01*

+X451750Y109250D01*

+X453500D01*

+Y88750D01*

+X451750D01*

+X451632Y88743D01*

+X451518Y88715D01*

+X451408Y88670D01*

+X451308Y88609D01*

+X451218Y88532D01*

+X451141Y88442D01*

+X451080Y88342D01*

+X451035Y88232D01*

+X451007Y88118D01*

+X450998Y88000D01*

+X451007Y87882D01*

+X451035Y87768D01*

+X451080Y87658D01*

+X451141Y87558D01*

+X451218Y87468D01*

+X451308Y87391D01*

+X451408Y87330D01*

+X451518Y87285D01*

+X451632Y87257D01*

+X451750Y87250D01*

+X453500D01*

+Y80750D01*

+X451750D01*

+X451632Y80743D01*

+X451518Y80715D01*

+X451408Y80670D01*

+X451308Y80609D01*

+X451218Y80532D01*

+X451141Y80442D01*

+X451080Y80342D01*

+X451035Y80232D01*

+X451007Y80118D01*

+X450998Y80000D01*

+X451007Y79882D01*

+X451035Y79768D01*

+X451080Y79658D01*

+X451141Y79558D01*

+X451218Y79468D01*

+X451308Y79391D01*

+X451408Y79330D01*

+X451518Y79285D01*

+X451632Y79257D01*

+X451750Y79250D01*

+X453500D01*

+Y58750D01*

+X451750D01*

+X451632Y58743D01*

+X451518Y58715D01*

+X451408Y58670D01*

+X451308Y58609D01*

+X451218Y58532D01*

+X451141Y58442D01*

+X451080Y58342D01*

+X451035Y58232D01*

+X451007Y58118D01*

+X450998Y58000D01*

+X451007Y57882D01*

+X451035Y57768D01*

+X451080Y57658D01*

+X451141Y57558D01*

+X451218Y57468D01*

+X451308Y57391D01*

+X451408Y57330D01*

+X451518Y57285D01*

+X451632Y57257D01*

+X451750Y57250D01*

+X453500D01*

+Y50750D01*

+X451750D01*

+X451632Y50743D01*

+X451518Y50715D01*

+X451408Y50670D01*

+X451308Y50609D01*

+X451218Y50532D01*

+X451141Y50442D01*

+X451080Y50342D01*

+X451035Y50232D01*

+X451007Y50118D01*

+X450998Y50000D01*

+X451007Y49882D01*

+X451035Y49768D01*

+X451080Y49658D01*

+X451141Y49558D01*

+X451218Y49468D01*

+X451308Y49391D01*

+X451408Y49330D01*

+X451518Y49285D01*

+X451632Y49257D01*

+X451750Y49250D01*

+X453500D01*

+Y39000D01*

+G37*

+G36*

+X449500D02*X440446D01*

+Y54695D01*

+X440449Y54694D01*

+X440731Y54717D01*

+X441007Y54783D01*

+X441269Y54891D01*

+X441510Y55039D01*

+X441726Y55223D01*

+X441910Y55439D01*

+X442058Y55680D01*

+X442166Y55942D01*

+X442232Y56218D01*

+X442249Y56500D01*

+X442232Y56782D01*

+X442166Y57058D01*

+X442058Y57320D01*

+X441910Y57561D01*

+X441726Y57777D01*

+X441510Y57961D01*

+X441269Y58109D01*

+X441007Y58217D01*

+X440731Y58283D01*

+X440449Y58306D01*

+X440446Y58305D01*

+Y70000D01*

+X447441D01*

+X447773Y99532D01*

+X448092Y99728D01*

+X448427Y100014D01*

+X448713Y100349D01*

+X448944Y100725D01*

+X449112Y101132D01*

+X449215Y101561D01*

+X449241Y102000D01*

+X449215Y102439D01*

+X449112Y102868D01*

+X448944Y103275D01*

+X448713Y103651D01*

+X448427Y103986D01*

+X448092Y104272D01*

+X447828Y104434D01*

+X448441Y159000D01*

+X440446D01*

+Y170721D01*

+X440855Y171199D01*

+X441245Y171837D01*

+X441531Y172528D01*

+X441706Y173255D01*

+X441750Y174000D01*

+X441706Y174745D01*

+X441531Y175472D01*

+X441245Y176163D01*

+X440855Y176801D01*

+X440446Y177279D01*

+Y200721D01*

+X440855Y201199D01*

+X441245Y201837D01*

+X441531Y202528D01*

+X441706Y203255D01*

+X441750Y204000D01*

+X441706Y204745D01*

+X441531Y205472D01*

+X441245Y206163D01*

+X440855Y206801D01*

+X440446Y207279D01*

+Y230721D01*

+X440855Y231199D01*

+X441245Y231837D01*

+X441531Y232528D01*

+X441706Y233255D01*

+X441750Y234000D01*

+X441706Y234745D01*

+X441531Y235472D01*

+X441245Y236163D01*

+X440855Y236801D01*

+X440446Y237279D01*

+Y260721D01*

+X440855Y261199D01*

+X441245Y261837D01*

+X441531Y262528D01*

+X441706Y263255D01*

+X441750Y264000D01*

+X441706Y264745D01*

+X441531Y265472D01*

+X441245Y266163D01*

+X440855Y266801D01*

+X440446Y267279D01*

+Y290721D01*

+X440855Y291199D01*

+X441245Y291837D01*

+X441531Y292528D01*

+X441706Y293255D01*

+X441750Y294000D01*

+X441706Y294745D01*

+X441531Y295472D01*

+X441245Y296163D01*

+X440855Y296801D01*

+X440446Y297279D01*

+Y320721D01*

+X440855Y321199D01*

+X441245Y321837D01*

+X441531Y322528D01*

+X441706Y323255D01*

+X441750Y324000D01*

+X441706Y324745D01*

+X441531Y325472D01*

+X441245Y326163D01*

+X440855Y326801D01*

+X440446Y327279D01*

+Y350721D01*

+X440855Y351199D01*

+X441245Y351837D01*

+X441531Y352528D01*

+X441706Y353255D01*

+X441750Y354000D01*

+X441706Y354745D01*

+X441531Y355472D01*

+X441245Y356163D01*

+X440855Y356801D01*

+X440446Y357279D01*

+Y380721D01*

+X440855Y381199D01*

+X441245Y381837D01*

+X441531Y382528D01*

+X441706Y383255D01*

+X441750Y384000D01*

+X441706Y384745D01*

+X441531Y385472D01*

+X441245Y386163D01*

+X440855Y386801D01*

+X440446Y387279D01*

+Y397000D01*

+X449500D01*

+Y386502D01*

+X449382Y386493D01*

+X449268Y386465D01*

+X449158Y386420D01*

+X449058Y386359D01*

+X448968Y386282D01*

+X448891Y386192D01*

+X448830Y386092D01*

+X448785Y385982D01*

+X448757Y385868D01*

+X448750Y385750D01*

+Y382250D01*

+X448757Y382132D01*

+X448785Y382018D01*

+X448830Y381908D01*

+X448891Y381808D01*

+X448968Y381718D01*

+X449058Y381641D01*

+X449158Y381580D01*

+X449268Y381535D01*

+X449382Y381507D01*

+X449500Y381498D01*

+Y356502D01*

+X449382Y356493D01*

+X449268Y356465D01*

+X449158Y356420D01*

+X449058Y356359D01*

+X448968Y356282D01*

+X448891Y356192D01*

+X448830Y356092D01*

+X448785Y355982D01*

+X448757Y355868D01*

+X448750Y355750D01*

+Y352250D01*

+X448757Y352132D01*

+X448785Y352018D01*

+X448830Y351908D01*

+X448891Y351808D01*

+X448968Y351718D01*

+X449058Y351641D01*

+X449158Y351580D01*

+X449268Y351535D01*

+X449382Y351507D01*

+X449500Y351498D01*

+Y326502D01*

+X449382Y326493D01*

+X449268Y326465D01*

+X449158Y326420D01*

+X449058Y326359D01*

+X448968Y326282D01*

+X448891Y326192D01*

+X448830Y326092D01*

+X448785Y325982D01*

+X448757Y325868D01*

+X448750Y325750D01*

+Y322250D01*

+X448757Y322132D01*

+X448785Y322018D01*

+X448830Y321908D01*

+X448891Y321808D01*

+X448968Y321718D01*

+X449058Y321641D01*

+X449158Y321580D01*

+X449268Y321535D01*

+X449382Y321507D01*

+X449500Y321498D01*

+Y296502D01*

+X449382Y296493D01*

+X449268Y296465D01*

+X449158Y296420D01*

+X449058Y296359D01*

+X448968Y296282D01*

+X448891Y296192D01*

+X448830Y296092D01*

+X448785Y295982D01*

+X448757Y295868D01*

+X448750Y295750D01*

+Y292250D01*

+X448757Y292132D01*

+X448785Y292018D01*

+X448830Y291908D01*

+X448891Y291808D01*

+X448968Y291718D01*

+X449058Y291641D01*

+X449158Y291580D01*

+X449268Y291535D01*

+X449382Y291507D01*

+X449500Y291498D01*

+Y266502D01*

+X449382Y266493D01*

+X449268Y266465D01*

+X449158Y266420D01*

+X449058Y266359D01*

+X448968Y266282D01*

+X448891Y266192D01*

+X448830Y266092D01*

+X448785Y265982D01*

+X448757Y265868D01*

+X448750Y265750D01*

+Y262250D01*

+X448757Y262132D01*

+X448785Y262018D01*

+X448830Y261908D01*

+X448891Y261808D01*

+X448968Y261718D01*

+X449058Y261641D01*

+X449158Y261580D01*

+X449268Y261535D01*

+X449382Y261507D01*

+X449500Y261498D01*

+Y236502D01*

+X449382Y236493D01*

+X449268Y236465D01*

+X449158Y236420D01*

+X449058Y236359D01*

+X448968Y236282D01*

+X448891Y236192D01*

+X448830Y236092D01*

+X448785Y235982D01*

+X448757Y235868D01*

+X448750Y235750D01*

+Y232250D01*

+X448757Y232132D01*

+X448785Y232018D01*

+X448830Y231908D01*

+X448891Y231808D01*

+X448968Y231718D01*

+X449058Y231641D01*

+X449158Y231580D01*

+X449268Y231535D01*

+X449382Y231507D01*

+X449500Y231498D01*

+Y206502D01*

+X449382Y206493D01*

+X449268Y206465D01*

+X449158Y206420D01*

+X449058Y206359D01*

+X448968Y206282D01*

+X448891Y206192D01*

+X448830Y206092D01*

+X448785Y205982D01*

+X448757Y205868D01*

+X448750Y205750D01*

+Y202250D01*

+X448757Y202132D01*

+X448785Y202018D01*

+X448830Y201908D01*

+X448891Y201808D01*

+X448968Y201718D01*

+X449058Y201641D01*

+X449158Y201580D01*

+X449268Y201535D01*

+X449382Y201507D01*

+X449500Y201498D01*

+Y176502D01*

+X449382Y176493D01*

+X449268Y176465D01*

+X449158Y176420D01*

+X449058Y176359D01*

+X448968Y176282D01*

+X448891Y176192D01*

+X448830Y176092D01*

+X448785Y175982D01*

+X448757Y175868D01*

+X448750Y175750D01*

+Y172250D01*

+X448757Y172132D01*

+X448785Y172018D01*

+X448830Y171908D01*

+X448891Y171808D01*

+X448968Y171718D01*

+X449058Y171641D01*

+X449158Y171580D01*

+X449268Y171535D01*

+X449382Y171507D01*

+X449500Y171498D01*

+Y146502D01*

+X449382Y146493D01*

+X449268Y146465D01*

+X449158Y146420D01*

+X449058Y146359D01*

+X448968Y146282D01*

+X448891Y146192D01*

+X448830Y146092D01*

+X448785Y145982D01*

+X448757Y145868D01*

+X448750Y145750D01*

+Y142250D01*

+X448757Y142132D01*

+X448785Y142018D01*

+X448830Y141908D01*

+X448891Y141808D01*

+X448968Y141718D01*

+X449058Y141641D01*

+X449158Y141580D01*

+X449268Y141535D01*

+X449382Y141507D01*

+X449500Y141498D01*

+Y116502D01*

+X449382Y116493D01*

+X449268Y116465D01*

+X449158Y116420D01*

+X449058Y116359D01*

+X448968Y116282D01*

+X448891Y116192D01*

+X448830Y116092D01*

+X448785Y115982D01*

+X448757Y115868D01*

+X448750Y115750D01*

+Y112250D01*

+X448757Y112132D01*

+X448785Y112018D01*

+X448830Y111908D01*

+X448891Y111808D01*

+X448968Y111718D01*

+X449058Y111641D01*

+X449158Y111580D01*

+X449268Y111535D01*

+X449382Y111507D01*

+X449500Y111498D01*

+Y86502D01*

+X449382Y86493D01*

+X449268Y86465D01*

+X449158Y86420D01*

+X449058Y86359D01*

+X448968Y86282D01*

+X448891Y86192D01*

+X448830Y86092D01*

+X448785Y85982D01*

+X448757Y85868D01*

+X448750Y85750D01*

+Y82250D01*

+X448757Y82132D01*

+X448785Y82018D01*

+X448830Y81908D01*

+X448891Y81808D01*

+X448968Y81718D01*

+X449058Y81641D01*

+X449158Y81580D01*

+X449268Y81535D01*

+X449382Y81507D01*

+X449500Y81498D01*

+Y56502D01*

+X449382Y56493D01*

+X449268Y56465D01*

+X449158Y56420D01*

+X449058Y56359D01*

+X448968Y56282D01*

+X448891Y56192D01*

+X448830Y56092D01*

+X448785Y55982D01*

+X448757Y55868D01*

+X448750Y55750D01*

+Y52250D01*

+X448757Y52132D01*

+X448785Y52018D01*

+X448830Y51908D01*

+X448891Y51808D01*

+X448968Y51718D01*

+X449058Y51641D01*

+X449158Y51580D01*

+X449268Y51535D01*

+X449382Y51507D01*

+X449500Y51498D01*

+Y39000D01*

+G37*

+G36*

+X440446Y387279D02*X440369Y387369D01*

+X439801Y387855D01*

+X439163Y388245D01*

+X438472Y388531D01*

+X437745Y388706D01*

+X437000Y388765D01*

+X436255Y388706D01*

+X435528Y388531D01*

+X434837Y388245D01*

+X434446Y388006D01*

+Y397000D01*

+X440446D01*

+Y387279D01*

+G37*

+G36*

+Y357279D02*X440369Y357369D01*

+X439801Y357855D01*

+X439163Y358245D01*

+X438472Y358531D01*

+X437745Y358706D01*

+X437000Y358765D01*

+X436255Y358706D01*

+X435528Y358531D01*

+X434837Y358245D01*

+X434446Y358006D01*

+Y379994D01*

+X434837Y379755D01*

+X435528Y379469D01*

+X436255Y379294D01*

+X437000Y379235D01*

+X437745Y379294D01*

+X438472Y379469D01*

+X439163Y379755D01*

+X439801Y380145D01*

+X440369Y380631D01*

+X440446Y380721D01*

+Y357279D01*

+G37*

+G36*

+Y327279D02*X440369Y327369D01*

+X439801Y327855D01*

+X439163Y328245D01*

+X438472Y328531D01*

+X437745Y328706D01*

+X437000Y328765D01*

+X436255Y328706D01*

+X435528Y328531D01*

+X434837Y328245D01*

+X434446Y328006D01*

+Y349994D01*

+X434837Y349755D01*

+X435528Y349469D01*

+X436255Y349294D01*

+X437000Y349235D01*

+X437745Y349294D01*

+X438472Y349469D01*

+X439163Y349755D01*

+X439801Y350145D01*

+X440369Y350631D01*

+X440446Y350721D01*

+Y327279D01*

+G37*

+G36*

+Y297279D02*X440369Y297369D01*

+X439801Y297855D01*

+X439163Y298245D01*

+X438472Y298531D01*

+X437745Y298706D01*

+X437000Y298765D01*

+X436255Y298706D01*

+X435528Y298531D01*

+X434837Y298245D01*

+X434446Y298006D01*

+Y319994D01*

+X434837Y319755D01*

+X435528Y319469D01*

+X436255Y319294D01*

+X437000Y319235D01*

+X437745Y319294D01*

+X438472Y319469D01*

+X439163Y319755D01*

+X439801Y320145D01*

+X440369Y320631D01*

+X440446Y320721D01*

+Y297279D01*

+G37*

+G36*

+Y267279D02*X440369Y267369D01*

+X439801Y267855D01*

+X439163Y268245D01*

+X438472Y268531D01*

+X437745Y268706D01*

+X437000Y268765D01*

+X436255Y268706D01*

+X435528Y268531D01*

+X434837Y268245D01*

+X434446Y268006D01*

+Y289994D01*

+X434837Y289755D01*

+X435528Y289469D01*

+X436255Y289294D01*

+X437000Y289235D01*

+X437745Y289294D01*

+X438472Y289469D01*

+X439163Y289755D01*

+X439801Y290145D01*

+X440369Y290631D01*

+X440446Y290721D01*

+Y267279D01*

+G37*

+G36*

+Y237279D02*X440369Y237369D01*

+X439801Y237855D01*

+X439163Y238245D01*

+X438472Y238531D01*

+X437745Y238706D01*

+X437000Y238765D01*

+X436255Y238706D01*

+X435528Y238531D01*

+X434837Y238245D01*

+X434446Y238006D01*

+Y259994D01*

+X434837Y259755D01*

+X435528Y259469D01*

+X436255Y259294D01*

+X437000Y259235D01*

+X437745Y259294D01*

+X438472Y259469D01*

+X439163Y259755D01*

+X439801Y260145D01*

+X440369Y260631D01*

+X440446Y260721D01*

+Y237279D01*

+G37*

+G36*

+Y207279D02*X440369Y207369D01*

+X439801Y207855D01*

+X439163Y208245D01*

+X438472Y208531D01*

+X437745Y208706D01*

+X437000Y208765D01*

+X436255Y208706D01*

+X435528Y208531D01*

+X434837Y208245D01*

+X434446Y208006D01*

+Y229994D01*

+X434837Y229755D01*

+X435528Y229469D01*

+X436255Y229294D01*

+X437000Y229235D01*

+X437745Y229294D01*

+X438472Y229469D01*

+X439163Y229755D01*

+X439801Y230145D01*

+X440369Y230631D01*

+X440446Y230721D01*

+Y207279D01*

+G37*

+G36*

+Y177279D02*X440369Y177369D01*

+X439801Y177855D01*

+X439163Y178245D01*

+X438472Y178531D01*

+X437745Y178706D01*

+X437000Y178765D01*

+X436255Y178706D01*

+X435528Y178531D01*

+X434837Y178245D01*

+X434446Y178006D01*

+Y199994D01*

+X434837Y199755D01*

+X435528Y199469D01*

+X436255Y199294D01*

+X437000Y199235D01*

+X437745Y199294D01*

+X438472Y199469D01*

+X439163Y199755D01*

+X439801Y200145D01*

+X440369Y200631D01*

+X440446Y200721D01*

+Y177279D01*

+G37*

+G36*

+Y159000D02*X434446D01*

+Y169994D01*

+X434837Y169755D01*

+X435528Y169469D01*

+X436255Y169294D01*

+X437000Y169235D01*

+X437745Y169294D01*

+X438472Y169469D01*

+X439163Y169755D01*

+X439801Y170145D01*

+X440369Y170631D01*

+X440446Y170721D01*

+Y159000D01*

+G37*

+G36*

+Y39000D02*X434446D01*

+Y54695D01*

+X434449Y54694D01*

+X434731Y54717D01*

+X435007Y54783D01*

+X435269Y54891D01*

+X435510Y55039D01*

+X435726Y55223D01*

+X435910Y55439D01*

+X436058Y55680D01*

+X436166Y55942D01*

+X436232Y56218D01*

+X436249Y56500D01*

+X436232Y56782D01*

+X436166Y57058D01*

+X436058Y57320D01*

+X435910Y57561D01*

+X435726Y57777D01*

+X435510Y57961D01*

+X435269Y58109D01*

+X435007Y58217D01*

+X434731Y58283D01*

+X434449Y58306D01*

+X434446Y58305D01*

+Y70000D01*

+X440446D01*

+Y58305D01*

+X440167Y58283D01*

+X439891Y58217D01*

+X439629Y58109D01*

+X439388Y57961D01*

+X439172Y57777D01*

+X438988Y57561D01*

+X438840Y57320D01*

+X438732Y57058D01*

+X438666Y56782D01*

+X438643Y56500D01*

+X438666Y56218D01*

+X438732Y55942D01*

+X438840Y55680D01*

+X438988Y55439D01*

+X439172Y55223D01*

+X439388Y55039D01*

+X439629Y54891D01*

+X439891Y54783D01*

+X440167Y54717D01*

+X440446Y54695D01*

+Y39000D01*

+G37*

+G36*

+X434446Y159000D02*X426993D01*

+Y169236D01*

+X427000Y169235D01*

+X427745Y169294D01*

+X428472Y169469D01*

+X429163Y169755D01*

+X429801Y170145D01*

+X430369Y170631D01*

+X430855Y171199D01*

+X431245Y171837D01*

+X431531Y172528D01*

+X431706Y173255D01*

+X431750Y174000D01*

+X431706Y174745D01*

+X431531Y175472D01*

+X431245Y176163D01*

+X430855Y176801D01*

+X430369Y177369D01*

+X429801Y177855D01*

+X429163Y178245D01*

+X428472Y178531D01*

+X427745Y178706D01*

+X427000Y178765D01*

+X426993Y178764D01*

+Y199236D01*

+X427000Y199235D01*

+X427745Y199294D01*

+X428472Y199469D01*

+X429163Y199755D01*

+X429801Y200145D01*

+X430369Y200631D01*

+X430855Y201199D01*

+X431245Y201837D01*

+X431531Y202528D01*

+X431706Y203255D01*

+X431750Y204000D01*

+X431706Y204745D01*

+X431531Y205472D01*

+X431245Y206163D01*

+X430855Y206801D01*

+X430369Y207369D01*

+X429801Y207855D01*

+X429163Y208245D01*

+X428472Y208531D01*

+X427745Y208706D01*

+X427000Y208765D01*

+X426993Y208764D01*

+Y229236D01*

+X427000Y229235D01*

+X427745Y229294D01*

+X428472Y229469D01*

+X429163Y229755D01*

+X429801Y230145D01*

+X430369Y230631D01*

+X430855Y231199D01*

+X431245Y231837D01*

+X431531Y232528D01*

+X431706Y233255D01*

+X431750Y234000D01*

+X431706Y234745D01*

+X431531Y235472D01*

+X431245Y236163D01*

+X430855Y236801D01*

+X430369Y237369D01*

+X429801Y237855D01*

+X429163Y238245D01*

+X428472Y238531D01*

+X427745Y238706D01*

+X427000Y238765D01*

+X426993Y238764D01*

+Y259236D01*

+X427000Y259235D01*

+X427745Y259294D01*

+X428472Y259469D01*

+X429163Y259755D01*

+X429801Y260145D01*

+X430369Y260631D01*

+X430855Y261199D01*

+X431245Y261837D01*

+X431531Y262528D01*

+X431706Y263255D01*

+X431750Y264000D01*

+X431706Y264745D01*

+X431531Y265472D01*

+X431245Y266163D01*

+X430855Y266801D01*

+X430369Y267369D01*

+X429801Y267855D01*

+X429163Y268245D01*

+X428472Y268531D01*

+X427745Y268706D01*

+X427000Y268765D01*

+X426993Y268764D01*

+Y289236D01*

+X427000Y289235D01*

+X427745Y289294D01*

+X428472Y289469D01*

+X429163Y289755D01*

+X429801Y290145D01*

+X430369Y290631D01*

+X430855Y291199D01*

+X431245Y291837D01*

+X431531Y292528D01*

+X431706Y293255D01*

+X431750Y294000D01*

+X431706Y294745D01*

+X431531Y295472D01*

+X431245Y296163D01*

+X430855Y296801D01*

+X430369Y297369D01*

+X429801Y297855D01*

+X429163Y298245D01*

+X428472Y298531D01*

+X427745Y298706D01*

+X427000Y298765D01*

+X426993Y298764D01*

+Y319236D01*

+X427000Y319235D01*

+X427745Y319294D01*

+X428472Y319469D01*

+X429163Y319755D01*

+X429801Y320145D01*

+X430369Y320631D01*

+X430855Y321199D01*

+X431245Y321837D01*

+X431531Y322528D01*

+X431706Y323255D01*

+X431750Y324000D01*

+X431706Y324745D01*

+X431531Y325472D01*

+X431245Y326163D01*

+X430855Y326801D01*

+X430369Y327369D01*

+X429801Y327855D01*

+X429163Y328245D01*

+X428472Y328531D01*

+X427745Y328706D01*

+X427000Y328765D01*

+X426993Y328764D01*

+Y349236D01*

+X427000Y349235D01*

+X427745Y349294D01*

+X428472Y349469D01*

+X429163Y349755D01*

+X429801Y350145D01*

+X430369Y350631D01*

+X430855Y351199D01*

+X431245Y351837D01*

+X431531Y352528D01*

+X431706Y353255D01*

+X431750Y354000D01*

+X431706Y354745D01*

+X431531Y355472D01*

+X431245Y356163D01*

+X430855Y356801D01*

+X430369Y357369D01*

+X429801Y357855D01*

+X429163Y358245D01*

+X428472Y358531D01*

+X427745Y358706D01*

+X427000Y358765D01*

+X426993Y358764D01*

+Y379236D01*

+X427000Y379235D01*

+X427745Y379294D01*

+X428472Y379469D01*

+X429163Y379755D01*

+X429801Y380145D01*

+X430369Y380631D01*

+X430855Y381199D01*

+X431245Y381837D01*

+X431531Y382528D01*

+X431706Y383255D01*

+X431750Y384000D01*

+X431706Y384745D01*

+X431531Y385472D01*

+X431245Y386163D01*

+X430855Y386801D01*

+X430369Y387369D01*

+X429801Y387855D01*

+X429163Y388245D01*

+X428472Y388531D01*

+X427745Y388706D01*

+X427000Y388765D01*

+X426993Y388764D01*

+Y397000D01*

+X434446D01*

+Y388006D01*

+X434199Y387855D01*

+X433631Y387369D01*

+X433145Y386801D01*

+X432755Y386163D01*

+X432469Y385472D01*

+X432294Y384745D01*

+X432235Y384000D01*

+X432294Y383255D01*

+X432469Y382528D01*

+X432755Y381837D01*

+X433145Y381199D01*

+X433631Y380631D01*

+X434199Y380145D01*

+X434446Y379994D01*

+Y358006D01*

+X434199Y357855D01*

+X433631Y357369D01*

+X433145Y356801D01*

+X432755Y356163D01*

+X432469Y355472D01*

+X432294Y354745D01*

+X432235Y354000D01*

+X432294Y353255D01*

+X432469Y352528D01*

+X432755Y351837D01*

+X433145Y351199D01*

+X433631Y350631D01*

+X434199Y350145D01*

+X434446Y349994D01*

+Y328006D01*

+X434199Y327855D01*

+X433631Y327369D01*

+X433145Y326801D01*

+X432755Y326163D01*

+X432469Y325472D01*

+X432294Y324745D01*

+X432235Y324000D01*

+X432294Y323255D01*

+X432469Y322528D01*

+X432755Y321837D01*

+X433145Y321199D01*

+X433631Y320631D01*

+X434199Y320145D01*

+X434446Y319994D01*

+Y298006D01*

+X434199Y297855D01*

+X433631Y297369D01*

+X433145Y296801D01*

+X432755Y296163D01*

+X432469Y295472D01*

+X432294Y294745D01*

+X432235Y294000D01*

+X432294Y293255D01*

+X432469Y292528D01*

+X432755Y291837D01*

+X433145Y291199D01*

+X433631Y290631D01*

+X434199Y290145D01*

+X434446Y289994D01*

+Y268006D01*

+X434199Y267855D01*

+X433631Y267369D01*

+X433145Y266801D01*

+X432755Y266163D01*

+X432469Y265472D01*

+X432294Y264745D01*

+X432235Y264000D01*

+X432294Y263255D01*

+X432469Y262528D01*

+X432755Y261837D01*

+X433145Y261199D01*

+X433631Y260631D01*

+X434199Y260145D01*

+X434446Y259994D01*

+Y238006D01*

+X434199Y237855D01*

+X433631Y237369D01*

+X433145Y236801D01*

+X432755Y236163D01*

+X432469Y235472D01*

+X432294Y234745D01*

+X432235Y234000D01*

+X432294Y233255D01*

+X432469Y232528D01*

+X432755Y231837D01*

+X433145Y231199D01*

+X433631Y230631D01*

+X434199Y230145D01*

+X434446Y229994D01*

+Y208006D01*

+X434199Y207855D01*

+X433631Y207369D01*

+X433145Y206801D01*

+X432755Y206163D01*

+X432469Y205472D01*

+X432294Y204745D01*

+X432235Y204000D01*

+X432294Y203255D01*

+X432469Y202528D01*

+X432755Y201837D01*

+X433145Y201199D01*

+X433631Y200631D01*

+X434199Y200145D01*

+X434446Y199994D01*

+Y178006D01*

+X434199Y177855D01*

+X433631Y177369D01*

+X433145Y176801D01*

+X432755Y176163D01*

+X432469Y175472D01*

+X432294Y174745D01*

+X432235Y174000D01*

+X432294Y173255D01*

+X432469Y172528D01*

+X432755Y171837D01*

+X433145Y171199D01*

+X433631Y170631D01*

+X434199Y170145D01*

+X434446Y169994D01*

+Y159000D01*

+G37*

+G36*

+X426993D02*X416993D01*

+Y169236D01*

+X417000Y169235D01*

+X417745Y169294D01*

+X418472Y169469D01*

+X419163Y169755D01*

+X419801Y170145D01*

+X420369Y170631D01*

+X420855Y171199D01*

+X421245Y171837D01*

+X421531Y172528D01*

+X421706Y173255D01*

+X421750Y174000D01*

+X421706Y174745D01*

+X421531Y175472D01*

+X421245Y176163D01*

+X420855Y176801D01*

+X420369Y177369D01*

+X419801Y177855D01*

+X419163Y178245D01*

+X418472Y178531D01*

+X417745Y178706D01*

+X417000Y178765D01*

+X416993Y178764D01*

+Y199236D01*

+X417000Y199235D01*

+X417745Y199294D01*

+X418472Y199469D01*

+X419163Y199755D01*

+X419801Y200145D01*

+X420369Y200631D01*

+X420855Y201199D01*

+X421245Y201837D01*

+X421531Y202528D01*

+X421706Y203255D01*

+X421750Y204000D01*

+X421706Y204745D01*

+X421531Y205472D01*

+X421245Y206163D01*

+X420855Y206801D01*

+X420369Y207369D01*

+X419801Y207855D01*

+X419163Y208245D01*

+X418472Y208531D01*

+X417745Y208706D01*

+X417000Y208765D01*

+X416993Y208764D01*

+Y229236D01*

+X417000Y229235D01*

+X417745Y229294D01*

+X418472Y229469D01*

+X419163Y229755D01*

+X419801Y230145D01*

+X420369Y230631D01*

+X420855Y231199D01*

+X421245Y231837D01*

+X421531Y232528D01*

+X421706Y233255D01*

+X421750Y234000D01*

+X421706Y234745D01*

+X421531Y235472D01*

+X421245Y236163D01*

+X420855Y236801D01*

+X420369Y237369D01*

+X419801Y237855D01*

+X419163Y238245D01*

+X418472Y238531D01*

+X417745Y238706D01*

+X417000Y238765D01*

+X416993Y238764D01*

+Y259236D01*

+X417000Y259235D01*

+X417745Y259294D01*

+X418472Y259469D01*

+X419163Y259755D01*

+X419801Y260145D01*

+X420369Y260631D01*

+X420855Y261199D01*

+X421245Y261837D01*

+X421531Y262528D01*

+X421706Y263255D01*

+X421750Y264000D01*

+X421706Y264745D01*

+X421531Y265472D01*

+X421245Y266163D01*

+X420855Y266801D01*

+X420369Y267369D01*

+X419801Y267855D01*

+X419163Y268245D01*

+X418472Y268531D01*

+X417745Y268706D01*

+X417000Y268765D01*

+X416993Y268764D01*

+Y289236D01*

+X417000Y289235D01*

+X417745Y289294D01*

+X418472Y289469D01*

+X419163Y289755D01*

+X419801Y290145D01*

+X420369Y290631D01*

+X420855Y291199D01*

+X421245Y291837D01*

+X421531Y292528D01*

+X421706Y293255D01*

+X421750Y294000D01*

+X421706Y294745D01*

+X421531Y295472D01*

+X421245Y296163D01*

+X420855Y296801D01*

+X420369Y297369D01*

+X419801Y297855D01*

+X419163Y298245D01*

+X418472Y298531D01*

+X417745Y298706D01*

+X417000Y298765D01*

+X416993Y298764D01*

+Y319236D01*

+X417000Y319235D01*

+X417745Y319294D01*

+X418472Y319469D01*

+X419163Y319755D01*

+X419801Y320145D01*

+X420369Y320631D01*

+X420855Y321199D01*

+X421245Y321837D01*

+X421531Y322528D01*

+X421706Y323255D01*

+X421750Y324000D01*

+X421706Y324745D01*

+X421531Y325472D01*

+X421245Y326163D01*

+X420855Y326801D01*

+X420369Y327369D01*

+X419801Y327855D01*

+X419163Y328245D01*

+X418472Y328531D01*

+X417745Y328706D01*

+X417000Y328765D01*

+X416993Y328764D01*

+Y349236D01*

+X417000Y349235D01*

+X417745Y349294D01*

+X418472Y349469D01*

+X419163Y349755D01*

+X419801Y350145D01*

+X420369Y350631D01*

+X420855Y351199D01*

+X421245Y351837D01*

+X421531Y352528D01*

+X421706Y353255D01*

+X421750Y354000D01*

+X421706Y354745D01*

+X421531Y355472D01*

+X421245Y356163D01*

+X420855Y356801D01*

+X420369Y357369D01*

+X419801Y357855D01*

+X419163Y358245D01*

+X418472Y358531D01*

+X417745Y358706D01*

+X417000Y358765D01*

+X416993Y358764D01*

+Y379236D01*

+X417000Y379235D01*

+X417745Y379294D01*

+X418472Y379469D01*

+X419163Y379755D01*

+X419801Y380145D01*

+X420369Y380631D01*

+X420855Y381199D01*

+X421245Y381837D01*

+X421531Y382528D01*

+X421706Y383255D01*

+X421750Y384000D01*

+X421706Y384745D01*

+X421531Y385472D01*

+X421245Y386163D01*

+X420855Y386801D01*

+X420369Y387369D01*

+X419801Y387855D01*

+X419163Y388245D01*

+X418472Y388531D01*

+X417745Y388706D01*

+X417000Y388765D01*

+X416993Y388764D01*

+Y397000D01*

+X426993D01*

+Y388764D01*

+X426255Y388706D01*

+X425528Y388531D01*

+X424837Y388245D01*

+X424199Y387855D01*

+X423631Y387369D01*

+X423145Y386801D01*

+X422755Y386163D01*

+X422469Y385472D01*

+X422294Y384745D01*

+X422235Y384000D01*

+X422294Y383255D01*

+X422469Y382528D01*

+X422755Y381837D01*

+X423145Y381199D01*

+X423631Y380631D01*

+X424199Y380145D01*

+X424837Y379755D01*

+X425528Y379469D01*

+X426255Y379294D01*

+X426993Y379236D01*

+Y358764D01*

+X426255Y358706D01*

+X425528Y358531D01*

+X424837Y358245D01*

+X424199Y357855D01*

+X423631Y357369D01*

+X423145Y356801D01*

+X422755Y356163D01*

+X422469Y355472D01*

+X422294Y354745D01*

+X422235Y354000D01*

+X422294Y353255D01*

+X422469Y352528D01*

+X422755Y351837D01*

+X423145Y351199D01*

+X423631Y350631D01*

+X424199Y350145D01*

+X424837Y349755D01*

+X425528Y349469D01*

+X426255Y349294D01*

+X426993Y349236D01*

+Y328764D01*

+X426255Y328706D01*

+X425528Y328531D01*

+X424837Y328245D01*

+X424199Y327855D01*

+X423631Y327369D01*

+X423145Y326801D01*

+X422755Y326163D01*

+X422469Y325472D01*

+X422294Y324745D01*

+X422235Y324000D01*

+X422294Y323255D01*

+X422469Y322528D01*

+X422755Y321837D01*

+X423145Y321199D01*

+X423631Y320631D01*

+X424199Y320145D01*

+X424837Y319755D01*

+X425528Y319469D01*

+X426255Y319294D01*

+X426993Y319236D01*

+Y298764D01*

+X426255Y298706D01*

+X425528Y298531D01*

+X424837Y298245D01*

+X424199Y297855D01*

+X423631Y297369D01*

+X423145Y296801D01*

+X422755Y296163D01*

+X422469Y295472D01*

+X422294Y294745D01*

+X422235Y294000D01*

+X422294Y293255D01*

+X422469Y292528D01*

+X422755Y291837D01*

+X423145Y291199D01*

+X423631Y290631D01*

+X424199Y290145D01*

+X424837Y289755D01*

+X425528Y289469D01*

+X426255Y289294D01*

+X426993Y289236D01*

+Y268764D01*

+X426255Y268706D01*

+X425528Y268531D01*

+X424837Y268245D01*

+X424199Y267855D01*

+X423631Y267369D01*

+X423145Y266801D01*

+X422755Y266163D01*

+X422469Y265472D01*

+X422294Y264745D01*

+X422235Y264000D01*

+X422294Y263255D01*

+X422469Y262528D01*

+X422755Y261837D01*

+X423145Y261199D01*

+X423631Y260631D01*

+X424199Y260145D01*

+X424837Y259755D01*

+X425528Y259469D01*

+X426255Y259294D01*

+X426993Y259236D01*

+Y238764D01*

+X426255Y238706D01*

+X425528Y238531D01*

+X424837Y238245D01*

+X424199Y237855D01*

+X423631Y237369D01*

+X423145Y236801D01*

+X422755Y236163D01*

+X422469Y235472D01*

+X422294Y234745D01*

+X422235Y234000D01*

+X422294Y233255D01*

+X422469Y232528D01*

+X422755Y231837D01*

+X423145Y231199D01*

+X423631Y230631D01*

+X424199Y230145D01*

+X424837Y229755D01*

+X425528Y229469D01*

+X426255Y229294D01*

+X426993Y229236D01*

+Y208764D01*

+X426255Y208706D01*

+X425528Y208531D01*

+X424837Y208245D01*

+X424199Y207855D01*

+X423631Y207369D01*

+X423145Y206801D01*

+X422755Y206163D01*

+X422469Y205472D01*

+X422294Y204745D01*

+X422235Y204000D01*

+X422294Y203255D01*

+X422469Y202528D01*

+X422755Y201837D01*

+X423145Y201199D01*

+X423631Y200631D01*

+X424199Y200145D01*

+X424837Y199755D01*

+X425528Y199469D01*

+X426255Y199294D01*

+X426993Y199236D01*

+Y178764D01*

+X426255Y178706D01*

+X425528Y178531D01*

+X424837Y178245D01*

+X424199Y177855D01*

+X423631Y177369D01*

+X423145Y176801D01*

+X422755Y176163D01*

+X422469Y175472D01*

+X422294Y174745D01*

+X422235Y174000D01*

+X422294Y173255D01*

+X422469Y172528D01*

+X422755Y171837D01*

+X423145Y171199D01*

+X423631Y170631D01*

+X424199Y170145D01*

+X424837Y169755D01*

+X425528Y169469D01*

+X426255Y169294D01*

+X426993Y169236D01*

+Y159000D01*

+G37*

+G36*

+X416993D02*X411000D01*

+Y171498D01*

+X411118Y171507D01*

+X411232Y171535D01*

+X411342Y171580D01*

+X411442Y171641D01*

+X411532Y171718D01*

+X411609Y171808D01*

+X411670Y171908D01*

+X411715Y172018D01*

+X411743Y172132D01*

+X411750Y172250D01*

+Y175750D01*

+X411743Y175868D01*

+X411715Y175982D01*

+X411670Y176092D01*

+X411609Y176192D01*

+X411532Y176282D01*

+X411442Y176359D01*

+X411342Y176420D01*

+X411232Y176465D01*

+X411118Y176493D01*

+X411000Y176502D01*

+Y201498D01*

+X411118Y201507D01*

+X411232Y201535D01*

+X411342Y201580D01*

+X411442Y201641D01*

+X411532Y201718D01*

+X411609Y201808D01*

+X411670Y201908D01*

+X411715Y202018D01*

+X411743Y202132D01*

+X411750Y202250D01*

+Y205750D01*

+X411743Y205868D01*

+X411715Y205982D01*

+X411670Y206092D01*

+X411609Y206192D01*

+X411532Y206282D01*

+X411442Y206359D01*

+X411342Y206420D01*

+X411232Y206465D01*

+X411118Y206493D01*

+X411000Y206502D01*

+Y231498D01*

+X411118Y231507D01*

+X411232Y231535D01*

+X411342Y231580D01*

+X411442Y231641D01*

+X411532Y231718D01*

+X411609Y231808D01*

+X411670Y231908D01*

+X411715Y232018D01*

+X411743Y232132D01*

+X411750Y232250D01*

+Y235750D01*

+X411743Y235868D01*

+X411715Y235982D01*

+X411670Y236092D01*

+X411609Y236192D01*

+X411532Y236282D01*

+X411442Y236359D01*

+X411342Y236420D01*

+X411232Y236465D01*

+X411118Y236493D01*

+X411000Y236502D01*

+Y261498D01*

+X411118Y261507D01*

+X411232Y261535D01*

+X411342Y261580D01*

+X411442Y261641D01*

+X411532Y261718D01*

+X411609Y261808D01*

+X411670Y261908D01*

+X411715Y262018D01*

+X411743Y262132D01*

+X411750Y262250D01*

+Y265750D01*

+X411743Y265868D01*

+X411715Y265982D01*

+X411670Y266092D01*

+X411609Y266192D01*

+X411532Y266282D01*

+X411442Y266359D01*

+X411342Y266420D01*

+X411232Y266465D01*

+X411118Y266493D01*

+X411000Y266502D01*

+Y291498D01*

+X411118Y291507D01*

+X411232Y291535D01*

+X411342Y291580D01*

+X411442Y291641D01*

+X411532Y291718D01*

+X411609Y291808D01*

+X411670Y291908D01*

+X411715Y292018D01*

+X411743Y292132D01*

+X411750Y292250D01*

+Y295750D01*

+X411743Y295868D01*

+X411715Y295982D01*

+X411670Y296092D01*

+X411609Y296192D01*

+X411532Y296282D01*

+X411442Y296359D01*

+X411342Y296420D01*

+X411232Y296465D01*

+X411118Y296493D01*

+X411000Y296502D01*

+Y321498D01*

+X411118Y321507D01*

+X411232Y321535D01*

+X411342Y321580D01*

+X411442Y321641D01*

+X411532Y321718D01*

+X411609Y321808D01*

+X411670Y321908D01*

+X411715Y322018D01*

+X411743Y322132D01*

+X411750Y322250D01*

+Y325750D01*

+X411743Y325868D01*

+X411715Y325982D01*

+X411670Y326092D01*

+X411609Y326192D01*

+X411532Y326282D01*

+X411442Y326359D01*

+X411342Y326420D01*

+X411232Y326465D01*

+X411118Y326493D01*

+X411000Y326502D01*

+Y351498D01*

+X411118Y351507D01*

+X411232Y351535D01*

+X411342Y351580D01*

+X411442Y351641D01*

+X411532Y351718D01*

+X411609Y351808D01*

+X411670Y351908D01*

+X411715Y352018D01*

+X411743Y352132D01*

+X411750Y352250D01*

+Y355750D01*

+X411743Y355868D01*

+X411715Y355982D01*

+X411670Y356092D01*

+X411609Y356192D01*

+X411532Y356282D01*

+X411442Y356359D01*

+X411342Y356420D01*

+X411232Y356465D01*

+X411118Y356493D01*

+X411000Y356502D01*

+Y381498D01*

+X411118Y381507D01*

+X411232Y381535D01*

+X411342Y381580D01*

+X411442Y381641D01*

+X411532Y381718D01*

+X411609Y381808D01*

+X411670Y381908D01*

+X411715Y382018D01*

+X411743Y382132D01*

+X411750Y382250D01*

+Y385750D01*

+X411743Y385868D01*

+X411715Y385982D01*

+X411670Y386092D01*

+X411609Y386192D01*

+X411532Y386282D01*

+X411442Y386359D01*

+X411342Y386420D01*

+X411232Y386465D01*

+X411118Y386493D01*

+X411000Y386502D01*

+Y397000D01*

+X416993D01*

+Y388764D01*

+X416255Y388706D01*

+X415528Y388531D01*

+X414837Y388245D01*

+X414199Y387855D01*

+X413631Y387369D01*

+X413145Y386801D01*

+X412755Y386163D01*

+X412469Y385472D01*

+X412294Y384745D01*

+X412235Y384000D01*

+X412294Y383255D01*

+X412469Y382528D01*

+X412755Y381837D01*

+X413145Y381199D01*

+X413631Y380631D01*

+X414199Y380145D01*

+X414837Y379755D01*

+X415528Y379469D01*

+X416255Y379294D01*

+X416993Y379236D01*

+Y358764D01*

+X416255Y358706D01*

+X415528Y358531D01*

+X414837Y358245D01*

+X414199Y357855D01*

+X413631Y357369D01*

+X413145Y356801D01*

+X412755Y356163D01*

+X412469Y355472D01*

+X412294Y354745D01*

+X412235Y354000D01*

+X412294Y353255D01*

+X412469Y352528D01*

+X412755Y351837D01*

+X413145Y351199D01*

+X413631Y350631D01*

+X414199Y350145D01*

+X414837Y349755D01*

+X415528Y349469D01*

+X416255Y349294D01*

+X416993Y349236D01*

+Y328764D01*

+X416255Y328706D01*

+X415528Y328531D01*

+X414837Y328245D01*

+X414199Y327855D01*

+X413631Y327369D01*

+X413145Y326801D01*

+X412755Y326163D01*

+X412469Y325472D01*

+X412294Y324745D01*

+X412235Y324000D01*

+X412294Y323255D01*

+X412469Y322528D01*

+X412755Y321837D01*

+X413145Y321199D01*

+X413631Y320631D01*

+X414199Y320145D01*

+X414837Y319755D01*

+X415528Y319469D01*

+X416255Y319294D01*

+X416993Y319236D01*

+Y298764D01*

+X416255Y298706D01*

+X415528Y298531D01*

+X414837Y298245D01*

+X414199Y297855D01*

+X413631Y297369D01*

+X413145Y296801D01*

+X412755Y296163D01*

+X412469Y295472D01*

+X412294Y294745D01*

+X412235Y294000D01*

+X412294Y293255D01*

+X412469Y292528D01*

+X412755Y291837D01*

+X413145Y291199D01*

+X413631Y290631D01*

+X414199Y290145D01*

+X414837Y289755D01*

+X415528Y289469D01*

+X416255Y289294D01*

+X416993Y289236D01*

+Y268764D01*

+X416255Y268706D01*

+X415528Y268531D01*

+X414837Y268245D01*

+X414199Y267855D01*

+X413631Y267369D01*

+X413145Y266801D01*

+X412755Y266163D01*

+X412469Y265472D01*

+X412294Y264745D01*

+X412235Y264000D01*

+X412294Y263255D01*

+X412469Y262528D01*

+X412755Y261837D01*

+X413145Y261199D01*

+X413631Y260631D01*

+X414199Y260145D01*

+X414837Y259755D01*

+X415528Y259469D01*

+X416255Y259294D01*

+X416993Y259236D01*

+Y238764D01*

+X416255Y238706D01*

+X415528Y238531D01*

+X414837Y238245D01*

+X414199Y237855D01*

+X413631Y237369D01*

+X413145Y236801D01*

+X412755Y236163D01*

+X412469Y235472D01*

+X412294Y234745D01*

+X412235Y234000D01*

+X412294Y233255D01*

+X412469Y232528D01*

+X412755Y231837D01*

+X413145Y231199D01*

+X413631Y230631D01*

+X414199Y230145D01*

+X414837Y229755D01*

+X415528Y229469D01*

+X416255Y229294D01*

+X416993Y229236D01*

+Y208764D01*

+X416255Y208706D01*

+X415528Y208531D01*

+X414837Y208245D01*

+X414199Y207855D01*

+X413631Y207369D01*

+X413145Y206801D01*

+X412755Y206163D01*

+X412469Y205472D01*

+X412294Y204745D01*

+X412235Y204000D01*

+X412294Y203255D01*

+X412469Y202528D01*

+X412755Y201837D01*

+X413145Y201199D01*

+X413631Y200631D01*

+X414199Y200145D01*

+X414837Y199755D01*

+X415528Y199469D01*

+X416255Y199294D01*

+X416993Y199236D01*

+Y178764D01*

+X416255Y178706D01*

+X415528Y178531D01*

+X414837Y178245D01*

+X414199Y177855D01*

+X413631Y177369D01*

+X413145Y176801D01*

+X412755Y176163D01*

+X412469Y175472D01*

+X412294Y174745D01*

+X412235Y174000D01*

+X412294Y173255D01*

+X412469Y172528D01*

+X412755Y171837D01*

+X413145Y171199D01*

+X413631Y170631D01*

+X414199Y170145D01*

+X414837Y169755D01*

+X415528Y169469D01*

+X416255Y169294D01*

+X416993Y169236D01*

+Y159000D01*

+G37*

+G36*

+X411000D02*X407000D01*

+Y169250D01*

+X408750D01*

+X408868Y169257D01*

+X408982Y169285D01*

+X409092Y169330D01*

+X409192Y169391D01*

+X409282Y169468D01*

+X409359Y169558D01*

+X409420Y169658D01*

+X409465Y169768D01*

+X409493Y169882D01*

+X409502Y170000D01*

+X409493Y170118D01*

+X409465Y170232D01*

+X409420Y170342D01*

+X409359Y170442D01*

+X409282Y170532D01*

+X409192Y170609D01*

+X409092Y170670D01*

+X408982Y170715D01*

+X408868Y170743D01*

+X408750Y170750D01*

+X407000D01*

+Y177250D01*

+X408750D01*

+X408868Y177257D01*

+X408982Y177285D01*

+X409092Y177330D01*

+X409192Y177391D01*

+X409282Y177468D01*

+X409359Y177558D01*

+X409420Y177658D01*

+X409465Y177768D01*

+X409493Y177882D01*

+X409502Y178000D01*

+X409493Y178118D01*

+X409465Y178232D01*

+X409420Y178342D01*

+X409359Y178442D01*

+X409282Y178532D01*

+X409192Y178609D01*

+X409092Y178670D01*

+X408982Y178715D01*

+X408868Y178743D01*

+X408750Y178750D01*

+X407000D01*

+Y199250D01*

+X408750D01*

+X408868Y199257D01*

+X408982Y199285D01*

+X409092Y199330D01*

+X409192Y199391D01*

+X409282Y199468D01*

+X409359Y199558D01*

+X409420Y199658D01*

+X409465Y199768D01*

+X409493Y199882D01*

+X409502Y200000D01*

+X409493Y200118D01*

+X409465Y200232D01*

+X409420Y200342D01*

+X409359Y200442D01*

+X409282Y200532D01*

+X409192Y200609D01*

+X409092Y200670D01*

+X408982Y200715D01*

+X408868Y200743D01*

+X408750Y200750D01*

+X407000D01*

+Y207250D01*

+X408750D01*

+X408868Y207257D01*

+X408982Y207285D01*

+X409092Y207330D01*

+X409192Y207391D01*

+X409282Y207468D01*

+X409359Y207558D01*

+X409420Y207658D01*

+X409465Y207768D01*

+X409493Y207882D01*

+X409502Y208000D01*

+X409493Y208118D01*

+X409465Y208232D01*

+X409420Y208342D01*

+X409359Y208442D01*

+X409282Y208532D01*

+X409192Y208609D01*

+X409092Y208670D01*

+X408982Y208715D01*

+X408868Y208743D01*

+X408750Y208750D01*

+X407000D01*

+Y229250D01*

+X408750D01*

+X408868Y229257D01*

+X408982Y229285D01*

+X409092Y229330D01*

+X409192Y229391D01*

+X409282Y229468D01*

+X409359Y229558D01*

+X409420Y229658D01*

+X409465Y229768D01*

+X409493Y229882D01*

+X409502Y230000D01*

+X409493Y230118D01*

+X409465Y230232D01*

+X409420Y230342D01*

+X409359Y230442D01*

+X409282Y230532D01*

+X409192Y230609D01*

+X409092Y230670D01*

+X408982Y230715D01*

+X408868Y230743D01*

+X408750Y230750D01*

+X407000D01*

+Y237250D01*

+X408750D01*

+X408868Y237257D01*

+X408982Y237285D01*

+X409092Y237330D01*

+X409192Y237391D01*

+X409282Y237468D01*

+X409359Y237558D01*

+X409420Y237658D01*

+X409465Y237768D01*

+X409493Y237882D01*

+X409502Y238000D01*

+X409493Y238118D01*

+X409465Y238232D01*

+X409420Y238342D01*

+X409359Y238442D01*

+X409282Y238532D01*

+X409192Y238609D01*

+X409092Y238670D01*

+X408982Y238715D01*

+X408868Y238743D01*

+X408750Y238750D01*

+X407000D01*

+Y259250D01*

+X408750D01*

+X408868Y259257D01*

+X408982Y259285D01*

+X409092Y259330D01*

+X409192Y259391D01*

+X409282Y259468D01*

+X409359Y259558D01*

+X409420Y259658D01*

+X409465Y259768D01*

+X409493Y259882D01*

+X409502Y260000D01*

+X409493Y260118D01*

+X409465Y260232D01*

+X409420Y260342D01*

+X409359Y260442D01*

+X409282Y260532D01*

+X409192Y260609D01*

+X409092Y260670D01*

+X408982Y260715D01*

+X408868Y260743D01*

+X408750Y260750D01*

+X407000D01*

+Y267250D01*

+X408750D01*

+X408868Y267257D01*

+X408982Y267285D01*

+X409092Y267330D01*

+X409192Y267391D01*

+X409282Y267468D01*

+X409359Y267558D01*

+X409420Y267658D01*

+X409465Y267768D01*

+X409493Y267882D01*

+X409502Y268000D01*

+X409493Y268118D01*

+X409465Y268232D01*

+X409420Y268342D01*

+X409359Y268442D01*

+X409282Y268532D01*

+X409192Y268609D01*

+X409092Y268670D01*

+X408982Y268715D01*

+X408868Y268743D01*

+X408750Y268750D01*

+X407000D01*

+Y289250D01*

+X408750D01*

+X408868Y289257D01*

+X408982Y289285D01*

+X409092Y289330D01*

+X409192Y289391D01*

+X409282Y289468D01*

+X409359Y289558D01*

+X409420Y289658D01*

+X409465Y289768D01*

+X409493Y289882D01*

+X409502Y290000D01*

+X409493Y290118D01*

+X409465Y290232D01*

+X409420Y290342D01*

+X409359Y290442D01*

+X409282Y290532D01*

+X409192Y290609D01*

+X409092Y290670D01*

+X408982Y290715D01*

+X408868Y290743D01*

+X408750Y290750D01*

+X407000D01*

+Y297250D01*

+X408750D01*

+X408868Y297257D01*

+X408982Y297285D01*

+X409092Y297330D01*

+X409192Y297391D01*

+X409282Y297468D01*

+X409359Y297558D01*

+X409420Y297658D01*

+X409465Y297768D01*

+X409493Y297882D01*

+X409502Y298000D01*

+X409493Y298118D01*

+X409465Y298232D01*

+X409420Y298342D01*

+X409359Y298442D01*

+X409282Y298532D01*

+X409192Y298609D01*

+X409092Y298670D01*

+X408982Y298715D01*

+X408868Y298743D01*

+X408750Y298750D01*

+X407000D01*

+Y319250D01*

+X408750D01*

+X408868Y319257D01*

+X408982Y319285D01*

+X409092Y319330D01*

+X409192Y319391D01*

+X409282Y319468D01*

+X409359Y319558D01*

+X409420Y319658D01*

+X409465Y319768D01*

+X409493Y319882D01*

+X409502Y320000D01*

+X409493Y320118D01*

+X409465Y320232D01*

+X409420Y320342D01*

+X409359Y320442D01*

+X409282Y320532D01*

+X409192Y320609D01*

+X409092Y320670D01*

+X408982Y320715D01*

+X408868Y320743D01*

+X408750Y320750D01*

+X407000D01*

+Y327250D01*

+X408750D01*

+X408868Y327257D01*

+X408982Y327285D01*

+X409092Y327330D01*

+X409192Y327391D01*

+X409282Y327468D01*

+X409359Y327558D01*

+X409420Y327658D01*

+X409465Y327768D01*

+X409493Y327882D01*

+X409502Y328000D01*

+X409493Y328118D01*

+X409465Y328232D01*

+X409420Y328342D01*

+X409359Y328442D01*

+X409282Y328532D01*

+X409192Y328609D01*

+X409092Y328670D01*

+X408982Y328715D01*

+X408868Y328743D01*

+X408750Y328750D01*

+X407000D01*

+Y349250D01*

+X408750D01*

+X408868Y349257D01*

+X408982Y349285D01*

+X409092Y349330D01*

+X409192Y349391D01*

+X409282Y349468D01*

+X409359Y349558D01*

+X409420Y349658D01*

+X409465Y349768D01*

+X409493Y349882D01*

+X409502Y350000D01*

+X409493Y350118D01*

+X409465Y350232D01*

+X409420Y350342D01*

+X409359Y350442D01*

+X409282Y350532D01*

+X409192Y350609D01*

+X409092Y350670D01*

+X408982Y350715D01*

+X408868Y350743D01*

+X408750Y350750D01*

+X407000D01*

+Y357250D01*

+X408750D01*

+X408868Y357257D01*

+X408982Y357285D01*

+X409092Y357330D01*

+X409192Y357391D01*

+X409282Y357468D01*

+X409359Y357558D01*

+X409420Y357658D01*

+X409465Y357768D01*

+X409493Y357882D01*

+X409502Y358000D01*

+X409493Y358118D01*

+X409465Y358232D01*

+X409420Y358342D01*

+X409359Y358442D01*

+X409282Y358532D01*

+X409192Y358609D01*

+X409092Y358670D01*

+X408982Y358715D01*

+X408868Y358743D01*

+X408750Y358750D01*

+X407000D01*

+Y379250D01*

+X408750D01*

+X408868Y379257D01*

+X408982Y379285D01*

+X409092Y379330D01*

+X409192Y379391D01*

+X409282Y379468D01*

+X409359Y379558D01*

+X409420Y379658D01*

+X409465Y379768D01*

+X409493Y379882D01*

+X409502Y380000D01*

+X409493Y380118D01*

+X409465Y380232D01*

+X409420Y380342D01*

+X409359Y380442D01*

+X409282Y380532D01*

+X409192Y380609D01*

+X409092Y380670D01*

+X408982Y380715D01*

+X408868Y380743D01*

+X408750Y380750D01*

+X407000D01*

+Y387250D01*

+X408750D01*

+X408868Y387257D01*

+X408982Y387285D01*

+X409092Y387330D01*

+X409192Y387391D01*

+X409282Y387468D01*

+X409359Y387558D01*

+X409420Y387658D01*

+X409465Y387768D01*

+X409493Y387882D01*

+X409502Y388000D01*

+X409493Y388118D01*

+X409465Y388232D01*

+X409420Y388342D01*

+X409359Y388442D01*

+X409282Y388532D01*

+X409192Y388609D01*

+X409092Y388670D01*

+X408982Y388715D01*

+X408868Y388743D01*

+X408750Y388750D01*

+X407000D01*

+Y397000D01*

+X411000D01*

+Y386502D01*

+X410882Y386493D01*

+X410768Y386465D01*

+X410658Y386420D01*

+X410558Y386359D01*

+X410468Y386282D01*

+X410391Y386192D01*

+X410330Y386092D01*

+X410285Y385982D01*

+X410257Y385868D01*

+X410250Y385750D01*

+Y382250D01*

+X410257Y382132D01*

+X410285Y382018D01*

+X410330Y381908D01*

+X410391Y381808D01*

+X410468Y381718D01*

+X410558Y381641D01*

+X410658Y381580D01*

+X410768Y381535D01*

+X410882Y381507D01*

+X411000Y381498D01*

+Y356502D01*

+X410882Y356493D01*

+X410768Y356465D01*

+X410658Y356420D01*

+X410558Y356359D01*

+X410468Y356282D01*

+X410391Y356192D01*

+X410330Y356092D01*

+X410285Y355982D01*

+X410257Y355868D01*

+X410250Y355750D01*

+Y352250D01*

+X410257Y352132D01*

+X410285Y352018D01*

+X410330Y351908D01*

+X410391Y351808D01*

+X410468Y351718D01*

+X410558Y351641D01*

+X410658Y351580D01*

+X410768Y351535D01*

+X410882Y351507D01*

+X411000Y351498D01*

+Y326502D01*

+X410882Y326493D01*

+X410768Y326465D01*

+X410658Y326420D01*

+X410558Y326359D01*

+X410468Y326282D01*

+X410391Y326192D01*

+X410330Y326092D01*

+X410285Y325982D01*

+X410257Y325868D01*

+X410250Y325750D01*

+Y322250D01*

+X410257Y322132D01*

+X410285Y322018D01*

+X410330Y321908D01*

+X410391Y321808D01*

+X410468Y321718D01*

+X410558Y321641D01*

+X410658Y321580D01*

+X410768Y321535D01*

+X410882Y321507D01*

+X411000Y321498D01*

+Y296502D01*

+X410882Y296493D01*

+X410768Y296465D01*

+X410658Y296420D01*

+X410558Y296359D01*

+X410468Y296282D01*

+X410391Y296192D01*

+X410330Y296092D01*

+X410285Y295982D01*

+X410257Y295868D01*

+X410250Y295750D01*

+Y292250D01*

+X410257Y292132D01*

+X410285Y292018D01*

+X410330Y291908D01*

+X410391Y291808D01*

+X410468Y291718D01*

+X410558Y291641D01*

+X410658Y291580D01*

+X410768Y291535D01*

+X410882Y291507D01*

+X411000Y291498D01*

+Y266502D01*

+X410882Y266493D01*

+X410768Y266465D01*

+X410658Y266420D01*

+X410558Y266359D01*

+X410468Y266282D01*

+X410391Y266192D01*

+X410330Y266092D01*

+X410285Y265982D01*

+X410257Y265868D01*

+X410250Y265750D01*

+Y262250D01*

+X410257Y262132D01*

+X410285Y262018D01*

+X410330Y261908D01*

+X410391Y261808D01*

+X410468Y261718D01*

+X410558Y261641D01*

+X410658Y261580D01*

+X410768Y261535D01*

+X410882Y261507D01*

+X411000Y261498D01*

+Y236502D01*

+X410882Y236493D01*

+X410768Y236465D01*

+X410658Y236420D01*

+X410558Y236359D01*

+X410468Y236282D01*

+X410391Y236192D01*

+X410330Y236092D01*

+X410285Y235982D01*

+X410257Y235868D01*

+X410250Y235750D01*

+Y232250D01*

+X410257Y232132D01*

+X410285Y232018D01*

+X410330Y231908D01*

+X410391Y231808D01*

+X410468Y231718D01*

+X410558Y231641D01*

+X410658Y231580D01*

+X410768Y231535D01*

+X410882Y231507D01*

+X411000Y231498D01*

+Y206502D01*

+X410882Y206493D01*

+X410768Y206465D01*

+X410658Y206420D01*

+X410558Y206359D01*

+X410468Y206282D01*

+X410391Y206192D01*

+X410330Y206092D01*

+X410285Y205982D01*

+X410257Y205868D01*

+X410250Y205750D01*

+Y202250D01*

+X410257Y202132D01*

+X410285Y202018D01*

+X410330Y201908D01*

+X410391Y201808D01*

+X410468Y201718D01*

+X410558Y201641D01*

+X410658Y201580D01*

+X410768Y201535D01*

+X410882Y201507D01*

+X411000Y201498D01*

+Y176502D01*

+X410882Y176493D01*

+X410768Y176465D01*

+X410658Y176420D01*

+X410558Y176359D01*

+X410468Y176282D01*

+X410391Y176192D01*

+X410330Y176092D01*

+X410285Y175982D01*

+X410257Y175868D01*

+X410250Y175750D01*

+Y172250D01*

+X410257Y172132D01*

+X410285Y172018D01*

+X410330Y171908D01*

+X410391Y171808D01*

+X410468Y171718D01*

+X410558Y171641D01*

+X410658Y171580D01*

+X410768Y171535D01*

+X410882Y171507D01*

+X411000Y171498D01*

+Y159000D01*

+G37*

+G36*

+X407000D02*X403000D01*

+Y171498D01*

+X403118Y171507D01*

+X403232Y171535D01*

+X403342Y171580D01*

+X403442Y171641D01*

+X403532Y171718D01*

+X403609Y171808D01*

+X403670Y171908D01*

+X403715Y172018D01*

+X403743Y172132D01*

+X403750Y172250D01*

+Y175750D01*

+X403743Y175868D01*

+X403715Y175982D01*

+X403670Y176092D01*

+X403609Y176192D01*

+X403532Y176282D01*

+X403442Y176359D01*

+X403342Y176420D01*

+X403232Y176465D01*

+X403118Y176493D01*

+X403000Y176502D01*

+Y187861D01*

+X403112Y188132D01*

+X403215Y188561D01*

+X403241Y189000D01*

+X403215Y189439D01*

+X403112Y189868D01*

+X403000Y190139D01*

+Y192861D01*

+X403112Y193132D01*

+X403215Y193561D01*

+X403241Y194000D01*

+X403215Y194439D01*

+X403112Y194868D01*

+X403000Y195139D01*

+Y201498D01*

+X403118Y201507D01*

+X403232Y201535D01*

+X403342Y201580D01*

+X403442Y201641D01*

+X403532Y201718D01*

+X403609Y201808D01*

+X403670Y201908D01*

+X403715Y202018D01*

+X403743Y202132D01*

+X403750Y202250D01*

+Y205750D01*

+X403743Y205868D01*

+X403715Y205982D01*

+X403670Y206092D01*

+X403609Y206192D01*

+X403532Y206282D01*

+X403442Y206359D01*

+X403342Y206420D01*

+X403232Y206465D01*

+X403118Y206493D01*

+X403000Y206502D01*

+Y231498D01*

+X403118Y231507D01*

+X403232Y231535D01*

+X403342Y231580D01*

+X403442Y231641D01*

+X403532Y231718D01*

+X403609Y231808D01*

+X403670Y231908D01*

+X403715Y232018D01*

+X403743Y232132D01*

+X403750Y232250D01*

+Y235750D01*

+X403743Y235868D01*

+X403715Y235982D01*

+X403670Y236092D01*

+X403609Y236192D01*

+X403532Y236282D01*

+X403442Y236359D01*

+X403342Y236420D01*

+X403232Y236465D01*

+X403118Y236493D01*

+X403000Y236502D01*

+Y261498D01*

+X403118Y261507D01*

+X403232Y261535D01*

+X403342Y261580D01*

+X403442Y261641D01*

+X403532Y261718D01*

+X403609Y261808D01*

+X403670Y261908D01*

+X403715Y262018D01*

+X403743Y262132D01*

+X403750Y262250D01*

+Y265750D01*

+X403743Y265868D01*

+X403715Y265982D01*

+X403670Y266092D01*

+X403609Y266192D01*

+X403532Y266282D01*

+X403442Y266359D01*

+X403342Y266420D01*

+X403232Y266465D01*

+X403118Y266493D01*

+X403000Y266502D01*

+Y291498D01*

+X403118Y291507D01*

+X403232Y291535D01*

+X403342Y291580D01*

+X403442Y291641D01*

+X403532Y291718D01*

+X403609Y291808D01*

+X403670Y291908D01*

+X403715Y292018D01*

+X403743Y292132D01*

+X403750Y292250D01*

+Y295750D01*

+X403743Y295868D01*

+X403715Y295982D01*

+X403670Y296092D01*

+X403609Y296192D01*

+X403532Y296282D01*

+X403442Y296359D01*

+X403342Y296420D01*

+X403232Y296465D01*

+X403118Y296493D01*

+X403000Y296502D01*

+Y321498D01*

+X403118Y321507D01*

+X403232Y321535D01*

+X403342Y321580D01*

+X403442Y321641D01*

+X403532Y321718D01*

+X403609Y321808D01*

+X403670Y321908D01*

+X403715Y322018D01*

+X403743Y322132D01*

+X403750Y322250D01*

+Y325750D01*

+X403743Y325868D01*

+X403715Y325982D01*

+X403670Y326092D01*

+X403609Y326192D01*

+X403532Y326282D01*

+X403442Y326359D01*

+X403342Y326420D01*

+X403232Y326465D01*

+X403118Y326493D01*

+X403000Y326502D01*

+Y351498D01*

+X403118Y351507D01*

+X403232Y351535D01*

+X403342Y351580D01*

+X403442Y351641D01*

+X403532Y351718D01*

+X403609Y351808D01*

+X403670Y351908D01*

+X403715Y352018D01*

+X403743Y352132D01*

+X403750Y352250D01*

+Y355750D01*

+X403743Y355868D01*

+X403715Y355982D01*

+X403670Y356092D01*

+X403609Y356192D01*

+X403532Y356282D01*

+X403442Y356359D01*

+X403342Y356420D01*

+X403232Y356465D01*

+X403118Y356493D01*

+X403000Y356502D01*

+Y381498D01*

+X403118Y381507D01*

+X403232Y381535D01*

+X403342Y381580D01*

+X403442Y381641D01*

+X403532Y381718D01*

+X403609Y381808D01*

+X403670Y381908D01*

+X403715Y382018D01*

+X403743Y382132D01*

+X403750Y382250D01*

+Y385750D01*

+X403743Y385868D01*

+X403715Y385982D01*

+X403670Y386092D01*

+X403609Y386192D01*

+X403532Y386282D01*

+X403442Y386359D01*

+X403342Y386420D01*

+X403232Y386465D01*

+X403118Y386493D01*

+X403000Y386502D01*

+Y397000D01*

+X407000D01*

+Y388750D01*

+X405250D01*

+X405132Y388743D01*

+X405018Y388715D01*

+X404908Y388670D01*

+X404808Y388609D01*

+X404718Y388532D01*

+X404641Y388442D01*

+X404580Y388342D01*

+X404535Y388232D01*

+X404507Y388118D01*

+X404498Y388000D01*

+X404507Y387882D01*

+X404535Y387768D01*

+X404580Y387658D01*

+X404641Y387558D01*

+X404718Y387468D01*

+X404808Y387391D01*

+X404908Y387330D01*

+X405018Y387285D01*

+X405132Y387257D01*

+X405250Y387250D01*

+X407000D01*

+Y380750D01*

+X405250D01*

+X405132Y380743D01*

+X405018Y380715D01*

+X404908Y380670D01*

+X404808Y380609D01*

+X404718Y380532D01*

+X404641Y380442D01*

+X404580Y380342D01*

+X404535Y380232D01*

+X404507Y380118D01*

+X404498Y380000D01*

+X404507Y379882D01*

+X404535Y379768D01*

+X404580Y379658D01*

+X404641Y379558D01*

+X404718Y379468D01*

+X404808Y379391D01*

+X404908Y379330D01*

+X405018Y379285D01*

+X405132Y379257D01*

+X405250Y379250D01*

+X407000D01*

+Y358750D01*

+X405250D01*

+X405132Y358743D01*

+X405018Y358715D01*

+X404908Y358670D01*

+X404808Y358609D01*

+X404718Y358532D01*

+X404641Y358442D01*

+X404580Y358342D01*

+X404535Y358232D01*

+X404507Y358118D01*

+X404498Y358000D01*

+X404507Y357882D01*

+X404535Y357768D01*

+X404580Y357658D01*

+X404641Y357558D01*

+X404718Y357468D01*

+X404808Y357391D01*

+X404908Y357330D01*

+X405018Y357285D01*

+X405132Y357257D01*

+X405250Y357250D01*

+X407000D01*

+Y350750D01*

+X405250D01*

+X405132Y350743D01*

+X405018Y350715D01*

+X404908Y350670D01*

+X404808Y350609D01*

+X404718Y350532D01*

+X404641Y350442D01*

+X404580Y350342D01*

+X404535Y350232D01*

+X404507Y350118D01*

+X404498Y350000D01*

+X404507Y349882D01*

+X404535Y349768D01*

+X404580Y349658D01*

+X404641Y349558D01*

+X404718Y349468D01*

+X404808Y349391D01*

+X404908Y349330D01*

+X405018Y349285D01*

+X405132Y349257D01*

+X405250Y349250D01*

+X407000D01*

+Y328750D01*

+X405250D01*

+X405132Y328743D01*

+X405018Y328715D01*

+X404908Y328670D01*

+X404808Y328609D01*

+X404718Y328532D01*

+X404641Y328442D01*

+X404580Y328342D01*

+X404535Y328232D01*

+X404507Y328118D01*

+X404498Y328000D01*

+X404507Y327882D01*

+X404535Y327768D01*

+X404580Y327658D01*

+X404641Y327558D01*

+X404718Y327468D01*

+X404808Y327391D01*

+X404908Y327330D01*

+X405018Y327285D01*

+X405132Y327257D01*

+X405250Y327250D01*

+X407000D01*

+Y320750D01*

+X405250D01*

+X405132Y320743D01*

+X405018Y320715D01*

+X404908Y320670D01*

+X404808Y320609D01*

+X404718Y320532D01*

+X404641Y320442D01*

+X404580Y320342D01*

+X404535Y320232D01*

+X404507Y320118D01*

+X404498Y320000D01*

+X404507Y319882D01*

+X404535Y319768D01*

+X404580Y319658D01*

+X404641Y319558D01*

+X404718Y319468D01*

+X404808Y319391D01*

+X404908Y319330D01*

+X405018Y319285D01*

+X405132Y319257D01*

+X405250Y319250D01*

+X407000D01*

+Y298750D01*

+X405250D01*

+X405132Y298743D01*

+X405018Y298715D01*

+X404908Y298670D01*

+X404808Y298609D01*

+X404718Y298532D01*

+X404641Y298442D01*

+X404580Y298342D01*

+X404535Y298232D01*

+X404507Y298118D01*

+X404498Y298000D01*

+X404507Y297882D01*

+X404535Y297768D01*

+X404580Y297658D01*

+X404641Y297558D01*

+X404718Y297468D01*

+X404808Y297391D01*

+X404908Y297330D01*

+X405018Y297285D01*

+X405132Y297257D01*

+X405250Y297250D01*

+X407000D01*

+Y290750D01*

+X405250D01*

+X405132Y290743D01*

+X405018Y290715D01*

+X404908Y290670D01*

+X404808Y290609D01*

+X404718Y290532D01*

+X404641Y290442D01*

+X404580Y290342D01*

+X404535Y290232D01*

+X404507Y290118D01*

+X404498Y290000D01*

+X404507Y289882D01*

+X404535Y289768D01*

+X404580Y289658D01*

+X404641Y289558D01*

+X404718Y289468D01*

+X404808Y289391D01*

+X404908Y289330D01*

+X405018Y289285D01*

+X405132Y289257D01*

+X405250Y289250D01*

+X407000D01*

+Y268750D01*

+X405250D01*

+X405132Y268743D01*

+X405018Y268715D01*

+X404908Y268670D01*

+X404808Y268609D01*

+X404718Y268532D01*

+X404641Y268442D01*

+X404580Y268342D01*

+X404535Y268232D01*

+X404507Y268118D01*

+X404498Y268000D01*

+X404507Y267882D01*

+X404535Y267768D01*

+X404580Y267658D01*

+X404641Y267558D01*

+X404718Y267468D01*

+X404808Y267391D01*

+X404908Y267330D01*

+X405018Y267285D01*

+X405132Y267257D01*

+X405250Y267250D01*

+X407000D01*

+Y260750D01*

+X405250D01*

+X405132Y260743D01*

+X405018Y260715D01*

+X404908Y260670D01*

+X404808Y260609D01*

+X404718Y260532D01*

+X404641Y260442D01*

+X404580Y260342D01*

+X404535Y260232D01*

+X404507Y260118D01*

+X404498Y260000D01*

+X404507Y259882D01*

+X404535Y259768D01*

+X404580Y259658D01*

+X404641Y259558D01*

+X404718Y259468D01*

+X404808Y259391D01*

+X404908Y259330D01*

+X405018Y259285D01*

+X405132Y259257D01*

+X405250Y259250D01*

+X407000D01*

+Y238750D01*

+X405250D01*

+X405132Y238743D01*

+X405018Y238715D01*

+X404908Y238670D01*

+X404808Y238609D01*

+X404718Y238532D01*

+X404641Y238442D01*

+X404580Y238342D01*

+X404535Y238232D01*

+X404507Y238118D01*

+X404498Y238000D01*

+X404507Y237882D01*

+X404535Y237768D01*

+X404580Y237658D01*

+X404641Y237558D01*

+X404718Y237468D01*

+X404808Y237391D01*

+X404908Y237330D01*

+X405018Y237285D01*

+X405132Y237257D01*

+X405250Y237250D01*

+X407000D01*

+Y230750D01*

+X405250D01*

+X405132Y230743D01*

+X405018Y230715D01*

+X404908Y230670D01*

+X404808Y230609D01*

+X404718Y230532D01*

+X404641Y230442D01*

+X404580Y230342D01*

+X404535Y230232D01*

+X404507Y230118D01*

+X404498Y230000D01*

+X404507Y229882D01*

+X404535Y229768D01*

+X404580Y229658D01*

+X404641Y229558D01*

+X404718Y229468D01*

+X404808Y229391D01*

+X404908Y229330D01*

+X405018Y229285D01*

+X405132Y229257D01*

+X405250Y229250D01*

+X407000D01*

+Y208750D01*

+X405250D01*

+X405132Y208743D01*

+X405018Y208715D01*

+X404908Y208670D01*

+X404808Y208609D01*

+X404718Y208532D01*

+X404641Y208442D01*

+X404580Y208342D01*

+X404535Y208232D01*

+X404507Y208118D01*

+X404498Y208000D01*

+X404507Y207882D01*

+X404535Y207768D01*

+X404580Y207658D01*

+X404641Y207558D01*

+X404718Y207468D01*

+X404808Y207391D01*

+X404908Y207330D01*

+X405018Y207285D01*

+X405132Y207257D01*

+X405250Y207250D01*

+X407000D01*

+Y200750D01*

+X405250D01*

+X405132Y200743D01*

+X405018Y200715D01*

+X404908Y200670D01*

+X404808Y200609D01*

+X404718Y200532D01*

+X404641Y200442D01*

+X404580Y200342D01*

+X404535Y200232D01*

+X404507Y200118D01*

+X404498Y200000D01*

+X404507Y199882D01*

+X404535Y199768D01*

+X404580Y199658D01*

+X404641Y199558D01*

+X404718Y199468D01*

+X404808Y199391D01*

+X404908Y199330D01*

+X405018Y199285D01*

+X405132Y199257D01*

+X405250Y199250D01*

+X407000D01*

+Y178750D01*

+X405250D01*

+X405132Y178743D01*

+X405018Y178715D01*

+X404908Y178670D01*

+X404808Y178609D01*

+X404718Y178532D01*

+X404641Y178442D01*

+X404580Y178342D01*

+X404535Y178232D01*

+X404507Y178118D01*

+X404498Y178000D01*

+X404507Y177882D01*

+X404535Y177768D01*

+X404580Y177658D01*

+X404641Y177558D01*

+X404718Y177468D01*

+X404808Y177391D01*

+X404908Y177330D01*

+X405018Y177285D01*

+X405132Y177257D01*

+X405250Y177250D01*

+X407000D01*

+Y170750D01*

+X405250D01*

+X405132Y170743D01*

+X405018Y170715D01*

+X404908Y170670D01*

+X404808Y170609D01*

+X404718Y170532D01*

+X404641Y170442D01*

+X404580Y170342D01*

+X404535Y170232D01*

+X404507Y170118D01*

+X404498Y170000D01*

+X404507Y169882D01*

+X404535Y169768D01*

+X404580Y169658D01*

+X404641Y169558D01*

+X404718Y169468D01*

+X404808Y169391D01*

+X404908Y169330D01*

+X405018Y169285D01*

+X405132Y169257D01*

+X405250Y169250D01*

+X407000D01*

+Y159000D01*

+G37*

+G36*

+X403000Y386502D02*X402882Y386493D01*

+X402768Y386465D01*

+X402658Y386420D01*

+X402558Y386359D01*

+X402468Y386282D01*

+X402396Y386197D01*

+X402441Y397000D01*

+X403000D01*

+Y386502D01*

+G37*

+G36*

+Y356502D02*X402882Y356493D01*

+X402768Y356465D01*

+X402658Y356420D01*

+X402558Y356359D01*

+X402468Y356282D01*

+X402391Y356192D01*

+X402330Y356092D01*

+X402285Y355982D01*

+X402268Y355915D01*

+X402377Y381831D01*

+X402391Y381808D01*

+X402468Y381718D01*

+X402558Y381641D01*

+X402658Y381580D01*

+X402768Y381535D01*

+X402882Y381507D01*

+X403000Y381498D01*

+Y356502D01*

+G37*

+G36*

+Y195139D02*X402944Y195275D01*

+X402713Y195651D01*

+X402427Y195986D01*

+X402092Y196272D01*

+X401716Y196503D01*

+X401599Y196551D01*

+X402253Y352203D01*

+X402257Y352132D01*

+X402285Y352018D01*

+X402330Y351908D01*

+X402391Y351808D01*

+X402468Y351718D01*

+X402558Y351641D01*

+X402658Y351580D01*

+X402768Y351535D01*

+X402882Y351507D01*

+X403000Y351498D01*

+Y326502D01*

+X402882Y326493D01*

+X402768Y326465D01*

+X402658Y326420D01*

+X402558Y326359D01*

+X402468Y326282D01*

+X402391Y326192D01*

+X402330Y326092D01*

+X402285Y325982D01*

+X402257Y325868D01*

+X402250Y325750D01*

+Y322250D01*

+X402257Y322132D01*

+X402285Y322018D01*

+X402330Y321908D01*

+X402391Y321808D01*

+X402468Y321718D01*

+X402558Y321641D01*

+X402658Y321580D01*

+X402768Y321535D01*

+X402882Y321507D01*

+X403000Y321498D01*

+Y296502D01*

+X402882Y296493D01*

+X402768Y296465D01*

+X402658Y296420D01*

+X402558Y296359D01*

+X402468Y296282D01*

+X402391Y296192D01*

+X402330Y296092D01*

+X402285Y295982D01*

+X402257Y295868D01*

+X402250Y295750D01*

+Y292250D01*

+X402257Y292132D01*

+X402285Y292018D01*

+X402330Y291908D01*

+X402391Y291808D01*

+X402468Y291718D01*

+X402558Y291641D01*

+X402658Y291580D01*

+X402768Y291535D01*

+X402882Y291507D01*

+X403000Y291498D01*

+Y266502D01*

+X402882Y266493D01*

+X402768Y266465D01*

+X402658Y266420D01*

+X402558Y266359D01*

+X402468Y266282D01*

+X402391Y266192D01*

+X402330Y266092D01*

+X402285Y265982D01*

+X402257Y265868D01*

+X402250Y265750D01*

+Y262250D01*

+X402257Y262132D01*

+X402285Y262018D01*

+X402330Y261908D01*

+X402391Y261808D01*

+X402468Y261718D01*

+X402558Y261641D01*

+X402658Y261580D01*

+X402768Y261535D01*

+X402882Y261507D01*

+X403000Y261498D01*

+Y236502D01*

+X402882Y236493D01*

+X402768Y236465D01*

+X402658Y236420D01*

+X402558Y236359D01*

+X402468Y236282D01*

+X402391Y236192D01*

+X402330Y236092D01*

+X402285Y235982D01*

+X402257Y235868D01*

+X402250Y235750D01*

+Y232250D01*

+X402257Y232132D01*

+X402285Y232018D01*

+X402330Y231908D01*

+X402391Y231808D01*

+X402468Y231718D01*

+X402558Y231641D01*

+X402658Y231580D01*

+X402768Y231535D01*

+X402882Y231507D01*

+X403000Y231498D01*

+Y206502D01*

+X402882Y206493D01*

+X402768Y206465D01*

+X402658Y206420D01*

+X402558Y206359D01*

+X402468Y206282D01*

+X402391Y206192D01*

+X402330Y206092D01*

+X402285Y205982D01*

+X402257Y205868D01*

+X402250Y205750D01*

+Y202250D01*

+X402257Y202132D01*

+X402285Y202018D01*

+X402330Y201908D01*

+X402391Y201808D01*

+X402468Y201718D01*

+X402558Y201641D01*

+X402658Y201580D01*

+X402768Y201535D01*

+X402882Y201507D01*

+X403000Y201498D01*

+Y195139D01*

+G37*

+G36*

+Y190139D02*X402944Y190275D01*

+X402713Y190651D01*

+X402427Y190986D01*

+X402092Y191272D01*

+X401720Y191500D01*

+X402092Y191728D01*

+X402427Y192014D01*

+X402713Y192349D01*

+X402944Y192725D01*

+X403000Y192861D01*

+Y190139D01*

+G37*

+G36*

+Y159000D02*X401441D01*

+X401556Y186431D01*

+X401716Y186497D01*

+X402092Y186728D01*

+X402427Y187014D01*

+X402713Y187349D01*

+X402944Y187725D01*

+X403000Y187861D01*

+Y176502D01*

+X402882Y176493D01*

+X402768Y176465D01*

+X402658Y176420D01*

+X402558Y176359D01*

+X402468Y176282D01*

+X402391Y176192D01*

+X402330Y176092D01*

+X402285Y175982D01*

+X402257Y175868D01*

+X402250Y175750D01*

+Y172250D01*

+X402257Y172132D01*

+X402285Y172018D01*

+X402330Y171908D01*

+X402391Y171808D01*

+X402468Y171718D01*

+X402558Y171641D01*

+X402658Y171580D01*

+X402768Y171535D01*

+X402882Y171507D01*

+X403000Y171498D01*

+Y159000D01*

+G37*

+G36*

+X434446Y39000D02*X394938D01*

+Y50000D01*

+X395002Y50039D01*

+X395218Y50223D01*

+X395402Y50439D01*

+X395550Y50680D01*

+X395658Y50942D01*

+X395724Y51218D01*

+X395741Y51500D01*

+X395724Y51782D01*

+X395658Y52058D01*

+X395550Y52320D01*

+X395402Y52561D01*

+X395218Y52777D01*

+X395002Y52961D01*

+X394938Y53000D01*

+Y56695D01*

+X394941Y56694D01*

+X395223Y56717D01*

+X395499Y56783D01*

+X395761Y56891D01*

+X396002Y57039D01*

+X396218Y57223D01*

+X396402Y57439D01*

+X396550Y57680D01*

+X396658Y57942D01*

+X396724Y58218D01*

+X396741Y58500D01*

+X396724Y58782D01*

+X396658Y59058D01*

+X396550Y59320D01*

+X396402Y59561D01*

+X396218Y59777D01*

+X396002Y59961D01*

+X395761Y60109D01*

+X395499Y60217D01*

+X395223Y60283D01*

+X394941Y60306D01*

+X394938Y60305D01*

+Y124500D01*

+X407941D01*

+Y70000D01*

+X434446D01*

+Y58305D01*

+X434167Y58283D01*

+X433891Y58217D01*

+X433629Y58109D01*

+X433388Y57961D01*

+X433172Y57777D01*

+X432988Y57561D01*

+X432840Y57320D01*

+X432732Y57058D01*

+X432666Y56782D01*

+X432643Y56500D01*

+X432666Y56218D01*

+X432732Y55942D01*

+X432840Y55680D01*

+X432988Y55439D01*

+X433172Y55223D01*

+X433388Y55039D01*

+X433629Y54891D01*

+X433891Y54783D01*

+X434167Y54717D01*

+X434446Y54695D01*

+Y39000D01*

+G37*

+G36*

+X394938D02*X390938D01*

+Y44007D01*

+X390980Y43939D01*

+X391164Y43723D01*

+X391380Y43539D01*

+X391621Y43391D01*

+X391883Y43283D01*

+X392159Y43217D01*

+X392441Y43194D01*

+X392723Y43217D01*

+X392999Y43283D01*

+X393261Y43391D01*

+X393502Y43539D01*

+X393718Y43723D01*

+X393902Y43939D01*

+X394050Y44180D01*

+X394158Y44442D01*

+X394224Y44718D01*

+X394241Y45000D01*

+X394224Y45282D01*

+X394158Y45558D01*

+X394050Y45820D01*

+X393902Y46061D01*

+X393718Y46277D01*

+X393502Y46461D01*

+X393261Y46609D01*

+X392999Y46717D01*

+X392723Y46783D01*

+X392441Y46806D01*

+X392159Y46783D01*

+X391883Y46717D01*

+X391621Y46609D01*

+X391380Y46461D01*

+X391164Y46277D01*

+X390980Y46061D01*

+X390938Y45993D01*

+Y64270D01*

+X391159Y64217D01*

+X391441Y64194D01*

+X391723Y64217D01*

+X391999Y64283D01*

+X392261Y64391D01*

+X392502Y64539D01*

+X392718Y64723D01*

+X392902Y64939D01*

+X393050Y65180D01*

+X393158Y65442D01*

+X393224Y65718D01*

+X393241Y66000D01*

+X393224Y66282D01*

+X393158Y66558D01*

+X393050Y66820D01*

+X392902Y67061D01*

+X392718Y67277D01*

+X392502Y67461D01*

+X392261Y67609D01*

+X391999Y67717D01*

+X391723Y67783D01*

+X391441Y67806D01*

+X391159Y67783D01*

+X390938Y67730D01*

+Y69695D01*

+X390941Y69694D01*

+X391223Y69717D01*

+X391499Y69783D01*

+X391761Y69891D01*

+X392002Y70039D01*

+X392218Y70223D01*

+X392402Y70439D01*

+X392550Y70680D01*

+X392658Y70942D01*

+X392724Y71218D01*

+X392741Y71500D01*

+X392724Y71782D01*

+X392658Y72058D01*

+X392550Y72320D01*

+X392402Y72561D01*

+X392218Y72777D01*

+X392002Y72961D01*

+X391761Y73109D01*

+X391499Y73217D01*

+X391223Y73283D01*

+X390941Y73306D01*

+X390938Y73305D01*

+Y74195D01*

+X390941Y74194D01*

+X391223Y74217D01*

+X391499Y74283D01*

+X391761Y74391D01*

+X392002Y74539D01*

+X392218Y74723D01*

+X392402Y74939D01*

+X392550Y75180D01*

+X392658Y75442D01*

+X392724Y75718D01*

+X392741Y76000D01*

+X392724Y76282D01*

+X392658Y76558D01*

+X392550Y76820D01*

+X392402Y77061D01*

+X392218Y77277D01*

+X392002Y77461D01*

+X391761Y77609D01*

+X391499Y77717D01*

+X391223Y77783D01*

+X390941Y77806D01*

+X390938Y77805D01*

+Y124500D01*

+X394938D01*

+Y60305D01*

+X394659Y60283D01*

+X394383Y60217D01*

+X394121Y60109D01*

+X393880Y59961D01*

+X393664Y59777D01*

+X393480Y59561D01*

+X393332Y59320D01*

+X393224Y59058D01*

+X393158Y58782D01*

+X393135Y58500D01*

+X393158Y58218D01*

+X393224Y57942D01*

+X393332Y57680D01*

+X393480Y57439D01*

+X393664Y57223D01*

+X393880Y57039D01*

+X394121Y56891D01*

+X394383Y56783D01*

+X394659Y56717D01*

+X394938Y56695D01*

+Y53000D01*

+X394761Y53109D01*

+X394499Y53217D01*

+X394223Y53283D01*

+X393941Y53306D01*

+X393659Y53283D01*

+X393383Y53217D01*

+X393121Y53109D01*

+X392880Y52961D01*

+X392664Y52777D01*

+X392480Y52561D01*

+X392332Y52320D01*

+X392224Y52058D01*

+X392158Y51782D01*

+X392135Y51500D01*

+X392158Y51218D01*

+X392224Y50942D01*

+X392332Y50680D01*

+X392480Y50439D01*

+X392664Y50223D01*

+X392880Y50039D01*

+X393121Y49891D01*

+X393383Y49783D01*

+X393659Y49717D01*

+X393941Y49694D01*

+X394223Y49717D01*

+X394499Y49783D01*

+X394761Y49891D01*

+X394938Y50000D01*

+Y39000D01*

+G37*

+G36*

+X390938D02*X387438D01*

+Y83195D01*

+X387441Y83194D01*

+X387723Y83217D01*

+X387999Y83283D01*

+X388261Y83391D01*

+X388502Y83539D01*

+X388718Y83723D01*

+X388902Y83939D01*

+X389050Y84180D01*

+X389158Y84442D01*

+X389224Y84718D01*

+X389241Y85000D01*

+X389224Y85282D01*

+X389158Y85558D01*

+X389050Y85820D01*

+X388902Y86061D01*

+X388718Y86277D01*

+X388502Y86461D01*

+X388261Y86609D01*

+X387999Y86717D01*

+X387723Y86783D01*

+X387441Y86806D01*

+X387438Y86805D01*

+Y87695D01*

+X387441Y87694D01*

+X387723Y87717D01*

+X387999Y87783D01*

+X388261Y87891D01*

+X388502Y88039D01*

+X388718Y88223D01*

+X388902Y88439D01*

+X389050Y88680D01*

+X389158Y88942D01*

+X389224Y89218D01*

+X389241Y89500D01*

+X389224Y89782D01*

+X389158Y90058D01*

+X389050Y90320D01*

+X388902Y90561D01*

+X388718Y90777D01*

+X388502Y90961D01*

+X388261Y91109D01*

+X387999Y91217D01*

+X387723Y91283D01*

+X387441Y91306D01*

+X387438Y91305D01*

+Y93695D01*

+X387441Y93694D01*

+X387723Y93717D01*

+X387999Y93783D01*

+X388261Y93891D01*

+X388502Y94039D01*

+X388718Y94223D01*

+X388902Y94439D01*

+X389050Y94680D01*

+X389158Y94942D01*

+X389224Y95218D01*

+X389241Y95500D01*

+X389224Y95782D01*

+X389158Y96058D01*

+X389050Y96320D01*

+X388902Y96561D01*

+X388718Y96777D01*

+X388502Y96961D01*

+X388261Y97109D01*

+X387999Y97217D01*

+X387723Y97283D01*

+X387441Y97306D01*

+X387438Y97305D01*

+Y99695D01*

+X387441Y99694D01*

+X387723Y99717D01*

+X387999Y99783D01*

+X388261Y99891D01*

+X388502Y100039D01*

+X388718Y100223D01*

+X388902Y100439D01*

+X389050Y100680D01*

+X389158Y100942D01*

+X389224Y101218D01*

+X389241Y101500D01*

+X389224Y101782D01*

+X389158Y102058D01*

+X389050Y102320D01*

+X388902Y102561D01*

+X388718Y102777D01*

+X388502Y102961D01*

+X388261Y103109D01*

+X387999Y103217D01*

+X387723Y103283D01*

+X387441Y103306D01*

+X387438Y103305D01*

+Y105695D01*

+X387441Y105694D01*

+X387723Y105717D01*

+X387999Y105783D01*

+X388261Y105891D01*

+X388502Y106039D01*

+X388718Y106223D01*

+X388902Y106439D01*

+X389050Y106680D01*

+X389158Y106942D01*

+X389224Y107218D01*

+X389241Y107500D01*

+X389224Y107782D01*

+X389158Y108058D01*

+X389050Y108320D01*

+X388902Y108561D01*

+X388718Y108777D01*

+X388502Y108961D01*

+X388261Y109109D01*

+X387999Y109217D01*

+X387723Y109283D01*

+X387441Y109306D01*

+X387438Y109305D01*

+Y111695D01*

+X387441Y111694D01*

+X387723Y111717D01*

+X387999Y111783D01*

+X388261Y111891D01*

+X388502Y112039D01*

+X388718Y112223D01*

+X388902Y112439D01*

+X389050Y112680D01*

+X389158Y112942D01*

+X389224Y113218D01*

+X389241Y113500D01*

+X389224Y113782D01*

+X389158Y114058D01*

+X389050Y114320D01*

+X388902Y114561D01*

+X388718Y114777D01*

+X388502Y114961D01*

+X388261Y115109D01*

+X387999Y115217D01*

+X387723Y115283D01*

+X387441Y115306D01*

+X387438Y115305D01*

+Y117695D01*

+X387441Y117694D01*

+X387723Y117717D01*

+X387999Y117783D01*

+X388261Y117891D01*

+X388502Y118039D01*

+X388718Y118223D01*

+X388902Y118439D01*

+X389050Y118680D01*

+X389158Y118942D01*

+X389224Y119218D01*

+X389241Y119500D01*

+X389224Y119782D01*

+X389158Y120058D01*

+X389050Y120320D01*

+X388902Y120561D01*

+X388718Y120777D01*

+X388502Y120961D01*

+X388261Y121109D01*

+X387999Y121217D01*

+X387723Y121283D01*

+X387441Y121306D01*

+X387438Y121305D01*

+Y124500D01*

+X390938D01*

+Y77805D01*

+X390659Y77783D01*

+X390383Y77717D01*

+X390121Y77609D01*

+X389880Y77461D01*

+X389664Y77277D01*

+X389480Y77061D01*

+X389332Y76820D01*

+X389224Y76558D01*

+X389158Y76282D01*

+X389135Y76000D01*

+X389158Y75718D01*

+X389224Y75442D01*

+X389332Y75180D01*

+X389480Y74939D01*

+X389664Y74723D01*

+X389880Y74539D01*

+X390121Y74391D01*

+X390383Y74283D01*

+X390659Y74217D01*

+X390938Y74195D01*

+Y73305D01*

+X390659Y73283D01*

+X390383Y73217D01*

+X390121Y73109D01*

+X389880Y72961D01*

+X389664Y72777D01*

+X389480Y72561D01*

+X389332Y72320D01*

+X389224Y72058D01*

+X389158Y71782D01*

+X389135Y71500D01*

+X389158Y71218D01*

+X389224Y70942D01*

+X389332Y70680D01*

+X389480Y70439D01*

+X389664Y70223D01*

+X389880Y70039D01*

+X390121Y69891D01*

+X390383Y69783D01*

+X390659Y69717D01*

+X390938Y69695D01*

+Y67730D01*

+X390883Y67717D01*

+X390621Y67609D01*

+X390380Y67461D01*

+X390164Y67277D01*

+X389980Y67061D01*

+X389832Y66820D01*

+X389724Y66558D01*

+X389658Y66282D01*

+X389635Y66000D01*

+X389658Y65718D01*

+X389724Y65442D01*

+X389832Y65180D01*

+X389980Y64939D01*

+X390164Y64723D01*

+X390380Y64539D01*

+X390621Y64391D01*

+X390883Y64283D01*

+X390938Y64270D01*

+Y45993D01*

+X390832Y45820D01*

+X390724Y45558D01*

+X390658Y45282D01*

+X390635Y45000D01*

+X390658Y44718D01*

+X390724Y44442D01*

+X390832Y44180D01*

+X390938Y44007D01*

+Y39000D01*

+G37*

+G36*

+X387438D02*X354438D01*

+Y83195D01*

+X354441Y83194D01*

+X354723Y83217D01*

+X354999Y83283D01*

+X355261Y83391D01*

+X355502Y83539D01*

+X355718Y83723D01*

+X355902Y83939D01*

+X356050Y84180D01*

+X356158Y84442D01*

+X356224Y84718D01*

+X356241Y85000D01*

+X356224Y85282D01*

+X356158Y85558D01*

+X356050Y85820D01*

+X355902Y86061D01*

+X355718Y86277D01*

+X355502Y86461D01*

+X355261Y86609D01*

+X354999Y86717D01*

+X354723Y86783D01*

+X354441Y86806D01*

+X354438Y86805D01*

+Y87695D01*

+X354441Y87694D01*

+X354723Y87717D01*

+X354999Y87783D01*

+X355261Y87891D01*

+X355502Y88039D01*

+X355718Y88223D01*

+X355902Y88439D01*

+X356050Y88680D01*

+X356158Y88942D01*

+X356224Y89218D01*

+X356241Y89500D01*

+X356224Y89782D01*

+X356158Y90058D01*

+X356050Y90320D01*

+X355902Y90561D01*

+X355718Y90777D01*

+X355502Y90961D01*

+X355261Y91109D01*

+X354999Y91217D01*

+X354723Y91283D01*

+X354441Y91306D01*

+X354438Y91305D01*

+Y93695D01*

+X354441Y93694D01*

+X354723Y93717D01*

+X354999Y93783D01*

+X355261Y93891D01*

+X355502Y94039D01*

+X355718Y94223D01*

+X355902Y94439D01*

+X356050Y94680D01*

+X356158Y94942D01*

+X356224Y95218D01*

+X356241Y95500D01*

+X356224Y95782D01*

+X356158Y96058D01*

+X356050Y96320D01*

+X355902Y96561D01*

+X355718Y96777D01*

+X355502Y96961D01*

+X355261Y97109D01*

+X354999Y97217D01*

+X354723Y97283D01*

+X354441Y97306D01*

+X354438Y97305D01*

+Y99695D01*

+X354441Y99694D01*

+X354723Y99717D01*

+X354999Y99783D01*

+X355261Y99891D01*

+X355502Y100039D01*

+X355718Y100223D01*

+X355902Y100439D01*

+X356050Y100680D01*

+X356158Y100942D01*

+X356224Y101218D01*

+X356241Y101500D01*

+X356224Y101782D01*

+X356158Y102058D01*

+X356050Y102320D01*

+X355902Y102561D01*

+X355718Y102777D01*

+X355502Y102961D01*

+X355261Y103109D01*

+X354999Y103217D01*

+X354723Y103283D01*

+X354441Y103306D01*

+X354438Y103305D01*

+Y105695D01*

+X354441Y105694D01*

+X354723Y105717D01*

+X354999Y105783D01*

+X355261Y105891D01*

+X355502Y106039D01*

+X355718Y106223D01*

+X355902Y106439D01*

+X356050Y106680D01*

+X356158Y106942D01*

+X356224Y107218D01*

+X356241Y107500D01*

+X356224Y107782D01*

+X356158Y108058D01*

+X356050Y108320D01*

+X355902Y108561D01*

+X355718Y108777D01*

+X355502Y108961D01*

+X355261Y109109D01*

+X354999Y109217D01*

+X354723Y109283D01*

+X354441Y109306D01*

+X354438Y109305D01*

+Y111695D01*

+X354441Y111694D01*

+X354723Y111717D01*

+X354999Y111783D01*

+X355261Y111891D01*

+X355502Y112039D01*

+X355718Y112223D01*

+X355902Y112439D01*

+X356050Y112680D01*

+X356158Y112942D01*

+X356224Y113218D01*

+X356241Y113500D01*

+X356224Y113782D01*

+X356158Y114058D01*

+X356050Y114320D01*

+X355902Y114561D01*

+X355718Y114777D01*

+X355502Y114961D01*

+X355261Y115109D01*

+X354999Y115217D01*

+X354723Y115283D01*

+X354441Y115306D01*

+X354438Y115305D01*

+Y117695D01*

+X354441Y117694D01*

+X354723Y117717D01*

+X354999Y117783D01*

+X355261Y117891D01*

+X355502Y118039D01*

+X355718Y118223D01*

+X355902Y118439D01*

+X356050Y118680D01*

+X356158Y118942D01*

+X356224Y119218D01*

+X356241Y119500D01*

+X356224Y119782D01*

+X356158Y120058D01*

+X356050Y120320D01*

+X355902Y120561D01*

+X355718Y120777D01*

+X355502Y120961D01*

+X355261Y121109D01*

+X354999Y121217D01*

+X354723Y121283D01*

+X354441Y121306D01*

+X354438Y121305D01*

+Y124500D01*

+X387438D01*

+Y121305D01*

+X387159Y121283D01*

+X386883Y121217D01*

+X386621Y121109D01*

+X386380Y120961D01*

+X386164Y120777D01*

+X385980Y120561D01*

+X385832Y120320D01*

+X385724Y120058D01*

+X385658Y119782D01*

+X385635Y119500D01*

+X385658Y119218D01*

+X385724Y118942D01*

+X385832Y118680D01*

+X385980Y118439D01*

+X386164Y118223D01*

+X386380Y118039D01*

+X386621Y117891D01*

+X386883Y117783D01*

+X387159Y117717D01*

+X387438Y117695D01*

+Y115305D01*

+X387159Y115283D01*

+X386883Y115217D01*

+X386621Y115109D01*

+X386380Y114961D01*

+X386164Y114777D01*

+X385980Y114561D01*

+X385832Y114320D01*

+X385724Y114058D01*

+X385658Y113782D01*

+X385635Y113500D01*

+X385658Y113218D01*

+X385724Y112942D01*

+X385832Y112680D01*

+X385980Y112439D01*

+X386164Y112223D01*

+X386380Y112039D01*

+X386621Y111891D01*

+X386883Y111783D01*

+X387159Y111717D01*

+X387438Y111695D01*

+Y109305D01*

+X387159Y109283D01*

+X386883Y109217D01*

+X386621Y109109D01*

+X386380Y108961D01*

+X386164Y108777D01*

+X385980Y108561D01*

+X385832Y108320D01*

+X385724Y108058D01*

+X385658Y107782D01*

+X385635Y107500D01*

+X385658Y107218D01*

+X385724Y106942D01*

+X385832Y106680D01*

+X385980Y106439D01*

+X386164Y106223D01*

+X386380Y106039D01*

+X386621Y105891D01*

+X386883Y105783D01*

+X387159Y105717D01*

+X387438Y105695D01*

+Y103305D01*

+X387159Y103283D01*

+X386883Y103217D01*

+X386621Y103109D01*

+X386380Y102961D01*

+X386164Y102777D01*

+X385980Y102561D01*

+X385832Y102320D01*

+X385724Y102058D01*

+X385658Y101782D01*

+X385635Y101500D01*

+X385658Y101218D01*

+X385724Y100942D01*

+X385832Y100680D01*

+X385980Y100439D01*

+X386164Y100223D01*

+X386380Y100039D01*

+X386621Y99891D01*

+X386883Y99783D01*

+X387159Y99717D01*

+X387438Y99695D01*

+Y97305D01*

+X387159Y97283D01*

+X386883Y97217D01*

+X386621Y97109D01*

+X386380Y96961D01*

+X386164Y96777D01*

+X385980Y96561D01*

+X385832Y96320D01*

+X385724Y96058D01*

+X385658Y95782D01*

+X385635Y95500D01*

+X385658Y95218D01*

+X385724Y94942D01*

+X385832Y94680D01*

+X385980Y94439D01*

+X386164Y94223D01*

+X386380Y94039D01*

+X386621Y93891D01*

+X386883Y93783D01*

+X387159Y93717D01*

+X387438Y93695D01*

+Y91305D01*

+X387159Y91283D01*

+X386883Y91217D01*

+X386621Y91109D01*

+X386380Y90961D01*

+X386164Y90777D01*

+X385980Y90561D01*

+X385832Y90320D01*

+X385724Y90058D01*

+X385658Y89782D01*

+X385635Y89500D01*

+X385658Y89218D01*

+X385724Y88942D01*

+X385832Y88680D01*

+X385980Y88439D01*

+X386164Y88223D01*

+X386380Y88039D01*

+X386621Y87891D01*

+X386883Y87783D01*

+X387159Y87717D01*

+X387438Y87695D01*

+Y86805D01*

+X387159Y86783D01*

+X386883Y86717D01*

+X386621Y86609D01*

+X386380Y86461D01*

+X386164Y86277D01*

+X385980Y86061D01*

+X385832Y85820D01*

+X385724Y85558D01*

+X385658Y85282D01*

+X385635Y85000D01*

+X385658Y84718D01*

+X385724Y84442D01*

+X385832Y84180D01*

+X385980Y83939D01*

+X386164Y83723D01*

+X386380Y83539D01*

+X386621Y83391D01*

+X386883Y83283D01*

+X387159Y83217D01*

+X387438Y83195D01*

+Y39000D01*

+G37*

+G36*

+X354438D02*X299441D01*

+Y44998D01*

+X299559Y45007D01*

+X299673Y45035D01*

+X299783Y45080D01*

+X299883Y45141D01*

+X299973Y45218D01*

+X300050Y45308D01*

+X300111Y45408D01*

+X300156Y45518D01*

+X300184Y45632D01*

+X300191Y45750D01*

+Y49250D01*

+X300184Y49368D01*

+X300156Y49482D01*

+X300111Y49592D01*

+X300050Y49692D01*

+X299973Y49782D01*

+X299883Y49859D01*

+X299783Y49920D01*

+X299673Y49965D01*

+X299559Y49993D01*

+X299441Y50002D01*

+Y54937D01*

+X299686Y55337D01*

+X299972Y56028D01*

+X300147Y56755D01*

+X300191Y57500D01*

+X300147Y58245D01*

+X299972Y58972D01*

+X299686Y59663D01*

+X299441Y60063D01*

+Y64937D01*

+X299686Y65337D01*

+X299972Y66028D01*

+X300147Y66755D01*

+X300191Y67500D01*

+X300147Y68245D01*

+X299972Y68972D01*

+X299686Y69663D01*

+X299441Y70063D01*

+Y76000D01*

+X313941D01*

+Y124500D01*

+X354438D01*

+Y121305D01*

+X354159Y121283D01*

+X353883Y121217D01*

+X353621Y121109D01*

+X353380Y120961D01*

+X353164Y120777D01*

+X352980Y120561D01*

+X352832Y120320D01*

+X352724Y120058D01*

+X352658Y119782D01*

+X352635Y119500D01*

+X352658Y119218D01*

+X352724Y118942D01*

+X352832Y118680D01*

+X352980Y118439D01*

+X353164Y118223D01*

+X353380Y118039D01*

+X353621Y117891D01*

+X353883Y117783D01*

+X354159Y117717D01*

+X354438Y117695D01*

+Y115305D01*

+X354159Y115283D01*

+X353883Y115217D01*

+X353621Y115109D01*

+X353380Y114961D01*

+X353164Y114777D01*

+X352980Y114561D01*

+X352832Y114320D01*

+X352724Y114058D01*

+X352658Y113782D01*

+X352635Y113500D01*

+X352658Y113218D01*

+X352724Y112942D01*

+X352832Y112680D01*

+X352980Y112439D01*

+X353164Y112223D01*

+X353380Y112039D01*

+X353621Y111891D01*

+X353883Y111783D01*

+X354159Y111717D01*

+X354438Y111695D01*

+Y109305D01*

+X354159Y109283D01*

+X353883Y109217D01*

+X353621Y109109D01*

+X353380Y108961D01*

+X353164Y108777D01*

+X352980Y108561D01*

+X352832Y108320D01*

+X352724Y108058D01*

+X352658Y107782D01*

+X352635Y107500D01*

+X352658Y107218D01*

+X352724Y106942D01*

+X352832Y106680D01*

+X352980Y106439D01*

+X353164Y106223D01*

+X353380Y106039D01*

+X353621Y105891D01*

+X353883Y105783D01*

+X354159Y105717D01*

+X354438Y105695D01*

+Y103305D01*

+X354159Y103283D01*

+X353883Y103217D01*

+X353621Y103109D01*

+X353380Y102961D01*

+X353164Y102777D01*

+X352980Y102561D01*

+X352832Y102320D01*

+X352724Y102058D01*

+X352658Y101782D01*

+X352635Y101500D01*

+X352658Y101218D01*

+X352724Y100942D01*

+X352832Y100680D01*

+X352980Y100439D01*

+X353164Y100223D01*

+X353380Y100039D01*

+X353621Y99891D01*

+X353883Y99783D01*

+X354159Y99717D01*

+X354438Y99695D01*

+Y97305D01*

+X354159Y97283D01*

+X353883Y97217D01*

+X353621Y97109D01*

+X353380Y96961D01*

+X353164Y96777D01*

+X352980Y96561D01*

+X352832Y96320D01*

+X352724Y96058D01*

+X352658Y95782D01*

+X352635Y95500D01*

+X352658Y95218D01*

+X352724Y94942D01*

+X352832Y94680D01*

+X352980Y94439D01*

+X353164Y94223D01*

+X353380Y94039D01*

+X353621Y93891D01*

+X353883Y93783D01*

+X354159Y93717D01*

+X354438Y93695D01*

+Y91305D01*

+X354159Y91283D01*

+X353883Y91217D01*

+X353621Y91109D01*

+X353380Y90961D01*

+X353164Y90777D01*

+X352980Y90561D01*

+X352832Y90320D01*

+X352724Y90058D01*

+X352658Y89782D01*

+X352635Y89500D01*

+X352658Y89218D01*

+X352724Y88942D01*

+X352832Y88680D01*

+X352980Y88439D01*

+X353164Y88223D01*

+X353380Y88039D01*

+X353621Y87891D01*

+X353883Y87783D01*

+X354159Y87717D01*

+X354438Y87695D01*

+Y86805D01*

+X354159Y86783D01*

+X353883Y86717D01*

+X353621Y86609D01*

+X353380Y86461D01*

+X353164Y86277D01*

+X352980Y86061D01*

+X352832Y85820D01*

+X352724Y85558D01*

+X352658Y85282D01*

+X352635Y85000D01*

+X352658Y84718D01*

+X352724Y84442D01*

+X352832Y84180D01*

+X352980Y83939D01*

+X353164Y83723D01*

+X353380Y83539D01*

+X353621Y83391D01*

+X353883Y83283D01*

+X354159Y83217D01*

+X354438Y83195D01*

+Y39000D01*

+G37*

+G36*

+X299441Y70063D02*X299296Y70301D01*

+X298810Y70869D01*

+X298242Y71355D01*

+X297604Y71745D01*

+X296913Y72031D01*

+X296186Y72206D01*

+X295441Y72265D01*

+Y76000D01*

+X299441D01*

+Y70063D01*

+G37*

+G36*

+Y60063D02*X299296Y60301D01*

+X298810Y60869D01*

+X298242Y61355D01*

+X297604Y61745D01*

+X296913Y62031D01*

+X296186Y62206D01*

+X295441Y62265D01*

+Y62735D01*

+X296186Y62794D01*

+X296913Y62969D01*

+X297604Y63255D01*

+X298242Y63645D01*

+X298810Y64131D01*

+X299296Y64699D01*

+X299441Y64937D01*

+Y60063D01*

+G37*

+G36*

+Y39000D02*X295441D01*

+Y42750D01*

+X297191D01*

+X297309Y42757D01*

+X297423Y42785D01*

+X297533Y42830D01*

+X297633Y42891D01*

+X297723Y42968D01*

+X297800Y43058D01*

+X297861Y43158D01*

+X297906Y43268D01*

+X297934Y43382D01*

+X297943Y43500D01*

+X297934Y43618D01*

+X297906Y43732D01*

+X297861Y43842D01*

+X297800Y43942D01*

+X297723Y44032D01*

+X297633Y44109D01*

+X297533Y44170D01*

+X297423Y44215D01*

+X297309Y44243D01*

+X297191Y44250D01*

+X295441D01*

+Y50750D01*

+X297191D01*

+X297309Y50757D01*

+X297423Y50785D01*

+X297533Y50830D01*

+X297633Y50891D01*

+X297723Y50968D01*

+X297800Y51058D01*

+X297861Y51158D01*

+X297906Y51268D01*

+X297934Y51382D01*

+X297943Y51500D01*

+X297934Y51618D01*

+X297906Y51732D01*

+X297861Y51842D01*

+X297800Y51942D01*

+X297723Y52032D01*

+X297633Y52109D01*

+X297533Y52170D01*

+X297423Y52215D01*

+X297309Y52243D01*

+X297191Y52250D01*

+X295441D01*

+Y52735D01*

+X296186Y52794D01*

+X296913Y52969D01*

+X297604Y53255D01*

+X298242Y53645D01*

+X298810Y54131D01*

+X299296Y54699D01*

+X299441Y54937D01*

+Y50002D01*

+X299323Y49993D01*

+X299209Y49965D01*

+X299099Y49920D01*

+X298999Y49859D01*

+X298909Y49782D01*

+X298832Y49692D01*

+X298771Y49592D01*

+X298726Y49482D01*

+X298698Y49368D01*

+X298691Y49250D01*

+Y45750D01*

+X298698Y45632D01*

+X298726Y45518D01*

+X298771Y45408D01*

+X298832Y45308D01*

+X298909Y45218D01*

+X298999Y45141D01*

+X299099Y45080D01*

+X299209Y45035D01*

+X299323Y45007D01*

+X299441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X291441Y64937D02*X291586Y64699D01*

+X292072Y64131D01*

+X292640Y63645D01*

+X293278Y63255D01*

+X293969Y62969D01*

+X294696Y62794D01*

+X295441Y62735D01*

+X295441D01*

+Y62265D01*

+X295441D01*

+X294696Y62206D01*

+X293969Y62031D01*

+X293278Y61745D01*

+X292640Y61355D01*

+X292072Y60869D01*

+X291586Y60301D01*

+X291441Y60063D01*

+Y64937D01*

+G37*

+G36*

+Y76000D02*X295441D01*

+Y72265D01*

+X295441D01*

+X294696Y72206D01*

+X293969Y72031D01*

+X293278Y71745D01*

+X292640Y71355D01*

+X292072Y70869D01*

+X291586Y70301D01*

+X291441Y70063D01*

+Y76000D01*

+G37*

+G36*

+X295441Y39000D02*X291441D01*

+Y44998D01*

+X291559Y45007D01*

+X291673Y45035D01*

+X291783Y45080D01*

+X291883Y45141D01*

+X291973Y45218D01*

+X292050Y45308D01*

+X292111Y45408D01*

+X292156Y45518D01*

+X292184Y45632D01*

+X292191Y45750D01*

+Y49250D01*

+X292184Y49368D01*

+X292156Y49482D01*

+X292111Y49592D01*

+X292050Y49692D01*

+X291973Y49782D01*

+X291883Y49859D01*

+X291783Y49920D01*

+X291673Y49965D01*

+X291559Y49993D01*

+X291441Y50002D01*

+Y54937D01*

+X291586Y54699D01*

+X292072Y54131D01*

+X292640Y53645D01*

+X293278Y53255D01*

+X293969Y52969D01*

+X294696Y52794D01*

+X295441Y52735D01*

+X295441D01*

+Y52250D01*

+X293691D01*

+X293573Y52243D01*

+X293459Y52215D01*

+X293349Y52170D01*

+X293249Y52109D01*

+X293159Y52032D01*

+X293082Y51942D01*

+X293021Y51842D01*

+X292976Y51732D01*

+X292948Y51618D01*

+X292939Y51500D01*

+X292948Y51382D01*

+X292976Y51268D01*

+X293021Y51158D01*

+X293082Y51058D01*

+X293159Y50968D01*

+X293249Y50891D01*

+X293349Y50830D01*

+X293459Y50785D01*

+X293573Y50757D01*

+X293691Y50750D01*

+X295441D01*

+Y44250D01*

+X293691D01*

+X293573Y44243D01*

+X293459Y44215D01*

+X293349Y44170D01*

+X293249Y44109D01*

+X293159Y44032D01*

+X293082Y43942D01*

+X293021Y43842D01*

+X292976Y43732D01*

+X292948Y43618D01*

+X292939Y43500D01*

+X292948Y43382D01*

+X292976Y43268D01*

+X293021Y43158D01*

+X293082Y43058D01*

+X293159Y42968D01*

+X293249Y42891D01*

+X293349Y42830D01*

+X293459Y42785D01*

+X293573Y42757D01*

+X293691Y42750D01*

+X295441D01*

+Y39000D01*

+G37*

+G36*

+X291441D02*X269441D01*

+Y44998D01*

+X269559Y45007D01*

+X269673Y45035D01*

+X269783Y45080D01*

+X269883Y45141D01*

+X269973Y45218D01*

+X270050Y45308D01*

+X270111Y45408D01*

+X270156Y45518D01*

+X270184Y45632D01*

+X270191Y45750D01*

+Y49250D01*

+X270184Y49368D01*

+X270156Y49482D01*

+X270111Y49592D01*

+X270050Y49692D01*

+X269973Y49782D01*

+X269883Y49859D01*

+X269783Y49920D01*

+X269673Y49965D01*

+X269559Y49993D01*

+X269441Y50002D01*

+Y54937D01*

+X269686Y55337D01*

+X269972Y56028D01*

+X270147Y56755D01*

+X270191Y57500D01*

+X270147Y58245D01*

+X269972Y58972D01*

+X269686Y59663D01*

+X269441Y60063D01*

+Y64937D01*

+X269686Y65337D01*

+X269972Y66028D01*

+X270147Y66755D01*

+X270191Y67500D01*

+X270147Y68245D01*

+X269972Y68972D01*

+X269686Y69663D01*

+X269441Y70063D01*

+Y76000D01*

+X291441D01*

+Y70063D01*

+X291196Y69663D01*

+X290910Y68972D01*

+X290735Y68245D01*

+X290676Y67500D01*

+X290735Y66755D01*

+X290910Y66028D01*

+X291196Y65337D01*

+X291441Y64937D01*

+Y60063D01*

+X291196Y59663D01*

+X290910Y58972D01*

+X290735Y58245D01*

+X290676Y57500D01*

+X290735Y56755D01*

+X290910Y56028D01*

+X291196Y55337D01*

+X291441Y54937D01*

+Y50002D01*

+X291323Y49993D01*

+X291209Y49965D01*

+X291099Y49920D01*

+X290999Y49859D01*

+X290909Y49782D01*

+X290832Y49692D01*

+X290771Y49592D01*

+X290726Y49482D01*

+X290698Y49368D01*

+X290691Y49250D01*

+Y45750D01*

+X290698Y45632D01*

+X290726Y45518D01*

+X290771Y45408D01*

+X290832Y45308D01*

+X290909Y45218D01*

+X290999Y45141D01*

+X291099Y45080D01*

+X291209Y45035D01*

+X291323Y45007D01*

+X291441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X269441Y70063D02*X269296Y70301D01*

+X268810Y70869D01*

+X268242Y71355D01*

+X267604Y71745D01*

+X266913Y72031D01*

+X266186Y72206D01*

+X265441Y72265D01*

+Y76000D01*

+X269441D01*

+Y70063D01*

+G37*

+G36*

+Y60063D02*X269296Y60301D01*

+X268810Y60869D01*

+X268242Y61355D01*

+X267604Y61745D01*

+X266913Y62031D01*

+X266186Y62206D01*

+X265441Y62265D01*

+Y62735D01*

+X266186Y62794D01*

+X266913Y62969D01*

+X267604Y63255D01*

+X268242Y63645D01*

+X268810Y64131D01*

+X269296Y64699D01*

+X269441Y64937D01*

+Y60063D01*

+G37*

+G36*

+Y39000D02*X265441D01*

+Y42750D01*

+X267191D01*

+X267309Y42757D01*

+X267423Y42785D01*

+X267533Y42830D01*

+X267633Y42891D01*

+X267723Y42968D01*

+X267800Y43058D01*

+X267861Y43158D01*

+X267906Y43268D01*

+X267934Y43382D01*

+X267943Y43500D01*

+X267934Y43618D01*

+X267906Y43732D01*

+X267861Y43842D01*

+X267800Y43942D01*

+X267723Y44032D01*

+X267633Y44109D01*

+X267533Y44170D01*

+X267423Y44215D01*

+X267309Y44243D01*

+X267191Y44250D01*

+X265441D01*

+Y50750D01*

+X267191D01*

+X267309Y50757D01*

+X267423Y50785D01*

+X267533Y50830D01*

+X267633Y50891D01*

+X267723Y50968D01*

+X267800Y51058D01*

+X267861Y51158D01*

+X267906Y51268D01*

+X267934Y51382D01*

+X267943Y51500D01*

+X267934Y51618D01*

+X267906Y51732D01*

+X267861Y51842D01*

+X267800Y51942D01*

+X267723Y52032D01*

+X267633Y52109D01*

+X267533Y52170D01*

+X267423Y52215D01*

+X267309Y52243D01*

+X267191Y52250D01*

+X265441D01*

+Y52735D01*

+X266186Y52794D01*

+X266913Y52969D01*

+X267604Y53255D01*

+X268242Y53645D01*

+X268810Y54131D01*

+X269296Y54699D01*

+X269441Y54937D01*

+Y50002D01*

+X269323Y49993D01*

+X269209Y49965D01*

+X269099Y49920D01*

+X268999Y49859D01*

+X268909Y49782D01*

+X268832Y49692D01*

+X268771Y49592D01*

+X268726Y49482D01*

+X268698Y49368D01*

+X268691Y49250D01*

+Y45750D01*

+X268698Y45632D01*

+X268726Y45518D01*

+X268771Y45408D01*

+X268832Y45308D01*

+X268909Y45218D01*

+X268999Y45141D01*

+X269099Y45080D01*

+X269209Y45035D01*

+X269323Y45007D01*

+X269441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X261441Y64937D02*X261586Y64699D01*

+X262072Y64131D01*

+X262640Y63645D01*

+X263278Y63255D01*

+X263969Y62969D01*

+X264696Y62794D01*

+X265441Y62735D01*

+X265441D01*

+Y62265D01*

+X265441D01*

+X264696Y62206D01*

+X263969Y62031D01*

+X263278Y61745D01*

+X262640Y61355D01*

+X262072Y60869D01*

+X261586Y60301D01*

+X261441Y60063D01*

+Y64937D01*

+G37*

+G36*

+Y76000D02*X265441D01*

+Y72265D01*

+X265441D01*

+X264696Y72206D01*

+X263969Y72031D01*

+X263278Y71745D01*

+X262640Y71355D01*

+X262072Y70869D01*

+X261586Y70301D01*

+X261441Y70063D01*

+Y76000D01*

+G37*

+G36*

+X265441Y39000D02*X261441D01*

+Y44998D01*

+X261559Y45007D01*

+X261673Y45035D01*

+X261783Y45080D01*

+X261883Y45141D01*

+X261973Y45218D01*

+X262050Y45308D01*

+X262111Y45408D01*

+X262156Y45518D01*

+X262184Y45632D01*

+X262191Y45750D01*

+Y49250D01*

+X262184Y49368D01*

+X262156Y49482D01*

+X262111Y49592D01*

+X262050Y49692D01*

+X261973Y49782D01*

+X261883Y49859D01*

+X261783Y49920D01*

+X261673Y49965D01*

+X261559Y49993D01*

+X261441Y50002D01*

+Y54937D01*

+X261586Y54699D01*

+X262072Y54131D01*

+X262640Y53645D01*

+X263278Y53255D01*

+X263969Y52969D01*

+X264696Y52794D01*

+X265441Y52735D01*

+X265441D01*

+Y52250D01*

+X263691D01*

+X263573Y52243D01*

+X263459Y52215D01*

+X263349Y52170D01*

+X263249Y52109D01*

+X263159Y52032D01*

+X263082Y51942D01*

+X263021Y51842D01*

+X262976Y51732D01*

+X262948Y51618D01*

+X262939Y51500D01*

+X262948Y51382D01*

+X262976Y51268D01*

+X263021Y51158D01*

+X263082Y51058D01*

+X263159Y50968D01*

+X263249Y50891D01*

+X263349Y50830D01*

+X263459Y50785D01*

+X263573Y50757D01*

+X263691Y50750D01*

+X265441D01*

+Y44250D01*

+X263691D01*

+X263573Y44243D01*

+X263459Y44215D01*

+X263349Y44170D01*

+X263249Y44109D01*

+X263159Y44032D01*

+X263082Y43942D01*

+X263021Y43842D01*

+X262976Y43732D01*

+X262948Y43618D01*

+X262939Y43500D01*

+X262948Y43382D01*

+X262976Y43268D01*

+X263021Y43158D01*

+X263082Y43058D01*

+X263159Y42968D01*

+X263249Y42891D01*

+X263349Y42830D01*

+X263459Y42785D01*

+X263573Y42757D01*

+X263691Y42750D01*

+X265441D01*

+Y39000D01*

+G37*

+G36*

+X261441D02*X239441D01*

+Y44998D01*

+X239559Y45007D01*

+X239673Y45035D01*

+X239783Y45080D01*

+X239883Y45141D01*

+X239973Y45218D01*

+X240050Y45308D01*

+X240111Y45408D01*

+X240156Y45518D01*

+X240184Y45632D01*

+X240191Y45750D01*

+Y49250D01*

+X240184Y49368D01*

+X240156Y49482D01*

+X240111Y49592D01*

+X240050Y49692D01*

+X239973Y49782D01*

+X239883Y49859D01*

+X239783Y49920D01*

+X239673Y49965D01*

+X239559Y49993D01*

+X239441Y50002D01*

+Y54937D01*

+X239686Y55337D01*

+X239972Y56028D01*

+X240147Y56755D01*

+X240191Y57500D01*

+X240147Y58245D01*

+X239972Y58972D01*

+X239686Y59663D01*

+X239441Y60063D01*

+Y64937D01*

+X239686Y65337D01*

+X239972Y66028D01*

+X240147Y66755D01*

+X240191Y67500D01*

+X240147Y68245D01*

+X239972Y68972D01*

+X239686Y69663D01*

+X239441Y70063D01*

+Y76000D01*

+X261441D01*

+Y70063D01*

+X261196Y69663D01*

+X260910Y68972D01*

+X260735Y68245D01*

+X260676Y67500D01*

+X260735Y66755D01*

+X260910Y66028D01*

+X261196Y65337D01*

+X261441Y64937D01*

+Y60063D01*

+X261196Y59663D01*

+X260910Y58972D01*

+X260735Y58245D01*

+X260676Y57500D01*

+X260735Y56755D01*

+X260910Y56028D01*

+X261196Y55337D01*

+X261441Y54937D01*

+Y50002D01*

+X261323Y49993D01*

+X261209Y49965D01*

+X261099Y49920D01*

+X260999Y49859D01*

+X260909Y49782D01*

+X260832Y49692D01*

+X260771Y49592D01*

+X260726Y49482D01*

+X260698Y49368D01*

+X260691Y49250D01*

+Y45750D01*

+X260698Y45632D01*

+X260726Y45518D01*

+X260771Y45408D01*

+X260832Y45308D01*

+X260909Y45218D01*

+X260999Y45141D01*

+X261099Y45080D01*

+X261209Y45035D01*

+X261323Y45007D01*

+X261441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X239441Y70063D02*X239296Y70301D01*

+X238810Y70869D01*

+X238242Y71355D01*

+X237604Y71745D01*

+X236913Y72031D01*

+X236186Y72206D01*

+X235441Y72265D01*

+Y76000D01*

+X239441D01*

+Y70063D01*

+G37*

+G36*

+Y60063D02*X239296Y60301D01*

+X238810Y60869D01*

+X238242Y61355D01*

+X237604Y61745D01*

+X236913Y62031D01*

+X236186Y62206D01*

+X235441Y62265D01*

+Y62735D01*

+X236186Y62794D01*

+X236913Y62969D01*

+X237604Y63255D01*

+X238242Y63645D01*

+X238810Y64131D01*

+X239296Y64699D01*

+X239441Y64937D01*

+Y60063D01*

+G37*

+G36*

+Y39000D02*X235441D01*

+Y42750D01*

+X237191D01*

+X237309Y42757D01*

+X237423Y42785D01*

+X237533Y42830D01*

+X237633Y42891D01*

+X237723Y42968D01*

+X237800Y43058D01*

+X237861Y43158D01*

+X237906Y43268D01*

+X237934Y43382D01*

+X237943Y43500D01*

+X237934Y43618D01*

+X237906Y43732D01*

+X237861Y43842D01*

+X237800Y43942D01*

+X237723Y44032D01*

+X237633Y44109D01*

+X237533Y44170D01*

+X237423Y44215D01*

+X237309Y44243D01*

+X237191Y44250D01*

+X235441D01*

+Y50750D01*

+X237191D01*

+X237309Y50757D01*

+X237423Y50785D01*

+X237533Y50830D01*

+X237633Y50891D01*

+X237723Y50968D01*

+X237800Y51058D01*

+X237861Y51158D01*

+X237906Y51268D01*

+X237934Y51382D01*

+X237943Y51500D01*

+X237934Y51618D01*

+X237906Y51732D01*

+X237861Y51842D01*

+X237800Y51942D01*

+X237723Y52032D01*

+X237633Y52109D01*

+X237533Y52170D01*

+X237423Y52215D01*

+X237309Y52243D01*

+X237191Y52250D01*

+X235441D01*

+Y52735D01*

+X236186Y52794D01*

+X236913Y52969D01*

+X237604Y53255D01*

+X238242Y53645D01*

+X238810Y54131D01*

+X239296Y54699D01*

+X239441Y54937D01*

+Y50002D01*

+X239323Y49993D01*

+X239209Y49965D01*

+X239099Y49920D01*

+X238999Y49859D01*

+X238909Y49782D01*

+X238832Y49692D01*

+X238771Y49592D01*

+X238726Y49482D01*

+X238698Y49368D01*

+X238691Y49250D01*

+Y45750D01*

+X238698Y45632D01*

+X238726Y45518D01*

+X238771Y45408D01*

+X238832Y45308D01*

+X238909Y45218D01*

+X238999Y45141D01*

+X239099Y45080D01*

+X239209Y45035D01*

+X239323Y45007D01*

+X239441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X231441Y64937D02*X231586Y64699D01*

+X232072Y64131D01*

+X232640Y63645D01*

+X233278Y63255D01*

+X233969Y62969D01*

+X234696Y62794D01*

+X235441Y62735D01*

+X235441D01*

+Y62265D01*

+X235441D01*

+X234696Y62206D01*

+X233969Y62031D01*

+X233278Y61745D01*

+X232640Y61355D01*

+X232072Y60869D01*

+X231586Y60301D01*

+X231441Y60063D01*

+Y64937D01*

+G37*

+G36*

+Y76000D02*X235441D01*

+Y72265D01*

+X235441D01*

+X234696Y72206D01*

+X233969Y72031D01*

+X233278Y71745D01*

+X232640Y71355D01*

+X232072Y70869D01*

+X231586Y70301D01*

+X231441Y70063D01*

+Y76000D01*

+G37*

+G36*

+X235441Y39000D02*X231441D01*

+Y44998D01*

+X231559Y45007D01*

+X231673Y45035D01*

+X231783Y45080D01*

+X231883Y45141D01*

+X231973Y45218D01*

+X232050Y45308D01*

+X232111Y45408D01*

+X232156Y45518D01*

+X232184Y45632D01*

+X232191Y45750D01*

+Y49250D01*

+X232184Y49368D01*

+X232156Y49482D01*

+X232111Y49592D01*

+X232050Y49692D01*

+X231973Y49782D01*

+X231883Y49859D01*

+X231783Y49920D01*

+X231673Y49965D01*

+X231559Y49993D01*

+X231441Y50002D01*

+Y54937D01*

+X231586Y54699D01*

+X232072Y54131D01*

+X232640Y53645D01*

+X233278Y53255D01*

+X233969Y52969D01*

+X234696Y52794D01*

+X235441Y52735D01*

+X235441D01*

+Y52250D01*

+X233691D01*

+X233573Y52243D01*

+X233459Y52215D01*

+X233349Y52170D01*

+X233249Y52109D01*

+X233159Y52032D01*

+X233082Y51942D01*

+X233021Y51842D01*

+X232976Y51732D01*

+X232948Y51618D01*

+X232939Y51500D01*

+X232948Y51382D01*

+X232976Y51268D01*

+X233021Y51158D01*

+X233082Y51058D01*

+X233159Y50968D01*

+X233249Y50891D01*

+X233349Y50830D01*

+X233459Y50785D01*

+X233573Y50757D01*

+X233691Y50750D01*

+X235441D01*

+Y44250D01*

+X233691D01*

+X233573Y44243D01*

+X233459Y44215D01*

+X233349Y44170D01*

+X233249Y44109D01*

+X233159Y44032D01*

+X233082Y43942D01*

+X233021Y43842D01*

+X232976Y43732D01*

+X232948Y43618D01*

+X232939Y43500D01*

+X232948Y43382D01*

+X232976Y43268D01*

+X233021Y43158D01*

+X233082Y43058D01*

+X233159Y42968D01*

+X233249Y42891D01*

+X233349Y42830D01*

+X233459Y42785D01*

+X233573Y42757D01*

+X233691Y42750D01*

+X235441D01*

+Y39000D01*

+G37*

+G36*

+X231441D02*X209441D01*

+Y44998D01*

+X209559Y45007D01*

+X209673Y45035D01*

+X209783Y45080D01*

+X209883Y45141D01*

+X209973Y45218D01*

+X210050Y45308D01*

+X210111Y45408D01*

+X210156Y45518D01*

+X210184Y45632D01*

+X210191Y45750D01*

+Y49250D01*

+X210184Y49368D01*

+X210156Y49482D01*

+X210111Y49592D01*

+X210050Y49692D01*

+X209973Y49782D01*

+X209883Y49859D01*

+X209783Y49920D01*

+X209673Y49965D01*

+X209559Y49993D01*

+X209441Y50002D01*

+Y54937D01*

+X209686Y55337D01*

+X209972Y56028D01*

+X210147Y56755D01*

+X210191Y57500D01*

+X210147Y58245D01*

+X209972Y58972D01*

+X209686Y59663D01*

+X209441Y60063D01*

+Y64937D01*

+X209686Y65337D01*

+X209972Y66028D01*

+X210147Y66755D01*

+X210191Y67500D01*

+X210147Y68245D01*

+X209972Y68972D01*

+X209686Y69663D01*

+X209441Y70063D01*

+Y76000D01*

+X231441D01*

+Y70063D01*

+X231196Y69663D01*

+X230910Y68972D01*

+X230735Y68245D01*

+X230676Y67500D01*

+X230735Y66755D01*

+X230910Y66028D01*

+X231196Y65337D01*

+X231441Y64937D01*

+Y60063D01*

+X231196Y59663D01*

+X230910Y58972D01*

+X230735Y58245D01*

+X230676Y57500D01*

+X230735Y56755D01*

+X230910Y56028D01*

+X231196Y55337D01*

+X231441Y54937D01*

+Y50002D01*

+X231323Y49993D01*

+X231209Y49965D01*

+X231099Y49920D01*

+X230999Y49859D01*

+X230909Y49782D01*

+X230832Y49692D01*

+X230771Y49592D01*

+X230726Y49482D01*

+X230698Y49368D01*

+X230691Y49250D01*

+Y45750D01*

+X230698Y45632D01*

+X230726Y45518D01*

+X230771Y45408D01*

+X230832Y45308D01*

+X230909Y45218D01*

+X230999Y45141D01*

+X231099Y45080D01*

+X231209Y45035D01*

+X231323Y45007D01*

+X231441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X209441Y70063D02*X209296Y70301D01*

+X208810Y70869D01*

+X208242Y71355D01*

+X207604Y71745D01*

+X206913Y72031D01*

+X206186Y72206D01*

+X205441Y72265D01*

+Y76000D01*

+X209441D01*

+Y70063D01*

+G37*

+G36*

+Y60063D02*X209296Y60301D01*

+X208810Y60869D01*

+X208242Y61355D01*

+X207604Y61745D01*

+X206913Y62031D01*

+X206186Y62206D01*

+X205441Y62265D01*

+Y62735D01*

+X206186Y62794D01*

+X206913Y62969D01*

+X207604Y63255D01*

+X208242Y63645D01*

+X208810Y64131D01*

+X209296Y64699D01*

+X209441Y64937D01*

+Y60063D01*

+G37*

+G36*

+Y39000D02*X205441D01*

+Y42750D01*

+X207191D01*

+X207309Y42757D01*

+X207423Y42785D01*

+X207533Y42830D01*

+X207633Y42891D01*

+X207723Y42968D01*

+X207800Y43058D01*

+X207861Y43158D01*

+X207906Y43268D01*

+X207934Y43382D01*

+X207943Y43500D01*

+X207934Y43618D01*

+X207906Y43732D01*

+X207861Y43842D01*

+X207800Y43942D01*

+X207723Y44032D01*

+X207633Y44109D01*

+X207533Y44170D01*

+X207423Y44215D01*

+X207309Y44243D01*

+X207191Y44250D01*

+X205441D01*

+Y50750D01*

+X207191D01*

+X207309Y50757D01*

+X207423Y50785D01*

+X207533Y50830D01*

+X207633Y50891D01*

+X207723Y50968D01*

+X207800Y51058D01*

+X207861Y51158D01*

+X207906Y51268D01*

+X207934Y51382D01*

+X207943Y51500D01*

+X207934Y51618D01*

+X207906Y51732D01*

+X207861Y51842D01*

+X207800Y51942D01*

+X207723Y52032D01*

+X207633Y52109D01*

+X207533Y52170D01*

+X207423Y52215D01*

+X207309Y52243D01*

+X207191Y52250D01*

+X205441D01*

+Y52735D01*

+X206186Y52794D01*

+X206913Y52969D01*

+X207604Y53255D01*

+X208242Y53645D01*

+X208810Y54131D01*

+X209296Y54699D01*

+X209441Y54937D01*

+Y50002D01*

+X209323Y49993D01*

+X209209Y49965D01*

+X209099Y49920D01*

+X208999Y49859D01*

+X208909Y49782D01*

+X208832Y49692D01*

+X208771Y49592D01*

+X208726Y49482D01*

+X208698Y49368D01*

+X208691Y49250D01*

+Y45750D01*

+X208698Y45632D01*

+X208726Y45518D01*

+X208771Y45408D01*

+X208832Y45308D01*

+X208909Y45218D01*

+X208999Y45141D01*

+X209099Y45080D01*

+X209209Y45035D01*

+X209323Y45007D01*

+X209441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X201441Y64937D02*X201586Y64699D01*

+X202072Y64131D01*

+X202640Y63645D01*

+X203278Y63255D01*

+X203969Y62969D01*

+X204696Y62794D01*

+X205441Y62735D01*

+X205441D01*

+Y62265D01*

+X205441D01*

+X204696Y62206D01*

+X203969Y62031D01*

+X203278Y61745D01*

+X202640Y61355D01*

+X202072Y60869D01*

+X201586Y60301D01*

+X201441Y60063D01*

+Y64937D01*

+G37*

+G36*

+Y76000D02*X205441D01*

+Y72265D01*

+X205441D01*

+X204696Y72206D01*

+X203969Y72031D01*

+X203278Y71745D01*

+X202640Y71355D01*

+X202072Y70869D01*

+X201586Y70301D01*

+X201441Y70063D01*

+Y76000D01*

+G37*

+G36*

+X205441Y39000D02*X201441D01*

+Y44998D01*

+X201559Y45007D01*

+X201673Y45035D01*

+X201783Y45080D01*

+X201883Y45141D01*

+X201973Y45218D01*

+X202050Y45308D01*

+X202111Y45408D01*

+X202156Y45518D01*

+X202184Y45632D01*

+X202191Y45750D01*

+Y49250D01*

+X202184Y49368D01*

+X202156Y49482D01*

+X202111Y49592D01*

+X202050Y49692D01*

+X201973Y49782D01*

+X201883Y49859D01*

+X201783Y49920D01*

+X201673Y49965D01*

+X201559Y49993D01*

+X201441Y50002D01*

+Y54937D01*

+X201586Y54699D01*

+X202072Y54131D01*

+X202640Y53645D01*

+X203278Y53255D01*

+X203969Y52969D01*

+X204696Y52794D01*

+X205441Y52735D01*

+X205441D01*

+Y52250D01*

+X203691D01*

+X203573Y52243D01*

+X203459Y52215D01*

+X203349Y52170D01*

+X203249Y52109D01*

+X203159Y52032D01*

+X203082Y51942D01*

+X203021Y51842D01*

+X202976Y51732D01*

+X202948Y51618D01*

+X202939Y51500D01*

+X202948Y51382D01*

+X202976Y51268D01*

+X203021Y51158D01*

+X203082Y51058D01*

+X203159Y50968D01*

+X203249Y50891D01*

+X203349Y50830D01*

+X203459Y50785D01*

+X203573Y50757D01*

+X203691Y50750D01*

+X205441D01*

+Y44250D01*

+X203691D01*

+X203573Y44243D01*

+X203459Y44215D01*

+X203349Y44170D01*

+X203249Y44109D01*

+X203159Y44032D01*

+X203082Y43942D01*

+X203021Y43842D01*

+X202976Y43732D01*

+X202948Y43618D01*

+X202939Y43500D01*

+X202948Y43382D01*

+X202976Y43268D01*

+X203021Y43158D01*

+X203082Y43058D01*

+X203159Y42968D01*

+X203249Y42891D01*

+X203349Y42830D01*

+X203459Y42785D01*

+X203573Y42757D01*

+X203691Y42750D01*

+X205441D01*

+Y39000D01*

+G37*

+G36*

+X201441D02*X179441D01*

+Y44998D01*

+X179559Y45007D01*

+X179673Y45035D01*

+X179783Y45080D01*

+X179883Y45141D01*

+X179973Y45218D01*

+X180050Y45308D01*

+X180111Y45408D01*

+X180156Y45518D01*

+X180184Y45632D01*

+X180191Y45750D01*

+Y49250D01*

+X180184Y49368D01*

+X180156Y49482D01*

+X180111Y49592D01*

+X180050Y49692D01*

+X179973Y49782D01*

+X179883Y49859D01*

+X179783Y49920D01*

+X179673Y49965D01*

+X179559Y49993D01*

+X179441Y50002D01*

+Y54937D01*

+X179686Y55337D01*

+X179972Y56028D01*

+X180147Y56755D01*

+X180191Y57500D01*

+X180147Y58245D01*

+X179972Y58972D01*

+X179686Y59663D01*

+X179441Y60063D01*

+Y64937D01*

+X179686Y65337D01*

+X179972Y66028D01*

+X180147Y66755D01*

+X180191Y67500D01*

+X180147Y68245D01*

+X179972Y68972D01*

+X179686Y69663D01*

+X179441Y70063D01*

+Y76000D01*

+X201441D01*

+Y70063D01*

+X201196Y69663D01*

+X200910Y68972D01*

+X200735Y68245D01*

+X200676Y67500D01*

+X200735Y66755D01*

+X200910Y66028D01*

+X201196Y65337D01*

+X201441Y64937D01*

+Y60063D01*

+X201196Y59663D01*

+X200910Y58972D01*

+X200735Y58245D01*

+X200676Y57500D01*

+X200735Y56755D01*

+X200910Y56028D01*

+X201196Y55337D01*

+X201441Y54937D01*

+Y50002D01*

+X201323Y49993D01*

+X201209Y49965D01*

+X201099Y49920D01*

+X200999Y49859D01*

+X200909Y49782D01*

+X200832Y49692D01*

+X200771Y49592D01*

+X200726Y49482D01*

+X200698Y49368D01*

+X200691Y49250D01*

+Y45750D01*

+X200698Y45632D01*

+X200726Y45518D01*

+X200771Y45408D01*

+X200832Y45308D01*

+X200909Y45218D01*

+X200999Y45141D01*

+X201099Y45080D01*

+X201209Y45035D01*

+X201323Y45007D01*

+X201441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X179441Y70063D02*X179296Y70301D01*

+X178810Y70869D01*

+X178242Y71355D01*

+X177604Y71745D01*

+X176913Y72031D01*

+X176186Y72206D01*

+X175441Y72265D01*

+Y76000D01*

+X179441D01*

+Y70063D01*

+G37*

+G36*

+Y60063D02*X179296Y60301D01*

+X178810Y60869D01*

+X178242Y61355D01*

+X177604Y61745D01*

+X176913Y62031D01*

+X176186Y62206D01*

+X175441Y62265D01*

+Y62735D01*

+X176186Y62794D01*

+X176913Y62969D01*

+X177604Y63255D01*

+X178242Y63645D01*

+X178810Y64131D01*

+X179296Y64699D01*

+X179441Y64937D01*

+Y60063D01*

+G37*

+G36*

+Y39000D02*X175441D01*

+Y42750D01*

+X177191D01*

+X177309Y42757D01*

+X177423Y42785D01*

+X177533Y42830D01*

+X177633Y42891D01*

+X177723Y42968D01*

+X177800Y43058D01*

+X177861Y43158D01*

+X177906Y43268D01*

+X177934Y43382D01*

+X177943Y43500D01*

+X177934Y43618D01*

+X177906Y43732D01*

+X177861Y43842D01*

+X177800Y43942D01*

+X177723Y44032D01*

+X177633Y44109D01*

+X177533Y44170D01*

+X177423Y44215D01*

+X177309Y44243D01*

+X177191Y44250D01*

+X175441D01*

+Y50750D01*

+X177191D01*

+X177309Y50757D01*

+X177423Y50785D01*

+X177533Y50830D01*

+X177633Y50891D01*

+X177723Y50968D01*

+X177800Y51058D01*

+X177861Y51158D01*

+X177906Y51268D01*

+X177934Y51382D01*

+X177943Y51500D01*

+X177934Y51618D01*

+X177906Y51732D01*

+X177861Y51842D01*

+X177800Y51942D01*

+X177723Y52032D01*

+X177633Y52109D01*

+X177533Y52170D01*

+X177423Y52215D01*

+X177309Y52243D01*

+X177191Y52250D01*

+X175441D01*

+Y52735D01*

+X176186Y52794D01*

+X176913Y52969D01*

+X177604Y53255D01*

+X178242Y53645D01*

+X178810Y54131D01*

+X179296Y54699D01*

+X179441Y54937D01*

+Y50002D01*

+X179323Y49993D01*

+X179209Y49965D01*

+X179099Y49920D01*

+X178999Y49859D01*

+X178909Y49782D01*

+X178832Y49692D01*

+X178771Y49592D01*

+X178726Y49482D01*

+X178698Y49368D01*

+X178691Y49250D01*

+Y45750D01*

+X178698Y45632D01*

+X178726Y45518D01*

+X178771Y45408D01*

+X178832Y45308D01*

+X178909Y45218D01*

+X178999Y45141D01*

+X179099Y45080D01*

+X179209Y45035D01*

+X179323Y45007D01*

+X179441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X171441Y64937D02*X171586Y64699D01*

+X172072Y64131D01*

+X172640Y63645D01*

+X173278Y63255D01*

+X173969Y62969D01*

+X174696Y62794D01*

+X175441Y62735D01*

+X175441D01*

+Y62265D01*

+X175441D01*

+X174696Y62206D01*

+X173969Y62031D01*

+X173278Y61745D01*

+X172640Y61355D01*

+X172072Y60869D01*

+X171586Y60301D01*

+X171441Y60063D01*

+Y64937D01*

+G37*

+G36*

+Y76000D02*X175441D01*

+Y72265D01*

+X175441D01*

+X174696Y72206D01*

+X173969Y72031D01*

+X173278Y71745D01*

+X172640Y71355D01*

+X172072Y70869D01*

+X171586Y70301D01*

+X171441Y70063D01*

+Y76000D01*

+G37*

+G36*

+X175441Y39000D02*X171441D01*

+Y44998D01*

+X171559Y45007D01*

+X171673Y45035D01*

+X171783Y45080D01*

+X171883Y45141D01*

+X171973Y45218D01*

+X172050Y45308D01*

+X172111Y45408D01*

+X172156Y45518D01*

+X172184Y45632D01*

+X172191Y45750D01*

+Y49250D01*

+X172184Y49368D01*

+X172156Y49482D01*

+X172111Y49592D01*

+X172050Y49692D01*

+X171973Y49782D01*

+X171883Y49859D01*

+X171783Y49920D01*

+X171673Y49965D01*

+X171559Y49993D01*

+X171441Y50002D01*

+Y54937D01*

+X171586Y54699D01*

+X172072Y54131D01*

+X172640Y53645D01*

+X173278Y53255D01*

+X173969Y52969D01*

+X174696Y52794D01*

+X175441Y52735D01*

+X175441D01*

+Y52250D01*

+X173691D01*

+X173573Y52243D01*

+X173459Y52215D01*

+X173349Y52170D01*

+X173249Y52109D01*

+X173159Y52032D01*

+X173082Y51942D01*

+X173021Y51842D01*

+X172976Y51732D01*

+X172948Y51618D01*

+X172939Y51500D01*

+X172948Y51382D01*

+X172976Y51268D01*

+X173021Y51158D01*

+X173082Y51058D01*

+X173159Y50968D01*

+X173249Y50891D01*

+X173349Y50830D01*

+X173459Y50785D01*

+X173573Y50757D01*

+X173691Y50750D01*

+X175441D01*

+Y44250D01*

+X173691D01*

+X173573Y44243D01*

+X173459Y44215D01*

+X173349Y44170D01*

+X173249Y44109D01*

+X173159Y44032D01*

+X173082Y43942D01*

+X173021Y43842D01*

+X172976Y43732D01*

+X172948Y43618D01*

+X172939Y43500D01*

+X172948Y43382D01*

+X172976Y43268D01*

+X173021Y43158D01*

+X173082Y43058D01*

+X173159Y42968D01*

+X173249Y42891D01*

+X173349Y42830D01*

+X173459Y42785D01*

+X173573Y42757D01*

+X173691Y42750D01*

+X175441D01*

+Y39000D01*

+G37*

+G36*

+X171441D02*X149441D01*

+Y44998D01*

+X149559Y45007D01*

+X149673Y45035D01*

+X149783Y45080D01*

+X149883Y45141D01*

+X149973Y45218D01*

+X150050Y45308D01*

+X150111Y45408D01*

+X150156Y45518D01*

+X150184Y45632D01*

+X150191Y45750D01*

+Y49250D01*

+X150184Y49368D01*

+X150156Y49482D01*

+X150111Y49592D01*

+X150050Y49692D01*

+X149973Y49782D01*

+X149883Y49859D01*

+X149783Y49920D01*

+X149673Y49965D01*

+X149559Y49993D01*

+X149441Y50002D01*

+Y54937D01*

+X149686Y55337D01*

+X149972Y56028D01*

+X150147Y56755D01*

+X150191Y57500D01*

+X150147Y58245D01*

+X149972Y58972D01*

+X149686Y59663D01*

+X149441Y60063D01*

+Y64937D01*

+X149686Y65337D01*

+X149972Y66028D01*

+X150147Y66755D01*

+X150191Y67500D01*

+X150147Y68245D01*

+X149972Y68972D01*

+X149686Y69663D01*

+X149441Y70063D01*

+Y76000D01*

+X171441D01*

+Y70063D01*

+X171196Y69663D01*

+X170910Y68972D01*

+X170735Y68245D01*

+X170676Y67500D01*

+X170735Y66755D01*

+X170910Y66028D01*

+X171196Y65337D01*

+X171441Y64937D01*

+Y60063D01*

+X171196Y59663D01*

+X170910Y58972D01*

+X170735Y58245D01*

+X170676Y57500D01*

+X170735Y56755D01*

+X170910Y56028D01*

+X171196Y55337D01*

+X171441Y54937D01*

+Y50002D01*

+X171323Y49993D01*

+X171209Y49965D01*

+X171099Y49920D01*

+X170999Y49859D01*

+X170909Y49782D01*

+X170832Y49692D01*

+X170771Y49592D01*

+X170726Y49482D01*

+X170698Y49368D01*

+X170691Y49250D01*

+Y45750D01*

+X170698Y45632D01*

+X170726Y45518D01*

+X170771Y45408D01*

+X170832Y45308D01*

+X170909Y45218D01*

+X170999Y45141D01*

+X171099Y45080D01*

+X171209Y45035D01*

+X171323Y45007D01*

+X171441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X149441Y70063D02*X149296Y70301D01*

+X148810Y70869D01*

+X148242Y71355D01*

+X147604Y71745D01*

+X146913Y72031D01*

+X146186Y72206D01*

+X145441Y72265D01*

+Y76000D01*

+X149441D01*

+Y70063D01*

+G37*

+G36*

+Y60063D02*X149296Y60301D01*

+X148810Y60869D01*

+X148242Y61355D01*

+X147604Y61745D01*

+X146913Y62031D01*

+X146186Y62206D01*

+X145441Y62265D01*

+Y62735D01*

+X146186Y62794D01*

+X146913Y62969D01*

+X147604Y63255D01*

+X148242Y63645D01*

+X148810Y64131D01*

+X149296Y64699D01*

+X149441Y64937D01*

+Y60063D01*

+G37*

+G36*

+Y39000D02*X145441D01*

+Y42750D01*

+X147191D01*

+X147309Y42757D01*

+X147423Y42785D01*

+X147533Y42830D01*

+X147633Y42891D01*

+X147723Y42968D01*

+X147800Y43058D01*

+X147861Y43158D01*

+X147906Y43268D01*

+X147934Y43382D01*

+X147943Y43500D01*

+X147934Y43618D01*

+X147906Y43732D01*

+X147861Y43842D01*

+X147800Y43942D01*

+X147723Y44032D01*

+X147633Y44109D01*

+X147533Y44170D01*

+X147423Y44215D01*

+X147309Y44243D01*

+X147191Y44250D01*

+X145441D01*

+Y50750D01*

+X147191D01*

+X147309Y50757D01*

+X147423Y50785D01*

+X147533Y50830D01*

+X147633Y50891D01*

+X147723Y50968D01*

+X147800Y51058D01*

+X147861Y51158D01*

+X147906Y51268D01*

+X147934Y51382D01*

+X147943Y51500D01*

+X147934Y51618D01*

+X147906Y51732D01*

+X147861Y51842D01*

+X147800Y51942D01*

+X147723Y52032D01*

+X147633Y52109D01*

+X147533Y52170D01*

+X147423Y52215D01*

+X147309Y52243D01*

+X147191Y52250D01*

+X145441D01*

+Y52735D01*

+X146186Y52794D01*

+X146913Y52969D01*

+X147604Y53255D01*

+X148242Y53645D01*

+X148810Y54131D01*

+X149296Y54699D01*

+X149441Y54937D01*

+Y50002D01*

+X149323Y49993D01*

+X149209Y49965D01*

+X149099Y49920D01*

+X148999Y49859D01*

+X148909Y49782D01*

+X148832Y49692D01*

+X148771Y49592D01*

+X148726Y49482D01*

+X148698Y49368D01*

+X148691Y49250D01*

+Y45750D01*

+X148698Y45632D01*

+X148726Y45518D01*

+X148771Y45408D01*

+X148832Y45308D01*

+X148909Y45218D01*

+X148999Y45141D01*

+X149099Y45080D01*

+X149209Y45035D01*

+X149323Y45007D01*

+X149441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X141441Y64937D02*X141586Y64699D01*

+X142072Y64131D01*

+X142640Y63645D01*

+X143278Y63255D01*

+X143969Y62969D01*

+X144696Y62794D01*

+X145441Y62735D01*

+X145441D01*

+Y62265D01*

+X145441D01*

+X144696Y62206D01*

+X143969Y62031D01*

+X143278Y61745D01*

+X142640Y61355D01*

+X142072Y60869D01*

+X141586Y60301D01*

+X141441Y60063D01*

+Y64937D01*

+G37*

+G36*

+Y76000D02*X145441D01*

+Y72265D01*

+X145441D01*

+X144696Y72206D01*

+X143969Y72031D01*

+X143278Y71745D01*

+X142640Y71355D01*

+X142072Y70869D01*

+X141586Y70301D01*

+X141441Y70063D01*

+Y76000D01*

+G37*

+G36*

+X145441Y39000D02*X141441D01*

+Y44998D01*

+X141559Y45007D01*

+X141673Y45035D01*

+X141783Y45080D01*

+X141883Y45141D01*

+X141973Y45218D01*

+X142050Y45308D01*

+X142111Y45408D01*

+X142156Y45518D01*

+X142184Y45632D01*

+X142191Y45750D01*

+Y49250D01*

+X142184Y49368D01*

+X142156Y49482D01*

+X142111Y49592D01*

+X142050Y49692D01*

+X141973Y49782D01*

+X141883Y49859D01*

+X141783Y49920D01*

+X141673Y49965D01*

+X141559Y49993D01*

+X141441Y50002D01*

+Y54937D01*

+X141586Y54699D01*

+X142072Y54131D01*

+X142640Y53645D01*

+X143278Y53255D01*

+X143969Y52969D01*

+X144696Y52794D01*

+X145441Y52735D01*

+X145441D01*

+Y52250D01*

+X143691D01*

+X143573Y52243D01*

+X143459Y52215D01*

+X143349Y52170D01*

+X143249Y52109D01*

+X143159Y52032D01*

+X143082Y51942D01*

+X143021Y51842D01*

+X142976Y51732D01*

+X142948Y51618D01*

+X142939Y51500D01*

+X142948Y51382D01*

+X142976Y51268D01*

+X143021Y51158D01*

+X143082Y51058D01*

+X143159Y50968D01*

+X143249Y50891D01*

+X143349Y50830D01*

+X143459Y50785D01*

+X143573Y50757D01*

+X143691Y50750D01*

+X145441D01*

+Y44250D01*

+X143691D01*

+X143573Y44243D01*

+X143459Y44215D01*

+X143349Y44170D01*

+X143249Y44109D01*

+X143159Y44032D01*

+X143082Y43942D01*

+X143021Y43842D01*

+X142976Y43732D01*

+X142948Y43618D01*

+X142939Y43500D01*

+X142948Y43382D01*

+X142976Y43268D01*

+X143021Y43158D01*

+X143082Y43058D01*

+X143159Y42968D01*

+X143249Y42891D01*

+X143349Y42830D01*

+X143459Y42785D01*

+X143573Y42757D01*

+X143691Y42750D01*

+X145441D01*

+Y39000D01*

+G37*

+G36*

+X141441D02*X119441D01*

+Y44998D01*

+X119559Y45007D01*

+X119673Y45035D01*

+X119783Y45080D01*

+X119883Y45141D01*

+X119973Y45218D01*

+X120050Y45308D01*

+X120111Y45408D01*

+X120156Y45518D01*

+X120184Y45632D01*

+X120191Y45750D01*

+Y49250D01*

+X120184Y49368D01*

+X120156Y49482D01*

+X120111Y49592D01*

+X120050Y49692D01*

+X119973Y49782D01*

+X119883Y49859D01*

+X119783Y49920D01*

+X119673Y49965D01*

+X119559Y49993D01*

+X119441Y50002D01*

+Y54937D01*

+X119686Y55337D01*

+X119972Y56028D01*

+X120147Y56755D01*

+X120191Y57500D01*

+X120147Y58245D01*

+X119972Y58972D01*

+X119686Y59663D01*

+X119441Y60063D01*

+Y64937D01*

+X119686Y65337D01*

+X119972Y66028D01*

+X120147Y66755D01*

+X120191Y67500D01*

+X120147Y68245D01*

+X119972Y68972D01*

+X119686Y69663D01*

+X119441Y70063D01*

+Y76000D01*

+X141441D01*

+Y70063D01*

+X141196Y69663D01*

+X140910Y68972D01*

+X140735Y68245D01*

+X140676Y67500D01*

+X140735Y66755D01*

+X140910Y66028D01*

+X141196Y65337D01*

+X141441Y64937D01*

+Y60063D01*

+X141196Y59663D01*

+X140910Y58972D01*

+X140735Y58245D01*

+X140676Y57500D01*

+X140735Y56755D01*

+X140910Y56028D01*

+X141196Y55337D01*

+X141441Y54937D01*

+Y50002D01*

+X141323Y49993D01*

+X141209Y49965D01*

+X141099Y49920D01*

+X140999Y49859D01*

+X140909Y49782D01*

+X140832Y49692D01*

+X140771Y49592D01*

+X140726Y49482D01*

+X140698Y49368D01*

+X140691Y49250D01*

+Y45750D01*

+X140698Y45632D01*

+X140726Y45518D01*

+X140771Y45408D01*

+X140832Y45308D01*

+X140909Y45218D01*

+X140999Y45141D01*

+X141099Y45080D01*

+X141209Y45035D01*

+X141323Y45007D01*

+X141441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X119441Y70063D02*X119296Y70301D01*

+X118810Y70869D01*

+X118242Y71355D01*

+X117604Y71745D01*

+X116913Y72031D01*

+X116186Y72206D01*

+X115441Y72265D01*

+Y76000D01*

+X119441D01*

+Y70063D01*

+G37*

+G36*

+Y60063D02*X119296Y60301D01*

+X118810Y60869D01*

+X118242Y61355D01*

+X117604Y61745D01*

+X116913Y62031D01*

+X116186Y62206D01*

+X115441Y62265D01*

+Y62735D01*

+X116186Y62794D01*

+X116913Y62969D01*

+X117604Y63255D01*

+X118242Y63645D01*

+X118810Y64131D01*

+X119296Y64699D01*

+X119441Y64937D01*

+Y60063D01*

+G37*

+G36*

+Y39000D02*X115441D01*

+Y42750D01*

+X117191D01*

+X117309Y42757D01*

+X117423Y42785D01*

+X117533Y42830D01*

+X117633Y42891D01*

+X117723Y42968D01*

+X117800Y43058D01*

+X117861Y43158D01*

+X117906Y43268D01*

+X117934Y43382D01*

+X117943Y43500D01*

+X117934Y43618D01*

+X117906Y43732D01*

+X117861Y43842D01*

+X117800Y43942D01*

+X117723Y44032D01*

+X117633Y44109D01*

+X117533Y44170D01*

+X117423Y44215D01*

+X117309Y44243D01*

+X117191Y44250D01*

+X115441D01*

+Y50750D01*

+X117191D01*

+X117309Y50757D01*

+X117423Y50785D01*

+X117533Y50830D01*

+X117633Y50891D01*

+X117723Y50968D01*

+X117800Y51058D01*

+X117861Y51158D01*

+X117906Y51268D01*

+X117934Y51382D01*

+X117943Y51500D01*

+X117934Y51618D01*

+X117906Y51732D01*

+X117861Y51842D01*

+X117800Y51942D01*

+X117723Y52032D01*

+X117633Y52109D01*

+X117533Y52170D01*

+X117423Y52215D01*

+X117309Y52243D01*

+X117191Y52250D01*

+X115441D01*

+Y52735D01*

+X116186Y52794D01*

+X116913Y52969D01*

+X117604Y53255D01*

+X118242Y53645D01*

+X118810Y54131D01*

+X119296Y54699D01*

+X119441Y54937D01*

+Y50002D01*

+X119323Y49993D01*

+X119209Y49965D01*

+X119099Y49920D01*

+X118999Y49859D01*

+X118909Y49782D01*

+X118832Y49692D01*

+X118771Y49592D01*

+X118726Y49482D01*

+X118698Y49368D01*

+X118691Y49250D01*

+Y45750D01*

+X118698Y45632D01*

+X118726Y45518D01*

+X118771Y45408D01*

+X118832Y45308D01*

+X118909Y45218D01*

+X118999Y45141D01*

+X119099Y45080D01*

+X119209Y45035D01*

+X119323Y45007D01*

+X119441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X111441Y64937D02*X111586Y64699D01*

+X112072Y64131D01*

+X112640Y63645D01*

+X113278Y63255D01*

+X113969Y62969D01*

+X114696Y62794D01*

+X115441Y62735D01*

+X115441D01*

+Y62265D01*

+X115441D01*

+X114696Y62206D01*

+X113969Y62031D01*

+X113278Y61745D01*

+X112640Y61355D01*

+X112072Y60869D01*

+X111586Y60301D01*

+X111441Y60063D01*

+Y64937D01*

+G37*

+G36*

+Y76000D02*X115441D01*

+Y72265D01*

+X115441D01*

+X114696Y72206D01*

+X113969Y72031D01*

+X113278Y71745D01*

+X112640Y71355D01*

+X112072Y70869D01*

+X111586Y70301D01*

+X111441Y70063D01*

+Y76000D01*

+G37*

+G36*

+X115441Y39000D02*X111441D01*

+Y44998D01*

+X111559Y45007D01*

+X111673Y45035D01*

+X111783Y45080D01*

+X111883Y45141D01*

+X111973Y45218D01*

+X112050Y45308D01*

+X112111Y45408D01*

+X112156Y45518D01*

+X112184Y45632D01*

+X112191Y45750D01*

+Y49250D01*

+X112184Y49368D01*

+X112156Y49482D01*

+X112111Y49592D01*

+X112050Y49692D01*

+X111973Y49782D01*

+X111883Y49859D01*

+X111783Y49920D01*

+X111673Y49965D01*

+X111559Y49993D01*

+X111441Y50002D01*

+Y54937D01*

+X111586Y54699D01*

+X112072Y54131D01*

+X112640Y53645D01*

+X113278Y53255D01*

+X113969Y52969D01*

+X114696Y52794D01*

+X115441Y52735D01*

+X115441D01*

+Y52250D01*

+X113691D01*

+X113573Y52243D01*

+X113459Y52215D01*

+X113349Y52170D01*

+X113249Y52109D01*

+X113159Y52032D01*

+X113082Y51942D01*

+X113021Y51842D01*

+X112976Y51732D01*

+X112948Y51618D01*

+X112939Y51500D01*

+X112948Y51382D01*

+X112976Y51268D01*

+X113021Y51158D01*

+X113082Y51058D01*

+X113159Y50968D01*

+X113249Y50891D01*

+X113349Y50830D01*

+X113459Y50785D01*

+X113573Y50757D01*

+X113691Y50750D01*

+X115441D01*

+Y44250D01*

+X113691D01*

+X113573Y44243D01*

+X113459Y44215D01*

+X113349Y44170D01*

+X113249Y44109D01*

+X113159Y44032D01*

+X113082Y43942D01*

+X113021Y43842D01*

+X112976Y43732D01*

+X112948Y43618D01*

+X112939Y43500D01*

+X112948Y43382D01*

+X112976Y43268D01*

+X113021Y43158D01*

+X113082Y43058D01*

+X113159Y42968D01*

+X113249Y42891D01*

+X113349Y42830D01*

+X113459Y42785D01*

+X113573Y42757D01*

+X113691Y42750D01*

+X115441D01*

+Y39000D01*

+G37*

+G36*

+X111441D02*X89441D01*

+Y44998D01*

+X89559Y45007D01*

+X89673Y45035D01*

+X89783Y45080D01*

+X89883Y45141D01*

+X89973Y45218D01*

+X90050Y45308D01*

+X90111Y45408D01*

+X90156Y45518D01*

+X90184Y45632D01*

+X90191Y45750D01*

+Y49250D01*

+X90184Y49368D01*

+X90156Y49482D01*

+X90111Y49592D01*

+X90050Y49692D01*

+X89973Y49782D01*

+X89883Y49859D01*

+X89783Y49920D01*

+X89673Y49965D01*

+X89559Y49993D01*

+X89441Y50002D01*

+Y54937D01*

+X89686Y55337D01*

+X89972Y56028D01*

+X90147Y56755D01*

+X90191Y57500D01*

+X90147Y58245D01*

+X89972Y58972D01*

+X89686Y59663D01*

+X89441Y60063D01*

+Y64937D01*

+X89686Y65337D01*

+X89972Y66028D01*

+X90147Y66755D01*

+X90191Y67500D01*

+X90147Y68245D01*

+X89972Y68972D01*

+X89686Y69663D01*

+X89441Y70063D01*

+Y76000D01*

+X111441D01*

+Y70063D01*

+X111196Y69663D01*

+X110910Y68972D01*

+X110735Y68245D01*

+X110676Y67500D01*

+X110735Y66755D01*

+X110910Y66028D01*

+X111196Y65337D01*

+X111441Y64937D01*

+Y60063D01*

+X111196Y59663D01*

+X110910Y58972D01*

+X110735Y58245D01*

+X110676Y57500D01*

+X110735Y56755D01*

+X110910Y56028D01*

+X111196Y55337D01*

+X111441Y54937D01*

+Y50002D01*

+X111323Y49993D01*

+X111209Y49965D01*

+X111099Y49920D01*

+X110999Y49859D01*

+X110909Y49782D01*

+X110832Y49692D01*

+X110771Y49592D01*

+X110726Y49482D01*

+X110698Y49368D01*

+X110691Y49250D01*

+Y45750D01*

+X110698Y45632D01*

+X110726Y45518D01*

+X110771Y45408D01*

+X110832Y45308D01*

+X110909Y45218D01*

+X110999Y45141D01*

+X111099Y45080D01*

+X111209Y45035D01*

+X111323Y45007D01*

+X111441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X89441Y70063D02*X89296Y70301D01*

+X88810Y70869D01*

+X88242Y71355D01*

+X87604Y71745D01*

+X86913Y72031D01*

+X86186Y72206D01*

+X85441Y72265D01*

+Y76000D01*

+X89441D01*

+Y70063D01*

+G37*

+G36*

+Y60063D02*X89296Y60301D01*

+X88810Y60869D01*

+X88242Y61355D01*

+X87604Y61745D01*

+X86913Y62031D01*

+X86186Y62206D01*

+X85441Y62265D01*

+Y62735D01*

+X86186Y62794D01*

+X86913Y62969D01*

+X87604Y63255D01*

+X88242Y63645D01*

+X88810Y64131D01*

+X89296Y64699D01*

+X89441Y64937D01*

+Y60063D01*

+G37*

+G36*

+Y39000D02*X85441D01*

+Y42750D01*

+X87191D01*

+X87309Y42757D01*

+X87423Y42785D01*

+X87533Y42830D01*

+X87633Y42891D01*

+X87723Y42968D01*

+X87800Y43058D01*

+X87861Y43158D01*

+X87906Y43268D01*

+X87934Y43382D01*

+X87943Y43500D01*

+X87934Y43618D01*

+X87906Y43732D01*

+X87861Y43842D01*

+X87800Y43942D01*

+X87723Y44032D01*

+X87633Y44109D01*

+X87533Y44170D01*

+X87423Y44215D01*

+X87309Y44243D01*

+X87191Y44250D01*

+X85441D01*

+Y50750D01*

+X87191D01*

+X87309Y50757D01*

+X87423Y50785D01*

+X87533Y50830D01*

+X87633Y50891D01*

+X87723Y50968D01*

+X87800Y51058D01*

+X87861Y51158D01*

+X87906Y51268D01*

+X87934Y51382D01*

+X87943Y51500D01*

+X87934Y51618D01*

+X87906Y51732D01*

+X87861Y51842D01*

+X87800Y51942D01*

+X87723Y52032D01*

+X87633Y52109D01*

+X87533Y52170D01*

+X87423Y52215D01*

+X87309Y52243D01*

+X87191Y52250D01*

+X85441D01*

+Y52735D01*

+X86186Y52794D01*

+X86913Y52969D01*

+X87604Y53255D01*

+X88242Y53645D01*

+X88810Y54131D01*

+X89296Y54699D01*

+X89441Y54937D01*

+Y50002D01*

+X89323Y49993D01*

+X89209Y49965D01*

+X89099Y49920D01*

+X88999Y49859D01*

+X88909Y49782D01*

+X88832Y49692D01*

+X88771Y49592D01*

+X88726Y49482D01*

+X88698Y49368D01*

+X88691Y49250D01*

+Y45750D01*

+X88698Y45632D01*

+X88726Y45518D01*

+X88771Y45408D01*

+X88832Y45308D01*

+X88909Y45218D01*

+X88999Y45141D01*

+X89099Y45080D01*

+X89209Y45035D01*

+X89323Y45007D01*

+X89441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X81441Y64937D02*X81586Y64699D01*

+X82072Y64131D01*

+X82640Y63645D01*

+X83278Y63255D01*

+X83969Y62969D01*

+X84696Y62794D01*

+X85441Y62735D01*

+X85441D01*

+Y62265D01*

+X85441D01*

+X84696Y62206D01*

+X83969Y62031D01*

+X83278Y61745D01*

+X82640Y61355D01*

+X82072Y60869D01*

+X81586Y60301D01*

+X81441Y60063D01*

+Y64937D01*

+G37*

+G36*

+Y76000D02*X85441D01*

+Y72265D01*

+X85441D01*

+X84696Y72206D01*

+X83969Y72031D01*

+X83278Y71745D01*

+X82640Y71355D01*

+X82072Y70869D01*

+X81586Y70301D01*

+X81441Y70063D01*

+Y76000D01*

+G37*

+G36*

+X85441Y39000D02*X81441D01*

+Y44998D01*

+X81559Y45007D01*

+X81673Y45035D01*

+X81783Y45080D01*

+X81883Y45141D01*

+X81973Y45218D01*

+X82050Y45308D01*

+X82111Y45408D01*

+X82156Y45518D01*

+X82184Y45632D01*

+X82191Y45750D01*

+Y49250D01*

+X82184Y49368D01*

+X82156Y49482D01*

+X82111Y49592D01*

+X82050Y49692D01*

+X81973Y49782D01*

+X81883Y49859D01*

+X81783Y49920D01*

+X81673Y49965D01*

+X81559Y49993D01*

+X81441Y50002D01*

+Y54937D01*

+X81586Y54699D01*

+X82072Y54131D01*

+X82640Y53645D01*

+X83278Y53255D01*

+X83969Y52969D01*

+X84696Y52794D01*

+X85441Y52735D01*

+X85441D01*

+Y52250D01*

+X83691D01*

+X83573Y52243D01*

+X83459Y52215D01*

+X83349Y52170D01*

+X83249Y52109D01*

+X83159Y52032D01*

+X83082Y51942D01*

+X83021Y51842D01*

+X82976Y51732D01*

+X82948Y51618D01*

+X82939Y51500D01*

+X82948Y51382D01*

+X82976Y51268D01*

+X83021Y51158D01*

+X83082Y51058D01*

+X83159Y50968D01*

+X83249Y50891D01*

+X83349Y50830D01*

+X83459Y50785D01*

+X83573Y50757D01*

+X83691Y50750D01*

+X85441D01*

+Y44250D01*

+X83691D01*

+X83573Y44243D01*

+X83459Y44215D01*

+X83349Y44170D01*

+X83249Y44109D01*

+X83159Y44032D01*

+X83082Y43942D01*

+X83021Y43842D01*

+X82976Y43732D01*

+X82948Y43618D01*

+X82939Y43500D01*

+X82948Y43382D01*

+X82976Y43268D01*

+X83021Y43158D01*

+X83082Y43058D01*

+X83159Y42968D01*

+X83249Y42891D01*

+X83349Y42830D01*

+X83459Y42785D01*

+X83573Y42757D01*

+X83691Y42750D01*

+X85441D01*

+Y39000D01*

+G37*

+G36*

+X81441D02*X75441D01*

+X72941Y41500D01*

+Y76000D01*

+X81441D01*

+Y70063D01*

+X81196Y69663D01*

+X80910Y68972D01*

+X80735Y68245D01*

+X80676Y67500D01*

+X80735Y66755D01*

+X80910Y66028D01*

+X81196Y65337D01*

+X81441Y64937D01*

+Y60063D01*

+X81196Y59663D01*

+X80910Y58972D01*

+X80735Y58245D01*

+X80676Y57500D01*

+X80735Y56755D01*

+X80910Y56028D01*

+X81196Y55337D01*

+X81441Y54937D01*

+Y50002D01*

+X81323Y49993D01*

+X81209Y49965D01*

+X81099Y49920D01*

+X80999Y49859D01*

+X80909Y49782D01*

+X80832Y49692D01*

+X80771Y49592D01*

+X80726Y49482D01*

+X80698Y49368D01*

+X80691Y49250D01*

+Y45750D01*

+X80698Y45632D01*

+X80726Y45518D01*

+X80771Y45408D01*

+X80832Y45308D01*

+X80909Y45218D01*

+X80999Y45141D01*

+X81099Y45080D01*

+X81209Y45035D01*

+X81323Y45007D01*

+X81441Y44998D01*

+Y39000D01*

+G37*

+G36*

+X291712Y247147D02*X299712D01*

+Y240147D01*

+X291712D01*

+Y247147D01*

+G37*

+G36*

+X181941Y231000D02*X188441D01*

+Y225000D01*

+X181941D01*

+Y231000D01*

+G37*

+G36*

+X98941Y206500D02*X107441D01*

+Y202000D01*

+X98941D01*

+Y206500D01*

+G37*

+G36*

+X305941Y138950D02*X312441D01*

+Y132950D01*

+X305941D01*

+Y138950D01*

+G37*

+G36*

+X302196Y110000D02*X308696D01*

+Y104000D01*

+X302196D01*

+Y110000D01*

+G37*

+G36*

+X220941Y247000D02*X227441D01*

+Y241000D01*

+X220941D01*

+Y247000D01*

+G37*

+G36*

+X221441Y238500D02*X227941D01*

+Y232500D01*

+X221441D01*

+Y238500D01*

+G37*

+G36*

+X232941D02*X239441D01*

+Y232500D01*

+X232941D01*

+Y238500D01*

+G37*

+G36*

+X209441Y241000D02*X215941D01*

+Y235000D01*

+X209441D01*

+Y241000D01*

+G37*

+G36*

+X200441Y240500D02*X206941D01*

+Y234500D01*

+X200441D01*

+Y240500D01*

+G37*

+G36*

+X190441Y240000D02*X196941D01*

+Y234000D01*

+X190441D01*

+Y240000D01*

+G37*

+G36*

+X221941Y229500D02*X228441D01*

+Y223500D01*

+X221941D01*

+Y229500D01*

+G37*

+G36*

+X221441Y223500D02*X227941D01*

+Y217500D01*

+X221441D01*

+Y223500D01*

+G37*

+G36*

+X216941Y218000D02*X223441D01*

+Y212000D01*

+X216941D01*

+Y218000D01*

+G37*

+G36*

+X206941Y215500D02*X213441D01*

+Y209500D01*

+X206941D01*

+Y215500D01*

+G37*

+G36*

+X198941D02*X205441D01*

+Y209500D01*

+X198941D01*

+Y215500D01*

+G37*

+G36*

+X190441D02*X196941D01*

+Y209500D01*

+X190441D01*

+Y215500D01*

+G37*

+G36*

+X181941Y220500D02*X188441D01*

+Y214500D01*

+X181941D01*

+Y220500D01*

+G37*

+G36*

+X173941D02*X180441D01*

+Y214500D01*

+X173941D01*

+Y220500D01*

+G37*

+G36*

+Y231000D02*X180441D01*

+Y225000D01*

+X173941D01*

+Y231000D01*

+G37*

+G36*

+X440935Y153000D02*X445441D01*

+Y104616D01*

+X445166Y104503D01*

+X444790Y104272D01*

+X444455Y103986D01*

+X444169Y103651D01*

+X443938Y103275D01*

+X443770Y102868D01*

+X443667Y102439D01*

+X443632Y102000D01*

+X443667Y101561D01*

+X443770Y101132D01*

+X443938Y100725D01*

+X444169Y100349D01*

+X444455Y100014D01*

+X444790Y99728D01*

+X445166Y99497D01*

+X445441Y99384D01*

+Y69000D01*

+X440935D01*

+Y118988D01*

+X440941Y118988D01*

+X441569Y119037D01*

+X442181Y119184D01*

+X442763Y119425D01*

+X443299Y119754D01*

+X443778Y120163D01*

+X444187Y120642D01*

+X444516Y121178D01*

+X444757Y121760D01*

+X444904Y122372D01*

+X444941Y123000D01*

+X444904Y123628D01*

+X444757Y124240D01*

+X444516Y124822D01*

+X444187Y125358D01*

+X443778Y125837D01*

+X443299Y126246D01*

+X442763Y126575D01*

+X442181Y126816D01*

+X441569Y126963D01*

+X440941Y127012D01*

+X440935Y127012D01*

+Y153000D01*

+G37*

+G36*

+X432320D02*X440935D01*

+Y127012D01*

+X440313Y126963D01*

+X439701Y126816D01*

+X439119Y126575D01*

+X438583Y126246D01*

+X438104Y125837D01*

+X437695Y125358D01*

+X437366Y124822D01*

+X437125Y124240D01*

+X436978Y123628D01*

+X436929Y123000D01*

+X436978Y122372D01*

+X437125Y121760D01*

+X437366Y121178D01*

+X437695Y120642D01*

+X438104Y120163D01*

+X438583Y119754D01*

+X439119Y119425D01*

+X439701Y119184D01*

+X440313Y119037D01*

+X440935Y118988D01*

+Y69000D01*

+X432320D01*

+Y73869D01*

+X432379Y73725D01*

+X432610Y73349D01*

+X432896Y73014D01*

+X433231Y72728D01*

+X433607Y72497D01*

+X434014Y72329D01*

+X434443Y72226D01*

+X434882Y72191D01*

+X435321Y72226D01*

+X435750Y72329D01*

+X436157Y72497D01*

+X436533Y72728D01*

+X436868Y73014D01*

+X437154Y73349D01*

+X437385Y73725D01*

+X437553Y74132D01*

+X437656Y74561D01*

+X437682Y75000D01*

+X437656Y75439D01*

+X437553Y75868D01*

+X437385Y76275D01*

+X437154Y76651D01*

+X436868Y76986D01*

+X436533Y77272D01*

+X436157Y77503D01*

+X435750Y77671D01*

+X435321Y77774D01*

+X434882Y77809D01*

+X434443Y77774D01*

+X434014Y77671D01*

+X433607Y77503D01*

+X433231Y77272D01*

+X432896Y76986D01*

+X432610Y76651D01*

+X432379Y76275D01*

+X432320Y76131D01*

+Y108192D01*

+X432324Y108191D01*

+X432763Y108226D01*

+X433192Y108329D01*

+X433599Y108497D01*

+X433975Y108728D01*

+X434310Y109014D01*

+X434596Y109349D01*

+X434827Y109725D01*

+X434995Y110132D01*

+X435098Y110561D01*

+X435124Y111000D01*

+X435098Y111439D01*

+X434995Y111868D01*

+X434827Y112275D01*

+X434596Y112651D01*

+X434310Y112986D01*

+X433975Y113272D01*

+X433599Y113503D01*

+X433192Y113671D01*

+X432763Y113774D01*

+X432324Y113809D01*

+X432320Y113808D01*

+Y153000D01*

+G37*

+G36*

+X423437D02*X432320D01*

+Y113808D01*

+X431885Y113774D01*

+X431456Y113671D01*

+X431049Y113503D01*

+X430673Y113272D01*

+X430338Y112986D01*

+X430052Y112651D01*

+X429821Y112275D01*

+X429653Y111868D01*

+X429550Y111439D01*

+X429515Y111000D01*

+X429550Y110561D01*

+X429653Y110132D01*

+X429821Y109725D01*

+X430052Y109349D01*

+X430338Y109014D01*

+X430673Y108728D01*

+X431049Y108497D01*

+X431456Y108329D01*

+X431885Y108226D01*

+X432320Y108192D01*

+Y76131D01*

+X432211Y75868D01*

+X432108Y75439D01*

+X432073Y75000D01*

+X432108Y74561D01*

+X432211Y74132D01*

+X432320Y73869D01*

+Y69000D01*

+X423437D01*

+Y72192D01*

+X423441Y72191D01*

+X423880Y72226D01*

+X424309Y72329D01*

+X424716Y72497D01*

+X425092Y72728D01*

+X425427Y73014D01*

+X425713Y73349D01*

+X425944Y73725D01*

+X426112Y74132D01*

+X426215Y74561D01*

+X426241Y75000D01*

+X426215Y75439D01*

+X426112Y75868D01*

+X425944Y76275D01*

+X425713Y76651D01*

+X425427Y76986D01*

+X425092Y77272D01*

+X424716Y77503D01*

+X424309Y77671D01*

+X423880Y77774D01*

+X423441Y77809D01*

+X423437Y77808D01*

+Y153000D01*

+G37*

+G36*

+X396441D02*X423437D01*

+Y77808D01*

+X423002Y77774D01*

+X422573Y77671D01*

+X422166Y77503D01*

+X421790Y77272D01*

+X421455Y76986D01*

+X421169Y76651D01*

+X420938Y76275D01*

+X420770Y75868D01*

+X420667Y75439D01*

+X420632Y75000D01*

+X420667Y74561D01*

+X420770Y74132D01*

+X420938Y73725D01*

+X421169Y73349D01*

+X421455Y73014D01*

+X421790Y72728D01*

+X422166Y72497D01*

+X422573Y72329D01*

+X423002Y72226D01*

+X423437Y72192D01*

+Y69000D01*

+X411941D01*

+Y127000D01*

+X393437D01*

+Y205192D01*

+X393441Y205191D01*

+X393880Y205226D01*

+X394309Y205329D01*

+X394716Y205497D01*

+X395092Y205728D01*

+X395427Y206014D01*

+X395713Y206349D01*

+X395944Y206725D01*

+X396112Y207132D01*

+X396215Y207561D01*

+X396241Y208000D01*

+X396215Y208439D01*

+X396112Y208868D01*

+X395944Y209275D01*

+X395713Y209651D01*

+X395427Y209986D01*

+X395092Y210272D01*

+X394716Y210503D01*

+X394309Y210671D01*

+X393880Y210774D01*

+X393441Y210809D01*

+X393437Y210808D01*

+Y237699D01*

+X393465Y237723D01*

+X393649Y237939D01*

+X393797Y238180D01*

+X393905Y238442D01*

+X393971Y238718D01*

+X393988Y239000D01*

+X393971Y239282D01*

+X393905Y239558D01*

+X393797Y239820D01*

+X393649Y240061D01*

+X393465Y240277D01*

+X393437Y240301D01*

+Y324192D01*

+X393441Y324191D01*

+X393880Y324226D01*

+X394309Y324329D01*

+X394716Y324497D01*

+X395092Y324728D01*

+X395427Y325014D01*

+X395713Y325349D01*

+X395944Y325725D01*

+X396112Y326132D01*

+X396215Y326561D01*

+X396241Y327000D01*

+X396215Y327439D01*

+X396112Y327868D01*

+X395944Y328275D01*

+X395713Y328651D01*

+X395427Y328986D01*

+X395092Y329272D01*

+X394716Y329503D01*

+X394309Y329671D01*

+X393880Y329774D01*

+X393441Y329809D01*

+X393437Y329808D01*

+Y352192D01*

+X393441Y352191D01*

+X393880Y352226D01*

+X394309Y352329D01*

+X394716Y352497D01*

+X395092Y352728D01*

+X395427Y353014D01*

+X395713Y353349D01*

+X395944Y353725D01*

+X396112Y354132D01*

+X396215Y354561D01*

+X396241Y355000D01*

+X396215Y355439D01*

+X396112Y355868D01*

+X395944Y356275D01*

+X395713Y356651D01*

+X395427Y356986D01*

+X395092Y357272D01*

+X394716Y357503D01*

+X394309Y357671D01*

+X393880Y357774D01*

+X393441Y357809D01*

+X393437Y357808D01*

+Y397000D01*

+X396441D01*

+Y375616D01*

+X396166Y375503D01*

+X395790Y375272D01*

+X395455Y374986D01*

+X395169Y374651D01*

+X394938Y374275D01*

+X394770Y373868D01*

+X394667Y373439D01*

+X394632Y373000D01*

+X394667Y372561D01*

+X394770Y372132D01*

+X394938Y371725D01*

+X395169Y371349D01*

+X395455Y371014D01*

+X395790Y370728D01*

+X396166Y370497D01*

+X396441Y370384D01*

+Y369806D01*

+X396290Y369713D01*

+X395955Y369427D01*

+X395669Y369092D01*

+X395438Y368716D01*

+X395270Y368309D01*

+X395167Y367880D01*

+X395132Y367441D01*

+X395167Y367002D01*

+X395270Y366573D01*

+X395438Y366166D01*

+X395669Y365790D01*

+X395955Y365455D01*

+X396290Y365169D01*

+X396441Y365076D01*

+Y315970D01*

+X396169Y315651D01*

+X395938Y315275D01*

+X395770Y314868D01*

+X395667Y314439D01*

+X395632Y314000D01*

+X395667Y313561D01*

+X395770Y313132D01*

+X395938Y312725D01*

+X396169Y312349D01*

+X396441Y312030D01*

+Y310970D01*

+X396169Y310651D01*

+X395938Y310275D01*

+X395770Y309868D01*

+X395667Y309439D01*

+X395632Y309000D01*

+X395667Y308561D01*

+X395770Y308132D01*

+X395938Y307725D01*

+X396169Y307349D01*

+X396441Y307030D01*

+Y254970D01*

+X396169Y254651D01*

+X395938Y254275D01*

+X395770Y253868D01*

+X395667Y253439D01*

+X395632Y253000D01*

+X395667Y252561D01*

+X395770Y252132D01*

+X395938Y251725D01*

+X396169Y251349D01*

+X396441Y251030D01*

+Y249970D01*

+X396169Y249651D01*

+X395938Y249275D01*

+X395770Y248868D01*

+X395667Y248439D01*

+X395632Y248000D01*

+X395667Y247561D01*

+X395770Y247132D01*

+X395938Y246725D01*

+X396169Y246349D01*

+X396441Y246030D01*

+Y236806D01*

+X396159Y236783D01*

+X395883Y236717D01*

+X395621Y236609D01*

+X395380Y236461D01*

+X395164Y236277D01*

+X394980Y236061D01*

+X394832Y235820D01*

+X394724Y235558D01*

+X394658Y235282D01*

+X394635Y235000D01*

+X394658Y234718D01*

+X394724Y234442D01*

+X394832Y234180D01*

+X394980Y233939D01*

+X395164Y233723D01*

+X395380Y233539D01*

+X395621Y233391D01*

+X395883Y233283D01*

+X396159Y233217D01*

+X396441Y233194D01*

+Y153000D01*

+G37*

+G36*

+X393437Y127000D02*X389437D01*

+Y181192D01*

+X389441Y181191D01*

+X389880Y181226D01*

+X390309Y181329D01*

+X390716Y181497D01*

+X391092Y181728D01*

+X391427Y182014D01*

+X391713Y182349D01*

+X391944Y182725D01*

+X392112Y183132D01*

+X392215Y183561D01*

+X392241Y184000D01*

+X392215Y184439D01*

+X392112Y184868D01*

+X391944Y185275D01*

+X391713Y185651D01*

+X391427Y185986D01*

+X391092Y186272D01*

+X390716Y186503D01*

+X390309Y186671D01*

+X389880Y186774D01*

+X389441Y186809D01*

+X389437Y186808D01*

+Y233503D01*

+X389573Y233725D01*

+X389741Y234132D01*

+X389844Y234561D01*

+X389870Y235000D01*

+X389844Y235439D01*

+X389741Y235868D01*

+X389573Y236275D01*

+X389437Y236497D01*

+Y245963D01*

+X389484Y246003D01*

+X389668Y246219D01*

+X389816Y246460D01*

+X389924Y246722D01*

+X389990Y246998D01*

+X390007Y247280D01*

+X389990Y247562D01*

+X389924Y247838D01*

+X389816Y248100D01*

+X389668Y248341D01*

+X389484Y248557D01*

+X389437Y248597D01*

+Y281322D01*

+X389494Y281561D01*

+X389520Y282000D01*

+X389494Y282439D01*

+X389437Y282678D01*

+Y324025D01*

+X389713Y324349D01*

+X389944Y324725D01*

+X390112Y325132D01*

+X390215Y325561D01*

+X390241Y326000D01*

+X390215Y326439D01*

+X390112Y326868D01*

+X389944Y327275D01*

+X389713Y327651D01*

+X389437Y327975D01*

+Y397000D01*

+X393437D01*

+Y357808D01*

+X393002Y357774D01*

+X392573Y357671D01*

+X392166Y357503D01*

+X391790Y357272D01*

+X391455Y356986D01*

+X391169Y356651D01*

+X390938Y356275D01*

+X390770Y355868D01*

+X390667Y355439D01*

+X390632Y355000D01*

+X390667Y354561D01*

+X390770Y354132D01*

+X390938Y353725D01*

+X391169Y353349D01*

+X391455Y353014D01*

+X391790Y352728D01*

+X392166Y352497D01*

+X392573Y352329D01*

+X393002Y352226D01*

+X393437Y352192D01*

+Y329808D01*

+X393002Y329774D01*

+X392573Y329671D01*

+X392166Y329503D01*

+X391790Y329272D01*

+X391455Y328986D01*

+X391169Y328651D01*

+X390938Y328275D01*

+X390770Y327868D01*

+X390667Y327439D01*

+X390632Y327000D01*

+X390667Y326561D01*

+X390770Y326132D01*

+X390938Y325725D01*

+X391169Y325349D01*

+X391455Y325014D01*

+X391790Y324728D01*

+X392166Y324497D01*

+X392573Y324329D01*

+X393002Y324226D01*

+X393437Y324192D01*

+Y240301D01*

+X393249Y240461D01*

+X393008Y240609D01*

+X392746Y240717D01*

+X392470Y240783D01*

+X392188Y240806D01*

+X391906Y240783D01*

+X391630Y240717D01*

+X391368Y240609D01*

+X391127Y240461D01*

+X390911Y240277D01*

+X390727Y240061D01*

+X390579Y239820D01*

+X390471Y239558D01*

+X390405Y239282D01*

+X390382Y239000D01*

+X390405Y238718D01*

+X390471Y238442D01*

+X390579Y238180D01*

+X390727Y237939D01*

+X390911Y237723D01*

+X391127Y237539D01*

+X391368Y237391D01*

+X391630Y237283D01*

+X391906Y237217D01*

+X392188Y237194D01*

+X392470Y237217D01*

+X392746Y237283D01*

+X393008Y237391D01*

+X393249Y237539D01*

+X393437Y237699D01*

+Y210808D01*

+X393002Y210774D01*

+X392573Y210671D01*

+X392166Y210503D01*

+X391790Y210272D01*

+X391455Y209986D01*

+X391169Y209651D01*

+X390938Y209275D01*

+X390770Y208868D01*

+X390667Y208439D01*

+X390632Y208000D01*

+X390667Y207561D01*

+X390770Y207132D01*

+X390938Y206725D01*

+X391169Y206349D01*

+X391455Y206014D01*

+X391790Y205728D01*

+X392166Y205497D01*

+X392573Y205329D01*

+X393002Y205226D01*

+X393437Y205192D01*

+Y127000D01*

+G37*

+G36*

+X389437Y327975D02*X389427Y327986D01*

+X389092Y328272D01*

+X388716Y328503D01*

+X388309Y328671D01*

+X387880Y328774D01*

+X387441Y328809D01*

+X387002Y328774D01*

+X386573Y328671D01*

+X386437Y328615D01*

+Y351739D01*

+X386809Y351829D01*

+X387216Y351997D01*

+X387592Y352228D01*

+X387927Y352514D01*

+X388213Y352849D01*

+X388444Y353225D01*

+X388612Y353632D01*

+X388715Y354061D01*

+X388741Y354500D01*

+X388715Y354939D01*

+X388612Y355368D01*

+X388444Y355775D01*

+X388213Y356151D01*

+X387927Y356486D01*

+X387592Y356772D01*

+X387216Y357003D01*

+X386809Y357171D01*

+X386437Y357261D01*

+Y364268D01*

+X386499Y364283D01*

+X386761Y364391D01*

+X387002Y364539D01*

+X387218Y364723D01*

+X387402Y364939D01*

+X387550Y365180D01*

+X387658Y365442D01*

+X387724Y365718D01*

+X387741Y366000D01*

+X387724Y366282D01*

+X387658Y366558D01*

+X387550Y366820D01*

+X387402Y367061D01*

+X387218Y367277D01*

+X387002Y367461D01*

+X386761Y367609D01*

+X386499Y367717D01*

+X386437Y367732D01*

+Y378071D01*

+X386462Y378500D01*

+X386437Y378929D01*

+Y397000D01*

+X389437D01*

+Y327975D01*

+G37*

+G36*

+Y282678D02*X389391Y282868D01*

+X389223Y283275D01*

+X388992Y283651D01*

+X388706Y283986D01*

+X388371Y284272D01*

+X387995Y284503D01*

+X387588Y284671D01*

+X387159Y284774D01*

+X386720Y284809D01*

+X386437Y284786D01*

+Y304353D01*

+X386665Y304725D01*

+X386833Y305132D01*

+X386936Y305561D01*

+X386962Y306000D01*

+X386936Y306439D01*

+X386833Y306868D01*

+X386665Y307275D01*

+X386437Y307647D01*

+Y323385D01*

+X386573Y323329D01*

+X387002Y323226D01*

+X387441Y323191D01*

+X387880Y323226D01*

+X388309Y323329D01*

+X388716Y323497D01*

+X389092Y323728D01*

+X389427Y324014D01*

+X389437Y324025D01*

+Y282678D01*

+G37*

+G36*

+Y248597D02*X389268Y248741D01*

+X389027Y248889D01*

+X388765Y248997D01*

+X388489Y249063D01*

+X388207Y249086D01*

+X387925Y249063D01*

+X387649Y248997D01*

+X387387Y248889D01*

+X387146Y248741D01*

+X386930Y248557D01*

+X386746Y248341D01*

+X386598Y248100D01*

+X386490Y247838D01*

+X386437Y247617D01*

+Y255962D01*

+X386498Y256014D01*

+X386784Y256349D01*

+X387015Y256725D01*

+X387183Y257132D01*

+X387286Y257561D01*

+X387312Y258000D01*

+X387286Y258439D01*

+X387183Y258868D01*

+X387015Y259275D01*

+X386784Y259651D01*

+X386498Y259986D01*

+X386437Y260038D01*

+Y279214D01*

+X386720Y279191D01*

+X387159Y279226D01*

+X387588Y279329D01*

+X387995Y279497D01*

+X388371Y279728D01*

+X388706Y280014D01*

+X388992Y280349D01*

+X389223Y280725D01*

+X389391Y281132D01*

+X389437Y281322D01*

+Y248597D01*

+G37*

+G36*

+Y236497D02*X389342Y236651D01*

+X389056Y236986D01*

+X388721Y237272D01*

+X388345Y237503D01*

+X387938Y237671D01*

+X387509Y237774D01*

+X387070Y237809D01*

+X386631Y237774D01*

+X386437Y237727D01*

+Y246943D01*

+X386490Y246722D01*

+X386598Y246460D01*

+X386746Y246219D01*

+X386930Y246003D01*

+X387146Y245819D01*

+X387387Y245671D01*

+X387649Y245563D01*

+X387925Y245497D01*

+X388207Y245474D01*

+X388489Y245497D01*

+X388765Y245563D01*

+X389027Y245671D01*

+X389268Y245819D01*

+X389437Y245963D01*

+Y236497D01*

+G37*

+G36*

+Y127000D02*X386437D01*

+Y156061D01*

+X386581Y156096D01*

+X386843Y156204D01*

+X387084Y156352D01*

+X387300Y156536D01*

+X387484Y156752D01*

+X387632Y156993D01*

+X387740Y157255D01*

+X387806Y157531D01*

+X387823Y157813D01*

+X387806Y158095D01*

+X387740Y158371D01*

+X387632Y158633D01*

+X387484Y158874D01*

+X387300Y159090D01*

+X387084Y159274D01*

+X386843Y159422D01*

+X386581Y159530D01*

+X386437Y159565D01*

+Y160192D01*

+X386441Y160191D01*

+X386880Y160226D01*

+X387309Y160329D01*

+X387716Y160497D01*

+X388092Y160728D01*

+X388427Y161014D01*

+X388713Y161349D01*

+X388944Y161725D01*

+X389112Y162132D01*

+X389215Y162561D01*

+X389241Y163000D01*

+X389215Y163439D01*

+X389112Y163868D01*

+X388944Y164275D01*

+X388713Y164651D01*

+X388427Y164986D01*

+X388092Y165272D01*

+X387716Y165503D01*

+X387309Y165671D01*

+X386880Y165774D01*

+X386441Y165809D01*

+X386437Y165808D01*

+Y186353D01*

+X386665Y186725D01*

+X386833Y187132D01*

+X386936Y187561D01*

+X386962Y188000D01*

+X386936Y188439D01*

+X386833Y188868D01*

+X386665Y189275D01*

+X386437Y189647D01*

+Y232273D01*

+X386631Y232226D01*

+X387070Y232191D01*

+X387509Y232226D01*

+X387938Y232329D01*

+X388345Y232497D01*

+X388721Y232728D01*

+X389056Y233014D01*

+X389342Y233349D01*

+X389437Y233503D01*

+Y186808D01*

+X389002Y186774D01*

+X388573Y186671D01*

+X388166Y186503D01*

+X387790Y186272D01*

+X387455Y185986D01*

+X387169Y185651D01*

+X386938Y185275D01*

+X386770Y184868D01*

+X386667Y184439D01*

+X386632Y184000D01*

+X386667Y183561D01*

+X386770Y183132D01*

+X386938Y182725D01*

+X387169Y182349D01*

+X387455Y182014D01*

+X387790Y181728D01*

+X388166Y181497D01*

+X388573Y181329D01*

+X389002Y181226D01*

+X389437Y181192D01*

+Y127000D01*

+G37*

+G36*

+X386437D02*X377344D01*

+Y160373D01*

+X377347Y160372D01*

+X377629Y160395D01*

+X377905Y160461D01*

+X378167Y160569D01*

+X378408Y160717D01*

+X378624Y160901D01*

+X378808Y161117D01*

+X378956Y161358D01*

+X379064Y161620D01*

+X379130Y161896D01*

+X379147Y162178D01*

+X379130Y162460D01*

+X379064Y162736D01*

+X378956Y162998D01*

+X378808Y163239D01*

+X378624Y163455D01*

+X378408Y163639D01*

+X378167Y163787D01*

+X377905Y163895D01*

+X377629Y163961D01*

+X377347Y163984D01*

+X377344Y163983D01*

+Y232943D01*

+X377427Y233014D01*

+X377713Y233349D01*

+X377944Y233725D01*

+X378112Y234132D01*

+X378215Y234561D01*

+X378241Y235000D01*

+X378215Y235439D01*

+X378112Y235868D01*

+X377944Y236275D01*

+X377713Y236651D01*

+X377427Y236986D01*

+X377344Y237057D01*

+Y397000D01*

+X386437D01*

+Y378929D01*

+X386436Y378939D01*

+X386333Y379368D01*

+X386165Y379775D01*

+X385934Y380151D01*

+X385648Y380486D01*

+X385313Y380772D01*

+X384937Y381003D01*

+X384530Y381171D01*

+X384101Y381274D01*

+X383662Y381309D01*

+X383223Y381274D01*

+X382794Y381171D01*

+X382387Y381003D01*

+X382011Y380772D01*

+X381676Y380486D01*

+X381390Y380151D01*

+X381159Y379775D01*

+X380991Y379368D01*

+X380888Y378939D01*

+X380853Y378500D01*

+X380888Y378061D01*

+X380991Y377632D01*

+X381159Y377225D01*

+X381390Y376849D01*

+X381676Y376514D01*

+X382011Y376228D01*

+X382387Y375997D01*

+X382794Y375829D01*

+X383223Y375726D01*

+X383662Y375691D01*

+X384101Y375726D01*

+X384530Y375829D01*

+X384937Y375997D01*

+X385313Y376228D01*

+X385648Y376514D01*

+X385934Y376849D01*

+X386165Y377225D01*

+X386333Y377632D01*

+X386436Y378061D01*

+X386437Y378071D01*

+Y367732D01*

+X386223Y367783D01*

+X385941Y367806D01*

+X385659Y367783D01*

+X385383Y367717D01*

+X385121Y367609D01*

+X384880Y367461D01*

+X384664Y367277D01*

+X384480Y367061D01*

+X384332Y366820D01*

+X384224Y366558D01*

+X384158Y366282D01*

+X384135Y366000D01*

+X384158Y365718D01*

+X384224Y365442D01*

+X384332Y365180D01*

+X384480Y364939D01*

+X384664Y364723D01*

+X384880Y364539D01*

+X385121Y364391D01*

+X385383Y364283D01*

+X385659Y364217D01*

+X385941Y364194D01*

+X386223Y364217D01*

+X386437Y364268D01*

+Y357261D01*

+X386380Y357274D01*

+X385941Y357309D01*

+X385502Y357274D01*

+X385073Y357171D01*

+X384666Y357003D01*

+X384290Y356772D01*

+X383955Y356486D01*

+X383669Y356151D01*

+X383438Y355775D01*

+X383270Y355368D01*

+X383167Y354939D01*

+X383132Y354500D01*

+X383167Y354061D01*

+X383270Y353632D01*

+X383438Y353225D01*

+X383669Y352849D01*

+X383955Y352514D01*

+X384290Y352228D01*

+X384666Y351997D01*

+X385073Y351829D01*

+X385502Y351726D01*

+X385941Y351691D01*

+X386380Y351726D01*

+X386437Y351739D01*

+Y328615D01*

+X386166Y328503D01*

+X385790Y328272D01*

+X385455Y327986D01*

+X385169Y327651D01*

+X384938Y327275D01*

+X384770Y326868D01*

+X384667Y326439D01*

+X384632Y326000D01*

+X384667Y325561D01*

+X384770Y325132D01*

+X384938Y324725D01*

+X385169Y324349D01*

+X385455Y324014D01*

+X385790Y323728D01*

+X386166Y323497D01*

+X386437Y323385D01*

+Y307647D01*

+X386434Y307651D01*

+X386148Y307986D01*

+X385813Y308272D01*

+X385437Y308503D01*

+X385030Y308671D01*

+X384601Y308774D01*

+X384162Y308809D01*

+X383723Y308774D01*

+X383294Y308671D01*

+X382887Y308503D01*

+X382511Y308272D01*

+X382176Y307986D01*

+X381890Y307651D01*

+X381659Y307275D01*

+X381491Y306868D01*

+X381388Y306439D01*

+X381353Y306000D01*

+X381388Y305561D01*

+X381491Y305132D01*

+X381659Y304725D01*

+X381890Y304349D01*

+X382176Y304014D01*

+X382511Y303728D01*

+X382887Y303497D01*

+X383294Y303329D01*

+X383723Y303226D01*

+X384162Y303191D01*

+X384601Y303226D01*

+X385030Y303329D01*

+X385437Y303497D01*

+X385813Y303728D01*

+X386148Y304014D01*

+X386434Y304349D01*

+X386437Y304353D01*

+Y284786D01*

+X386281Y284774D01*

+X385852Y284671D01*

+X385445Y284503D01*

+X385069Y284272D01*

+X384734Y283986D01*

+X384448Y283651D01*

+X384217Y283275D01*

+X384049Y282868D01*

+X383946Y282439D01*

+X383911Y282000D01*

+X383946Y281561D01*

+X384049Y281132D01*

+X384217Y280725D01*

+X384448Y280349D01*

+X384734Y280014D01*

+X385069Y279728D01*

+X385445Y279497D01*

+X385852Y279329D01*

+X386281Y279226D01*

+X386437Y279214D01*

+Y260038D01*

+X386163Y260272D01*

+X385787Y260503D01*

+X385380Y260671D01*

+X384951Y260774D01*

+X384512Y260809D01*

+X384073Y260774D01*

+X383644Y260671D01*

+X383237Y260503D01*

+X382861Y260272D01*

+X382526Y259986D01*

+X382240Y259651D01*

+X382009Y259275D01*

+X381841Y258868D01*

+X381738Y258439D01*

+X381703Y258000D01*

+X381738Y257561D01*

+X381841Y257132D01*

+X382009Y256725D01*

+X382240Y256349D01*

+X382526Y256014D01*

+X382861Y255728D01*

+X383237Y255497D01*

+X383644Y255329D01*

+X384073Y255226D01*

+X384512Y255191D01*

+X384951Y255226D01*

+X385380Y255329D01*

+X385787Y255497D01*

+X386163Y255728D01*

+X386437Y255962D01*

+Y247617D01*

+X386424Y247562D01*

+X386401Y247280D01*

+X386424Y246998D01*

+X386437Y246943D01*

+Y237727D01*

+X386202Y237671D01*

+X385795Y237503D01*

+X385419Y237272D01*

+X385084Y236986D01*

+X384798Y236651D01*

+X384567Y236275D01*

+X384399Y235868D01*

+X384296Y235439D01*

+X384261Y235000D01*

+X384296Y234561D01*

+X384399Y234132D01*

+X384567Y233725D01*

+X384798Y233349D01*

+X385084Y233014D01*

+X385419Y232728D01*

+X385795Y232497D01*

+X386202Y232329D01*

+X386437Y232273D01*

+Y189647D01*

+X386434Y189651D01*

+X386148Y189986D01*

+X385813Y190272D01*

+X385437Y190503D01*

+X385030Y190671D01*

+X384601Y190774D01*

+X384162Y190809D01*

+X383723Y190774D01*

+X383294Y190671D01*

+X382887Y190503D01*

+X382511Y190272D01*

+X382176Y189986D01*

+X381890Y189651D01*

+X381659Y189275D01*

+X381491Y188868D01*

+X381388Y188439D01*

+X381353Y188000D01*

+X381388Y187561D01*

+X381491Y187132D01*

+X381659Y186725D01*

+X381890Y186349D01*

+X382176Y186014D01*

+X382511Y185728D01*

+X382887Y185497D01*

+X383294Y185329D01*

+X383723Y185226D01*

+X384162Y185191D01*

+X384601Y185226D01*

+X385030Y185329D01*

+X385437Y185497D01*

+X385813Y185728D01*

+X386148Y186014D01*

+X386434Y186349D01*

+X386437Y186353D01*

+Y165808D01*

+X386002Y165774D01*

+X385573Y165671D01*

+X385166Y165503D01*

+X384790Y165272D01*

+X384455Y164986D01*

+X384169Y164651D01*

+X383938Y164275D01*

+X383770Y163868D01*

+X383667Y163439D01*

+X383632Y163000D01*

+X383667Y162561D01*

+X383770Y162132D01*

+X383938Y161725D01*

+X384169Y161349D01*

+X384455Y161014D01*

+X384790Y160728D01*

+X385166Y160497D01*

+X385573Y160329D01*

+X386002Y160226D01*

+X386437Y160192D01*

+Y159565D01*

+X386305Y159596D01*

+X386023Y159619D01*

+X385741Y159596D01*

+X385465Y159530D01*

+X385203Y159422D01*

+X384962Y159274D01*

+X384746Y159090D01*

+X384562Y158874D01*

+X384414Y158633D01*

+X384306Y158371D01*

+X384240Y158095D01*

+X384217Y157813D01*

+X384240Y157531D01*

+X384306Y157255D01*

+X384414Y156993D01*

+X384562Y156752D01*

+X384746Y156536D01*

+X384962Y156352D01*

+X385203Y156204D01*

+X385465Y156096D01*

+X385741Y156030D01*

+X386023Y156007D01*

+X386305Y156030D01*

+X386437Y156061D01*

+Y127000D01*

+G37*

+G36*

+X377344D02*X372437D01*

+Y167578D01*

+X372441Y167577D01*

+X372880Y167612D01*

+X373309Y167715D01*

+X373716Y167883D01*

+X374092Y168114D01*

+X374427Y168400D01*

+X374713Y168735D01*

+X374944Y169111D01*

+X375112Y169518D01*

+X375215Y169947D01*

+X375241Y170386D01*

+X375215Y170825D01*

+X375112Y171254D01*

+X374944Y171661D01*

+X374713Y172037D01*

+X374427Y172372D01*

+X374092Y172658D01*

+X373716Y172889D01*

+X373309Y173057D01*

+X372880Y173160D01*

+X372441Y173195D01*

+X372437Y173194D01*

+Y258628D01*

+X372663Y258767D01*

+X372879Y258951D01*

+X373063Y259167D01*

+X373211Y259408D01*

+X373319Y259670D01*

+X373385Y259946D01*

+X373402Y260228D01*

+X373385Y260510D01*

+X373319Y260786D01*

+X373211Y261048D01*

+X373063Y261289D01*

+X372879Y261505D01*

+X372663Y261689D01*

+X372437Y261828D01*

+Y287881D01*

+X372441Y287880D01*

+X372880Y287915D01*

+X373309Y288018D01*

+X373716Y288186D01*

+X374092Y288417D01*

+X374427Y288703D01*

+X374713Y289038D01*

+X374944Y289414D01*

+X375112Y289821D01*

+X375215Y290250D01*

+X375241Y290689D01*

+X375215Y291128D01*

+X375112Y291557D01*

+X374944Y291964D01*

+X374713Y292340D01*

+X374427Y292675D01*

+X374092Y292961D01*

+X373716Y293192D01*

+X373309Y293360D01*

+X372880Y293463D01*

+X372441Y293498D01*

+X372437Y293497D01*

+Y348381D01*

+X372441Y348380D01*

+X372880Y348415D01*

+X373309Y348518D01*

+X373716Y348686D01*

+X374092Y348917D01*

+X374427Y349203D01*

+X374713Y349538D01*

+X374944Y349914D01*

+X375112Y350321D01*

+X375215Y350750D01*

+X375241Y351189D01*

+X375215Y351628D01*

+X375112Y352057D01*

+X374944Y352464D01*

+X374713Y352840D01*

+X374427Y353175D01*

+X374092Y353461D01*

+X373716Y353692D01*

+X373309Y353860D01*

+X372880Y353963D01*

+X372441Y353998D01*

+X372437Y353997D01*

+Y397000D01*

+X377344D01*

+Y237057D01*

+X377092Y237272D01*

+X376716Y237503D01*

+X376309Y237671D01*

+X375880Y237774D01*

+X375441Y237809D01*

+X375002Y237774D01*

+X374573Y237671D01*

+X374166Y237503D01*

+X373790Y237272D01*

+X373455Y236986D01*

+X373169Y236651D01*

+X372938Y236275D01*

+X372770Y235868D01*

+X372667Y235439D01*

+X372632Y235000D01*

+X372667Y234561D01*

+X372770Y234132D01*

+X372938Y233725D01*

+X373169Y233349D01*

+X373455Y233014D01*

+X373790Y232728D01*

+X374166Y232497D01*

+X374573Y232329D01*

+X375002Y232226D01*

+X375441Y232191D01*

+X375880Y232226D01*

+X376309Y232329D01*

+X376716Y232497D01*

+X377092Y232728D01*

+X377344Y232943D01*

+Y163983D01*

+X377065Y163961D01*

+X376789Y163895D01*

+X376527Y163787D01*

+X376286Y163639D01*

+X376070Y163455D01*

+X375886Y163239D01*

+X375738Y162998D01*

+X375630Y162736D01*

+X375564Y162460D01*

+X375541Y162178D01*

+X375564Y161896D01*

+X375630Y161620D01*

+X375738Y161358D01*

+X375886Y161117D01*

+X376070Y160901D01*

+X376286Y160717D01*

+X376527Y160569D01*

+X376789Y160461D01*

+X377065Y160395D01*

+X377344Y160373D01*

+Y127000D01*

+G37*

+G36*

+X372437D02*X358938D01*

+Y141855D01*

+X360128Y142872D01*

+X361156Y144075D01*

+X361982Y145423D01*

+X362588Y146885D01*

+X362957Y148423D01*

+X363050Y150000D01*

+X362957Y151577D01*

+X362588Y153115D01*

+X361982Y154577D01*

+X361156Y155925D01*

+X360128Y157128D01*

+X358938Y158145D01*

+Y206695D01*

+X358941Y206694D01*

+X359223Y206717D01*

+X359499Y206783D01*

+X359761Y206891D01*

+X360002Y207039D01*

+X360218Y207223D01*

+X360402Y207439D01*

+X360550Y207680D01*

+X360658Y207942D01*

+X360724Y208218D01*

+X360741Y208500D01*

+X360724Y208782D01*

+X360658Y209058D01*

+X360550Y209320D01*

+X360402Y209561D01*

+X360218Y209777D01*

+X360002Y209961D01*

+X359761Y210109D01*

+X359499Y210217D01*

+X359223Y210283D01*

+X358941Y210306D01*

+X358938Y210305D01*

+Y397000D01*

+X372437D01*

+Y353997D01*

+X372002Y353963D01*

+X371573Y353860D01*

+X371166Y353692D01*

+X370790Y353461D01*

+X370455Y353175D01*

+X370169Y352840D01*

+X369938Y352464D01*

+X369770Y352057D01*

+X369667Y351628D01*

+X369632Y351189D01*

+X369667Y350750D01*

+X369770Y350321D01*

+X369938Y349914D01*

+X370169Y349538D01*

+X370455Y349203D01*

+X370790Y348917D01*

+X371166Y348686D01*

+X371573Y348518D01*

+X372002Y348415D01*

+X372437Y348381D01*

+Y293497D01*

+X372002Y293463D01*

+X371573Y293360D01*

+X371166Y293192D01*

+X370790Y292961D01*

+X370455Y292675D01*

+X370169Y292340D01*

+X369938Y291964D01*

+X369770Y291557D01*

+X369667Y291128D01*

+X369632Y290689D01*

+X369667Y290250D01*

+X369770Y289821D01*

+X369938Y289414D01*

+X370169Y289038D01*

+X370455Y288703D01*

+X370790Y288417D01*

+X371166Y288186D01*

+X371573Y288018D01*

+X372002Y287915D01*

+X372437Y287881D01*

+Y261828D01*

+X372422Y261837D01*

+X372160Y261945D01*

+X371884Y262011D01*

+X371602Y262034D01*

+X371320Y262011D01*

+X371044Y261945D01*

+X370782Y261837D01*

+X370541Y261689D01*

+X370325Y261505D01*

+X370141Y261289D01*

+X369993Y261048D01*

+X369885Y260786D01*

+X369819Y260510D01*

+X369796Y260228D01*

+X369819Y259946D01*

+X369885Y259670D01*

+X369993Y259408D01*

+X370141Y259167D01*

+X370325Y258951D01*

+X370541Y258767D01*

+X370782Y258619D01*

+X371044Y258511D01*

+X371320Y258445D01*

+X371602Y258422D01*

+X371884Y258445D01*

+X372160Y258511D01*

+X372422Y258619D01*

+X372437Y258628D01*

+Y173194D01*

+X372002Y173160D01*

+X371573Y173057D01*

+X371166Y172889D01*

+X370790Y172658D01*

+X370455Y172372D01*

+X370169Y172037D01*

+X369938Y171661D01*

+X369770Y171254D01*

+X369667Y170825D01*

+X369632Y170386D01*

+X369667Y169947D01*

+X369770Y169518D01*

+X369938Y169111D01*

+X370169Y168735D01*

+X370455Y168400D01*

+X370790Y168114D01*

+X371166Y167883D01*

+X371573Y167715D01*

+X372002Y167612D01*

+X372437Y167578D01*

+Y127000D01*

+G37*

+G36*

+X358938Y158145D02*X358925Y158156D01*

+X357577Y158982D01*

+X356438Y159454D01*

+Y188225D01*

+X356674Y188795D01*

+X357093Y190540D01*

+X357199Y192329D01*

+X357093Y194118D01*

+X356674Y195863D01*

+X356438Y196433D01*

+Y231195D01*

+X356441Y231194D01*

+X356723Y231217D01*

+X356999Y231283D01*

+X357261Y231391D01*

+X357502Y231539D01*

+X357718Y231723D01*

+X357902Y231939D01*

+X358050Y232180D01*

+X358158Y232442D01*

+X358224Y232718D01*

+X358241Y233000D01*

+X358224Y233282D01*

+X358158Y233558D01*

+X358050Y233820D01*

+X357902Y234061D01*

+X357718Y234277D01*

+X357502Y234461D01*

+X357261Y234609D01*

+X356999Y234717D01*

+X356723Y234783D01*

+X356441Y234806D01*

+X356438Y234805D01*

+Y397000D01*

+X358938D01*

+Y210305D01*

+X358659Y210283D01*

+X358383Y210217D01*

+X358121Y210109D01*

+X357880Y209961D01*

+X357664Y209777D01*

+X357480Y209561D01*

+X357332Y209320D01*

+X357224Y209058D01*

+X357158Y208782D01*

+X357135Y208500D01*

+X357158Y208218D01*

+X357224Y207942D01*

+X357332Y207680D01*

+X357480Y207439D01*

+X357664Y207223D01*

+X357880Y207039D01*

+X358121Y206891D01*

+X358383Y206783D01*

+X358659Y206717D01*

+X358938Y206695D01*

+Y158145D01*

+G37*

+G36*

+X356438Y196433D02*X355988Y197520D01*

+X355050Y199050D01*

+X353885Y200415D01*

+X353387Y200840D01*

+Y337716D01*

+X353390Y337715D01*

+X353672Y337738D01*

+X353948Y337804D01*

+X354210Y337912D01*

+X354451Y338060D01*

+X354667Y338244D01*

+X354851Y338460D01*

+X354999Y338701D01*

+X355107Y338963D01*

+X355173Y339239D01*

+X355190Y339521D01*

+X355173Y339803D01*

+X355107Y340079D01*

+X354999Y340341D01*

+X354851Y340582D01*

+X354667Y340798D01*

+X354451Y340982D01*

+X354210Y341130D01*

+X353948Y341238D01*

+X353672Y341304D01*

+X353390Y341327D01*

+X353387Y341326D01*

+Y350739D01*

+X353955Y351404D01*

+X354781Y352752D01*

+X355387Y354214D01*

+X355756Y355752D01*

+X355849Y357329D01*

+X355756Y358906D01*

+X355387Y360444D01*

+X354781Y361906D01*

+X353955Y363254D01*

+X353387Y363919D01*

+Y397000D01*

+X356438D01*

+Y234805D01*

+X356159Y234783D01*

+X355883Y234717D01*

+X355621Y234609D01*

+X355380Y234461D01*

+X355164Y234277D01*

+X354980Y234061D01*

+X354832Y233820D01*

+X354724Y233558D01*

+X354658Y233282D01*

+X354635Y233000D01*

+X354658Y232718D01*

+X354724Y232442D01*

+X354832Y232180D01*

+X354980Y231939D01*

+X355164Y231723D01*

+X355380Y231539D01*

+X355621Y231391D01*

+X355883Y231283D01*

+X356159Y231217D01*

+X356438Y231195D01*

+Y196433D01*

+G37*

+G36*

+Y159454D02*X356115Y159588D01*

+X354577Y159957D01*

+X353387Y160051D01*

+Y183818D01*

+X353885Y184243D01*

+X355050Y185608D01*

+X355988Y187138D01*

+X356438Y188225D01*

+Y159454D01*

+G37*

+G36*

+X353387Y363919D02*X352927Y364457D01*

+X351724Y365485D01*

+X350376Y366311D01*

+X348914Y366917D01*

+X347376Y367286D01*

+X345799Y367410D01*

+X345784Y367409D01*

+Y397000D01*

+X353387D01*

+Y363919D01*

+G37*

+G36*

+Y200840D02*X352520Y201580D01*

+X350990Y202518D01*

+X349333Y203204D01*

+X347588Y203623D01*

+X345799Y203764D01*

+X345784Y203763D01*

+Y245608D01*

+X345810Y245631D01*

+X346296Y246199D01*

+X346686Y246837D01*

+X346972Y247528D01*

+X347147Y248255D01*

+X347191Y249000D01*

+X347147Y249745D01*

+X346972Y250472D01*

+X346686Y251163D01*

+X346296Y251801D01*

+X345810Y252369D01*

+X345784Y252392D01*

+Y347249D01*

+X345799Y347248D01*

+X347376Y347372D01*

+X348914Y347741D01*

+X350376Y348347D01*

+X351724Y349173D01*

+X352927Y350201D01*

+X353387Y350739D01*

+Y341326D01*

+X353108Y341304D01*

+X352832Y341238D01*

+X352570Y341130D01*

+X352329Y340982D01*

+X352113Y340798D01*

+X351929Y340582D01*

+X351781Y340341D01*

+X351673Y340079D01*

+X351607Y339803D01*

+X351584Y339521D01*

+X351607Y339239D01*

+X351673Y338963D01*

+X351781Y338701D01*

+X351929Y338460D01*

+X352113Y338244D01*

+X352329Y338060D01*

+X352570Y337912D01*

+X352832Y337804D01*

+X353108Y337738D01*

+X353387Y337716D01*

+Y200840D01*

+G37*

+G36*

+Y160051D02*X353000Y160081D01*

+X351423Y159957D01*

+X349885Y159588D01*

+X348423Y158982D01*

+X347075Y158156D01*

+X345872Y157128D01*

+X345784Y157025D01*

+Y180895D01*

+X345799Y180894D01*

+X347588Y181035D01*

+X349333Y181454D01*

+X350990Y182140D01*

+X352520Y183078D01*

+X353387Y183818D01*

+Y160051D01*

+G37*

+G36*

+X358938Y127000D02*X345784D01*

+Y142975D01*

+X345872Y142872D01*

+X347075Y141844D01*

+X348423Y141018D01*

+X349885Y140412D01*

+X351423Y140043D01*

+X353000Y139919D01*

+X354577Y140043D01*

+X356115Y140412D01*

+X357577Y141018D01*

+X358925Y141844D01*

+X358938Y141855D01*

+Y127000D01*

+G37*

+G36*

+X339834Y245027D02*X340278Y244755D01*

+X340969Y244469D01*

+X341696Y244294D01*

+X342441Y244235D01*

+X343186Y244294D01*

+X343913Y244469D01*

+X344604Y244755D01*

+X345242Y245145D01*

+X345784Y245608D01*

+Y203763D01*

+X344010Y203623D01*

+X342265Y203204D01*

+X340608Y202518D01*

+X339834Y202044D01*

+Y223052D01*

+X339902Y223131D01*

+X340050Y223372D01*

+X340158Y223634D01*

+X340224Y223910D01*

+X340241Y224192D01*

+X340224Y224474D01*

+X340158Y224750D01*

+X340050Y225012D01*

+X339902Y225253D01*

+X339834Y225332D01*

+Y228984D01*

+X339902Y229063D01*

+X340050Y229304D01*

+X340158Y229566D01*

+X340224Y229842D01*

+X340241Y230124D01*

+X340224Y230406D01*

+X340158Y230682D01*

+X340050Y230944D01*

+X339902Y231185D01*

+X339834Y231264D01*

+Y245027D01*

+G37*

+G36*

+Y349207D02*X339874Y349173D01*

+X341222Y348347D01*

+X342684Y347741D01*

+X344222Y347372D01*

+X345784Y347249D01*

+Y252392D01*

+X345242Y252855D01*

+X344604Y253245D01*

+X343913Y253531D01*

+X343186Y253706D01*

+X342441Y253765D01*

+X341696Y253706D01*

+X340969Y253531D01*

+X340278Y253245D01*

+X339834Y252973D01*

+Y340022D01*

+X339837Y340021D01*

+X340119Y340044D01*

+X340395Y340110D01*

+X340657Y340218D01*

+X340898Y340366D01*

+X341114Y340550D01*

+X341298Y340766D01*

+X341446Y341007D01*

+X341554Y341269D01*

+X341620Y341545D01*

+X341637Y341827D01*

+X341620Y342109D01*

+X341554Y342385D01*

+X341446Y342647D01*

+X341298Y342888D01*

+X341114Y343104D01*

+X340898Y343288D01*

+X340657Y343436D01*

+X340395Y343544D01*

+X340119Y343610D01*

+X339837Y343633D01*

+X339834Y343632D01*

+Y349207D01*

+G37*

+G36*

+Y225332D02*X339718Y225469D01*

+X339502Y225653D01*

+X339261Y225801D01*

+X338999Y225909D01*

+X338723Y225975D01*

+X338441Y225998D01*

+X338159Y225975D01*

+X337883Y225909D01*

+X337621Y225801D01*

+X337438Y225689D01*

+Y228627D01*

+X337621Y228515D01*

+X337883Y228407D01*

+X338159Y228341D01*

+X338441Y228318D01*

+X338723Y228341D01*

+X338999Y228407D01*

+X339261Y228515D01*

+X339502Y228663D01*

+X339718Y228847D01*

+X339834Y228984D01*

+Y225332D01*

+G37*

+G36*

+Y202044D02*X339078Y201580D01*

+X337713Y200415D01*

+X337438Y200093D01*

+Y222695D01*

+X337621Y222583D01*

+X337883Y222475D01*

+X338159Y222409D01*

+X338441Y222386D01*

+X338723Y222409D01*

+X338999Y222475D01*

+X339261Y222583D01*

+X339502Y222731D01*

+X339718Y222915D01*

+X339834Y223052D01*

+Y202044D01*

+G37*

+G36*

+X337438Y351738D02*X337643Y351404D01*

+X338671Y350201D01*

+X339834Y349207D01*

+Y343632D01*

+X339555Y343610D01*

+X339279Y343544D01*

+X339017Y343436D01*

+X338776Y343288D01*

+X338560Y343104D01*

+X338376Y342888D01*

+X338228Y342647D01*

+X338120Y342385D01*

+X338054Y342109D01*

+X338031Y341827D01*

+X338054Y341545D01*

+X338120Y341269D01*

+X338228Y341007D01*

+X338376Y340766D01*

+X338560Y340550D01*

+X338776Y340366D01*

+X339017Y340218D01*

+X339279Y340110D01*

+X339555Y340044D01*

+X339834Y340022D01*

+Y252973D01*

+X339640Y252855D01*

+X339072Y252369D01*

+X338586Y251801D01*

+X338196Y251163D01*

+X337910Y250472D01*

+X337735Y249745D01*

+X337676Y249000D01*

+X337735Y248255D01*

+X337910Y247528D01*

+X338196Y246837D01*

+X338586Y246199D01*

+X339072Y245631D01*

+X339640Y245145D01*

+X339834Y245027D01*

+Y231264D01*

+X339718Y231401D01*

+X339502Y231585D01*

+X339261Y231733D01*

+X338999Y231841D01*

+X338723Y231907D01*

+X338441Y231930D01*

+X338159Y231907D01*

+X337883Y231841D01*

+X337621Y231733D01*

+X337438Y231621D01*

+Y351738D01*

+G37*

+G36*

+Y397000D02*X345784D01*

+Y367409D01*

+X344222Y367286D01*

+X342684Y366917D01*

+X341222Y366311D01*

+X339874Y365485D01*

+X338671Y364457D01*

+X337643Y363254D01*

+X337438Y362920D01*

+Y397000D01*

+G37*

+G36*

+X345784Y127000D02*X337438D01*

+Y161195D01*

+X337441Y161194D01*

+X337723Y161217D01*

+X337999Y161283D01*

+X338261Y161391D01*

+X338502Y161539D01*

+X338718Y161723D01*

+X338902Y161939D01*

+X339050Y162180D01*

+X339158Y162442D01*

+X339224Y162718D01*

+X339241Y163000D01*

+X339224Y163282D01*

+X339158Y163558D01*

+X339050Y163820D01*

+X338902Y164061D01*

+X338718Y164277D01*

+X338502Y164461D01*

+X338261Y164609D01*

+X337999Y164717D01*

+X337723Y164783D01*

+X337441Y164806D01*

+X337438Y164805D01*

+Y184565D01*

+X337713Y184243D01*

+X339078Y183078D01*

+X340608Y182140D01*

+X342265Y181454D01*

+X344010Y181035D01*

+X345784Y180895D01*

+Y157025D01*

+X344844Y155925D01*

+X344018Y154577D01*

+X343412Y153115D01*

+X343043Y151577D01*

+X342919Y150000D01*

+X343043Y148423D01*

+X343412Y146885D01*

+X344018Y145423D01*

+X344844Y144075D01*

+X345784Y142975D01*

+Y127000D01*

+G37*

+G36*

+X337438D02*X332434D01*

+Y244236D01*

+X332441Y244235D01*

+X333186Y244294D01*

+X333913Y244469D01*

+X334604Y244755D01*

+X335242Y245145D01*

+X335810Y245631D01*

+X336296Y246199D01*

+X336686Y246837D01*

+X336972Y247528D01*

+X337147Y248255D01*

+X337191Y249000D01*

+X337147Y249745D01*

+X336972Y250472D01*

+X336686Y251163D01*

+X336296Y251801D01*

+X335810Y252369D01*

+X335242Y252855D01*

+X334604Y253245D01*

+X333913Y253531D01*

+X333186Y253706D01*

+X332441Y253765D01*

+X332434Y253764D01*

+Y397000D01*

+X337438D01*

+Y362920D01*

+X336817Y361906D01*

+X336211Y360444D01*

+X335842Y358906D01*

+X335718Y357329D01*

+X335842Y355752D01*

+X336211Y354214D01*

+X336817Y352752D01*

+X337438Y351738D01*

+Y231621D01*

+X337380Y231585D01*

+X337164Y231401D01*

+X336980Y231185D01*

+X336832Y230944D01*

+X336724Y230682D01*

+X336658Y230406D01*

+X336635Y230124D01*

+X336658Y229842D01*

+X336724Y229566D01*

+X336832Y229304D01*

+X336980Y229063D01*

+X337164Y228847D01*

+X337380Y228663D01*

+X337438Y228627D01*

+Y225689D01*

+X337380Y225653D01*

+X337164Y225469D01*

+X336980Y225253D01*

+X336832Y225012D01*

+X336724Y224750D01*

+X336658Y224474D01*

+X336635Y224192D01*

+X336658Y223910D01*

+X336724Y223634D01*

+X336832Y223372D01*

+X336980Y223131D01*

+X337164Y222915D01*

+X337380Y222731D01*

+X337438Y222695D01*

+Y200093D01*

+X336548Y199050D01*

+X335610Y197520D01*

+X334924Y195863D01*

+X334505Y194118D01*

+X334364Y192329D01*

+X334505Y190540D01*

+X334924Y188795D01*

+X335610Y187138D01*

+X336548Y185608D01*

+X337438Y184565D01*

+Y164805D01*

+X337159Y164783D01*

+X336883Y164717D01*

+X336621Y164609D01*

+X336380Y164461D01*

+X336164Y164277D01*

+X335980Y164061D01*

+X335832Y163820D01*

+X335724Y163558D01*

+X335658Y163282D01*

+X335635Y163000D01*

+X335658Y162718D01*

+X335724Y162442D01*

+X335832Y162180D01*

+X335980Y161939D01*

+X336164Y161723D01*

+X336380Y161539D01*

+X336621Y161391D01*

+X336883Y161283D01*

+X337159Y161217D01*

+X337438Y161195D01*

+Y127000D01*

+G37*

+G36*

+X332434D02*X325792D01*

+Y170516D01*

+X325799Y170516D01*

+X326474Y170569D01*

+X327132Y170727D01*

+X327757Y170986D01*

+X328334Y171339D01*

+X328849Y171779D01*

+X329289Y172294D01*

+X329642Y172871D01*

+X329901Y173496D01*

+X330059Y174154D01*

+X330099Y174829D01*

+X330059Y175504D01*

+X329901Y176162D01*

+X329642Y176787D01*

+X329289Y177364D01*

+X328849Y177879D01*

+X328334Y178319D01*

+X327757Y178672D01*

+X327132Y178931D01*

+X326474Y179089D01*

+X325799Y179142D01*

+X325792Y179142D01*

+Y180516D01*

+X325799Y180516D01*

+X326474Y180569D01*

+X327132Y180727D01*

+X327757Y180986D01*

+X328334Y181339D01*

+X328849Y181779D01*

+X329289Y182294D01*

+X329642Y182871D01*

+X329901Y183496D01*

+X330059Y184154D01*

+X330099Y184829D01*

+X330059Y185504D01*

+X329901Y186162D01*

+X329642Y186787D01*

+X329289Y187364D01*

+X328849Y187879D01*

+X328334Y188319D01*

+X327757Y188672D01*

+X327132Y188931D01*

+X326474Y189089D01*

+X325799Y189142D01*

+X325792Y189142D01*

+Y245616D01*

+X325810Y245631D01*

+X326296Y246199D01*

+X326686Y246837D01*

+X326972Y247528D01*

+X327147Y248255D01*

+X327191Y249000D01*

+X327147Y249745D01*

+X326972Y250472D01*

+X326686Y251163D01*

+X326296Y251801D01*

+X325810Y252369D01*

+X325792Y252384D01*

+Y330862D01*

+X326435Y331910D01*

+X327151Y333640D01*

+X327589Y335462D01*

+X327699Y337329D01*

+X327589Y339196D01*

+X327151Y341018D01*

+X326435Y342748D01*

+X325792Y343796D01*

+Y360516D01*

+X325799Y360516D01*

+X326474Y360569D01*

+X327132Y360727D01*

+X327757Y360986D01*

+X328334Y361339D01*

+X328849Y361779D01*

+X329289Y362294D01*

+X329642Y362871D01*

+X329901Y363496D01*

+X330059Y364154D01*

+X330099Y364829D01*

+X330059Y365504D01*

+X329901Y366162D01*

+X329642Y366787D01*

+X329289Y367364D01*

+X328849Y367879D01*

+X328334Y368319D01*

+X327757Y368672D01*

+X327132Y368931D01*

+X326474Y369089D01*

+X325799Y369142D01*

+X325792Y369142D01*

+Y370516D01*

+X325799Y370516D01*

+X326474Y370569D01*

+X327132Y370727D01*

+X327757Y370986D01*

+X328334Y371339D01*

+X328849Y371779D01*

+X329289Y372294D01*

+X329642Y372871D01*

+X329901Y373496D01*

+X330059Y374154D01*

+X330099Y374829D01*

+X330059Y375504D01*

+X329901Y376162D01*

+X329642Y376787D01*

+X329289Y377364D01*

+X328849Y377879D01*

+X328334Y378319D01*

+X327757Y378672D01*

+X327132Y378931D01*

+X326474Y379089D01*

+X325799Y379142D01*

+X325792Y379142D01*

+Y397000D01*

+X332434D01*

+Y253764D01*

+X331696Y253706D01*

+X330969Y253531D01*

+X330278Y253245D01*

+X329640Y252855D01*

+X329072Y252369D01*

+X328586Y251801D01*

+X328196Y251163D01*

+X327910Y250472D01*

+X327735Y249745D01*

+X327676Y249000D01*

+X327735Y248255D01*

+X327910Y247528D01*

+X328196Y246837D01*

+X328586Y246199D01*

+X329072Y245631D01*

+X329640Y245145D01*

+X330278Y244755D01*

+X330969Y244469D01*

+X331696Y244294D01*

+X332434Y244236D01*

+Y127000D01*

+G37*

+G36*

+X325792Y343796D02*X325456Y344345D01*

+X324240Y345770D01*

+X322815Y346986D01*

+X321218Y347965D01*

+X319488Y348681D01*

+X317666Y349119D01*

+X315799Y349266D01*

+X315792Y349265D01*

+Y360516D01*

+X315799Y360516D01*

+X316474Y360569D01*

+X317132Y360727D01*

+X317757Y360986D01*

+X318334Y361339D01*

+X318849Y361779D01*

+X319289Y362294D01*

+X319642Y362871D01*

+X319901Y363496D01*

+X320059Y364154D01*

+X320099Y364829D01*

+X320059Y365504D01*

+X319901Y366162D01*

+X319642Y366787D01*

+X319289Y367364D01*

+X318849Y367879D01*

+X318334Y368319D01*

+X317757Y368672D01*

+X317132Y368931D01*

+X316474Y369089D01*

+X315799Y369142D01*

+X315792Y369142D01*

+Y370516D01*

+X315799Y370516D01*

+X316474Y370569D01*

+X317132Y370727D01*

+X317757Y370986D01*

+X318334Y371339D01*

+X318849Y371779D01*

+X319289Y372294D01*

+X319642Y372871D01*

+X319901Y373496D01*

+X320059Y374154D01*

+X320099Y374829D01*

+X320059Y375504D01*

+X319901Y376162D01*

+X319642Y376787D01*

+X319289Y377364D01*

+X318849Y377879D01*

+X318334Y378319D01*

+X317757Y378672D01*

+X317132Y378931D01*

+X316474Y379089D01*

+X315799Y379142D01*

+X315792Y379142D01*

+Y397000D01*

+X325792D01*

+Y379142D01*

+X325124Y379089D01*

+X324466Y378931D01*

+X323841Y378672D01*

+X323264Y378319D01*

+X322749Y377879D01*

+X322309Y377364D01*

+X321956Y376787D01*

+X321697Y376162D01*

+X321539Y375504D01*

+X321486Y374829D01*

+X321539Y374154D01*

+X321697Y373496D01*

+X321956Y372871D01*

+X322309Y372294D01*

+X322749Y371779D01*

+X323264Y371339D01*

+X323841Y370986D01*

+X324466Y370727D01*

+X325124Y370569D01*

+X325792Y370516D01*

+Y369142D01*

+X325124Y369089D01*

+X324466Y368931D01*

+X323841Y368672D01*

+X323264Y368319D01*

+X322749Y367879D01*

+X322309Y367364D01*

+X321956Y366787D01*

+X321697Y366162D01*

+X321539Y365504D01*

+X321486Y364829D01*

+X321539Y364154D01*

+X321697Y363496D01*

+X321956Y362871D01*

+X322309Y362294D01*

+X322749Y361779D01*

+X323264Y361339D01*

+X323841Y360986D01*

+X324466Y360727D01*

+X325124Y360569D01*

+X325792Y360516D01*

+Y343796D01*

+G37*

+G36*

+Y127000D02*X315792D01*

+Y170516D01*

+X315799Y170516D01*

+X316474Y170569D01*

+X317132Y170727D01*

+X317757Y170986D01*

+X318334Y171339D01*

+X318849Y171779D01*

+X319289Y172294D01*

+X319642Y172871D01*

+X319901Y173496D01*

+X320059Y174154D01*

+X320099Y174829D01*

+X320059Y175504D01*

+X319901Y176162D01*

+X319642Y176787D01*

+X319289Y177364D01*

+X318849Y177879D01*

+X318334Y178319D01*

+X317757Y178672D01*

+X317132Y178931D01*

+X316474Y179089D01*

+X315799Y179142D01*

+X315792Y179142D01*

+Y180516D01*

+X315799Y180516D01*

+X316474Y180569D01*

+X317132Y180727D01*

+X317757Y180986D01*

+X318334Y181339D01*

+X318849Y181779D01*

+X319289Y182294D01*

+X319642Y182871D01*

+X319901Y183496D01*

+X320059Y184154D01*

+X320099Y184829D01*

+X320059Y185504D01*

+X319901Y186162D01*

+X319642Y186787D01*

+X319289Y187364D01*

+X318849Y187879D01*

+X318334Y188319D01*

+X317757Y188672D01*

+X317132Y188931D01*

+X316474Y189089D01*

+X315799Y189142D01*

+X315792Y189142D01*

+Y246873D01*

+X315832Y246808D01*

+X315909Y246718D01*

+X315999Y246641D01*

+X316099Y246580D01*

+X316209Y246535D01*

+X316323Y246507D01*

+X316441Y246498D01*

+X316559Y246507D01*

+X316673Y246535D01*

+X316783Y246580D01*

+X316883Y246641D01*

+X316973Y246718D01*

+X317050Y246808D01*

+X317111Y246908D01*

+X317156Y247018D01*

+X317184Y247132D01*

+X317191Y247250D01*

+Y250750D01*

+X317184Y250868D01*

+X317156Y250982D01*

+X317111Y251092D01*

+X317050Y251192D01*

+X316973Y251282D01*

+X316883Y251359D01*

+X316783Y251420D01*

+X316673Y251465D01*

+X316559Y251493D01*

+X316441Y251502D01*

+X316323Y251493D01*

+X316209Y251465D01*

+X316099Y251420D01*

+X315999Y251359D01*

+X315909Y251282D01*

+X315832Y251192D01*

+X315792Y251127D01*

+Y325393D01*

+X315799Y325392D01*

+X317666Y325539D01*

+X319488Y325977D01*

+X321218Y326693D01*

+X322815Y327672D01*

+X324240Y328888D01*

+X325456Y330313D01*

+X325792Y330862D01*

+Y252384D01*

+X325242Y252855D01*

+X324604Y253245D01*

+X323913Y253531D01*

+X323186Y253706D01*

+X322441Y253765D01*

+X321696Y253706D01*

+X320969Y253531D01*

+X320278Y253245D01*

+X319640Y252855D01*

+X319072Y252369D01*

+X318586Y251801D01*

+X318196Y251163D01*

+X317910Y250472D01*

+X317735Y249745D01*

+X317676Y249000D01*

+X317735Y248255D01*

+X317910Y247528D01*

+X318196Y246837D01*

+X318586Y246199D01*

+X319072Y245631D01*

+X319640Y245145D01*

+X320278Y244755D01*

+X320969Y244469D01*

+X321696Y244294D01*

+X322441Y244235D01*

+X323186Y244294D01*

+X323913Y244469D01*

+X324604Y244755D01*

+X325242Y245145D01*

+X325792Y245616D01*

+Y189142D01*

+X325124Y189089D01*

+X324466Y188931D01*

+X323841Y188672D01*

+X323264Y188319D01*

+X322749Y187879D01*

+X322309Y187364D01*

+X321956Y186787D01*

+X321697Y186162D01*

+X321539Y185504D01*

+X321486Y184829D01*

+X321539Y184154D01*

+X321697Y183496D01*

+X321956Y182871D01*

+X322309Y182294D01*

+X322749Y181779D01*

+X323264Y181339D01*

+X323841Y180986D01*

+X324466Y180727D01*

+X325124Y180569D01*

+X325792Y180516D01*

+Y179142D01*

+X325124Y179089D01*

+X324466Y178931D01*

+X323841Y178672D01*

+X323264Y178319D01*

+X322749Y177879D01*

+X322309Y177364D01*

+X321956Y176787D01*

+X321697Y176162D01*

+X321539Y175504D01*

+X321486Y174829D01*

+X321539Y174154D01*

+X321697Y173496D01*

+X321956Y172871D01*

+X322309Y172294D01*

+X322749Y171779D01*

+X323264Y171339D01*

+X323841Y170986D01*

+X324466Y170727D01*

+X325124Y170569D01*

+X325792Y170516D01*

+Y127000D01*

+G37*

+G36*

+X315792Y349265D02*X313932Y349119D01*

+X312110Y348681D01*

+X310380Y347965D01*

+X308783Y346986D01*

+X307358Y345770D01*

+X306142Y344345D01*

+X305792Y343775D01*

+Y360516D01*

+X305799Y360516D01*

+X306474Y360569D01*

+X307132Y360727D01*

+X307757Y360986D01*

+X308334Y361339D01*

+X308849Y361779D01*

+X309289Y362294D01*

+X309642Y362871D01*

+X309901Y363496D01*

+X310059Y364154D01*

+X310099Y364829D01*

+X310059Y365504D01*

+X309901Y366162D01*

+X309642Y366787D01*

+X309289Y367364D01*

+X308849Y367879D01*

+X308334Y368319D01*

+X307757Y368672D01*

+X307132Y368931D01*

+X306474Y369089D01*

+X305799Y369142D01*

+X305792Y369142D01*

+Y370516D01*

+X305799Y370516D01*

+X306474Y370569D01*

+X307132Y370727D01*

+X307757Y370986D01*

+X308334Y371339D01*

+X308849Y371779D01*

+X309289Y372294D01*

+X309642Y372871D01*

+X309901Y373496D01*

+X310059Y374154D01*

+X310099Y374829D01*

+X310059Y375504D01*

+X309901Y376162D01*

+X309642Y376787D01*

+X309289Y377364D01*

+X308849Y377879D01*

+X308334Y378319D01*

+X307757Y378672D01*

+X307132Y378931D01*

+X306474Y379089D01*

+X305799Y379142D01*

+X305792Y379142D01*

+Y397000D01*

+X315792D01*

+Y379142D01*

+X315124Y379089D01*

+X314466Y378931D01*

+X313841Y378672D01*

+X313264Y378319D01*

+X312749Y377879D01*

+X312309Y377364D01*

+X311956Y376787D01*

+X311697Y376162D01*

+X311539Y375504D01*

+X311486Y374829D01*

+X311539Y374154D01*

+X311697Y373496D01*

+X311956Y372871D01*

+X312309Y372294D01*

+X312749Y371779D01*

+X313264Y371339D01*

+X313841Y370986D01*

+X314466Y370727D01*

+X315124Y370569D01*

+X315792Y370516D01*

+Y369142D01*

+X315124Y369089D01*

+X314466Y368931D01*

+X313841Y368672D01*

+X313264Y368319D01*

+X312749Y367879D01*

+X312309Y367364D01*

+X311956Y366787D01*

+X311697Y366162D01*

+X311539Y365504D01*

+X311486Y364829D01*

+X311539Y364154D01*

+X311697Y363496D01*

+X311956Y362871D01*

+X312309Y362294D01*

+X312749Y361779D01*

+X313264Y361339D01*

+X313841Y360986D01*

+X314466Y360727D01*

+X315124Y360569D01*

+X315792Y360516D01*

+Y349265D01*

+G37*

+G36*

+X312441Y182140D02*X312749Y181779D01*

+X313264Y181339D01*

+X313841Y180986D01*

+X314466Y180727D01*

+X315124Y180569D01*

+X315792Y180516D01*

+Y179142D01*

+X315124Y179089D01*

+X314466Y178931D01*

+X313841Y178672D01*

+X313264Y178319D01*

+X312749Y177879D01*

+X312441Y177518D01*

+Y182140D01*

+G37*

+G36*

+Y325897D02*X313932Y325539D01*

+X315792Y325393D01*

+Y251127D01*

+X315771Y251092D01*

+X315726Y250982D01*

+X315698Y250868D01*

+X315691Y250750D01*

+Y247250D01*

+X315698Y247132D01*

+X315726Y247018D01*

+X315771Y246908D01*

+X315792Y246873D01*

+Y189142D01*

+X315124Y189089D01*

+X314466Y188931D01*

+X313841Y188672D01*

+X313264Y188319D01*

+X312749Y187879D01*

+X312441Y187518D01*

+Y244250D01*

+X314191D01*

+X314309Y244257D01*

+X314423Y244285D01*

+X314533Y244330D01*

+X314633Y244391D01*

+X314723Y244468D01*

+X314800Y244558D01*

+X314861Y244658D01*

+X314906Y244768D01*

+X314934Y244882D01*

+X314943Y245000D01*

+X314934Y245118D01*

+X314906Y245232D01*

+X314861Y245342D01*

+X314800Y245442D01*

+X314723Y245532D01*

+X314633Y245609D01*

+X314533Y245670D01*

+X314423Y245715D01*

+X314309Y245743D01*

+X314191Y245750D01*

+X312441D01*

+Y252250D01*

+X314191D01*

+X314309Y252257D01*

+X314423Y252285D01*

+X314533Y252330D01*

+X314633Y252391D01*

+X314723Y252468D01*

+X314800Y252558D01*

+X314861Y252658D01*

+X314906Y252768D01*

+X314934Y252882D01*

+X314943Y253000D01*

+X314934Y253118D01*

+X314906Y253232D01*

+X314861Y253342D01*

+X314800Y253442D01*

+X314723Y253532D01*

+X314633Y253609D01*

+X314533Y253670D01*

+X314423Y253715D01*

+X314309Y253743D01*

+X314191Y253750D01*

+X312441D01*

+Y293007D01*

+X312444Y293007D01*

+X312757Y293082D01*

+X313056Y293206D01*

+X313331Y293374D01*

+X313576Y293584D01*

+X313786Y293829D01*

+X313954Y294104D01*

+X314078Y294403D01*

+X314153Y294716D01*

+X314172Y295038D01*

+X314153Y295360D01*

+X314078Y295673D01*

+X313954Y295972D01*

+X313786Y296247D01*

+X313576Y296492D01*

+X313331Y296702D01*

+X313056Y296870D01*

+X312757Y296994D01*

+X312444Y297069D01*

+X312441Y297069D01*

+Y298122D01*

+X312479Y298125D01*

+X312792Y298200D01*

+X313091Y298324D01*

+X313366Y298492D01*

+X313611Y298702D01*

+X313821Y298947D01*

+X313989Y299222D01*

+X314113Y299521D01*

+X314188Y299834D01*

+X314207Y300156D01*

+X314188Y300478D01*

+X314113Y300791D01*

+X313989Y301090D01*

+X313821Y301365D01*

+X313611Y301610D01*

+X313366Y301820D01*

+X313091Y301988D01*

+X312792Y302112D01*

+X312479Y302187D01*

+X312441Y302190D01*

+Y325897D01*

+G37*

+G36*

+X315792Y127000D02*X312441D01*

+Y172140D01*

+X312749Y171779D01*

+X313264Y171339D01*

+X313841Y170986D01*

+X314466Y170727D01*

+X315124Y170569D01*

+X315792Y170516D01*

+Y127000D01*

+G37*

+G36*

+X312441D02*X310441D01*

+Y117671D01*

+X310383Y117657D01*

+X310121Y117549D01*

+X309880Y117401D01*

+X309664Y117217D01*

+X309480Y117001D01*

+X309332Y116760D01*

+X309224Y116498D01*

+X309158Y116222D01*

+X309135Y115940D01*

+X309158Y115658D01*

+X309224Y115382D01*

+X309332Y115120D01*

+X309480Y114879D01*

+X309664Y114663D01*

+X309880Y114479D01*

+X310121Y114331D01*

+X310383Y114223D01*

+X310441Y114209D01*

+Y97000D01*

+X308441D01*

+Y134952D01*

+X308621Y134841D01*

+X308883Y134733D01*

+X309159Y134667D01*

+X309441Y134644D01*

+X309723Y134667D01*

+X309999Y134733D01*

+X310261Y134841D01*

+X310502Y134989D01*

+X310718Y135173D01*

+X310902Y135389D01*

+X311050Y135630D01*

+X311158Y135892D01*

+X311224Y136168D01*

+X311241Y136450D01*

+X311224Y136732D01*

+X311158Y137008D01*

+X311050Y137270D01*

+X310902Y137511D01*

+X310718Y137727D01*

+X310502Y137911D01*

+X310261Y138059D01*

+X309999Y138167D01*

+X309723Y138233D01*

+X309441Y138256D01*

+X309159Y138233D01*

+X308883Y138167D01*

+X308621Y138059D01*

+X308441Y137948D01*

+Y140070D01*

+X308621Y139959D01*

+X308883Y139851D01*

+X309159Y139785D01*

+X309441Y139762D01*

+X309723Y139785D01*

+X309999Y139851D01*

+X310261Y139959D01*

+X310502Y140107D01*

+X310718Y140291D01*

+X310902Y140507D01*

+X311050Y140748D01*

+X311158Y141010D01*

+X311224Y141286D01*

+X311241Y141568D01*

+X311224Y141850D01*

+X311158Y142126D01*

+X311050Y142388D01*

+X310902Y142629D01*

+X310718Y142845D01*

+X310502Y143029D01*

+X310261Y143177D01*

+X309999Y143285D01*

+X309723Y143351D01*

+X309441Y143374D01*

+X309159Y143351D01*

+X308883Y143285D01*

+X308621Y143177D01*

+X308441Y143066D01*

+Y171431D01*

+X308849Y171779D01*

+X309289Y172294D01*

+X309642Y172871D01*

+X309901Y173496D01*

+X310059Y174154D01*

+X310099Y174829D01*

+X310059Y175504D01*

+X309901Y176162D01*

+X309642Y176787D01*

+X309289Y177364D01*

+X308849Y177879D01*

+X308441Y178227D01*

+Y181431D01*

+X308849Y181779D01*

+X309289Y182294D01*

+X309642Y182871D01*

+X309901Y183496D01*

+X310059Y184154D01*

+X310099Y184829D01*

+X310059Y185504D01*

+X309901Y186162D01*

+X309642Y186787D01*

+X309289Y187364D01*

+X308849Y187879D01*

+X308441Y188227D01*

+Y246498D01*

+X308559Y246507D01*

+X308673Y246535D01*

+X308783Y246580D01*

+X308883Y246641D01*

+X308973Y246718D01*

+X309050Y246808D01*

+X309111Y246908D01*

+X309156Y247018D01*

+X309184Y247132D01*

+X309191Y247250D01*

+Y250750D01*

+X309184Y250868D01*

+X309156Y250982D01*

+X309111Y251092D01*

+X309050Y251192D01*

+X308973Y251282D01*

+X308883Y251359D01*

+X308783Y251420D01*

+X308673Y251465D01*

+X308559Y251493D01*

+X308441Y251502D01*

+Y264517D01*

+X308550Y264491D01*

+X308872Y264466D01*

+X309194Y264491D01*

+X309507Y264566D01*

+X309806Y264690D01*

+X310081Y264858D01*

+X310326Y265068D01*

+X310536Y265313D01*

+X310704Y265588D01*

+X310828Y265887D01*

+X310903Y266200D01*

+X310922Y266522D01*

+X310903Y266844D01*

+X310828Y267157D01*

+X310704Y267456D01*

+X310536Y267731D01*

+X310326Y267976D01*

+X310081Y268186D01*

+X309806Y268354D01*

+X309507Y268478D01*

+X309194Y268553D01*

+X308872Y268578D01*

+X308550Y268553D01*

+X308441Y268527D01*

+Y269995D01*

+X308670Y269940D01*

+X308992Y269915D01*

+X309314Y269940D01*

+X309627Y270015D01*

+X309926Y270139D01*

+X310201Y270307D01*

+X310446Y270517D01*

+X310656Y270762D01*

+X310824Y271037D01*

+X310948Y271336D01*

+X311023Y271649D01*

+X311042Y271971D01*

+X311023Y272293D01*

+X310948Y272606D01*

+X310824Y272905D01*

+X310656Y273180D01*

+X310446Y273425D01*

+X310201Y273635D01*

+X309926Y273803D01*

+X309627Y273927D01*

+X309444Y273971D01*

+X309548Y274141D01*

+X309672Y274440D01*

+X309747Y274753D01*

+X309766Y275075D01*

+X309747Y275397D01*

+X309672Y275710D01*

+X309548Y276009D01*

+X309380Y276284D01*

+X309170Y276529D01*

+X308925Y276739D01*

+X308650Y276907D01*

+X308441Y276994D01*

+Y327964D01*

+X308783Y327672D01*

+X310380Y326693D01*

+X312110Y325977D01*

+X312441Y325897D01*

+Y302190D01*

+X312157Y302212D01*

+X311835Y302187D01*

+X311522Y302112D01*

+X311223Y301988D01*

+X310948Y301820D01*

+X310703Y301610D01*

+X310493Y301365D01*

+X310325Y301090D01*

+X310201Y300791D01*

+X310126Y300478D01*

+X310101Y300156D01*

+X310126Y299834D01*

+X310201Y299521D01*

+X310325Y299222D01*

+X310493Y298947D01*

+X310703Y298702D01*

+X310948Y298492D01*

+X311223Y298324D01*

+X311522Y298200D01*

+X311835Y298125D01*

+X312157Y298100D01*

+X312441Y298122D01*

+Y297069D01*

+X312122Y297094D01*

+X311800Y297069D01*

+X311487Y296994D01*

+X311188Y296870D01*

+X310913Y296702D01*

+X310668Y296492D01*

+X310458Y296247D01*

+X310290Y295972D01*

+X310166Y295673D01*

+X310091Y295360D01*

+X310066Y295038D01*

+X310091Y294716D01*

+X310166Y294403D01*

+X310290Y294104D01*

+X310458Y293829D01*

+X310668Y293584D01*

+X310913Y293374D01*

+X311188Y293206D01*

+X311487Y293082D01*

+X311800Y293007D01*

+X312122Y292982D01*

+X312441Y293007D01*

+Y253750D01*

+X310691D01*

+X310573Y253743D01*

+X310459Y253715D01*

+X310349Y253670D01*

+X310249Y253609D01*

+X310159Y253532D01*

+X310082Y253442D01*

+X310021Y253342D01*

+X309976Y253232D01*

+X309948Y253118D01*

+X309939Y253000D01*

+X309948Y252882D01*

+X309976Y252768D01*

+X310021Y252658D01*

+X310082Y252558D01*

+X310159Y252468D01*

+X310249Y252391D01*

+X310349Y252330D01*

+X310459Y252285D01*

+X310573Y252257D01*

+X310691Y252250D01*

+X312441D01*

+Y245750D01*

+X310691D01*

+X310573Y245743D01*

+X310459Y245715D01*

+X310349Y245670D01*

+X310249Y245609D01*

+X310159Y245532D01*

+X310082Y245442D01*

+X310021Y245342D01*

+X309976Y245232D01*

+X309948Y245118D01*

+X309939Y245000D01*

+X309948Y244882D01*

+X309976Y244768D01*

+X310021Y244658D01*

+X310082Y244558D01*

+X310159Y244468D01*

+X310249Y244391D01*

+X310349Y244330D01*

+X310459Y244285D01*

+X310573Y244257D01*

+X310691Y244250D01*

+X312441D01*

+Y187518D01*

+X312309Y187364D01*

+X311956Y186787D01*

+X311697Y186162D01*

+X311539Y185504D01*

+X311486Y184829D01*

+X311539Y184154D01*

+X311697Y183496D01*

+X311956Y182871D01*

+X312309Y182294D01*

+X312441Y182140D01*

+Y177518D01*

+X312309Y177364D01*

+X311956Y176787D01*

+X311697Y176162D01*

+X311539Y175504D01*

+X311486Y174829D01*

+X311539Y174154D01*

+X311697Y173496D01*

+X311956Y172871D01*

+X312309Y172294D01*

+X312441Y172140D01*

+Y127000D01*

+G37*

+G36*

+X308441Y276994D02*X308351Y277031D01*

+X308038Y277106D01*

+X307716Y277131D01*

+X307394Y277106D01*

+X307081Y277031D01*

+X306782Y276907D01*

+X306507Y276739D01*

+X306262Y276529D01*

+X306052Y276284D01*

+X305884Y276009D01*

+X305792Y275788D01*

+Y330883D01*

+X306142Y330313D01*

+X307358Y328888D01*

+X308441Y327964D01*

+Y276994D01*

+G37*

+G36*

+Y188227D02*X308334Y188319D01*

+X307757Y188672D01*

+X307132Y188931D01*

+X306474Y189089D01*

+X305799Y189142D01*

+X305792Y189142D01*

+Y202655D01*

+X305838Y202666D01*

+X306100Y202774D01*

+X306341Y202922D01*

+X306557Y203106D01*

+X306741Y203322D01*

+X306889Y203563D01*

+X306997Y203825D01*

+X307063Y204101D01*

+X307080Y204383D01*

+X307063Y204665D01*

+X306997Y204941D01*

+X306889Y205203D01*

+X306741Y205444D01*

+X306557Y205660D01*

+X306341Y205844D01*

+X306100Y205992D01*

+X305838Y206100D01*

+X305792Y206111D01*

+Y206148D01*

+X305861Y206206D01*

+X306045Y206422D01*

+X306193Y206663D01*

+X306301Y206925D01*

+X306367Y207201D01*

+X306384Y207483D01*

+X306367Y207765D01*

+X306301Y208041D01*

+X306193Y208303D01*

+X306045Y208544D01*

+X305861Y208760D01*

+X305792Y208818D01*

+Y209144D01*

+X305983Y209306D01*

+X306167Y209522D01*

+X306315Y209763D01*

+X306423Y210025D01*

+X306489Y210301D01*

+X306506Y210583D01*

+X306489Y210865D01*

+X306423Y211141D01*

+X306315Y211403D01*

+X306167Y211644D01*

+X305983Y211860D01*

+X305792Y212022D01*

+Y274362D01*

+X305884Y274141D01*

+X306052Y273866D01*

+X306262Y273621D01*

+X306507Y273411D01*

+X306782Y273243D01*

+X307081Y273119D01*

+X307264Y273075D01*

+X307160Y272905D01*

+X307036Y272606D01*

+X306961Y272293D01*

+X306936Y271971D01*

+X306961Y271649D01*

+X307036Y271336D01*

+X307160Y271037D01*

+X307328Y270762D01*

+X307538Y270517D01*

+X307783Y270307D01*

+X308058Y270139D01*

+X308357Y270015D01*

+X308441Y269995D01*

+Y268527D01*

+X308237Y268478D01*

+X307938Y268354D01*

+X307663Y268186D01*

+X307418Y267976D01*

+X307208Y267731D01*

+X307040Y267456D01*

+X306916Y267157D01*

+X306841Y266844D01*

+X306816Y266522D01*

+X306841Y266200D01*

+X306916Y265887D01*

+X307040Y265588D01*

+X307208Y265313D01*

+X307418Y265068D01*

+X307663Y264858D01*

+X307938Y264690D01*

+X308237Y264566D01*

+X308441Y264517D01*

+Y251502D01*

+X308323Y251493D01*

+X308209Y251465D01*

+X308099Y251420D01*

+X307999Y251359D01*

+X307909Y251282D01*

+X307832Y251192D01*

+X307771Y251092D01*

+X307726Y250982D01*

+X307698Y250868D01*

+X307691Y250750D01*

+Y247250D01*

+X307698Y247132D01*

+X307726Y247018D01*

+X307771Y246908D01*

+X307832Y246808D01*

+X307909Y246718D01*

+X307999Y246641D01*

+X308099Y246580D01*

+X308209Y246535D01*

+X308323Y246507D01*

+X308441Y246498D01*

+Y188227D01*

+G37*

+G36*

+Y178227D02*X308334Y178319D01*

+X307757Y178672D01*

+X307132Y178931D01*

+X306474Y179089D01*

+X305799Y179142D01*

+X305792Y179142D01*

+Y180516D01*

+X305799Y180516D01*

+X306474Y180569D01*

+X307132Y180727D01*

+X307757Y180986D01*

+X308334Y181339D01*

+X308441Y181431D01*

+Y178227D01*

+G37*

+G36*

+Y97000D02*X305792D01*

+Y105702D01*

+X305978Y105717D01*

+X306254Y105783D01*

+X306516Y105891D01*

+X306757Y106039D01*

+X306973Y106223D01*

+X307157Y106439D01*

+X307305Y106680D01*

+X307413Y106942D01*

+X307479Y107218D01*

+X307496Y107500D01*

+X307479Y107782D01*

+X307413Y108058D01*

+X307305Y108320D01*

+X307157Y108561D01*

+X306973Y108777D01*

+X306757Y108961D01*

+X306516Y109109D01*

+X306254Y109217D01*

+X305978Y109283D01*

+X305792Y109298D01*

+Y170516D01*

+X305799Y170516D01*

+X306474Y170569D01*

+X307132Y170727D01*

+X307757Y170986D01*

+X308334Y171339D01*

+X308441Y171431D01*

+Y143066D01*

+X308380Y143029D01*

+X308164Y142845D01*

+X307980Y142629D01*

+X307832Y142388D01*

+X307724Y142126D01*

+X307658Y141850D01*

+X307635Y141568D01*

+X307658Y141286D01*

+X307724Y141010D01*

+X307832Y140748D01*

+X307980Y140507D01*

+X308164Y140291D01*

+X308380Y140107D01*

+X308441Y140070D01*

+Y137948D01*

+X308380Y137911D01*

+X308164Y137727D01*

+X307980Y137511D01*

+X307832Y137270D01*

+X307724Y137008D01*

+X307658Y136732D01*

+X307635Y136450D01*

+X307658Y136168D01*

+X307724Y135892D01*

+X307832Y135630D01*

+X307980Y135389D01*

+X308164Y135173D01*

+X308380Y134989D01*

+X308441Y134952D01*

+Y97000D01*

+G37*

+G36*

+X305792Y206111D02*X305759Y206119D01*

+X305792Y206148D01*

+Y206111D01*

+G37*

+G36*

+Y208818D02*X305645Y208944D01*

+X305561Y208996D01*

+X305767Y209122D01*

+X305792Y209144D01*

+Y208818D01*

+G37*

+G36*

+X303362Y181279D02*X303841Y180986D01*

+X304466Y180727D01*

+X305124Y180569D01*

+X305792Y180516D01*

+Y179142D01*

+X305124Y179089D01*

+X304466Y178931D01*

+X303841Y178672D01*

+X303362Y178379D01*

+Y181279D01*

+G37*

+G36*

+Y206160D02*X303523Y206022D01*

+X303764Y205874D01*

+X304026Y205766D01*

+X304105Y205747D01*

+X304003Y205660D01*

+X303819Y205444D01*

+X303671Y205203D01*

+X303563Y204941D01*

+X303497Y204665D01*

+X303474Y204383D01*

+X303497Y204101D01*

+X303563Y203825D01*

+X303671Y203563D01*

+X303819Y203322D01*

+X304003Y203106D01*

+X304219Y202922D01*

+X304460Y202774D01*

+X304722Y202666D01*

+X304998Y202600D01*

+X305280Y202577D01*

+X305562Y202600D01*

+X305792Y202655D01*

+Y189142D01*

+X305124Y189089D01*

+X304466Y188931D01*

+X303841Y188672D01*

+X303362Y188379D01*

+Y206160D01*

+G37*

+G36*

+Y209385D02*X303429Y209306D01*

+X303645Y209122D01*

+X303729Y209070D01*

+X303523Y208944D01*

+X303362Y208806D01*

+Y209385D01*

+G37*

+G36*

+Y338000D02*X303576Y338051D01*

+X303875Y338175D01*

+X303932Y338210D01*

+X303862Y337329D01*

+X304009Y335462D01*

+X304447Y333640D01*

+X305163Y331910D01*

+X305792Y330883D01*

+Y275788D01*

+X305760Y275710D01*

+X305685Y275397D01*

+X305660Y275075D01*

+X305685Y274753D01*

+X305760Y274440D01*

+X305792Y274362D01*

+Y212022D01*

+X305767Y212044D01*

+X305526Y212192D01*

+X305264Y212300D01*

+X304988Y212366D01*

+X304706Y212389D01*

+X304424Y212366D01*

+X304148Y212300D01*

+X303886Y212192D01*

+X303645Y212044D01*

+X303429Y211860D01*

+X303362Y211781D01*

+Y327944D01*

+X303365Y327944D01*

+X303687Y327969D01*

+X304000Y328044D01*

+X304299Y328168D01*

+X304574Y328336D01*

+X304819Y328546D01*

+X305029Y328791D01*

+X305197Y329066D01*

+X305321Y329365D01*

+X305396Y329678D01*

+X305415Y330000D01*

+X305396Y330322D01*

+X305321Y330635D01*

+X305197Y330934D01*

+X305029Y331209D01*

+X304819Y331454D01*

+X304574Y331664D01*

+X304299Y331832D01*

+X304000Y331956D01*

+X303687Y332031D01*

+X303365Y332056D01*

+X303362Y332056D01*

+Y338000D01*

+G37*

+G36*

+Y361279D02*X303841Y360986D01*

+X304466Y360727D01*

+X305124Y360569D01*

+X305792Y360516D01*

+Y343775D01*

+X305163Y342748D01*

+X304553Y341276D01*

+X304395Y341461D01*

+X304150Y341671D01*

+X303875Y341839D01*

+X303576Y341963D01*

+X303362Y342014D01*

+Y361279D01*

+G37*

+G36*

+Y371279D02*X303841Y370986D01*

+X304466Y370727D01*

+X305124Y370569D01*

+X305792Y370516D01*

+Y369142D01*

+X305124Y369089D01*

+X304466Y368931D01*

+X303841Y368672D01*

+X303362Y368379D01*

+Y371279D01*

+G37*

+G36*

+Y397000D02*X305792D01*

+Y379142D01*

+X305124Y379089D01*

+X304466Y378931D01*

+X303841Y378672D01*

+X303362Y378379D01*

+Y397000D01*

+G37*

+G36*

+X305792Y97000D02*X303362D01*

+Y171279D01*

+X303841Y170986D01*

+X304466Y170727D01*

+X305124Y170569D01*

+X305792Y170516D01*

+Y109298D01*

+X305696Y109306D01*

+X305414Y109283D01*

+X305138Y109217D01*

+X304876Y109109D01*

+X304635Y108961D01*

+X304419Y108777D01*

+X304235Y108561D01*

+X304087Y108320D01*

+X303979Y108058D01*

+X303913Y107782D01*

+X303890Y107500D01*

+X303913Y107218D01*

+X303979Y106942D01*

+X304087Y106680D01*

+X304235Y106439D01*

+X304419Y106223D01*

+X304635Y106039D01*

+X304876Y105891D01*

+X305138Y105783D01*

+X305414Y105717D01*

+X305696Y105694D01*

+X305792Y105702D01*

+Y97000D01*

+G37*

+G36*

+X303362D02*X295792D01*

+Y170516D01*

+X295799Y170516D01*

+X296474Y170569D01*

+X297132Y170727D01*

+X297757Y170986D01*

+X298334Y171339D01*

+X298849Y171779D01*

+X299289Y172294D01*

+X299642Y172871D01*

+X299901Y173496D01*

+X300059Y174154D01*

+X300099Y174829D01*

+X300059Y175504D01*

+X299901Y176162D01*

+X299642Y176787D01*

+X299289Y177364D01*

+X298849Y177879D01*

+X298334Y178319D01*

+X297757Y178672D01*

+X297132Y178931D01*

+X296474Y179089D01*

+X295799Y179142D01*

+X295792Y179142D01*

+Y180516D01*

+X295799Y180516D01*

+X296474Y180569D01*

+X297132Y180727D01*

+X297757Y180986D01*

+X298334Y181339D01*

+X298849Y181779D01*

+X299289Y182294D01*

+X299642Y182871D01*

+X299901Y183496D01*

+X300059Y184154D01*

+X300099Y184829D01*

+X300059Y185504D01*

+X299901Y186162D01*

+X299642Y186787D01*

+X299289Y187364D01*

+X298849Y187879D01*

+X298334Y188319D01*

+X297757Y188672D01*

+X297132Y188931D01*

+X296474Y189089D01*

+X295799Y189142D01*

+X295792Y189142D01*

+Y241583D01*

+X295937Y241572D01*

+X296259Y241597D01*

+X296572Y241672D01*

+X296871Y241796D01*

+X297146Y241964D01*

+X297391Y242174D01*

+X297601Y242419D01*

+X297769Y242694D01*

+X297893Y242993D01*

+X297968Y243306D01*

+X297987Y243628D01*

+X297968Y243950D01*

+X297893Y244263D01*

+X297769Y244562D01*

+X297601Y244837D01*

+X297391Y245082D01*

+X297146Y245292D01*

+X296871Y245460D01*

+X296572Y245584D01*

+X296259Y245659D01*

+X295937Y245684D01*

+X295792Y245673D01*

+Y254395D01*

+X295793Y254395D01*

+X296092Y254271D01*

+X296405Y254196D01*

+X296727Y254171D01*

+X297049Y254196D01*

+X297362Y254271D01*

+X297661Y254395D01*

+X297936Y254563D01*

+X298181Y254773D01*

+X298391Y255018D01*

+X298559Y255293D01*

+X298683Y255592D01*

+X298758Y255905D01*

+X298777Y256227D01*

+X298758Y256549D01*

+X298683Y256862D01*

+X298559Y257161D01*

+X298391Y257436D01*

+X298181Y257681D01*

+X297936Y257891D01*

+X297661Y258059D01*

+X297362Y258183D01*

+X297049Y258258D01*

+X296727Y258283D01*

+X296405Y258258D01*

+X296092Y258183D01*

+X295793Y258059D01*

+X295792Y258059D01*

+Y281470D01*

+X295858Y281628D01*

+X295933Y281941D01*

+X295952Y282263D01*

+X295933Y282585D01*

+X295858Y282898D01*

+X295792Y283056D01*

+Y303163D01*

+X295845Y303131D01*

+X296144Y303007D01*

+X296457Y302932D01*

+X296779Y302907D01*

+X297101Y302932D01*

+X297414Y303007D01*

+X297713Y303131D01*

+X297988Y303299D01*

+X298233Y303509D01*

+X298443Y303754D01*

+X298611Y304029D01*

+X298735Y304328D01*

+X298810Y304641D01*

+X298829Y304963D01*

+X298810Y305285D01*

+X298735Y305598D01*

+X298611Y305897D01*

+X298443Y306172D01*

+X298233Y306417D01*

+X297988Y306627D01*

+X297713Y306795D01*

+X297414Y306919D01*

+X297101Y306994D01*

+X296779Y307019D01*

+X296457Y306994D01*

+X296144Y306919D01*

+X295845Y306795D01*

+X295792Y306763D01*

+Y360516D01*

+X295799Y360516D01*

+X296474Y360569D01*

+X297132Y360727D01*

+X297757Y360986D01*

+X298334Y361339D01*

+X298849Y361779D01*

+X299289Y362294D01*

+X299642Y362871D01*

+X299901Y363496D01*

+X300059Y364154D01*

+X300099Y364829D01*

+X300059Y365504D01*

+X299901Y366162D01*

+X299642Y366787D01*

+X299289Y367364D01*

+X298849Y367879D01*

+X298334Y368319D01*

+X297757Y368672D01*

+X297132Y368931D01*

+X296474Y369089D01*

+X295799Y369142D01*

+X295792Y369142D01*

+Y370516D01*

+X295799Y370516D01*

+X296474Y370569D01*

+X297132Y370727D01*

+X297757Y370986D01*

+X298334Y371339D01*

+X298849Y371779D01*

+X299289Y372294D01*

+X299642Y372871D01*

+X299901Y373496D01*

+X300059Y374154D01*

+X300099Y374829D01*

+X300059Y375504D01*

+X299901Y376162D01*

+X299642Y376787D01*

+X299289Y377364D01*

+X298849Y377879D01*

+X298334Y378319D01*

+X297757Y378672D01*

+X297132Y378931D01*

+X296474Y379089D01*

+X295799Y379142D01*

+X295792Y379142D01*

+Y397000D01*

+X303362D01*

+Y378379D01*

+X303264Y378319D01*

+X302749Y377879D01*

+X302309Y377364D01*

+X301956Y376787D01*

+X301697Y376162D01*

+X301539Y375504D01*

+X301486Y374829D01*

+X301539Y374154D01*

+X301697Y373496D01*

+X301956Y372871D01*

+X302309Y372294D01*

+X302749Y371779D01*

+X303264Y371339D01*

+X303362Y371279D01*

+Y368379D01*

+X303264Y368319D01*

+X302749Y367879D01*

+X302309Y367364D01*

+X301956Y366787D01*

+X301697Y366162D01*

+X301539Y365504D01*

+X301486Y364829D01*

+X301539Y364154D01*

+X301697Y363496D01*

+X301956Y362871D01*

+X302309Y362294D01*

+X302749Y361779D01*

+X303264Y361339D01*

+X303362Y361279D01*

+Y342014D01*

+X303263Y342038D01*

+X302941Y342063D01*

+X302619Y342038D01*

+X302306Y341963D01*

+X302007Y341839D01*

+X301732Y341671D01*

+X301487Y341461D01*

+X301277Y341216D01*

+X301109Y340941D01*

+X300985Y340642D01*

+X300910Y340329D01*

+X300885Y340007D01*

+X300910Y339685D01*

+X300985Y339372D01*

+X301109Y339073D01*

+X301277Y338798D01*

+X301487Y338553D01*

+X301732Y338343D01*

+X302007Y338175D01*

+X302306Y338051D01*

+X302619Y337976D01*

+X302941Y337951D01*

+X303263Y337976D01*

+X303362Y338000D01*

+Y332056D01*

+X303043Y332031D01*

+X302730Y331956D01*

+X302431Y331832D01*

+X302156Y331664D01*

+X301911Y331454D01*

+X301701Y331209D01*

+X301533Y330934D01*

+X301409Y330635D01*

+X301334Y330322D01*

+X301309Y330000D01*

+X301334Y329678D01*

+X301409Y329365D01*

+X301533Y329066D01*

+X301701Y328791D01*

+X301911Y328546D01*

+X302156Y328336D01*

+X302431Y328168D01*

+X302730Y328044D01*

+X303043Y327969D01*

+X303362Y327944D01*

+Y211781D01*

+X303245Y211644D01*

+X303097Y211403D01*

+X302989Y211141D01*

+X302923Y210865D01*

+X302900Y210583D01*

+X302923Y210301D01*

+X302989Y210025D01*

+X303097Y209763D01*

+X303245Y209522D01*

+X303362Y209385D01*

+Y208806D01*

+X303307Y208760D01*

+X303123Y208544D01*

+X302975Y208303D01*

+X302867Y208041D01*

+X302801Y207765D01*

+X302778Y207483D01*

+X302801Y207201D01*

+X302867Y206925D01*

+X302975Y206663D01*

+X303123Y206422D01*

+X303307Y206206D01*

+X303362Y206160D01*

+Y188379D01*

+X303264Y188319D01*

+X302749Y187879D01*

+X302309Y187364D01*

+X301956Y186787D01*

+X301697Y186162D01*

+X301539Y185504D01*

+X301486Y184829D01*

+X301539Y184154D01*

+X301697Y183496D01*

+X301956Y182871D01*

+X302309Y182294D01*

+X302749Y181779D01*

+X303264Y181339D01*

+X303362Y181279D01*

+Y178379D01*

+X303264Y178319D01*

+X302749Y177879D01*

+X302309Y177364D01*

+X301956Y176787D01*

+X301697Y176162D01*

+X301539Y175504D01*

+X301486Y174829D01*

+X301539Y174154D01*

+X301697Y173496D01*

+X301956Y172871D01*

+X302309Y172294D01*

+X302749Y171779D01*

+X303264Y171339D01*

+X303362Y171279D01*

+Y97000D01*

+G37*

+G36*

+X295792D02*X287914D01*

+Y171082D01*

+X288334Y171339D01*

+X288849Y171779D01*

+X289289Y172294D01*

+X289642Y172871D01*

+X289901Y173496D01*

+X290059Y174154D01*

+X290099Y174829D01*

+X290059Y175504D01*

+X289901Y176162D01*

+X289642Y176787D01*

+X289289Y177364D01*

+X288849Y177879D01*

+X288334Y178319D01*

+X287914Y178576D01*

+Y181082D01*

+X288334Y181339D01*

+X288849Y181779D01*

+X289289Y182294D01*

+X289642Y182871D01*

+X289901Y183496D01*

+X290059Y184154D01*

+X290099Y184829D01*

+X290059Y185504D01*

+X289901Y186162D01*

+X289642Y186787D01*

+X289289Y187364D01*

+X288849Y187879D01*

+X288334Y188319D01*

+X287914Y188576D01*

+Y305773D01*

+X287917Y305773D01*

+X288239Y305798D01*

+X288552Y305873D01*

+X288851Y305997D01*

+X289126Y306165D01*

+X289371Y306375D01*

+X289581Y306620D01*

+X289749Y306895D01*

+X289873Y307194D01*

+X289948Y307507D01*

+X289967Y307829D01*

+X289948Y308151D01*

+X289873Y308464D01*

+X289749Y308763D01*

+X289581Y309038D01*

+X289371Y309283D01*

+X289126Y309493D01*

+X288851Y309661D01*

+X288552Y309785D01*

+X288239Y309860D01*

+X287917Y309885D01*

+X287914Y309885D01*

+Y361082D01*

+X288334Y361339D01*

+X288849Y361779D01*

+X289289Y362294D01*

+X289642Y362871D01*

+X289901Y363496D01*

+X290059Y364154D01*

+X290099Y364829D01*

+X290059Y365504D01*

+X289901Y366162D01*

+X289642Y366787D01*

+X289289Y367364D01*

+X288849Y367879D01*

+X288334Y368319D01*

+X287914Y368576D01*

+Y371082D01*

+X288334Y371339D01*

+X288849Y371779D01*

+X289289Y372294D01*

+X289642Y372871D01*

+X289901Y373496D01*

+X290059Y374154D01*

+X290099Y374829D01*

+X290059Y375504D01*

+X289901Y376162D01*

+X289642Y376787D01*

+X289289Y377364D01*

+X288849Y377879D01*

+X288334Y378319D01*

+X287914Y378576D01*

+Y397000D01*

+X295792D01*

+Y379142D01*

+X295124Y379089D01*

+X294466Y378931D01*

+X293841Y378672D01*

+X293264Y378319D01*

+X292749Y377879D01*

+X292309Y377364D01*

+X291956Y376787D01*

+X291697Y376162D01*

+X291539Y375504D01*

+X291486Y374829D01*

+X291539Y374154D01*

+X291697Y373496D01*

+X291956Y372871D01*

+X292309Y372294D01*

+X292749Y371779D01*

+X293264Y371339D01*

+X293841Y370986D01*

+X294466Y370727D01*

+X295124Y370569D01*

+X295792Y370516D01*

+Y369142D01*

+X295124Y369089D01*

+X294466Y368931D01*

+X293841Y368672D01*

+X293264Y368319D01*

+X292749Y367879D01*

+X292309Y367364D01*

+X291956Y366787D01*

+X291697Y366162D01*

+X291539Y365504D01*

+X291486Y364829D01*

+X291539Y364154D01*

+X291697Y363496D01*

+X291956Y362871D01*

+X292309Y362294D01*

+X292749Y361779D01*

+X293264Y361339D01*

+X293841Y360986D01*

+X294466Y360727D01*

+X295124Y360569D01*

+X295792Y360516D01*

+Y306763D01*

+X295570Y306627D01*

+X295325Y306417D01*

+X295115Y306172D01*

+X294947Y305897D01*

+X294823Y305598D01*

+X294748Y305285D01*

+X294723Y304963D01*

+X294748Y304641D01*

+X294823Y304328D01*

+X294947Y304029D01*

+X295115Y303754D01*

+X295325Y303509D01*

+X295570Y303299D01*

+X295792Y303163D01*

+Y283056D01*

+X295734Y283197D01*

+X295566Y283472D01*

+X295356Y283717D01*

+X295111Y283927D01*

+X294836Y284095D01*

+X294537Y284219D01*

+X294224Y284294D01*

+X293902Y284319D01*

+X293580Y284294D01*

+X293267Y284219D01*

+X292968Y284095D01*

+X292693Y283927D01*

+X292448Y283717D01*

+X292238Y283472D01*

+X292070Y283197D01*

+X291946Y282898D01*

+X291871Y282585D01*

+X291846Y282263D01*

+X291871Y281941D01*

+X291946Y281628D01*

+X292070Y281329D01*

+X292238Y281054D01*

+X292448Y280809D01*

+X292693Y280599D01*

+X292968Y280431D01*

+X293267Y280307D01*

+X293580Y280232D01*

+X293902Y280207D01*

+X294224Y280232D01*

+X294537Y280307D01*

+X294836Y280431D01*

+X295111Y280599D01*

+X295356Y280809D01*

+X295566Y281054D01*

+X295734Y281329D01*

+X295792Y281470D01*

+Y258059D01*

+X295518Y257891D01*

+X295273Y257681D01*

+X295063Y257436D01*

+X294895Y257161D01*

+X294771Y256862D01*

+X294696Y256549D01*

+X294671Y256227D01*

+X294696Y255905D01*

+X294771Y255592D01*

+X294895Y255293D01*

+X295063Y255018D01*

+X295273Y254773D01*

+X295518Y254563D01*

+X295792Y254395D01*

+Y245673D01*

+X295615Y245659D01*

+X295302Y245584D01*

+X295003Y245460D01*

+X294728Y245292D01*

+X294483Y245082D01*

+X294273Y244837D01*

+X294105Y244562D01*

+X293981Y244263D01*

+X293906Y243950D01*

+X293881Y243628D01*

+X293906Y243306D01*

+X293981Y242993D01*

+X294105Y242694D01*

+X294273Y242419D01*

+X294483Y242174D01*

+X294728Y241964D01*

+X295003Y241796D01*

+X295302Y241672D01*

+X295615Y241597D01*

+X295792Y241583D01*

+Y189142D01*

+X295124Y189089D01*

+X294466Y188931D01*

+X293841Y188672D01*

+X293264Y188319D01*

+X292749Y187879D01*

+X292309Y187364D01*

+X291956Y186787D01*

+X291697Y186162D01*

+X291539Y185504D01*

+X291486Y184829D01*

+X291539Y184154D01*

+X291697Y183496D01*

+X291956Y182871D01*

+X292309Y182294D01*

+X292749Y181779D01*

+X293264Y181339D01*

+X293841Y180986D01*

+X294466Y180727D01*

+X295124Y180569D01*

+X295792Y180516D01*

+Y179142D01*

+X295124Y179089D01*

+X294466Y178931D01*

+X293841Y178672D01*

+X293264Y178319D01*

+X292749Y177879D01*

+X292309Y177364D01*

+X291956Y176787D01*

+X291697Y176162D01*

+X291539Y175504D01*

+X291486Y174829D01*

+X291539Y174154D01*

+X291697Y173496D01*

+X291956Y172871D01*

+X292309Y172294D01*

+X292749Y171779D01*

+X293264Y171339D01*

+X293841Y170986D01*

+X294466Y170727D01*

+X295124Y170569D01*

+X295792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X287914Y378576D02*X287757Y378672D01*

+X287132Y378931D01*

+X286474Y379089D01*

+X285799Y379142D01*

+X285792Y379142D01*

+Y397000D01*

+X287914D01*

+Y378576D01*

+G37*

+G36*

+Y368576D02*X287757Y368672D01*

+X287132Y368931D01*

+X286474Y369089D01*

+X285799Y369142D01*

+X285792Y369142D01*

+Y370516D01*

+X285799Y370516D01*

+X286474Y370569D01*

+X287132Y370727D01*

+X287757Y370986D01*

+X287914Y371082D01*

+Y368576D01*

+G37*

+G36*

+Y188576D02*X287757Y188672D01*

+X287132Y188931D01*

+X286474Y189089D01*

+X285799Y189142D01*

+X285792Y189142D01*

+Y322979D01*

+X286065Y323044D01*

+X286364Y323168D01*

+X286639Y323336D01*

+X286884Y323546D01*

+X287094Y323791D01*

+X287262Y324066D01*

+X287386Y324365D01*

+X287461Y324678D01*

+X287480Y325000D01*

+X287461Y325322D01*

+X287386Y325635D01*

+X287262Y325934D01*

+X287094Y326209D01*

+X286884Y326454D01*

+X286639Y326664D01*

+X286364Y326832D01*

+X286065Y326956D01*

+X285792Y327021D01*

+Y360516D01*

+X285799Y360516D01*

+X286474Y360569D01*

+X287132Y360727D01*

+X287757Y360986D01*

+X287914Y361082D01*

+Y309885D01*

+X287595Y309860D01*

+X287282Y309785D01*

+X286983Y309661D01*

+X286708Y309493D01*

+X286463Y309283D01*

+X286253Y309038D01*

+X286085Y308763D01*

+X285961Y308464D01*

+X285886Y308151D01*

+X285861Y307829D01*

+X285886Y307507D01*

+X285961Y307194D01*

+X286085Y306895D01*

+X286253Y306620D01*

+X286463Y306375D01*

+X286708Y306165D01*

+X286983Y305997D01*

+X287282Y305873D01*

+X287595Y305798D01*

+X287914Y305773D01*

+Y188576D01*

+G37*

+G36*

+Y178576D02*X287757Y178672D01*

+X287132Y178931D01*

+X286474Y179089D01*

+X285799Y179142D01*

+X285792Y179142D01*

+Y180516D01*

+X285799Y180516D01*

+X286474Y180569D01*

+X287132Y180727D01*

+X287757Y180986D01*

+X287914Y181082D01*

+Y178576D01*

+G37*

+G36*

+Y97000D02*X285792D01*

+Y170516D01*

+X285799Y170516D01*

+X286474Y170569D01*

+X287132Y170727D01*

+X287757Y170986D01*

+X287914Y171082D01*

+Y97000D01*

+G37*

+G36*

+X285792D02*X278222D01*

+Y171271D01*

+X278334Y171339D01*

+X278849Y171779D01*

+X279289Y172294D01*

+X279642Y172871D01*

+X279901Y173496D01*

+X280059Y174154D01*

+X280099Y174829D01*

+X280059Y175504D01*

+X279901Y176162D01*

+X279642Y176787D01*

+X279289Y177364D01*

+X278849Y177879D01*

+X278334Y178319D01*

+X278222Y178387D01*

+Y181271D01*

+X278334Y181339D01*

+X278849Y181779D01*

+X279289Y182294D01*

+X279642Y182871D01*

+X279901Y183496D01*

+X280059Y184154D01*

+X280099Y184829D01*

+X280059Y185504D01*

+X279901Y186162D01*

+X279642Y186787D01*

+X279289Y187364D01*

+X278849Y187879D01*

+X278334Y188319D01*

+X278222Y188387D01*

+Y277546D01*

+X278225Y277546D01*

+X278547Y277571D01*

+X278860Y277646D01*

+X279159Y277770D01*

+X279434Y277938D01*

+X279679Y278148D01*

+X279889Y278393D01*

+X280057Y278668D01*

+X280181Y278967D01*

+X280256Y279280D01*

+X280275Y279602D01*

+X280256Y279924D01*

+X280181Y280237D01*

+X280057Y280536D01*

+X279889Y280811D01*

+X279679Y281056D01*

+X279434Y281266D01*

+X279159Y281434D01*

+X278860Y281558D01*

+X278547Y281633D01*

+X278225Y281658D01*

+X278222Y281658D01*

+Y283674D01*

+X278380Y283539D01*

+X278621Y283391D01*

+X278883Y283283D01*

+X279159Y283217D01*

+X279441Y283194D01*

+X279723Y283217D01*

+X279999Y283283D01*

+X280261Y283391D01*

+X280502Y283539D01*

+X280718Y283723D01*

+X280902Y283939D01*

+X281050Y284180D01*

+X281158Y284442D01*

+X281224Y284718D01*

+X281241Y285000D01*

+X281224Y285282D01*

+X281158Y285558D01*

+X281050Y285820D01*

+X280902Y286061D01*

+X280718Y286277D01*

+X280502Y286461D01*

+X280261Y286609D01*

+X279999Y286717D01*

+X279723Y286783D01*

+X279441Y286806D01*

+X279159Y286783D01*

+X278883Y286717D01*

+X278621Y286609D01*

+X278380Y286461D01*

+X278222Y286326D01*

+Y296557D01*

+X278529Y296581D01*

+X278842Y296656D01*

+X279141Y296780D01*

+X279416Y296948D01*

+X279661Y297158D01*

+X279871Y297403D01*

+X280039Y297678D01*

+X280163Y297977D01*

+X280238Y298290D01*

+X280257Y298612D01*

+X280238Y298934D01*

+X280163Y299247D01*

+X280039Y299546D01*

+X279871Y299821D01*

+X279661Y300066D01*

+X279416Y300276D01*

+X279141Y300444D01*

+X278842Y300568D01*

+X278529Y300643D01*

+X278222Y300667D01*

+Y306457D01*

+X278383Y306555D01*

+X278628Y306765D01*

+X278838Y307010D01*

+X279006Y307285D01*

+X279130Y307584D01*

+X279205Y307897D01*

+X279224Y308219D01*

+X279205Y308541D01*

+X279130Y308854D01*

+X279006Y309153D01*

+X278838Y309428D01*

+X278628Y309673D01*

+X278383Y309883D01*

+X278222Y309981D01*

+Y345601D01*

+X278383Y345668D01*

+X278658Y345836D01*

+X278903Y346046D01*

+X279113Y346291D01*

+X279281Y346566D01*

+X279405Y346865D01*

+X279480Y347178D01*

+X279499Y347500D01*

+X279480Y347822D01*

+X279405Y348135D01*

+X279281Y348434D01*

+X279113Y348709D01*

+X278903Y348954D01*

+X278658Y349164D01*

+X278383Y349332D01*

+X278222Y349399D01*

+Y361271D01*

+X278334Y361339D01*

+X278849Y361779D01*

+X279289Y362294D01*

+X279642Y362871D01*

+X279901Y363496D01*

+X280059Y364154D01*

+X280099Y364829D01*

+X280059Y365504D01*

+X279901Y366162D01*

+X279642Y366787D01*

+X279289Y367364D01*

+X278849Y367879D01*

+X278334Y368319D01*

+X278222Y368387D01*

+Y371271D01*

+X278334Y371339D01*

+X278849Y371779D01*

+X279289Y372294D01*

+X279642Y372871D01*

+X279901Y373496D01*

+X280059Y374154D01*

+X280099Y374829D01*

+X280059Y375504D01*

+X279901Y376162D01*

+X279642Y376787D01*

+X279289Y377364D01*

+X278849Y377879D01*

+X278334Y378319D01*

+X278222Y378387D01*

+Y397000D01*

+X285792D01*

+Y379142D01*

+X285124Y379089D01*

+X284466Y378931D01*

+X283841Y378672D01*

+X283264Y378319D01*

+X282749Y377879D01*

+X282309Y377364D01*

+X281956Y376787D01*

+X281697Y376162D01*

+X281539Y375504D01*

+X281486Y374829D01*

+X281539Y374154D01*

+X281697Y373496D01*

+X281956Y372871D01*

+X282309Y372294D01*

+X282749Y371779D01*

+X283264Y371339D01*

+X283841Y370986D01*

+X284466Y370727D01*

+X285124Y370569D01*

+X285792Y370516D01*

+Y369142D01*

+X285124Y369089D01*

+X284466Y368931D01*

+X283841Y368672D01*

+X283264Y368319D01*

+X282749Y367879D01*

+X282309Y367364D01*

+X281956Y366787D01*

+X281697Y366162D01*

+X281539Y365504D01*

+X281486Y364829D01*

+X281539Y364154D01*

+X281697Y363496D01*

+X281956Y362871D01*

+X282309Y362294D01*

+X282749Y361779D01*

+X283264Y361339D01*

+X283841Y360986D01*

+X284466Y360727D01*

+X285124Y360569D01*

+X285792Y360516D01*

+Y327021D01*

+X285752Y327031D01*

+X285430Y327056D01*

+X285108Y327031D01*

+X284795Y326956D01*

+X284496Y326832D01*

+X284221Y326664D01*

+X283976Y326454D01*

+X283766Y326209D01*

+X283598Y325934D01*

+X283474Y325635D01*

+X283399Y325322D01*

+X283374Y325000D01*

+X283399Y324678D01*

+X283474Y324365D01*

+X283598Y324066D01*

+X283766Y323791D01*

+X283976Y323546D01*

+X284221Y323336D01*

+X284496Y323168D01*

+X284795Y323044D01*

+X285108Y322969D01*

+X285430Y322944D01*

+X285752Y322969D01*

+X285792Y322979D01*

+Y189142D01*

+X285124Y189089D01*

+X284466Y188931D01*

+X283841Y188672D01*

+X283264Y188319D01*

+X282749Y187879D01*

+X282309Y187364D01*

+X281956Y186787D01*

+X281697Y186162D01*

+X281539Y185504D01*

+X281486Y184829D01*

+X281539Y184154D01*

+X281697Y183496D01*

+X281956Y182871D01*

+X282309Y182294D01*

+X282749Y181779D01*

+X283264Y181339D01*

+X283841Y180986D01*

+X284466Y180727D01*

+X285124Y180569D01*

+X285792Y180516D01*

+Y179142D01*

+X285124Y179089D01*

+X284466Y178931D01*

+X283841Y178672D01*

+X283264Y178319D01*

+X282749Y177879D01*

+X282309Y177364D01*

+X281956Y176787D01*

+X281697Y176162D01*

+X281539Y175504D01*

+X281486Y174829D01*

+X281539Y174154D01*

+X281697Y173496D01*

+X281956Y172871D01*

+X282309Y172294D01*

+X282749Y171779D01*

+X283264Y171339D01*

+X283841Y170986D01*

+X284466Y170727D01*

+X285124Y170569D01*

+X285792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X278222Y378387D02*X277757Y378672D01*

+X277132Y378931D01*

+X276474Y379089D01*

+X275799Y379142D01*

+X275792Y379142D01*

+Y397000D01*

+X278222D01*

+Y378387D01*

+G37*

+G36*

+Y368387D02*X277757Y368672D01*

+X277132Y368931D01*

+X276474Y369089D01*

+X275799Y369142D01*

+X275792Y369142D01*

+Y370516D01*

+X275799Y370516D01*

+X276474Y370569D01*

+X277132Y370727D01*

+X277757Y370986D01*

+X278222Y371271D01*

+Y368387D01*

+G37*

+G36*

+Y349399D02*X278084Y349456D01*

+X277771Y349531D01*

+X277449Y349556D01*

+X277127Y349531D01*

+X276814Y349456D01*

+X276515Y349332D01*

+X276240Y349164D01*

+X275995Y348954D01*

+X275792Y348717D01*

+Y360516D01*

+X275799Y360516D01*

+X276474Y360569D01*

+X277132Y360727D01*

+X277757Y360986D01*

+X278222Y361271D01*

+Y349399D01*

+G37*

+G36*

+Y309981D02*X278108Y310051D01*

+X277809Y310175D01*

+X277496Y310250D01*

+X277174Y310275D01*

+X276852Y310250D01*

+X276539Y310175D01*

+X276240Y310051D01*

+X275965Y309883D01*

+X275792Y309735D01*

+Y346283D01*

+X275995Y346046D01*

+X276240Y345836D01*

+X276515Y345668D01*

+X276814Y345544D01*

+X277127Y345469D01*

+X277449Y345444D01*

+X277771Y345469D01*

+X278084Y345544D01*

+X278222Y345601D01*

+Y309981D01*

+G37*

+G36*

+Y188387D02*X277757Y188672D01*

+X277132Y188931D01*

+X276474Y189089D01*

+X275799Y189142D01*

+X275792Y189142D01*

+Y306703D01*

+X275965Y306555D01*

+X276240Y306387D01*

+X276539Y306263D01*

+X276852Y306188D01*

+X277174Y306163D01*

+X277496Y306188D01*

+X277809Y306263D01*

+X278108Y306387D01*

+X278222Y306457D01*

+Y300667D01*

+X278207Y300668D01*

+X277885Y300643D01*

+X277572Y300568D01*

+X277273Y300444D01*

+X276998Y300276D01*

+X276753Y300066D01*

+X276543Y299821D01*

+X276375Y299546D01*

+X276251Y299247D01*

+X276176Y298934D01*

+X276151Y298612D01*

+X276176Y298290D01*

+X276251Y297977D01*

+X276375Y297678D01*

+X276543Y297403D01*

+X276753Y297158D01*

+X276998Y296948D01*

+X277273Y296780D01*

+X277572Y296656D01*

+X277885Y296581D01*

+X278207Y296556D01*

+X278222Y296557D01*

+Y286326D01*

+X278164Y286277D01*

+X277980Y286061D01*

+X277832Y285820D01*

+X277724Y285558D01*

+X277658Y285282D01*

+X277635Y285000D01*

+X277658Y284718D01*

+X277724Y284442D01*

+X277832Y284180D01*

+X277980Y283939D01*

+X278164Y283723D01*

+X278222Y283674D01*

+Y281658D01*

+X277903Y281633D01*

+X277590Y281558D01*

+X277291Y281434D01*

+X277016Y281266D01*

+X276771Y281056D01*

+X276561Y280811D01*

+X276393Y280536D01*

+X276269Y280237D01*

+X276194Y279924D01*

+X276169Y279602D01*

+X276194Y279280D01*

+X276269Y278967D01*

+X276393Y278668D01*

+X276561Y278393D01*

+X276771Y278148D01*

+X277016Y277938D01*

+X277291Y277770D01*

+X277590Y277646D01*

+X277903Y277571D01*

+X278222Y277546D01*

+Y188387D01*

+G37*

+G36*

+Y178387D02*X277757Y178672D01*

+X277132Y178931D01*

+X276474Y179089D01*

+X275799Y179142D01*

+X275792Y179142D01*

+Y180516D01*

+X275799Y180516D01*

+X276474Y180569D01*

+X277132Y180727D01*

+X277757Y180986D01*

+X278222Y181271D01*

+Y178387D01*

+G37*

+G36*

+Y97000D02*X275792D01*

+Y170516D01*

+X275799Y170516D01*

+X276474Y170569D01*

+X277132Y170727D01*

+X277757Y170986D01*

+X278222Y171271D01*

+Y97000D01*

+G37*

+G36*

+X275792D02*X268938D01*

+Y171883D01*

+X269289Y172294D01*

+X269642Y172871D01*

+X269901Y173496D01*

+X270059Y174154D01*

+X270099Y174829D01*

+X270059Y175504D01*

+X269901Y176162D01*

+X269642Y176787D01*

+X269289Y177364D01*

+X268938Y177775D01*

+Y181883D01*

+X269289Y182294D01*

+X269642Y182871D01*

+X269901Y183496D01*

+X270059Y184154D01*

+X270099Y184829D01*

+X270059Y185504D01*

+X269901Y186162D01*

+X269642Y186787D01*

+X269289Y187364D01*

+X268938Y187775D01*

+Y196770D01*

+X269159Y196717D01*

+X269441Y196694D01*

+X269723Y196717D01*

+X269999Y196783D01*

+X270261Y196891D01*

+X270502Y197039D01*

+X270718Y197223D01*

+X270902Y197439D01*

+X271050Y197680D01*

+X271158Y197942D01*

+X271224Y198218D01*

+X271241Y198500D01*

+X271224Y198782D01*

+X271158Y199058D01*

+X271050Y199320D01*

+X270902Y199561D01*

+X270718Y199777D01*

+X270502Y199961D01*

+X270261Y200109D01*

+X269999Y200217D01*

+X269723Y200283D01*

+X269441Y200306D01*

+X269159Y200283D01*

+X268938Y200230D01*

+Y230004D01*

+X269121Y229891D01*

+X269383Y229783D01*

+X269659Y229717D01*

+X269941Y229694D01*

+X270223Y229717D01*

+X270499Y229783D01*

+X270761Y229891D01*

+X271002Y230039D01*

+X271218Y230223D01*

+X271402Y230439D01*

+X271550Y230680D01*

+X271658Y230942D01*

+X271724Y231218D01*

+X271741Y231500D01*

+X271724Y231782D01*

+X271658Y232058D01*

+X271550Y232320D01*

+X271402Y232561D01*

+X271218Y232777D01*

+X271002Y232961D01*

+X270761Y233109D01*

+X270499Y233217D01*

+X270223Y233283D01*

+X269941Y233306D01*

+X269659Y233283D01*

+X269383Y233217D01*

+X269121Y233109D01*

+X268938Y232996D01*

+Y296708D01*

+X269018Y296675D01*

+X269331Y296600D01*

+X269653Y296575D01*

+X269975Y296600D01*

+X270288Y296675D01*

+X270587Y296799D01*

+X270862Y296967D01*

+X271107Y297177D01*

+X271317Y297422D01*

+X271426Y297601D01*

+X271565Y297373D01*

+X271775Y297128D01*

+X272020Y296918D01*

+X272295Y296750D01*

+X272594Y296626D01*

+X272907Y296551D01*

+X273229Y296526D01*

+X273551Y296551D01*

+X273864Y296626D01*

+X274163Y296750D01*

+X274438Y296918D01*

+X274683Y297128D01*

+X274893Y297373D01*

+X275061Y297648D01*

+X275185Y297947D01*

+X275260Y298260D01*

+X275279Y298582D01*

+X275260Y298904D01*

+X275185Y299217D01*

+X275061Y299516D01*

+X274893Y299791D01*

+X274683Y300036D01*

+X274438Y300246D01*

+X274163Y300414D01*

+X273864Y300538D01*

+X273551Y300613D01*

+X273229Y300638D01*

+X272907Y300613D01*

+X272594Y300538D01*

+X272295Y300414D01*

+X272020Y300246D01*

+X271775Y300036D01*

+X271565Y299791D01*

+X271456Y299612D01*

+X271317Y299840D01*

+X271107Y300085D01*

+X270862Y300295D01*

+X270587Y300463D01*

+X270288Y300587D01*

+X269975Y300662D01*

+X269653Y300687D01*

+X269331Y300662D01*

+X269018Y300587D01*

+X268938Y300554D01*

+Y311944D01*

+X268941Y311944D01*

+X269263Y311969D01*

+X269576Y312044D01*

+X269875Y312168D01*

+X270150Y312336D01*

+X270395Y312546D01*

+X270605Y312791D01*

+X270773Y313066D01*

+X270897Y313365D01*

+X270972Y313678D01*

+X270991Y314000D01*

+X270972Y314322D01*

+X270897Y314635D01*

+X270773Y314934D01*

+X270605Y315209D01*

+X270395Y315454D01*

+X270150Y315664D01*

+X269875Y315832D01*

+X269576Y315956D01*

+X269263Y316031D01*

+X268941Y316056D01*

+X268938Y316056D01*

+Y335008D01*

+X268980Y334939D01*

+X269164Y334723D01*

+X269380Y334539D01*

+X269621Y334391D01*

+X269883Y334283D01*

+X270159Y334217D01*

+X270441Y334194D01*

+X270723Y334217D01*

+X270999Y334283D01*

+X271261Y334391D01*

+X271502Y334539D01*

+X271718Y334723D01*

+X271902Y334939D01*

+X272050Y335180D01*

+X272158Y335442D01*

+X272224Y335718D01*

+X272241Y336000D01*

+X272224Y336282D01*

+X272158Y336558D01*

+X272050Y336820D01*

+X271902Y337061D01*

+X271718Y337277D01*

+X271502Y337461D01*

+X271261Y337609D01*

+X270999Y337717D01*

+X270723Y337783D01*

+X270441Y337806D01*

+X270159Y337783D01*

+X269883Y337717D01*

+X269621Y337609D01*

+X269380Y337461D01*

+X269164Y337277D01*

+X268980Y337061D01*

+X268938Y336992D01*

+Y341508D01*

+X268980Y341439D01*

+X269164Y341223D01*

+X269380Y341039D01*

+X269621Y340891D01*

+X269883Y340783D01*

+X270159Y340717D01*

+X270441Y340694D01*

+X270723Y340717D01*

+X270999Y340783D01*

+X271261Y340891D01*

+X271502Y341039D01*

+X271718Y341223D01*

+X271902Y341439D01*

+X272050Y341680D01*

+X272158Y341942D01*

+X272224Y342218D01*

+X272241Y342500D01*

+X272224Y342782D01*

+X272158Y343058D01*

+X272050Y343320D01*

+X271902Y343561D01*

+X271718Y343777D01*

+X271502Y343961D01*

+X271261Y344109D01*

+X270999Y344217D01*

+X270723Y344283D01*

+X270441Y344306D01*

+X270159Y344283D01*

+X269883Y344217D01*

+X269621Y344109D01*

+X269380Y343961D01*

+X269164Y343777D01*

+X268980Y343561D01*

+X268938Y343492D01*

+Y348508D01*

+X268980Y348439D01*

+X269164Y348223D01*

+X269380Y348039D01*

+X269621Y347891D01*

+X269883Y347783D01*

+X270159Y347717D01*

+X270441Y347694D01*

+X270723Y347717D01*

+X270999Y347783D01*

+X271261Y347891D01*

+X271502Y348039D01*

+X271718Y348223D01*

+X271902Y348439D01*

+X272050Y348680D01*

+X272158Y348942D01*

+X272224Y349218D01*

+X272241Y349500D01*

+X272224Y349782D01*

+X272158Y350058D01*

+X272050Y350320D01*

+X271902Y350561D01*

+X271718Y350777D01*

+X271502Y350961D01*

+X271261Y351109D01*

+X270999Y351217D01*

+X270723Y351283D01*

+X270441Y351306D01*

+X270159Y351283D01*

+X269883Y351217D01*

+X269621Y351109D01*

+X269380Y350961D01*

+X269164Y350777D01*

+X268980Y350561D01*

+X268938Y350492D01*

+Y356008D01*

+X268980Y355939D01*

+X269164Y355723D01*

+X269380Y355539D01*

+X269621Y355391D01*

+X269883Y355283D01*

+X270159Y355217D01*

+X270441Y355194D01*

+X270723Y355217D01*

+X270999Y355283D01*

+X271261Y355391D01*

+X271502Y355539D01*

+X271718Y355723D01*

+X271902Y355939D01*

+X272050Y356180D01*

+X272158Y356442D01*

+X272224Y356718D01*

+X272241Y357000D01*

+X272224Y357282D01*

+X272158Y357558D01*

+X272050Y357820D01*

+X271902Y358061D01*

+X271718Y358277D01*

+X271502Y358461D01*

+X271261Y358609D01*

+X270999Y358717D01*

+X270723Y358783D01*

+X270441Y358806D01*

+X270159Y358783D01*

+X269883Y358717D01*

+X269621Y358609D01*

+X269380Y358461D01*

+X269164Y358277D01*

+X268980Y358061D01*

+X268938Y357992D01*

+Y361883D01*

+X269289Y362294D01*

+X269642Y362871D01*

+X269901Y363496D01*

+X270059Y364154D01*

+X270099Y364829D01*

+X270059Y365504D01*

+X269901Y366162D01*

+X269642Y366787D01*

+X269289Y367364D01*

+X268938Y367775D01*

+Y371883D01*

+X269289Y372294D01*

+X269642Y372871D01*

+X269901Y373496D01*

+X270059Y374154D01*

+X270099Y374829D01*

+X270059Y375504D01*

+X269901Y376162D01*

+X269642Y376787D01*

+X269289Y377364D01*

+X268938Y377775D01*

+Y397000D01*

+X275792D01*

+Y379142D01*

+X275124Y379089D01*

+X274466Y378931D01*

+X273841Y378672D01*

+X273264Y378319D01*

+X272749Y377879D01*

+X272309Y377364D01*

+X271956Y376787D01*

+X271697Y376162D01*

+X271539Y375504D01*

+X271486Y374829D01*

+X271539Y374154D01*

+X271697Y373496D01*

+X271956Y372871D01*

+X272309Y372294D01*

+X272749Y371779D01*

+X273264Y371339D01*

+X273841Y370986D01*

+X274466Y370727D01*

+X275124Y370569D01*

+X275792Y370516D01*

+Y369142D01*

+X275124Y369089D01*

+X274466Y368931D01*

+X273841Y368672D01*

+X273264Y368319D01*

+X272749Y367879D01*

+X272309Y367364D01*

+X271956Y366787D01*

+X271697Y366162D01*

+X271539Y365504D01*

+X271486Y364829D01*

+X271539Y364154D01*

+X271697Y363496D01*

+X271956Y362871D01*

+X272309Y362294D01*

+X272749Y361779D01*

+X273264Y361339D01*

+X273841Y360986D01*

+X274466Y360727D01*

+X275124Y360569D01*

+X275792Y360516D01*

+Y348717D01*

+X275785Y348709D01*

+X275617Y348434D01*

+X275493Y348135D01*

+X275418Y347822D01*

+X275393Y347500D01*

+X275418Y347178D01*

+X275493Y346865D01*

+X275617Y346566D01*

+X275785Y346291D01*

+X275792Y346283D01*

+Y309735D01*

+X275720Y309673D01*

+X275510Y309428D01*

+X275342Y309153D01*

+X275218Y308854D01*

+X275143Y308541D01*

+X275118Y308219D01*

+X275143Y307897D01*

+X275218Y307584D01*

+X275342Y307285D01*

+X275510Y307010D01*

+X275720Y306765D01*

+X275792Y306703D01*

+Y189142D01*

+X275124Y189089D01*

+X274466Y188931D01*

+X273841Y188672D01*

+X273264Y188319D01*

+X272749Y187879D01*

+X272309Y187364D01*

+X271956Y186787D01*

+X271697Y186162D01*

+X271539Y185504D01*

+X271486Y184829D01*

+X271539Y184154D01*

+X271697Y183496D01*

+X271956Y182871D01*

+X272309Y182294D01*

+X272749Y181779D01*

+X273264Y181339D01*

+X273841Y180986D01*

+X274466Y180727D01*

+X275124Y180569D01*

+X275792Y180516D01*

+Y179142D01*

+X275124Y179089D01*

+X274466Y178931D01*

+X273841Y178672D01*

+X273264Y178319D01*

+X272749Y177879D01*

+X272309Y177364D01*

+X271956Y176787D01*

+X271697Y176162D01*

+X271539Y175504D01*

+X271486Y174829D01*

+X271539Y174154D01*

+X271697Y173496D01*

+X271956Y172871D01*

+X272309Y172294D01*

+X272749Y171779D01*

+X273264Y171339D01*

+X273841Y170986D01*

+X274466Y170727D01*

+X275124Y170569D01*

+X275792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X268938Y377775D02*X268849Y377879D01*

+X268334Y378319D01*

+X267757Y378672D01*

+X267132Y378931D01*

+X266474Y379089D01*

+X265799Y379142D01*

+X265792Y379142D01*

+Y397000D01*

+X268938D01*

+Y377775D01*

+G37*

+G36*

+Y367775D02*X268849Y367879D01*

+X268334Y368319D01*

+X267757Y368672D01*

+X267132Y368931D01*

+X266474Y369089D01*

+X265799Y369142D01*

+X265792Y369142D01*

+Y370516D01*

+X265799Y370516D01*

+X266474Y370569D01*

+X267132Y370727D01*

+X267757Y370986D01*

+X268334Y371339D01*

+X268849Y371779D01*

+X268938Y371883D01*

+Y367775D01*

+G37*

+G36*

+Y300554D02*X268719Y300463D01*

+X268444Y300295D01*

+X268199Y300085D01*

+X267989Y299840D01*

+X267821Y299565D01*

+X267697Y299266D01*

+X267622Y298953D01*

+X267597Y298631D01*

+X267622Y298309D01*

+X267638Y298244D01*

+X267622Y298258D01*

+X267347Y298426D01*

+X267048Y298550D01*

+X266735Y298625D01*

+X266413Y298650D01*

+X266091Y298625D01*

+X265792Y298553D01*

+Y360516D01*

+X265799Y360516D01*

+X266474Y360569D01*

+X267132Y360727D01*

+X267757Y360986D01*

+X268334Y361339D01*

+X268849Y361779D01*

+X268938Y361883D01*

+Y357992D01*

+X268832Y357820D01*

+X268724Y357558D01*

+X268658Y357282D01*

+X268635Y357000D01*

+X268658Y356718D01*

+X268724Y356442D01*

+X268832Y356180D01*

+X268938Y356008D01*

+Y350492D01*

+X268832Y350320D01*

+X268724Y350058D01*

+X268658Y349782D01*

+X268635Y349500D01*

+X268658Y349218D01*

+X268724Y348942D01*

+X268832Y348680D01*

+X268938Y348508D01*

+Y343492D01*

+X268832Y343320D01*

+X268724Y343058D01*

+X268658Y342782D01*

+X268635Y342500D01*

+X268658Y342218D01*

+X268724Y341942D01*

+X268832Y341680D01*

+X268938Y341508D01*

+Y336992D01*

+X268832Y336820D01*

+X268724Y336558D01*

+X268658Y336282D01*

+X268635Y336000D01*

+X268658Y335718D01*

+X268724Y335442D01*

+X268832Y335180D01*

+X268938Y335008D01*

+Y316056D01*

+X268619Y316031D01*

+X268306Y315956D01*

+X268007Y315832D01*

+X267732Y315664D01*

+X267487Y315454D01*

+X267277Y315209D01*

+X267109Y314934D01*

+X266985Y314635D01*

+X266910Y314322D01*

+X266885Y314000D01*

+X266910Y313678D01*

+X266985Y313365D01*

+X267109Y313066D01*

+X267277Y312791D01*

+X267487Y312546D01*

+X267732Y312336D01*

+X268007Y312168D01*

+X268306Y312044D01*

+X268619Y311969D01*

+X268938Y311944D01*

+Y300554D01*

+G37*

+G36*

+Y187775D02*X268849Y187879D01*

+X268334Y188319D01*

+X267757Y188672D01*

+X267132Y188931D01*

+X266474Y189089D01*

+X265799Y189142D01*

+X265792Y189142D01*

+Y281877D01*

+X265866Y281997D01*

+X265990Y282296D01*

+X266065Y282609D01*

+X266084Y282931D01*

+X266065Y283253D01*

+X265990Y283566D01*

+X265866Y283865D01*

+X265792Y283985D01*

+Y294635D01*

+X266091Y294563D01*

+X266413Y294538D01*

+X266735Y294563D01*

+X267048Y294638D01*

+X267347Y294762D01*

+X267622Y294930D01*

+X267867Y295140D01*

+X268077Y295385D01*

+X268245Y295660D01*

+X268369Y295959D01*

+X268444Y296272D01*

+X268463Y296594D01*

+X268444Y296916D01*

+X268428Y296981D01*

+X268444Y296967D01*

+X268719Y296799D01*

+X268938Y296708D01*

+Y232996D01*

+X268880Y232961D01*

+X268664Y232777D01*

+X268480Y232561D01*

+X268332Y232320D01*

+X268224Y232058D01*

+X268158Y231782D01*

+X268135Y231500D01*

+X268158Y231218D01*

+X268224Y230942D01*

+X268332Y230680D01*

+X268480Y230439D01*

+X268664Y230223D01*

+X268880Y230039D01*

+X268938Y230004D01*

+Y200230D01*

+X268883Y200217D01*

+X268621Y200109D01*

+X268380Y199961D01*

+X268164Y199777D01*

+X267980Y199561D01*

+X267832Y199320D01*

+X267724Y199058D01*

+X267658Y198782D01*

+X267635Y198500D01*

+X267658Y198218D01*

+X267724Y197942D01*

+X267832Y197680D01*

+X267980Y197439D01*

+X268164Y197223D01*

+X268380Y197039D01*

+X268621Y196891D01*

+X268883Y196783D01*

+X268938Y196770D01*

+Y187775D01*

+G37*

+G36*

+Y177775D02*X268849Y177879D01*

+X268334Y178319D01*

+X267757Y178672D01*

+X267132Y178931D01*

+X266474Y179089D01*

+X265799Y179142D01*

+X265792Y179142D01*

+Y180516D01*

+X265799Y180516D01*

+X266474Y180569D01*

+X267132Y180727D01*

+X267757Y180986D01*

+X268334Y181339D01*

+X268849Y181779D01*

+X268938Y181883D01*

+Y177775D01*

+G37*

+G36*

+Y97000D02*X265792D01*

+Y170516D01*

+X265799Y170516D01*

+X266474Y170569D01*

+X267132Y170727D01*

+X267757Y170986D01*

+X268334Y171339D01*

+X268849Y171779D01*

+X268938Y171883D01*

+Y97000D01*

+G37*

+G36*

+X263438Y181233D02*X263841Y180986D01*

+X264466Y180727D01*

+X265124Y180569D01*

+X265792Y180516D01*

+Y179142D01*

+X265124Y179089D01*

+X264466Y178931D01*

+X263841Y178672D01*

+X263438Y178425D01*

+Y181233D01*

+G37*

+G36*

+Y280966D02*X263712Y280900D01*

+X264034Y280875D01*

+X264356Y280900D01*

+X264669Y280975D01*

+X264968Y281099D01*

+X265243Y281267D01*

+X265488Y281477D01*

+X265698Y281722D01*

+X265792Y281877D01*

+Y189142D01*

+X265124Y189089D01*

+X264466Y188931D01*

+X263841Y188672D01*

+X263438Y188425D01*

+Y266838D01*

+X263684Y266940D01*

+X263959Y267108D01*

+X264204Y267318D01*

+X264414Y267563D01*

+X264582Y267838D01*

+X264706Y268137D01*

+X264781Y268450D01*

+X264800Y268772D01*

+X264781Y269094D01*

+X264706Y269407D01*

+X264582Y269706D01*

+X264414Y269981D01*

+X264204Y270226D01*

+X263959Y270436D01*

+X263684Y270604D01*

+X263438Y270706D01*

+Y280966D01*

+G37*

+G36*

+Y289899D02*X263674Y289997D01*

+X263949Y290165D01*

+X264194Y290375D01*

+X264404Y290620D01*

+X264572Y290895D01*

+X264696Y291194D01*

+X264771Y291507D01*

+X264790Y291829D01*

+X264771Y292151D01*

+X264696Y292464D01*

+X264572Y292763D01*

+X264404Y293038D01*

+X264194Y293283D01*

+X264019Y293433D01*

+X264174Y293497D01*

+X264449Y293665D01*

+X264694Y293875D01*

+X264904Y294120D01*

+X265072Y294395D01*

+X265196Y294694D01*

+X265246Y294905D01*

+X265479Y294762D01*

+X265778Y294638D01*

+X265792Y294635D01*

+Y283985D01*

+X265698Y284140D01*

+X265488Y284385D01*

+X265243Y284595D01*

+X264968Y284763D01*

+X264669Y284887D01*

+X264356Y284962D01*

+X264034Y284987D01*

+X263712Y284962D01*

+X263438Y284896D01*

+Y289899D01*

+G37*

+G36*

+Y361233D02*X263841Y360986D01*

+X264466Y360727D01*

+X265124Y360569D01*

+X265792Y360516D01*

+Y298553D01*

+X265778Y298550D01*

+X265479Y298426D01*

+X265204Y298258D01*

+X264959Y298048D01*

+X264749Y297803D01*

+X264581Y297528D01*

+X264457Y297229D01*

+X264407Y297018D01*

+X264174Y297161D01*

+X263875Y297285D01*

+X263562Y297360D01*

+X263438Y297370D01*

+Y318195D01*

+X263441Y318194D01*

+X263723Y318217D01*

+X263999Y318283D01*

+X264261Y318391D01*

+X264502Y318539D01*

+X264718Y318723D01*

+X264902Y318939D01*

+X265050Y319180D01*

+X265158Y319442D01*

+X265224Y319718D01*

+X265241Y320000D01*

+X265224Y320282D01*

+X265158Y320558D01*

+X265050Y320820D01*

+X264902Y321061D01*

+X264718Y321277D01*

+X264502Y321461D01*

+X264261Y321609D01*

+X263999Y321717D01*

+X263723Y321783D01*

+X263441Y321806D01*

+X263438Y321805D01*

+Y361233D01*

+G37*

+G36*

+Y371233D02*X263841Y370986D01*

+X264466Y370727D01*

+X265124Y370569D01*

+X265792Y370516D01*

+Y369142D01*

+X265124Y369089D01*

+X264466Y368931D01*

+X263841Y368672D01*

+X263438Y368425D01*

+Y371233D01*

+G37*

+G36*

+Y397000D02*X265792D01*

+Y379142D01*

+X265124Y379089D01*

+X264466Y378931D01*

+X263841Y378672D01*

+X263438Y378425D01*

+Y397000D01*

+G37*

+G36*

+X265792Y97000D02*X263438D01*

+Y171233D01*

+X263841Y170986D01*

+X264466Y170727D01*

+X265124Y170569D01*

+X265792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X260565Y397000D02*X263438D01*

+Y378425D01*

+X263264Y378319D01*

+X262749Y377879D01*

+X262309Y377364D01*

+X261956Y376787D01*

+X261697Y376162D01*

+X261539Y375504D01*

+X261486Y374829D01*

+X261539Y374154D01*

+X261697Y373496D01*

+X261956Y372871D01*

+X262309Y372294D01*

+X262749Y371779D01*

+X263264Y371339D01*

+X263438Y371233D01*

+Y368425D01*

+X263264Y368319D01*

+X262749Y367879D01*

+X262309Y367364D01*

+X261956Y366787D01*

+X261697Y366162D01*

+X261539Y365504D01*

+X261486Y364829D01*

+X261539Y364154D01*

+X261697Y363496D01*

+X261956Y362871D01*

+X262309Y362294D01*

+X262749Y361779D01*

+X263264Y361339D01*

+X263438Y361233D01*

+Y321805D01*

+X263159Y321783D01*

+X262883Y321717D01*

+X262621Y321609D01*

+X262380Y321461D01*

+X262164Y321277D01*

+X261980Y321061D01*

+X261832Y320820D01*

+X261724Y320558D01*

+X261658Y320282D01*

+X261635Y320000D01*

+X261658Y319718D01*

+X261724Y319442D01*

+X261832Y319180D01*

+X261980Y318939D01*

+X262164Y318723D01*

+X262380Y318539D01*

+X262621Y318391D01*

+X262883Y318283D01*

+X263159Y318217D01*

+X263438Y318195D01*

+Y297370D01*

+X263240Y297385D01*

+X262918Y297360D01*

+X262605Y297285D01*

+X262306Y297161D01*

+X262031Y296993D01*

+X261786Y296783D01*

+X261576Y296538D01*

+X261408Y296263D01*

+X261284Y295964D01*

+X261209Y295651D01*

+X261184Y295329D01*

+X261209Y295007D01*

+X261284Y294694D01*

+X261408Y294395D01*

+X261576Y294120D01*

+X261786Y293875D01*

+X261961Y293725D01*

+X261806Y293661D01*

+X261531Y293493D01*

+X261286Y293283D01*

+X261076Y293038D01*

+X260908Y292763D01*

+X260784Y292464D01*

+X260709Y292151D01*

+X260684Y291829D01*

+X260709Y291507D01*

+X260784Y291194D01*

+X260908Y290895D01*

+X261076Y290620D01*

+X261286Y290375D01*

+X261531Y290165D01*

+X261806Y289997D01*

+X262105Y289873D01*

+X262418Y289798D01*

+X262740Y289773D01*

+X263062Y289798D01*

+X263375Y289873D01*

+X263438Y289899D01*

+Y284896D01*

+X263399Y284887D01*

+X263100Y284763D01*

+X262825Y284595D01*

+X262580Y284385D01*

+X262386Y284157D01*

+X262391Y284249D01*

+X262372Y284571D01*

+X262297Y284884D01*

+X262173Y285183D01*

+X262005Y285458D01*

+X261795Y285703D01*

+X261550Y285913D01*

+X261275Y286081D01*

+X260976Y286205D01*

+X260663Y286280D01*

+X260565Y286288D01*

+Y305830D01*

+X260682Y305758D01*

+X260944Y305650D01*

+X261220Y305584D01*

+X261502Y305561D01*

+X261784Y305584D01*

+X262060Y305650D01*

+X262322Y305758D01*

+X262563Y305906D01*

+X262779Y306090D01*

+X262963Y306306D01*

+X263111Y306547D01*

+X263219Y306809D01*

+X263285Y307085D01*

+X263302Y307367D01*

+X263285Y307649D01*

+X263219Y307925D01*

+X263111Y308187D01*

+X262963Y308428D01*

+X262779Y308644D01*

+X262563Y308828D01*

+X262322Y308976D01*

+X262060Y309084D01*

+X261784Y309150D01*

+X261502Y309173D01*

+X261220Y309150D01*

+X260944Y309084D01*

+X260682Y308976D01*

+X260565Y308904D01*

+Y315192D01*

+X260568Y315191D01*

+X260850Y315214D01*

+X261126Y315280D01*

+X261388Y315388D01*

+X261629Y315536D01*

+X261845Y315720D01*

+X262029Y315936D01*

+X262177Y316177D01*

+X262285Y316439D01*

+X262351Y316715D01*

+X262368Y316997D01*

+X262351Y317279D01*

+X262285Y317555D01*

+X262177Y317817D01*

+X262029Y318058D01*

+X261845Y318274D01*

+X261629Y318458D01*

+X261388Y318606D01*

+X261126Y318714D01*

+X260850Y318780D01*

+X260568Y318803D01*

+X260565Y318802D01*

+Y397000D01*

+G37*

+G36*

+X263438Y97000D02*X260565D01*

+Y189739D01*

+X260659Y189717D01*

+X260941Y189694D01*

+X261223Y189717D01*

+X261499Y189783D01*

+X261761Y189891D01*

+X262002Y190039D01*

+X262218Y190223D01*

+X262402Y190439D01*

+X262550Y190680D01*

+X262658Y190942D01*

+X262724Y191218D01*

+X262741Y191500D01*

+X262724Y191782D01*

+X262658Y192058D01*

+X262550Y192320D01*

+X262402Y192561D01*

+X262218Y192777D01*

+X262002Y192961D01*

+X261761Y193109D01*

+X261499Y193217D01*

+X261223Y193283D01*

+X260941Y193306D01*

+X260659Y193283D01*

+X260565Y193261D01*

+Y282210D01*

+X260663Y282218D01*

+X260976Y282293D01*

+X261275Y282417D01*

+X261550Y282585D01*

+X261795Y282795D01*

+X261984Y283017D01*

+X261978Y282931D01*

+X262003Y282609D01*

+X262078Y282296D01*

+X262202Y281997D01*

+X262370Y281722D01*

+X262580Y281477D01*

+X262825Y281267D01*

+X263100Y281099D01*

+X263399Y280975D01*

+X263438Y280966D01*

+Y270706D01*

+X263385Y270728D01*

+X263072Y270803D01*

+X262750Y270828D01*

+X262428Y270803D01*

+X262115Y270728D01*

+X261816Y270604D01*

+X261541Y270436D01*

+X261296Y270226D01*

+X261086Y269981D01*

+X260918Y269706D01*

+X260794Y269407D01*

+X260719Y269094D01*

+X260694Y268772D01*

+X260719Y268450D01*

+X260794Y268137D01*

+X260918Y267838D01*

+X261086Y267563D01*

+X261296Y267318D01*

+X261541Y267108D01*

+X261816Y266940D01*

+X262115Y266816D01*

+X262428Y266741D01*

+X262750Y266716D01*

+X263072Y266741D01*

+X263385Y266816D01*

+X263438Y266838D01*

+Y188425D01*

+X263264Y188319D01*

+X262749Y187879D01*

+X262309Y187364D01*

+X261956Y186787D01*

+X261697Y186162D01*

+X261539Y185504D01*

+X261486Y184829D01*

+X261539Y184154D01*

+X261697Y183496D01*

+X261956Y182871D01*

+X262309Y182294D01*

+X262749Y181779D01*

+X263264Y181339D01*

+X263438Y181233D01*

+Y178425D01*

+X263264Y178319D01*

+X262749Y177879D01*

+X262309Y177364D01*

+X261956Y176787D01*

+X261697Y176162D01*

+X261539Y175504D01*

+X261486Y174829D01*

+X261539Y174154D01*

+X261697Y173496D01*

+X261956Y172871D01*

+X262309Y172294D01*

+X262749Y171779D01*

+X263264Y171339D01*

+X263438Y171233D01*

+Y97000D01*

+G37*

+G36*

+X260565D02*X255792D01*

+Y170516D01*

+X255799Y170516D01*

+X256474Y170569D01*

+X257132Y170727D01*

+X257757Y170986D01*

+X258334Y171339D01*

+X258849Y171779D01*

+X259289Y172294D01*

+X259642Y172871D01*

+X259901Y173496D01*

+X260059Y174154D01*

+X260099Y174829D01*

+X260059Y175504D01*

+X259901Y176162D01*

+X259642Y176787D01*

+X259289Y177364D01*

+X258849Y177879D01*

+X258334Y178319D01*

+X257757Y178672D01*

+X257132Y178931D01*

+X256474Y179089D01*

+X255799Y179142D01*

+X255792Y179142D01*

+Y180516D01*

+X255799Y180516D01*

+X256474Y180569D01*

+X257132Y180727D01*

+X257757Y180986D01*

+X258334Y181339D01*

+X258849Y181779D01*

+X259289Y182294D01*

+X259642Y182871D01*

+X259901Y183496D01*

+X260059Y184154D01*

+X260099Y184829D01*

+X260059Y185504D01*

+X259901Y186162D01*

+X259642Y186787D01*

+X259289Y187364D01*

+X258849Y187879D01*

+X258334Y188319D01*

+X257757Y188672D01*

+X257132Y188931D01*

+X256474Y189089D01*

+X255799Y189142D01*

+X255792Y189142D01*

+Y296570D01*

+X255949Y296665D01*

+X256194Y296875D01*

+X256404Y297120D01*

+X256572Y297395D01*

+X256696Y297694D01*

+X256771Y298007D01*

+X256790Y298329D01*

+X256771Y298651D01*

+X256696Y298964D01*

+X256572Y299263D01*

+X256404Y299538D01*

+X256194Y299783D01*

+X255949Y299993D01*

+X255792Y300088D01*

+Y360516D01*

+X255799Y360516D01*

+X256474Y360569D01*

+X257132Y360727D01*

+X257757Y360986D01*

+X258334Y361339D01*

+X258849Y361779D01*

+X259289Y362294D01*

+X259642Y362871D01*

+X259901Y363496D01*

+X260059Y364154D01*

+X260099Y364829D01*

+X260059Y365504D01*

+X259901Y366162D01*

+X259642Y366787D01*

+X259289Y367364D01*

+X258849Y367879D01*

+X258334Y368319D01*

+X257757Y368672D01*

+X257132Y368931D01*

+X256474Y369089D01*

+X255799Y369142D01*

+X255792Y369142D01*

+Y370516D01*

+X255799Y370516D01*

+X256474Y370569D01*

+X257132Y370727D01*

+X257757Y370986D01*

+X258334Y371339D01*

+X258849Y371779D01*

+X259289Y372294D01*

+X259642Y372871D01*

+X259901Y373496D01*

+X260059Y374154D01*

+X260099Y374829D01*

+X260059Y375504D01*

+X259901Y376162D01*

+X259642Y376787D01*

+X259289Y377364D01*

+X258849Y377879D01*

+X258334Y378319D01*

+X257757Y378672D01*

+X257132Y378931D01*

+X256474Y379089D01*

+X255799Y379142D01*

+X255792Y379142D01*

+Y397000D01*

+X260565D01*

+Y318802D01*

+X260286Y318780D01*

+X260010Y318714D01*

+X259748Y318606D01*

+X259507Y318458D01*

+X259291Y318274D01*

+X259107Y318058D01*

+X258959Y317817D01*

+X258851Y317555D01*

+X258785Y317279D01*

+X258762Y316997D01*

+X258785Y316715D01*

+X258851Y316439D01*

+X258959Y316177D01*

+X259107Y315936D01*

+X259291Y315720D01*

+X259507Y315536D01*

+X259748Y315388D01*

+X260010Y315280D01*

+X260286Y315214D01*

+X260565Y315192D01*

+Y308904D01*

+X260441Y308828D01*

+X260225Y308644D01*

+X260041Y308428D01*

+X259893Y308187D01*

+X259785Y307925D01*

+X259719Y307649D01*

+X259696Y307367D01*

+X259719Y307085D01*

+X259785Y306809D01*

+X259893Y306547D01*

+X260041Y306306D01*

+X260225Y306090D01*

+X260441Y305906D01*

+X260565Y305830D01*

+Y286288D01*

+X260341Y286305D01*

+X260019Y286280D01*

+X259706Y286205D01*

+X259407Y286081D01*

+X259132Y285913D01*

+X258887Y285703D01*

+X258677Y285458D01*

+X258509Y285183D01*

+X258385Y284884D01*

+X258310Y284571D01*

+X258285Y284249D01*

+X258310Y283927D01*

+X258385Y283614D01*

+X258509Y283315D01*

+X258677Y283040D01*

+X258887Y282795D01*

+X259132Y282585D01*

+X259407Y282417D01*

+X259706Y282293D01*

+X260019Y282218D01*

+X260341Y282193D01*

+X260565Y282210D01*

+Y193261D01*

+X260383Y193217D01*

+X260121Y193109D01*

+X259880Y192961D01*

+X259664Y192777D01*

+X259480Y192561D01*

+X259332Y192320D01*

+X259224Y192058D01*

+X259158Y191782D01*

+X259135Y191500D01*

+X259158Y191218D01*

+X259224Y190942D01*

+X259332Y190680D01*

+X259480Y190439D01*

+X259664Y190223D01*

+X259880Y190039D01*

+X260121Y189891D01*

+X260383Y189783D01*

+X260565Y189739D01*

+Y97000D01*

+G37*

+G36*

+X253098Y181481D02*X253264Y181339D01*

+X253841Y180986D01*

+X254466Y180727D01*

+X255124Y180569D01*

+X255792Y180516D01*

+Y179142D01*

+X255124Y179089D01*

+X254466Y178931D01*

+X253841Y178672D01*

+X253264Y178319D01*

+X253098Y178177D01*

+Y181481D01*

+G37*

+G36*

+Y297095D02*X253286Y296875D01*

+X253531Y296665D01*

+X253806Y296497D01*

+X254105Y296373D01*

+X254418Y296298D01*

+X254740Y296273D01*

+X255062Y296298D01*

+X255375Y296373D01*

+X255674Y296497D01*

+X255792Y296570D01*

+Y189142D01*

+X255124Y189089D01*

+X254466Y188931D01*

+X253841Y188672D01*

+X253264Y188319D01*

+X253098Y188177D01*

+Y209121D01*

+X253218Y209223D01*

+X253402Y209439D01*

+X253550Y209680D01*

+X253658Y209942D01*

+X253724Y210218D01*

+X253741Y210500D01*

+X253724Y210782D01*

+X253658Y211058D01*

+X253550Y211320D01*

+X253402Y211561D01*

+X253218Y211777D01*

+X253098Y211879D01*

+Y259780D01*

+X253101Y259780D01*

+X253423Y259805D01*

+X253736Y259880D01*

+X254035Y260004D01*

+X254310Y260172D01*

+X254555Y260382D01*

+X254765Y260627D01*

+X254933Y260902D01*

+X255057Y261201D01*

+X255132Y261514D01*

+X255151Y261836D01*

+X255132Y262158D01*

+X255057Y262471D01*

+X254933Y262770D01*

+X254765Y263045D01*

+X254555Y263290D01*

+X254310Y263500D01*

+X254035Y263668D01*

+X253736Y263792D01*

+X253423Y263867D01*

+X253101Y263892D01*

+X253098Y263892D01*

+Y297095D01*

+G37*

+G36*

+Y361481D02*X253264Y361339D01*

+X253841Y360986D01*

+X254466Y360727D01*

+X255124Y360569D01*

+X255792Y360516D01*

+Y300088D01*

+X255674Y300161D01*

+X255375Y300285D01*

+X255062Y300360D01*

+X254740Y300385D01*

+X254418Y300360D01*

+X254105Y300285D01*

+X253806Y300161D01*

+X253531Y299993D01*

+X253286Y299783D01*

+X253098Y299563D01*

+Y361481D01*

+G37*

+G36*

+Y371481D02*X253264Y371339D01*

+X253841Y370986D01*

+X254466Y370727D01*

+X255124Y370569D01*

+X255792Y370516D01*

+Y369142D01*

+X255124Y369089D01*

+X254466Y368931D01*

+X253841Y368672D01*

+X253264Y368319D01*

+X253098Y368177D01*

+Y371481D01*

+G37*

+G36*

+Y397000D02*X255792D01*

+Y379142D01*

+X255124Y379089D01*

+X254466Y378931D01*

+X253841Y378672D01*

+X253264Y378319D01*

+X253098Y378177D01*

+Y397000D01*

+G37*

+G36*

+X255792Y97000D02*X253098D01*

+Y171481D01*

+X253264Y171339D01*

+X253841Y170986D01*

+X254466Y170727D01*

+X255124Y170569D01*

+X255792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X250938Y397000D02*X253098D01*

+Y378177D01*

+X252749Y377879D01*

+X252309Y377364D01*

+X251956Y376787D01*

+X251697Y376162D01*

+X251539Y375504D01*

+X251486Y374829D01*

+X251539Y374154D01*

+X251697Y373496D01*

+X251956Y372871D01*

+X252309Y372294D01*

+X252749Y371779D01*

+X253098Y371481D01*

+Y368177D01*

+X252749Y367879D01*

+X252309Y367364D01*

+X251956Y366787D01*

+X251697Y366162D01*

+X251539Y365504D01*

+X251486Y364829D01*

+X251539Y364154D01*

+X251697Y363496D01*

+X251956Y362871D01*

+X252309Y362294D01*

+X252749Y361779D01*

+X253098Y361481D01*

+Y299563D01*

+X253076Y299538D01*

+X252908Y299263D01*

+X252784Y298964D01*

+X252709Y298651D01*

+X252684Y298329D01*

+X252709Y298007D01*

+X252784Y297694D01*

+X252908Y297395D01*

+X253076Y297120D01*

+X253098Y297095D01*

+Y263892D01*

+X252779Y263867D01*

+X252466Y263792D01*

+X252167Y263668D01*

+X251892Y263500D01*

+X251647Y263290D01*

+X251437Y263045D01*

+X251269Y262770D01*

+X251145Y262471D01*

+X251070Y262158D01*

+X251045Y261836D01*

+X251070Y261514D01*

+X251145Y261201D01*

+X251269Y260902D01*

+X251437Y260627D01*

+X251647Y260382D01*

+X251892Y260172D01*

+X252167Y260004D01*

+X252466Y259880D01*

+X252779Y259805D01*

+X253098Y259780D01*

+Y211879D01*

+X253002Y211961D01*

+X252761Y212109D01*

+X252499Y212217D01*

+X252223Y212283D01*

+X251941Y212306D01*

+X251659Y212283D01*

+X251383Y212217D01*

+X251121Y212109D01*

+X250938Y211997D01*

+Y227695D01*

+X250941Y227694D01*

+X251223Y227717D01*

+X251499Y227783D01*

+X251761Y227891D01*

+X252002Y228039D01*

+X252218Y228223D01*

+X252402Y228439D01*

+X252550Y228680D01*

+X252658Y228942D01*

+X252724Y229218D01*

+X252741Y229500D01*

+X252724Y229782D01*

+X252658Y230058D01*

+X252550Y230320D01*

+X252402Y230561D01*

+X252218Y230777D01*

+X252002Y230961D01*

+X251761Y231109D01*

+X251499Y231217D01*

+X251223Y231283D01*

+X250941Y231306D01*

+X250938Y231305D01*

+Y397000D01*

+G37*

+G36*

+X253098Y97000D02*X250938D01*

+Y209003D01*

+X251121Y208891D01*

+X251383Y208783D01*

+X251659Y208717D01*

+X251941Y208694D01*

+X252223Y208717D01*

+X252499Y208783D01*

+X252761Y208891D01*

+X253002Y209039D01*

+X253098Y209121D01*

+Y188177D01*

+X252749Y187879D01*

+X252309Y187364D01*

+X251956Y186787D01*

+X251697Y186162D01*

+X251539Y185504D01*

+X251486Y184829D01*

+X251539Y184154D01*

+X251697Y183496D01*

+X251956Y182871D01*

+X252309Y182294D01*

+X252749Y181779D01*

+X253098Y181481D01*

+Y178177D01*

+X252749Y177879D01*

+X252309Y177364D01*

+X251956Y176787D01*

+X251697Y176162D01*

+X251539Y175504D01*

+X251486Y174829D01*

+X251539Y174154D01*

+X251697Y173496D01*

+X251956Y172871D01*

+X252309Y172294D01*

+X252749Y171779D01*

+X253098Y171481D01*

+Y97000D01*

+G37*

+G36*

+X250938D02*X249098D01*

+Y172071D01*

+X249289Y172294D01*

+X249642Y172871D01*

+X249901Y173496D01*

+X250059Y174154D01*

+X250099Y174829D01*

+X250059Y175504D01*

+X249901Y176162D01*

+X249642Y176787D01*

+X249289Y177364D01*

+X249098Y177587D01*

+Y182071D01*

+X249289Y182294D01*

+X249642Y182871D01*

+X249901Y183496D01*

+X250059Y184154D01*

+X250099Y184829D01*

+X250059Y185504D01*

+X249901Y186162D01*

+X249642Y186787D01*

+X249289Y187364D01*

+X249098Y187587D01*

+Y326988D01*

+X249101Y326987D01*

+X249383Y327010D01*

+X249659Y327076D01*

+X249921Y327184D01*

+X250162Y327332D01*

+X250378Y327516D01*

+X250562Y327732D01*

+X250710Y327973D01*

+X250818Y328235D01*

+X250884Y328511D01*

+X250901Y328793D01*

+X250884Y329075D01*

+X250818Y329351D01*

+X250710Y329613D01*

+X250562Y329854D01*

+X250378Y330070D01*

+X250162Y330254D01*

+X249921Y330402D01*

+X249659Y330510D01*

+X249383Y330576D01*

+X249101Y330599D01*

+X249098Y330598D01*

+Y362071D01*

+X249289Y362294D01*

+X249642Y362871D01*

+X249901Y363496D01*

+X250059Y364154D01*

+X250099Y364829D01*

+X250059Y365504D01*

+X249901Y366162D01*

+X249642Y366787D01*

+X249289Y367364D01*

+X249098Y367587D01*

+Y372071D01*

+X249289Y372294D01*

+X249642Y372871D01*

+X249901Y373496D01*

+X250059Y374154D01*

+X250099Y374829D01*

+X250059Y375504D01*

+X249901Y376162D01*

+X249642Y376787D01*

+X249289Y377364D01*

+X249098Y377587D01*

+Y397000D01*

+X250938D01*

+Y231305D01*

+X250659Y231283D01*

+X250383Y231217D01*

+X250121Y231109D01*

+X249880Y230961D01*

+X249664Y230777D01*

+X249480Y230561D01*

+X249332Y230320D01*

+X249224Y230058D01*

+X249158Y229782D01*

+X249135Y229500D01*

+X249158Y229218D01*

+X249224Y228942D01*

+X249332Y228680D01*

+X249480Y228439D01*

+X249664Y228223D01*

+X249880Y228039D01*

+X250121Y227891D01*

+X250383Y227783D01*

+X250659Y227717D01*

+X250938Y227695D01*

+Y211997D01*

+X250880Y211961D01*

+X250664Y211777D01*

+X250480Y211561D01*

+X250332Y211320D01*

+X250224Y211058D01*

+X250158Y210782D01*

+X250135Y210500D01*

+X250158Y210218D01*

+X250224Y209942D01*

+X250332Y209680D01*

+X250480Y209439D01*

+X250664Y209223D01*

+X250880Y209039D01*

+X250938Y209003D01*

+Y97000D01*

+G37*

+G36*

+X249098Y377587D02*X248849Y377879D01*

+X248334Y378319D01*

+X247757Y378672D01*

+X247132Y378931D01*

+X246474Y379089D01*

+X245799Y379142D01*

+X245792Y379142D01*

+Y397000D01*

+X249098D01*

+Y377587D01*

+G37*

+G36*

+Y367587D02*X248849Y367879D01*

+X248334Y368319D01*

+X247757Y368672D01*

+X247132Y368931D01*

+X246474Y369089D01*

+X245799Y369142D01*

+X245792Y369142D01*

+Y370516D01*

+X245799Y370516D01*

+X246474Y370569D01*

+X247132Y370727D01*

+X247757Y370986D01*

+X248334Y371339D01*

+X248849Y371779D01*

+X249098Y372071D01*

+Y367587D01*

+G37*

+G36*

+Y187587D02*X248849Y187879D01*

+X248334Y188319D01*

+X247757Y188672D01*

+X247132Y188931D01*

+X246474Y189089D01*

+X245799Y189142D01*

+X245792Y189142D01*

+Y189724D01*

+X245863Y189718D01*

+X246145Y189741D01*

+X246421Y189807D01*

+X246683Y189915D01*

+X246924Y190063D01*

+X247140Y190247D01*

+X247324Y190463D01*

+X247472Y190704D01*

+X247580Y190966D01*

+X247646Y191242D01*

+X247663Y191524D01*

+X247646Y191806D01*

+X247580Y192082D01*

+X247472Y192344D01*

+X247324Y192585D01*

+X247140Y192801D01*

+X246924Y192985D01*

+X246683Y193133D01*

+X246421Y193241D01*

+X246145Y193307D01*

+X245863Y193330D01*

+X245792Y193324D01*

+Y227820D01*

+X245883Y227783D01*

+X246159Y227717D01*

+X246441Y227694D01*

+X246723Y227717D01*

+X246999Y227783D01*

+X247261Y227891D01*

+X247502Y228039D01*

+X247718Y228223D01*

+X247902Y228439D01*

+X248050Y228680D01*

+X248158Y228942D01*

+X248224Y229218D01*

+X248241Y229500D01*

+X248224Y229782D01*

+X248158Y230058D01*

+X248050Y230320D01*

+X247902Y230561D01*

+X247718Y230777D01*

+X247502Y230961D01*

+X247261Y231109D01*

+X246999Y231217D01*

+X246723Y231283D01*

+X246441Y231306D01*

+X246159Y231283D01*

+X245883Y231217D01*

+X245792Y231180D01*

+Y236614D01*

+X245880Y236539D01*

+X246121Y236391D01*

+X246383Y236283D01*

+X246659Y236217D01*

+X246941Y236194D01*

+X247223Y236217D01*

+X247499Y236283D01*

+X247761Y236391D01*

+X248002Y236539D01*

+X248218Y236723D01*

+X248402Y236939D01*

+X248550Y237180D01*

+X248658Y237442D01*

+X248724Y237718D01*

+X248741Y238000D01*

+X248724Y238282D01*

+X248658Y238558D01*

+X248550Y238820D01*

+X248402Y239061D01*

+X248218Y239277D01*

+X248002Y239461D01*

+X247761Y239609D01*

+X247499Y239717D01*

+X247223Y239783D01*

+X246941Y239806D01*

+X246659Y239783D01*

+X246383Y239717D01*

+X246121Y239609D01*

+X245880Y239461D01*

+X245792Y239386D01*

+Y277470D01*

+X245879Y277477D01*

+X246192Y277552D01*

+X246491Y277676D01*

+X246766Y277844D01*

+X247011Y278054D01*

+X247221Y278299D01*

+X247389Y278574D01*

+X247513Y278873D01*

+X247588Y279186D01*

+X247607Y279508D01*

+X247588Y279830D01*

+X247513Y280143D01*

+X247389Y280442D01*

+X247221Y280717D01*

+X247011Y280962D01*

+X246766Y281172D01*

+X246491Y281340D01*

+X246192Y281464D01*

+X245879Y281539D01*

+X245792Y281546D01*

+Y301495D01*

+X245911Y301422D01*

+X246173Y301314D01*

+X246449Y301248D01*

+X246731Y301225D01*

+X247013Y301248D01*

+X247289Y301314D01*

+X247551Y301422D01*

+X247792Y301570D01*

+X248008Y301754D01*

+X248192Y301970D01*

+X248340Y302211D01*

+X248448Y302473D01*

+X248514Y302749D01*

+X248531Y303031D01*

+X248514Y303313D01*

+X248448Y303589D01*

+X248340Y303851D01*

+X248192Y304092D01*

+X248008Y304308D01*

+X247792Y304492D01*

+X247551Y304640D01*

+X247289Y304748D01*

+X247013Y304814D01*

+X246731Y304837D01*

+X246449Y304814D01*

+X246173Y304748D01*

+X245911Y304640D01*

+X245792Y304567D01*

+Y360516D01*

+X245799Y360516D01*

+X246474Y360569D01*

+X247132Y360727D01*

+X247757Y360986D01*

+X248334Y361339D01*

+X248849Y361779D01*

+X249098Y362071D01*

+Y330598D01*

+X248819Y330576D01*

+X248543Y330510D01*

+X248281Y330402D01*

+X248040Y330254D01*

+X247824Y330070D01*

+X247640Y329854D01*

+X247492Y329613D01*

+X247384Y329351D01*

+X247318Y329075D01*

+X247295Y328793D01*

+X247318Y328511D01*

+X247384Y328235D01*

+X247492Y327973D01*

+X247640Y327732D01*

+X247824Y327516D01*

+X248040Y327332D01*

+X248281Y327184D01*

+X248543Y327076D01*

+X248819Y327010D01*

+X249098Y326988D01*

+Y187587D01*

+G37*

+G36*

+Y177587D02*X248849Y177879D01*

+X248334Y178319D01*

+X247757Y178672D01*

+X247132Y178931D01*

+X246474Y179089D01*

+X245799Y179142D01*

+X245792Y179142D01*

+Y180516D01*

+X245799Y180516D01*

+X246474Y180569D01*

+X247132Y180727D01*

+X247757Y180986D01*

+X248334Y181339D01*

+X248849Y181779D01*

+X249098Y182071D01*

+Y177587D01*

+G37*

+G36*

+Y97000D02*X245792D01*

+Y125733D01*

+X245999Y125783D01*

+X246261Y125891D01*

+X246502Y126039D01*

+X246718Y126223D01*

+X246902Y126439D01*

+X247050Y126680D01*

+X247158Y126942D01*

+X247224Y127218D01*

+X247241Y127500D01*

+X247224Y127782D01*

+X247158Y128058D01*

+X247050Y128320D01*

+X246902Y128561D01*

+X246718Y128777D01*

+X246502Y128961D01*

+X246261Y129109D01*

+X245999Y129217D01*

+X245792Y129267D01*

+Y170516D01*

+X245799Y170516D01*

+X246474Y170569D01*

+X247132Y170727D01*

+X247757Y170986D01*

+X248334Y171339D01*

+X248849Y171779D01*

+X249098Y172071D01*

+Y97000D01*

+G37*

+G36*

+X242438Y182143D02*X242749Y181779D01*

+X243264Y181339D01*

+X243841Y180986D01*

+X244466Y180727D01*

+X245124Y180569D01*

+X245792Y180516D01*

+Y179142D01*

+X245124Y179089D01*

+X244466Y178931D01*

+X243841Y178672D01*

+X243264Y178319D01*

+X242749Y177879D01*

+X242438Y177515D01*

+Y182143D01*

+G37*

+G36*

+Y362143D02*X242749Y361779D01*

+X243264Y361339D01*

+X243841Y360986D01*

+X244466Y360727D01*

+X245124Y360569D01*

+X245792Y360516D01*

+Y304567D01*

+X245670Y304492D01*

+X245454Y304308D01*

+X245270Y304092D01*

+X245122Y303851D01*

+X245014Y303589D01*

+X244948Y303313D01*

+X244925Y303031D01*

+X244948Y302749D01*

+X245014Y302473D01*

+X245122Y302211D01*

+X245270Y301970D01*

+X245454Y301754D01*

+X245670Y301570D01*

+X245792Y301495D01*

+Y281546D01*

+X245557Y281564D01*

+X245235Y281539D01*

+X244922Y281464D01*

+X244623Y281340D01*

+X244348Y281172D01*

+X244103Y280962D01*

+X243893Y280717D01*

+X243725Y280442D01*

+X243601Y280143D01*

+X243526Y279830D01*

+X243501Y279508D01*

+X243526Y279186D01*

+X243601Y278873D01*

+X243725Y278574D01*

+X243893Y278299D01*

+X244103Y278054D01*

+X244348Y277844D01*

+X244623Y277676D01*

+X244922Y277552D01*

+X245235Y277477D01*

+X245557Y277452D01*

+X245792Y277470D01*

+Y239386D01*

+X245664Y239277D01*

+X245480Y239061D01*

+X245332Y238820D01*

+X245224Y238558D01*

+X245158Y238282D01*

+X245135Y238000D01*

+X245158Y237718D01*

+X245224Y237442D01*

+X245332Y237180D01*

+X245480Y236939D01*

+X245664Y236723D01*

+X245792Y236614D01*

+Y231180D01*

+X245621Y231109D01*

+X245380Y230961D01*

+X245164Y230777D01*

+X244980Y230561D01*

+X244832Y230320D01*

+X244724Y230058D01*

+X244658Y229782D01*

+X244635Y229500D01*

+X244658Y229218D01*

+X244724Y228942D01*

+X244832Y228680D01*

+X244980Y228439D01*

+X245164Y228223D01*

+X245380Y228039D01*

+X245621Y227891D01*

+X245792Y227820D01*

+Y193324D01*

+X245581Y193307D01*

+X245305Y193241D01*

+X245043Y193133D01*

+X244802Y192985D01*

+X244586Y192801D01*

+X244402Y192585D01*

+X244254Y192344D01*

+X244146Y192082D01*

+X244080Y191806D01*

+X244057Y191524D01*

+X244080Y191242D01*

+X244146Y190966D01*

+X244254Y190704D01*

+X244402Y190463D01*

+X244586Y190247D01*

+X244802Y190063D01*

+X245043Y189915D01*

+X245305Y189807D01*

+X245581Y189741D01*

+X245792Y189724D01*

+Y189142D01*

+X245124Y189089D01*

+X244466Y188931D01*

+X243841Y188672D01*

+X243264Y188319D01*

+X242749Y187879D01*

+X242438Y187515D01*

+Y201007D01*

+X242480Y200939D01*

+X242664Y200723D01*

+X242880Y200539D01*

+X243121Y200391D01*

+X243383Y200283D01*

+X243659Y200217D01*

+X243941Y200194D01*

+X244223Y200217D01*

+X244499Y200283D01*

+X244761Y200391D01*

+X245002Y200539D01*

+X245218Y200723D01*

+X245402Y200939D01*

+X245550Y201180D01*

+X245658Y201442D01*

+X245724Y201718D01*

+X245741Y202000D01*

+X245724Y202282D01*

+X245658Y202558D01*

+X245550Y202820D01*

+X245402Y203061D01*

+X245218Y203277D01*

+X245002Y203461D01*

+X244761Y203609D01*

+X244499Y203717D01*

+X244223Y203783D01*

+X243941Y203806D01*

+X243659Y203783D01*

+X243383Y203717D01*

+X243121Y203609D01*

+X242880Y203461D01*

+X242664Y203277D01*

+X242480Y203061D01*

+X242438Y202993D01*

+Y227695D01*

+X242441Y227694D01*

+X242723Y227717D01*

+X242999Y227783D01*

+X243261Y227891D01*

+X243502Y228039D01*

+X243718Y228223D01*

+X243902Y228439D01*

+X244050Y228680D01*

+X244158Y228942D01*

+X244224Y229218D01*

+X244241Y229500D01*

+X244224Y229782D01*

+X244158Y230058D01*

+X244050Y230320D01*

+X243902Y230561D01*

+X243718Y230777D01*

+X243502Y230961D01*

+X243261Y231109D01*

+X242999Y231217D01*

+X242723Y231283D01*

+X242441Y231306D01*

+X242438Y231305D01*

+Y291488D01*

+X242456Y291487D01*

+X242778Y291512D01*

+X243091Y291587D01*

+X243390Y291711D01*

+X243665Y291879D01*

+X243910Y292089D01*

+X244120Y292334D01*

+X244288Y292609D01*

+X244412Y292908D01*

+X244487Y293221D01*

+X244506Y293543D01*

+X244487Y293865D01*

+X244412Y294178D01*

+X244288Y294477D01*

+X244120Y294752D01*

+X243910Y294997D01*

+X243665Y295207D01*

+X243390Y295375D01*

+X243091Y295499D01*

+X242778Y295574D01*

+X242456Y295599D01*

+X242438Y295598D01*

+Y296765D01*

+X242490Y296769D01*

+X242803Y296844D01*

+X243102Y296968D01*

+X243377Y297136D01*

+X243622Y297346D01*

+X243832Y297591D01*

+X244000Y297866D01*

+X244124Y298165D01*

+X244199Y298478D01*

+X244218Y298800D01*

+X244199Y299122D01*

+X244124Y299435D01*

+X244000Y299734D01*

+X243832Y300009D01*

+X243622Y300254D01*

+X243377Y300464D01*

+X243102Y300632D01*

+X242803Y300756D01*

+X242490Y300831D01*

+X242438Y300835D01*

+Y362143D01*

+G37*

+G36*

+Y372143D02*X242749Y371779D01*

+X243264Y371339D01*

+X243841Y370986D01*

+X244466Y370727D01*

+X245124Y370569D01*

+X245792Y370516D01*

+Y369142D01*

+X245124Y369089D01*

+X244466Y368931D01*

+X243841Y368672D01*

+X243264Y368319D01*

+X242749Y367879D01*

+X242438Y367515D01*

+Y372143D01*

+G37*

+G36*

+Y397000D02*X245792D01*

+Y379142D01*

+X245124Y379089D01*

+X244466Y378931D01*

+X243841Y378672D01*

+X243264Y378319D01*

+X242749Y377879D01*

+X242438Y377515D01*

+Y397000D01*

+G37*

+G36*

+X245792Y97000D02*X242438D01*

+Y172143D01*

+X242749Y171779D01*

+X243264Y171339D01*

+X243841Y170986D01*

+X244466Y170727D01*

+X245124Y170569D01*

+X245792Y170516D01*

+Y129267D01*

+X245723Y129283D01*

+X245441Y129306D01*

+X245159Y129283D01*

+X244883Y129217D01*

+X244621Y129109D01*

+X244380Y128961D01*

+X244164Y128777D01*

+X243980Y128561D01*

+X243832Y128320D01*

+X243724Y128058D01*

+X243658Y127782D01*

+X243635Y127500D01*

+X243658Y127218D01*

+X243724Y126942D01*

+X243832Y126680D01*

+X243980Y126439D01*

+X244164Y126223D01*

+X244380Y126039D01*

+X244621Y125891D01*

+X244883Y125783D01*

+X245159Y125717D01*

+X245441Y125694D01*

+X245723Y125717D01*

+X245792Y125733D01*

+Y97000D01*

+G37*

+G36*

+X242438D02*X239299D01*

+Y172311D01*

+X239642Y172871D01*

+X239901Y173496D01*

+X240059Y174154D01*

+X240099Y174829D01*

+X240059Y175504D01*

+X239901Y176162D01*

+X239642Y176787D01*

+X239299Y177347D01*

+Y182311D01*

+X239642Y182871D01*

+X239901Y183496D01*

+X240059Y184154D01*

+X240099Y184829D01*

+X240059Y185504D01*

+X239901Y186162D01*

+X239642Y186787D01*

+X239299Y187347D01*

+Y194811D01*

+X239642Y195371D01*

+X239901Y195996D01*

+X240059Y196654D01*

+X240099Y197329D01*

+X240059Y198004D01*

+X239901Y198662D01*

+X239642Y199287D01*

+X239299Y199847D01*

+Y260179D01*

+X239302Y260179D01*

+X239624Y260204D01*

+X239937Y260279D01*

+X240236Y260403D01*

+X240511Y260571D01*

+X240756Y260781D01*

+X240966Y261026D01*

+X241134Y261301D01*

+X241258Y261600D01*

+X241333Y261913D01*

+X241352Y262235D01*

+X241333Y262557D01*

+X241258Y262870D01*

+X241134Y263169D01*

+X240966Y263444D01*

+X240756Y263689D01*

+X240511Y263899D01*

+X240236Y264067D01*

+X239937Y264191D01*

+X239624Y264266D01*

+X239302Y264291D01*

+X239299Y264291D01*

+Y277130D01*

+X239330Y277103D01*

+X239571Y276955D01*

+X239833Y276847D01*

+X240109Y276781D01*

+X240391Y276758D01*

+X240673Y276781D01*

+X240949Y276847D01*

+X241211Y276955D01*

+X241452Y277103D01*

+X241668Y277287D01*

+X241852Y277503D01*

+X242000Y277744D01*

+X242108Y278006D01*

+X242174Y278282D01*

+X242191Y278564D01*

+X242174Y278846D01*

+X242108Y279122D01*

+X242000Y279384D01*

+X241852Y279625D01*

+X241668Y279841D01*

+X241452Y280025D01*

+X241211Y280173D01*

+X240949Y280281D01*

+X240673Y280347D01*

+X240391Y280370D01*

+X240109Y280347D01*

+X239833Y280281D01*

+X239571Y280173D01*

+X239330Y280025D01*

+X239299Y279998D01*

+Y362311D01*

+X239642Y362871D01*

+X239901Y363496D01*

+X240059Y364154D01*

+X240099Y364829D01*

+X240059Y365504D01*

+X239901Y366162D01*

+X239642Y366787D01*

+X239299Y367347D01*

+Y372311D01*

+X239642Y372871D01*

+X239901Y373496D01*

+X240059Y374154D01*

+X240099Y374829D01*

+X240059Y375504D01*

+X239901Y376162D01*

+X239642Y376787D01*

+X239299Y377347D01*

+Y397000D01*

+X242438D01*

+Y377515D01*

+X242309Y377364D01*

+X241956Y376787D01*

+X241697Y376162D01*

+X241539Y375504D01*

+X241486Y374829D01*

+X241539Y374154D01*

+X241697Y373496D01*

+X241956Y372871D01*

+X242309Y372294D01*

+X242438Y372143D01*

+Y367515D01*

+X242309Y367364D01*

+X241956Y366787D01*

+X241697Y366162D01*

+X241539Y365504D01*

+X241486Y364829D01*

+X241539Y364154D01*

+X241697Y363496D01*

+X241956Y362871D01*

+X242309Y362294D01*

+X242438Y362143D01*

+Y300835D01*

+X242168Y300856D01*

+X241846Y300831D01*

+X241533Y300756D01*

+X241234Y300632D01*

+X240959Y300464D01*

+X240714Y300254D01*

+X240504Y300009D01*

+X240336Y299734D01*

+X240212Y299435D01*

+X240137Y299122D01*

+X240112Y298800D01*

+X240137Y298478D01*

+X240212Y298165D01*

+X240336Y297866D01*

+X240504Y297591D01*

+X240714Y297346D01*

+X240959Y297136D01*

+X241234Y296968D01*

+X241533Y296844D01*

+X241846Y296769D01*

+X242168Y296744D01*

+X242438Y296765D01*

+Y295598D01*

+X242134Y295574D01*

+X241821Y295499D01*

+X241522Y295375D01*

+X241247Y295207D01*

+X241002Y294997D01*

+X240792Y294752D01*

+X240624Y294477D01*

+X240500Y294178D01*

+X240425Y293865D01*

+X240400Y293543D01*

+X240425Y293221D01*

+X240500Y292908D01*

+X240624Y292609D01*

+X240792Y292334D01*

+X241002Y292089D01*

+X241247Y291879D01*

+X241522Y291711D01*

+X241821Y291587D01*

+X242134Y291512D01*

+X242438Y291488D01*

+Y231305D01*

+X242159Y231283D01*

+X241883Y231217D01*

+X241621Y231109D01*

+X241380Y230961D01*

+X241164Y230777D01*

+X240980Y230561D01*

+X240832Y230320D01*

+X240724Y230058D01*

+X240658Y229782D01*

+X240635Y229500D01*

+X240658Y229218D01*

+X240724Y228942D01*

+X240832Y228680D01*

+X240980Y228439D01*

+X241164Y228223D01*

+X241380Y228039D01*

+X241621Y227891D01*

+X241883Y227783D01*

+X242159Y227717D01*

+X242438Y227695D01*

+Y202993D01*

+X242332Y202820D01*

+X242224Y202558D01*

+X242158Y202282D01*

+X242135Y202000D01*

+X242158Y201718D01*

+X242224Y201442D01*

+X242332Y201180D01*

+X242438Y201007D01*

+Y187515D01*

+X242309Y187364D01*

+X241956Y186787D01*

+X241697Y186162D01*

+X241539Y185504D01*

+X241486Y184829D01*

+X241539Y184154D01*

+X241697Y183496D01*

+X241956Y182871D01*

+X242309Y182294D01*

+X242438Y182143D01*

+Y177515D01*

+X242309Y177364D01*

+X241956Y176787D01*

+X241697Y176162D01*

+X241539Y175504D01*

+X241486Y174829D01*

+X241539Y174154D01*

+X241697Y173496D01*

+X241956Y172871D01*

+X242309Y172294D01*

+X242438Y172143D01*

+Y97000D01*

+G37*

+G36*

+X239299Y377347D02*X239289Y377364D01*

+X238849Y377879D01*

+X238334Y378319D01*

+X237757Y378672D01*

+X237132Y378931D01*

+X236474Y379089D01*

+X235799Y379142D01*

+X235792Y379142D01*

+Y397000D01*

+X239299D01*

+Y377347D01*

+G37*

+G36*

+Y367347D02*X239289Y367364D01*

+X238849Y367879D01*

+X238334Y368319D01*

+X237757Y368672D01*

+X237132Y368931D01*

+X236474Y369089D01*

+X235799Y369142D01*

+X235792Y369142D01*

+Y370516D01*

+X235799Y370516D01*

+X236474Y370569D01*

+X237132Y370727D01*

+X237757Y370986D01*

+X238334Y371339D01*

+X238849Y371779D01*

+X239289Y372294D01*

+X239299Y372311D01*

+Y367347D01*

+G37*

+G36*

+Y199847D02*X239289Y199864D01*

+X238849Y200379D01*

+X238334Y200819D01*

+X237757Y201172D01*

+X237132Y201431D01*

+X236474Y201589D01*

+X235799Y201642D01*

+X235792Y201642D01*

+Y233820D01*

+X235883Y233783D01*

+X236159Y233717D01*

+X236441Y233694D01*

+X236723Y233717D01*

+X236999Y233783D01*

+X237261Y233891D01*

+X237502Y234039D01*

+X237718Y234223D01*

+X237902Y234439D01*

+X238050Y234680D01*

+X238158Y234942D01*

+X238224Y235218D01*

+X238241Y235500D01*

+X238224Y235782D01*

+X238158Y236058D01*

+X238050Y236320D01*

+X237902Y236561D01*

+X237718Y236777D01*

+X237502Y236961D01*

+X237261Y237109D01*

+X236999Y237217D01*

+X236723Y237283D01*

+X236441Y237306D01*

+X236159Y237283D01*

+X235883Y237217D01*

+X235792Y237180D01*

+Y360516D01*

+X235799Y360516D01*

+X236474Y360569D01*

+X237132Y360727D01*

+X237757Y360986D01*

+X238334Y361339D01*

+X238849Y361779D01*

+X239289Y362294D01*

+X239299Y362311D01*

+Y279998D01*

+X239114Y279841D01*

+X238930Y279625D01*

+X238782Y279384D01*

+X238674Y279122D01*

+X238608Y278846D01*

+X238585Y278564D01*

+X238608Y278282D01*

+X238674Y278006D01*

+X238782Y277744D01*

+X238930Y277503D01*

+X239114Y277287D01*

+X239299Y277130D01*

+Y264291D01*

+X238980Y264266D01*

+X238667Y264191D01*

+X238368Y264067D01*

+X238093Y263899D01*

+X237848Y263689D01*

+X237638Y263444D01*

+X237470Y263169D01*

+X237346Y262870D01*

+X237271Y262557D01*

+X237246Y262235D01*

+X237271Y261913D01*

+X237346Y261600D01*

+X237470Y261301D01*

+X237638Y261026D01*

+X237848Y260781D01*

+X238093Y260571D01*

+X238368Y260403D01*

+X238667Y260279D01*

+X238980Y260204D01*

+X239299Y260179D01*

+Y199847D01*

+G37*

+G36*

+Y187347D02*X239289Y187364D01*

+X238849Y187879D01*

+X238334Y188319D01*

+X237757Y188672D01*

+X237132Y188931D01*

+X236474Y189089D01*

+X235799Y189142D01*

+X235792Y189142D01*

+Y193016D01*

+X235799Y193016D01*

+X236474Y193069D01*

+X237132Y193227D01*

+X237757Y193486D01*

+X238334Y193839D01*

+X238849Y194279D01*

+X239289Y194794D01*

+X239299Y194811D01*

+Y187347D01*

+G37*

+G36*

+Y177347D02*X239289Y177364D01*

+X238849Y177879D01*

+X238334Y178319D01*

+X237757Y178672D01*

+X237132Y178931D01*

+X236474Y179089D01*

+X235799Y179142D01*

+X235792Y179142D01*

+Y180516D01*

+X235799Y180516D01*

+X236474Y180569D01*

+X237132Y180727D01*

+X237757Y180986D01*

+X238334Y181339D01*

+X238849Y181779D01*

+X239289Y182294D01*

+X239299Y182311D01*

+Y177347D01*

+G37*

+G36*

+Y97000D02*X235792D01*

+Y121311D01*

+X235902Y121439D01*

+X236050Y121680D01*

+X236158Y121942D01*

+X236224Y122218D01*

+X236241Y122500D01*

+X236224Y122782D01*

+X236158Y123058D01*

+X236050Y123320D01*

+X235902Y123561D01*

+X235792Y123689D01*

+Y131206D01*

+X235941Y131194D01*

+X236223Y131217D01*

+X236499Y131283D01*

+X236761Y131391D01*

+X237002Y131539D01*

+X237218Y131723D01*

+X237402Y131939D01*

+X237550Y132180D01*

+X237658Y132442D01*

+X237724Y132718D01*

+X237741Y133000D01*

+X237724Y133282D01*

+X237658Y133558D01*

+X237550Y133820D01*

+X237402Y134061D01*

+X237218Y134277D01*

+X237002Y134461D01*

+X236761Y134609D01*

+X236499Y134717D01*

+X236223Y134783D01*

+X235941Y134806D01*

+X235792Y134794D01*

+Y170516D01*

+X235799Y170516D01*

+X236474Y170569D01*

+X237132Y170727D01*

+X237757Y170986D01*

+X238334Y171339D01*

+X238849Y171779D01*

+X239289Y172294D01*

+X239299Y172311D01*

+Y97000D01*

+G37*

+G36*

+X235792D02*X229815D01*

+Y173289D01*

+X229901Y173496D01*

+X230059Y174154D01*

+X230099Y174829D01*

+X230059Y175504D01*

+X229901Y176162D01*

+X229815Y176369D01*

+Y183289D01*

+X229901Y183496D01*

+X230059Y184154D01*

+X230099Y184829D01*

+X230059Y185504D01*

+X229901Y186162D01*

+X229815Y186369D01*

+Y195789D01*

+X229901Y195996D01*

+X230059Y196654D01*

+X230099Y197329D01*

+X230059Y198004D01*

+X229901Y198662D01*

+X229815Y198869D01*

+Y245311D01*

+X229883Y245283D01*

+X230159Y245217D01*

+X230441Y245194D01*

+X230723Y245217D01*

+X230999Y245283D01*

+X231261Y245391D01*

+X231502Y245539D01*

+X231718Y245723D01*

+X231902Y245939D01*

+X232050Y246180D01*

+X232158Y246442D01*

+X232224Y246718D01*

+X232241Y247000D01*

+X232224Y247282D01*

+X232158Y247558D01*

+X232050Y247820D01*

+X231902Y248061D01*

+X231718Y248277D01*

+X231502Y248461D01*

+X231261Y248609D01*

+X230999Y248717D01*

+X230723Y248783D01*

+X230441Y248806D01*

+X230159Y248783D01*

+X229883Y248717D01*

+X229815Y248689D01*

+Y291311D01*

+X229883Y291283D01*

+X230159Y291217D01*

+X230441Y291194D01*

+X230723Y291217D01*

+X230999Y291283D01*

+X231261Y291391D01*

+X231502Y291539D01*

+X231718Y291723D01*

+X231902Y291939D01*

+X232050Y292180D01*

+X232158Y292442D01*

+X232224Y292718D01*

+X232241Y293000D01*

+X232224Y293282D01*

+X232158Y293558D01*

+X232050Y293820D01*

+X231902Y294061D01*

+X231718Y294277D01*

+X231502Y294461D01*

+X231261Y294609D01*

+X230999Y294717D01*

+X230723Y294783D01*

+X230441Y294806D01*

+X230159Y294783D01*

+X229883Y294717D01*

+X229815Y294689D01*

+Y353183D01*

+X229818Y353182D01*

+X230100Y353205D01*

+X230376Y353271D01*

+X230638Y353379D01*

+X230879Y353527D01*

+X231095Y353711D01*

+X231279Y353927D01*

+X231427Y354168D01*

+X231535Y354430D01*

+X231601Y354706D01*

+X231618Y354988D01*

+X231601Y355270D01*

+X231535Y355546D01*

+X231427Y355808D01*

+X231279Y356049D01*

+X231095Y356265D01*

+X230879Y356449D01*

+X230638Y356597D01*

+X230376Y356705D01*

+X230100Y356771D01*

+X229818Y356794D01*

+X229815Y356793D01*

+Y363289D01*

+X229901Y363496D01*

+X230059Y364154D01*

+X230099Y364829D01*

+X230059Y365504D01*

+X229901Y366162D01*

+X229815Y366369D01*

+Y373289D01*

+X229901Y373496D01*

+X230059Y374154D01*

+X230099Y374829D01*

+X230059Y375504D01*

+X229901Y376162D01*

+X229815Y376369D01*

+Y397000D01*

+X235792D01*

+Y379142D01*

+X235124Y379089D01*

+X234466Y378931D01*

+X233841Y378672D01*

+X233264Y378319D01*

+X232749Y377879D01*

+X232309Y377364D01*

+X231956Y376787D01*

+X231697Y376162D01*

+X231539Y375504D01*

+X231486Y374829D01*

+X231539Y374154D01*

+X231697Y373496D01*

+X231956Y372871D01*

+X232309Y372294D01*

+X232749Y371779D01*

+X233264Y371339D01*

+X233841Y370986D01*

+X234466Y370727D01*

+X235124Y370569D01*

+X235792Y370516D01*

+Y369142D01*

+X235124Y369089D01*

+X234466Y368931D01*

+X233841Y368672D01*

+X233264Y368319D01*

+X232749Y367879D01*

+X232309Y367364D01*

+X231956Y366787D01*

+X231697Y366162D01*

+X231539Y365504D01*

+X231486Y364829D01*

+X231539Y364154D01*

+X231697Y363496D01*

+X231956Y362871D01*

+X232309Y362294D01*

+X232749Y361779D01*

+X233264Y361339D01*

+X233841Y360986D01*

+X234466Y360727D01*

+X235124Y360569D01*

+X235792Y360516D01*

+Y237180D01*

+X235621Y237109D01*

+X235380Y236961D01*

+X235164Y236777D01*

+X234980Y236561D01*

+X234832Y236320D01*

+X234724Y236058D01*

+X234658Y235782D01*

+X234635Y235500D01*

+X234658Y235218D01*

+X234724Y234942D01*

+X234832Y234680D01*

+X234980Y234439D01*

+X235164Y234223D01*

+X235380Y234039D01*

+X235621Y233891D01*

+X235792Y233820D01*

+Y201642D01*

+X235124Y201589D01*

+X234466Y201431D01*

+X233841Y201172D01*

+X233264Y200819D01*

+X232749Y200379D01*

+X232309Y199864D01*

+X231956Y199287D01*

+X231697Y198662D01*

+X231539Y198004D01*

+X231486Y197329D01*

+X231539Y196654D01*

+X231697Y195996D01*

+X231956Y195371D01*

+X232309Y194794D01*

+X232749Y194279D01*

+X233264Y193839D01*

+X233841Y193486D01*

+X234466Y193227D01*

+X235124Y193069D01*

+X235792Y193016D01*

+Y189142D01*

+X235124Y189089D01*

+X234466Y188931D01*

+X233841Y188672D01*

+X233264Y188319D01*

+X232749Y187879D01*

+X232309Y187364D01*

+X231956Y186787D01*

+X231697Y186162D01*

+X231539Y185504D01*

+X231486Y184829D01*

+X231539Y184154D01*

+X231697Y183496D01*

+X231956Y182871D01*

+X232309Y182294D01*

+X232749Y181779D01*

+X233264Y181339D01*

+X233841Y180986D01*

+X234466Y180727D01*

+X235124Y180569D01*

+X235792Y180516D01*

+Y179142D01*

+X235124Y179089D01*

+X234466Y178931D01*

+X233841Y178672D01*

+X233264Y178319D01*

+X232749Y177879D01*

+X232309Y177364D01*

+X231956Y176787D01*

+X231697Y176162D01*

+X231539Y175504D01*

+X231486Y174829D01*

+X231539Y174154D01*

+X231697Y173496D01*

+X231956Y172871D01*

+X232309Y172294D01*

+X232749Y171779D01*

+X233264Y171339D01*

+X233841Y170986D01*

+X234466Y170727D01*

+X235124Y170569D01*

+X235792Y170516D01*

+Y134794D01*

+X235659Y134783D01*

+X235383Y134717D01*

+X235121Y134609D01*

+X234880Y134461D01*

+X234664Y134277D01*

+X234480Y134061D01*

+X234332Y133820D01*

+X234224Y133558D01*

+X234158Y133282D01*

+X234135Y133000D01*

+X234158Y132718D01*

+X234224Y132442D01*

+X234332Y132180D01*

+X234480Y131939D01*

+X234664Y131723D01*

+X234880Y131539D01*

+X235121Y131391D01*

+X235383Y131283D01*

+X235659Y131217D01*

+X235792Y131206D01*

+Y123689D01*

+X235718Y123777D01*

+X235502Y123961D01*

+X235261Y124109D01*

+X234999Y124217D01*

+X234723Y124283D01*

+X234441Y124306D01*

+X234159Y124283D01*

+X233883Y124217D01*

+X233621Y124109D01*

+X233380Y123961D01*

+X233164Y123777D01*

+X232980Y123561D01*

+X232832Y123320D01*

+X232724Y123058D01*

+X232658Y122782D01*

+X232635Y122500D01*

+X232658Y122218D01*

+X232724Y121942D01*

+X232832Y121680D01*

+X232980Y121439D01*

+X233164Y121223D01*

+X233380Y121039D01*

+X233621Y120891D01*

+X233883Y120783D01*

+X234159Y120717D01*

+X234441Y120694D01*

+X234723Y120717D01*

+X234999Y120783D01*

+X235261Y120891D01*

+X235502Y121039D01*

+X235718Y121223D01*

+X235792Y121311D01*

+Y97000D01*

+G37*

+G36*

+X229815Y376369D02*X229642Y376787D01*

+X229289Y377364D01*

+X228849Y377879D01*

+X228334Y378319D01*

+X227757Y378672D01*

+X227132Y378931D01*

+X226474Y379089D01*

+X225799Y379142D01*

+X225792Y379142D01*

+Y397000D01*

+X229815D01*

+Y376369D01*

+G37*

+G36*

+Y366369D02*X229642Y366787D01*

+X229289Y367364D01*

+X228849Y367879D01*

+X228334Y368319D01*

+X227757Y368672D01*

+X227132Y368931D01*

+X226474Y369089D01*

+X225799Y369142D01*

+X225792Y369142D01*

+Y370516D01*

+X225799Y370516D01*

+X226474Y370569D01*

+X227132Y370727D01*

+X227757Y370986D01*

+X228334Y371339D01*

+X228849Y371779D01*

+X229289Y372294D01*

+X229642Y372871D01*

+X229815Y373289D01*

+Y366369D01*

+G37*

+G36*

+Y198869D02*X229642Y199287D01*

+X229289Y199864D01*

+X228849Y200379D01*

+X228334Y200819D01*

+X227757Y201172D01*

+X227132Y201431D01*

+X226474Y201589D01*

+X225799Y201642D01*

+X225792Y201642D01*

+Y218911D01*

+X226002Y219039D01*

+X226218Y219223D01*

+X226402Y219439D01*

+X226550Y219680D01*

+X226658Y219942D01*

+X226724Y220218D01*

+X226741Y220500D01*

+X226724Y220782D01*

+X226658Y221058D01*

+X226550Y221320D01*

+X226402Y221561D01*

+X226218Y221777D01*

+X226002Y221961D01*

+X225792Y222089D01*

+Y224733D01*

+X225999Y224783D01*

+X226261Y224891D01*

+X226502Y225039D01*

+X226718Y225223D01*

+X226902Y225439D01*

+X227050Y225680D01*

+X227158Y225942D01*

+X227224Y226218D01*

+X227241Y226500D01*

+X227224Y226782D01*

+X227158Y227058D01*

+X227050Y227320D01*

+X226902Y227561D01*

+X226718Y227777D01*

+X226502Y227961D01*

+X226261Y228109D01*

+X225999Y228217D01*

+X225792Y228267D01*

+Y233911D01*

+X226002Y234039D01*

+X226218Y234223D01*

+X226402Y234439D01*

+X226550Y234680D01*

+X226658Y234942D01*

+X226724Y235218D01*

+X226741Y235500D01*

+X226724Y235782D01*

+X226658Y236058D01*

+X226550Y236320D01*

+X226402Y236561D01*

+X226218Y236777D01*

+X226002Y236961D01*

+X225792Y237089D01*

+Y242811D01*

+X225902Y242939D01*

+X226050Y243180D01*

+X226158Y243442D01*

+X226224Y243718D01*

+X226241Y244000D01*

+X226224Y244282D01*

+X226158Y244558D01*

+X226050Y244820D01*

+X225902Y245061D01*

+X225792Y245189D01*

+Y247233D01*

+X225999Y247283D01*

+X226261Y247391D01*

+X226502Y247539D01*

+X226718Y247723D01*

+X226902Y247939D01*

+X227050Y248180D01*

+X227158Y248442D01*

+X227224Y248718D01*

+X227241Y249000D01*

+X227224Y249282D01*

+X227158Y249558D01*

+X227050Y249820D01*

+X226902Y250061D01*

+X226718Y250277D01*

+X226502Y250461D01*

+X226261Y250609D01*

+X225999Y250717D01*

+X225792Y250767D01*

+Y250811D01*

+X225902Y250939D01*

+X226050Y251180D01*

+X226158Y251442D01*

+X226224Y251718D01*

+X226241Y252000D01*

+X226224Y252282D01*

+X226158Y252558D01*

+X226050Y252820D01*

+X225902Y253061D01*

+X225792Y253189D01*

+Y360516D01*

+X225799Y360516D01*

+X226474Y360569D01*

+X227132Y360727D01*

+X227757Y360986D01*

+X228334Y361339D01*

+X228849Y361779D01*

+X229289Y362294D01*

+X229642Y362871D01*

+X229815Y363289D01*

+Y356793D01*

+X229536Y356771D01*

+X229260Y356705D01*

+X228998Y356597D01*

+X228757Y356449D01*

+X228541Y356265D01*

+X228357Y356049D01*

+X228209Y355808D01*

+X228101Y355546D01*

+X228035Y355270D01*

+X228012Y354988D01*

+X228035Y354706D01*

+X228101Y354430D01*

+X228209Y354168D01*

+X228357Y353927D01*

+X228541Y353711D01*

+X228757Y353527D01*

+X228998Y353379D01*

+X229260Y353271D01*

+X229536Y353205D01*

+X229815Y353183D01*

+Y294689D01*

+X229621Y294609D01*

+X229380Y294461D01*

+X229164Y294277D01*

+X228980Y294061D01*

+X228832Y293820D01*

+X228724Y293558D01*

+X228658Y293282D01*

+X228635Y293000D01*

+X228658Y292718D01*

+X228724Y292442D01*

+X228832Y292180D01*

+X228980Y291939D01*

+X229164Y291723D01*

+X229380Y291539D01*

+X229621Y291391D01*

+X229815Y291311D01*

+Y248689D01*

+X229621Y248609D01*

+X229380Y248461D01*

+X229164Y248277D01*

+X228980Y248061D01*

+X228832Y247820D01*

+X228724Y247558D01*

+X228658Y247282D01*

+X228635Y247000D01*

+X228658Y246718D01*

+X228724Y246442D01*

+X228832Y246180D01*

+X228980Y245939D01*

+X229164Y245723D01*

+X229380Y245539D01*

+X229621Y245391D01*

+X229815Y245311D01*

+Y198869D01*

+G37*

+G36*

+Y186369D02*X229642Y186787D01*

+X229289Y187364D01*

+X228849Y187879D01*

+X228334Y188319D01*

+X227757Y188672D01*

+X227132Y188931D01*

+X226474Y189089D01*

+X225799Y189142D01*

+X225792Y189142D01*

+Y193016D01*

+X225799Y193016D01*

+X226474Y193069D01*

+X227132Y193227D01*

+X227757Y193486D01*

+X228334Y193839D01*

+X228849Y194279D01*

+X229289Y194794D01*

+X229642Y195371D01*

+X229815Y195789D01*

+Y186369D01*

+G37*

+G36*

+Y176369D02*X229642Y176787D01*

+X229289Y177364D01*

+X228849Y177879D01*

+X228334Y178319D01*

+X227757Y178672D01*

+X227132Y178931D01*

+X226474Y179089D01*

+X225799Y179142D01*

+X225792Y179142D01*

+Y180516D01*

+X225799Y180516D01*

+X226474Y180569D01*

+X227132Y180727D01*

+X227757Y180986D01*

+X228334Y181339D01*

+X228849Y181779D01*

+X229289Y182294D01*

+X229642Y182871D01*

+X229815Y183289D01*

+Y176369D01*

+G37*

+G36*

+Y97000D02*X225792D01*

+Y170516D01*

+X225799Y170516D01*

+X226474Y170569D01*

+X227132Y170727D01*

+X227757Y170986D01*

+X228334Y171339D01*

+X228849Y171779D01*

+X229289Y172294D01*

+X229642Y172871D01*

+X229815Y173289D01*

+Y97000D01*

+G37*

+G36*

+X225792Y250767D02*X225761Y250774D01*

+X225792Y250811D01*

+Y250767D01*

+G37*

+G36*

+X223938Y180946D02*X224466Y180727D01*

+X225124Y180569D01*

+X225792Y180516D01*

+Y179142D01*

+X225124Y179089D01*

+X224466Y178931D01*

+X223938Y178712D01*

+Y180946D01*

+G37*

+G36*

+Y193446D02*X224466Y193227D01*

+X225124Y193069D01*

+X225792Y193016D01*

+Y189142D01*

+X225124Y189089D01*

+X224466Y188931D01*

+X223938Y188712D01*

+Y193446D01*

+G37*

+G36*

+Y219003D02*X224121Y218891D01*

+X224383Y218783D01*

+X224659Y218717D01*

+X224941Y218694D01*

+X225223Y218717D01*

+X225499Y218783D01*

+X225761Y218891D01*

+X225792Y218911D01*

+Y201642D01*

+X225124Y201589D01*

+X224466Y201431D01*

+X223938Y201212D01*

+Y219003D01*

+G37*

+G36*

+Y225507D02*X223980Y225439D01*

+X224164Y225223D01*

+X224380Y225039D01*

+X224621Y224891D01*

+X224883Y224783D01*

+X225159Y224717D01*

+X225441Y224694D01*

+X225723Y224717D01*

+X225792Y224733D01*

+Y222089D01*

+X225761Y222109D01*

+X225499Y222217D01*

+X225223Y222283D01*

+X224941Y222306D01*

+X224659Y222283D01*

+X224383Y222217D01*

+X224121Y222109D01*

+X223938Y221997D01*

+Y225507D01*

+G37*

+G36*

+Y234003D02*X224121Y233891D01*

+X224383Y233783D01*

+X224659Y233717D01*

+X224941Y233694D01*

+X225223Y233717D01*

+X225499Y233783D01*

+X225761Y233891D01*

+X225792Y233911D01*

+Y228267D01*

+X225723Y228283D01*

+X225441Y228306D01*

+X225159Y228283D01*

+X224883Y228217D01*

+X224621Y228109D01*

+X224380Y227961D01*

+X224164Y227777D01*

+X223980Y227561D01*

+X223938Y227493D01*

+Y234003D01*

+G37*

+G36*

+Y242270D02*X224159Y242217D01*

+X224441Y242194D01*

+X224723Y242217D01*

+X224999Y242283D01*

+X225261Y242391D01*

+X225502Y242539D01*

+X225718Y242723D01*

+X225792Y242811D01*

+Y237089D01*

+X225761Y237109D01*

+X225499Y237217D01*

+X225223Y237283D01*

+X224941Y237306D01*

+X224659Y237283D01*

+X224383Y237217D01*

+X224121Y237109D01*

+X223938Y236997D01*

+Y242270D01*

+G37*

+G36*

+Y248007D02*X223980Y247939D01*

+X224164Y247723D01*

+X224380Y247539D01*

+X224621Y247391D01*

+X224883Y247283D01*

+X225159Y247217D01*

+X225441Y247194D01*

+X225723Y247217D01*

+X225792Y247233D01*

+Y245189D01*

+X225718Y245277D01*

+X225502Y245461D01*

+X225261Y245609D01*

+X224999Y245717D01*

+X224723Y245783D01*

+X224441Y245806D01*

+X224159Y245783D01*

+X223938Y245730D01*

+Y248007D01*

+G37*

+G36*

+Y250270D02*X224121Y250226D01*

+X223980Y250061D01*

+X223938Y249993D01*

+Y250270D01*

+G37*

+G36*

+Y360946D02*X224466Y360727D01*

+X225124Y360569D01*

+X225792Y360516D01*

+Y253189D01*

+X225718Y253277D01*

+X225502Y253461D01*

+X225261Y253609D01*

+X224999Y253717D01*

+X224723Y253783D01*

+X224441Y253806D01*

+X224159Y253783D01*

+X223938Y253730D01*

+Y360946D01*

+G37*

+G36*

+Y370946D02*X224466Y370727D01*

+X225124Y370569D01*

+X225792Y370516D01*

+Y369142D01*

+X225124Y369089D01*

+X224466Y368931D01*

+X223938Y368712D01*

+Y370946D01*

+G37*

+G36*

+Y397000D02*X225792D01*

+Y379142D01*

+X225124Y379089D01*

+X224466Y378931D01*

+X223938Y378712D01*

+Y397000D01*

+G37*

+G36*

+X225792Y97000D02*X223938D01*

+Y146195D01*

+X223941Y146194D01*

+X224223Y146217D01*

+X224499Y146283D01*

+X224761Y146391D01*

+X225002Y146539D01*

+X225218Y146723D01*

+X225402Y146939D01*

+X225550Y147180D01*

+X225658Y147442D01*

+X225724Y147718D01*

+X225741Y148000D01*

+X225724Y148282D01*

+X225658Y148558D01*

+X225550Y148820D01*

+X225402Y149061D01*

+X225218Y149277D01*

+X225002Y149461D01*

+X224761Y149609D01*

+X224499Y149717D01*

+X224223Y149783D01*

+X223941Y149806D01*

+X223938Y149805D01*

+Y170946D01*

+X224466Y170727D01*

+X225124Y170569D01*

+X225792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X223938D02*X219438D01*

+Y172538D01*

+X219642Y172871D01*

+X219901Y173496D01*

+X220059Y174154D01*

+X220099Y174829D01*

+X220059Y175504D01*

+X219901Y176162D01*

+X219642Y176787D01*

+X219438Y177120D01*

+Y182538D01*

+X219642Y182871D01*

+X219901Y183496D01*

+X220059Y184154D01*

+X220099Y184829D01*

+X220059Y185504D01*

+X219901Y186162D01*

+X219642Y186787D01*

+X219438Y187120D01*

+Y195038D01*

+X219642Y195371D01*

+X219901Y195996D01*

+X220059Y196654D01*

+X220099Y197329D01*

+X220059Y198004D01*

+X219901Y198662D01*

+X219642Y199287D01*

+X219438Y199620D01*

+Y213503D01*

+X219621Y213391D01*

+X219883Y213283D01*

+X220159Y213217D01*

+X220441Y213194D01*

+X220723Y213217D01*

+X220999Y213283D01*

+X221261Y213391D01*

+X221502Y213539D01*

+X221718Y213723D01*

+X221902Y213939D01*

+X222050Y214180D01*

+X222158Y214442D01*

+X222224Y214718D01*

+X222241Y215000D01*

+X222224Y215282D01*

+X222158Y215558D01*

+X222050Y215820D01*

+X221902Y216061D01*

+X221718Y216277D01*

+X221502Y216461D01*

+X221261Y216609D01*

+X220999Y216717D01*

+X220723Y216783D01*

+X220441Y216806D01*

+X220159Y216783D01*

+X219883Y216717D01*

+X219621Y216609D01*

+X219438Y216497D01*

+Y258003D01*

+X219621Y257891D01*

+X219883Y257783D01*

+X220159Y257717D01*

+X220441Y257694D01*

+X220723Y257717D01*

+X220999Y257783D01*

+X221261Y257891D01*

+X221502Y258039D01*

+X221718Y258223D01*

+X221902Y258439D01*

+X222050Y258680D01*

+X222158Y258942D01*

+X222224Y259218D01*

+X222241Y259500D01*

+X222224Y259782D01*

+X222158Y260058D01*

+X222050Y260320D01*

+X221902Y260561D01*

+X221718Y260777D01*

+X221502Y260961D01*

+X221261Y261109D01*

+X220999Y261217D01*

+X220723Y261283D01*

+X220441Y261306D01*

+X220229Y261289D01*

+X220241Y261500D01*

+X220224Y261782D01*

+X220158Y262058D01*

+X220050Y262320D01*

+X219902Y262561D01*

+X219718Y262777D01*

+X219502Y262961D01*

+X219438Y263000D01*

+Y264320D01*

+X219452Y264303D01*

+X219668Y264119D01*

+X219909Y263971D01*

+X220171Y263863D01*

+X220447Y263797D01*

+X220729Y263774D01*

+X221011Y263797D01*

+X221287Y263863D01*

+X221549Y263971D01*

+X221790Y264119D01*

+X222006Y264303D01*

+X222190Y264519D01*

+X222338Y264760D01*

+X222446Y265022D01*

+X222512Y265298D01*

+X222529Y265580D01*

+X222512Y265862D01*

+X222446Y266138D01*

+X222338Y266400D01*

+X222190Y266641D01*

+X222006Y266857D01*

+X221790Y267041D01*

+X221549Y267189D01*

+X221287Y267297D01*

+X221011Y267363D01*

+X220729Y267386D01*

+X220447Y267363D01*

+X220171Y267297D01*

+X219909Y267189D01*

+X219668Y267041D01*

+X219452Y266857D01*

+X219438Y266840D01*

+Y270695D01*

+X219441Y270694D01*

+X219723Y270717D01*

+X219999Y270783D01*

+X220261Y270891D01*

+X220502Y271039D01*

+X220718Y271223D01*

+X220902Y271439D01*

+X221050Y271680D01*

+X221158Y271942D01*

+X221224Y272218D01*

+X221241Y272500D01*

+X221224Y272782D01*

+X221158Y273058D01*

+X221050Y273320D01*

+X220902Y273561D01*

+X220718Y273777D01*

+X220502Y273961D01*

+X220261Y274109D01*

+X219999Y274217D01*

+X219723Y274283D01*

+X219441Y274306D01*

+X219438Y274305D01*

+Y362538D01*

+X219642Y362871D01*

+X219901Y363496D01*

+X220059Y364154D01*

+X220099Y364829D01*

+X220059Y365504D01*

+X219901Y366162D01*

+X219642Y366787D01*

+X219438Y367120D01*

+Y372538D01*

+X219642Y372871D01*

+X219901Y373496D01*

+X220059Y374154D01*

+X220099Y374829D01*

+X220059Y375504D01*

+X219901Y376162D01*

+X219642Y376787D01*

+X219438Y377120D01*

+Y397000D01*

+X223938D01*

+Y378712D01*

+X223841Y378672D01*

+X223264Y378319D01*

+X222749Y377879D01*

+X222309Y377364D01*

+X221956Y376787D01*

+X221697Y376162D01*

+X221539Y375504D01*

+X221486Y374829D01*

+X221539Y374154D01*

+X221697Y373496D01*

+X221956Y372871D01*

+X222309Y372294D01*

+X222749Y371779D01*

+X223264Y371339D01*

+X223841Y370986D01*

+X223938Y370946D01*

+Y368712D01*

+X223841Y368672D01*

+X223264Y368319D01*

+X222749Y367879D01*

+X222309Y367364D01*

+X221956Y366787D01*

+X221697Y366162D01*

+X221539Y365504D01*

+X221486Y364829D01*

+X221539Y364154D01*

+X221697Y363496D01*

+X221956Y362871D01*

+X222309Y362294D01*

+X222749Y361779D01*

+X223264Y361339D01*

+X223841Y360986D01*

+X223938Y360946D01*

+Y253730D01*

+X223883Y253717D01*

+X223643Y253618D01*

+X223667Y253718D01*

+X223684Y254000D01*

+X223667Y254282D01*

+X223601Y254558D01*

+X223493Y254820D01*

+X223345Y255061D01*

+X223161Y255277D01*

+X222945Y255461D01*

+X222704Y255609D01*

+X222442Y255717D01*

+X222166Y255783D01*

+X221884Y255806D01*

+X221602Y255783D01*

+X221326Y255717D01*

+X221064Y255609D01*

+X220823Y255461D01*

+X220607Y255277D01*

+X220423Y255061D01*

+X220275Y254820D01*

+X220167Y254558D01*

+X220101Y254282D01*

+X220078Y254000D01*

+X220101Y253718D01*

+X220167Y253442D01*

+X220275Y253180D01*

+X220423Y252939D01*

+X220607Y252723D01*

+X220823Y252539D01*

+X221064Y252391D01*

+X221326Y252283D01*

+X221602Y252217D01*

+X221884Y252194D01*

+X222166Y252217D01*

+X222442Y252283D01*

+X222682Y252382D01*

+X222658Y252282D01*

+X222635Y252000D01*

+X222658Y251718D01*

+X222724Y251442D01*

+X222832Y251180D01*

+X222980Y250939D01*

+X223164Y250723D01*

+X223380Y250539D01*

+X223621Y250391D01*

+X223883Y250283D01*

+X223938Y250270D01*

+Y249993D01*

+X223832Y249820D01*

+X223724Y249558D01*

+X223658Y249282D01*

+X223635Y249000D01*

+X223658Y248718D01*

+X223724Y248442D01*

+X223832Y248180D01*

+X223938Y248007D01*

+Y245730D01*

+X223883Y245717D01*

+X223621Y245609D01*

+X223380Y245461D01*

+X223164Y245277D01*

+X222980Y245061D01*

+X222832Y244820D01*

+X222724Y244558D01*

+X222658Y244282D01*

+X222635Y244000D01*

+X222658Y243718D01*

+X222724Y243442D01*

+X222832Y243180D01*

+X222980Y242939D01*

+X223164Y242723D01*

+X223380Y242539D01*

+X223621Y242391D01*

+X223883Y242283D01*

+X223938Y242270D01*

+Y236997D01*

+X223880Y236961D01*

+X223664Y236777D01*

+X223480Y236561D01*

+X223332Y236320D01*

+X223224Y236058D01*

+X223158Y235782D01*

+X223135Y235500D01*

+X223158Y235218D01*

+X223224Y234942D01*

+X223332Y234680D01*

+X223480Y234439D01*

+X223664Y234223D01*

+X223880Y234039D01*

+X223938Y234003D01*

+Y227493D01*

+X223832Y227320D01*

+X223724Y227058D01*

+X223658Y226782D01*

+X223635Y226500D01*

+X223658Y226218D01*

+X223724Y225942D01*

+X223832Y225680D01*

+X223938Y225507D01*

+Y221997D01*

+X223880Y221961D01*

+X223664Y221777D01*

+X223480Y221561D01*

+X223332Y221320D01*

+X223224Y221058D01*

+X223158Y220782D01*

+X223135Y220500D01*

+X223158Y220218D01*

+X223224Y219942D01*

+X223332Y219680D01*

+X223480Y219439D01*

+X223664Y219223D01*

+X223880Y219039D01*

+X223938Y219003D01*

+Y201212D01*

+X223841Y201172D01*

+X223264Y200819D01*

+X222749Y200379D01*

+X222309Y199864D01*

+X221956Y199287D01*

+X221697Y198662D01*

+X221539Y198004D01*

+X221486Y197329D01*

+X221539Y196654D01*

+X221697Y195996D01*

+X221956Y195371D01*

+X222309Y194794D01*

+X222749Y194279D01*

+X223264Y193839D01*

+X223841Y193486D01*

+X223938Y193446D01*

+Y188712D01*

+X223841Y188672D01*

+X223264Y188319D01*

+X222749Y187879D01*

+X222309Y187364D01*

+X221956Y186787D01*

+X221697Y186162D01*

+X221539Y185504D01*

+X221486Y184829D01*

+X221539Y184154D01*

+X221697Y183496D01*

+X221956Y182871D01*

+X222309Y182294D01*

+X222749Y181779D01*

+X223264Y181339D01*

+X223841Y180986D01*

+X223938Y180946D01*

+Y178712D01*

+X223841Y178672D01*

+X223264Y178319D01*

+X222749Y177879D01*

+X222309Y177364D01*

+X221956Y176787D01*

+X221697Y176162D01*

+X221539Y175504D01*

+X221486Y174829D01*

+X221539Y174154D01*

+X221697Y173496D01*

+X221956Y172871D01*

+X222309Y172294D01*

+X222749Y171779D01*

+X223264Y171339D01*

+X223841Y170986D01*

+X223938Y170946D01*

+Y149805D01*

+X223659Y149783D01*

+X223383Y149717D01*

+X223121Y149609D01*

+X222880Y149461D01*

+X222664Y149277D01*

+X222480Y149061D01*

+X222332Y148820D01*

+X222224Y148558D01*

+X222158Y148282D01*

+X222135Y148000D01*

+X222158Y147718D01*

+X222224Y147442D01*

+X222332Y147180D01*

+X222480Y146939D01*

+X222664Y146723D01*

+X222880Y146539D01*

+X223121Y146391D01*

+X223383Y146283D01*

+X223659Y146217D01*

+X223938Y146195D01*

+Y97000D01*

+G37*

+G36*

+X219438Y377120D02*X219289Y377364D01*

+X218849Y377879D01*

+X218334Y378319D01*

+X217757Y378672D01*

+X217132Y378931D01*

+X216474Y379089D01*

+X215799Y379142D01*

+X215792Y379142D01*

+Y397000D01*

+X219438D01*

+Y377120D01*

+G37*

+G36*

+Y367120D02*X219289Y367364D01*

+X218849Y367879D01*

+X218334Y368319D01*

+X217757Y368672D01*

+X217132Y368931D01*

+X216474Y369089D01*

+X215799Y369142D01*

+X215792Y369142D01*

+Y370516D01*

+X215799Y370516D01*

+X216474Y370569D01*

+X217132Y370727D01*

+X217757Y370986D01*

+X218334Y371339D01*

+X218849Y371779D01*

+X219289Y372294D01*

+X219438Y372538D01*

+Y367120D01*

+G37*

+G36*

+Y199620D02*X219289Y199864D01*

+X218849Y200379D01*

+X218334Y200819D01*

+X217757Y201172D01*

+X217132Y201431D01*

+X216474Y201589D01*

+X215799Y201642D01*

+X215792Y201642D01*

+Y278277D01*

+X215832Y278180D01*

+X215980Y277939D01*

+X216164Y277723D01*

+X216380Y277539D01*

+X216621Y277391D01*

+X216883Y277283D01*

+X217159Y277217D01*

+X217441Y277194D01*

+X217723Y277217D01*

+X217999Y277283D01*

+X218261Y277391D01*

+X218502Y277539D01*

+X218718Y277723D01*

+X218902Y277939D01*

+X219050Y278180D01*

+X219158Y278442D01*

+X219224Y278718D01*

+X219241Y279000D01*

+X219224Y279282D01*

+X219158Y279558D01*

+X219050Y279820D01*

+X218902Y280061D01*

+X218718Y280277D01*

+X218502Y280461D01*

+X218261Y280609D01*

+X217999Y280717D01*

+X217723Y280783D01*

+X217441Y280806D01*

+X217159Y280783D01*

+X216883Y280717D01*

+X216621Y280609D01*

+X216380Y280461D01*

+X216164Y280277D01*

+X215980Y280061D01*

+X215832Y279820D01*

+X215792Y279723D01*

+Y360516D01*

+X215799Y360516D01*

+X216474Y360569D01*

+X217132Y360727D01*

+X217757Y360986D01*

+X218334Y361339D01*

+X218849Y361779D01*

+X219289Y362294D01*

+X219438Y362538D01*

+Y274305D01*

+X219159Y274283D01*

+X218883Y274217D01*

+X218621Y274109D01*

+X218380Y273961D01*

+X218164Y273777D01*

+X217980Y273561D01*

+X217832Y273320D01*

+X217724Y273058D01*

+X217658Y272782D01*

+X217635Y272500D01*

+X217658Y272218D01*

+X217724Y271942D01*

+X217832Y271680D01*

+X217980Y271439D01*

+X218164Y271223D01*

+X218380Y271039D01*

+X218621Y270891D01*

+X218883Y270783D01*

+X219159Y270717D01*

+X219438Y270695D01*

+Y266840D01*

+X219268Y266641D01*

+X219120Y266400D01*

+X219012Y266138D01*

+X218946Y265862D01*

+X218923Y265580D01*

+X218946Y265298D01*

+X219012Y265022D01*

+X219120Y264760D01*

+X219268Y264519D01*

+X219438Y264320D01*

+Y263000D01*

+X219261Y263109D01*

+X218999Y263217D01*

+X218723Y263283D01*

+X218441Y263306D01*

+X218159Y263283D01*

+X217883Y263217D01*

+X217621Y263109D01*

+X217380Y262961D01*

+X217164Y262777D01*

+X216980Y262561D01*

+X216832Y262320D01*

+X216724Y262058D01*

+X216658Y261782D01*

+X216635Y261500D01*

+X216658Y261218D01*

+X216724Y260942D01*

+X216832Y260680D01*

+X216980Y260439D01*

+X217164Y260223D01*

+X217380Y260039D01*

+X217621Y259891D01*

+X217883Y259783D01*

+X218159Y259717D01*

+X218441Y259694D01*

+X218652Y259711D01*

+X218635Y259500D01*

+X218658Y259218D01*

+X218724Y258942D01*

+X218832Y258680D01*

+X218980Y258439D01*

+X219164Y258223D01*

+X219380Y258039D01*

+X219438Y258003D01*

+Y216497D01*

+X219380Y216461D01*

+X219164Y216277D01*

+X218980Y216061D01*

+X218832Y215820D01*

+X218724Y215558D01*

+X218658Y215282D01*

+X218635Y215000D01*

+X218658Y214718D01*

+X218724Y214442D01*

+X218832Y214180D01*

+X218980Y213939D01*

+X219164Y213723D01*

+X219380Y213539D01*

+X219438Y213503D01*

+Y199620D01*

+G37*

+G36*

+Y187120D02*X219289Y187364D01*

+X218849Y187879D01*

+X218334Y188319D01*

+X217757Y188672D01*

+X217132Y188931D01*

+X216474Y189089D01*

+X215799Y189142D01*

+X215792Y189142D01*

+Y193016D01*

+X215799Y193016D01*

+X216474Y193069D01*

+X217132Y193227D01*

+X217757Y193486D01*

+X218334Y193839D01*

+X218849Y194279D01*

+X219289Y194794D01*

+X219438Y195038D01*

+Y187120D01*

+G37*

+G36*

+Y177120D02*X219289Y177364D01*

+X218849Y177879D01*

+X218334Y178319D01*

+X217757Y178672D01*

+X217132Y178931D01*

+X216474Y179089D01*

+X215799Y179142D01*

+X215792Y179142D01*

+Y180516D01*

+X215799Y180516D01*

+X216474Y180569D01*

+X217132Y180727D01*

+X217757Y180986D01*

+X218334Y181339D01*

+X218849Y181779D01*

+X219289Y182294D01*

+X219438Y182538D01*

+Y177120D01*

+G37*

+G36*

+Y97000D02*X215792D01*

+Y170516D01*

+X215799Y170516D01*

+X216474Y170569D01*

+X217132Y170727D01*

+X217757Y170986D01*

+X218334Y171339D01*

+X218849Y171779D01*

+X219289Y172294D01*

+X219438Y172538D01*

+Y97000D01*

+G37*

+G36*

+X212938Y181618D02*X213264Y181339D01*

+X213841Y180986D01*

+X214466Y180727D01*

+X215124Y180569D01*

+X215792Y180516D01*

+Y179142D01*

+X215124Y179089D01*

+X214466Y178931D01*

+X213841Y178672D01*

+X213264Y178319D01*

+X212938Y178040D01*

+Y181618D01*

+G37*

+G36*

+Y194118D02*X213264Y193839D01*

+X213841Y193486D01*

+X214466Y193227D01*

+X215124Y193069D01*

+X215792Y193016D01*

+Y189142D01*

+X215124Y189089D01*

+X214466Y188931D01*

+X213841Y188672D01*

+X213264Y188319D01*

+X212938Y188040D01*

+Y194118D01*

+G37*

+G36*

+Y361618D02*X213264Y361339D01*

+X213841Y360986D01*

+X214466Y360727D01*

+X215124Y360569D01*

+X215792Y360516D01*

+Y279723D01*

+X215724Y279558D01*

+X215658Y279282D01*

+X215635Y279000D01*

+X215658Y278718D01*

+X215724Y278442D01*

+X215792Y278277D01*

+Y201642D01*

+X215124Y201589D01*

+X214466Y201431D01*

+X213841Y201172D01*

+X213264Y200819D01*

+X212938Y200540D01*

+Y236195D01*

+X212941Y236194D01*

+X213223Y236217D01*

+X213499Y236283D01*

+X213761Y236391D01*

+X214002Y236539D01*

+X214218Y236723D01*

+X214402Y236939D01*

+X214550Y237180D01*

+X214658Y237442D01*

+X214724Y237718D01*

+X214741Y238000D01*

+X214724Y238282D01*

+X214658Y238558D01*

+X214550Y238820D01*

+X214402Y239061D01*

+X214218Y239277D01*

+X214002Y239461D01*

+X213761Y239609D01*

+X213499Y239717D01*

+X213223Y239783D01*

+X212941Y239806D01*

+X212938Y239805D01*

+Y361618D01*

+G37*

+G36*

+Y371618D02*X213264Y371339D01*

+X213841Y370986D01*

+X214466Y370727D01*

+X215124Y370569D01*

+X215792Y370516D01*

+Y369142D01*

+X215124Y369089D01*

+X214466Y368931D01*

+X213841Y368672D01*

+X213264Y368319D01*

+X212938Y368040D01*

+Y371618D01*

+G37*

+G36*

+Y397000D02*X215792D01*

+Y379142D01*

+X215124Y379089D01*

+X214466Y378931D01*

+X213841Y378672D01*

+X213264Y378319D01*

+X212938Y378040D01*

+Y397000D01*

+G37*

+G36*

+X215792Y97000D02*X212938D01*

+Y171618D01*

+X213264Y171339D01*

+X213841Y170986D01*

+X214466Y170727D01*

+X215124Y170569D01*

+X215792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X212938D02*X208938D01*

+Y146195D01*

+X208941Y146194D01*

+X209223Y146217D01*

+X209499Y146283D01*

+X209761Y146391D01*

+X210002Y146539D01*

+X210218Y146723D01*

+X210402Y146939D01*

+X210550Y147180D01*

+X210658Y147442D01*

+X210724Y147718D01*

+X210741Y148000D01*

+X210724Y148282D01*

+X210658Y148558D01*

+X210550Y148820D01*

+X210402Y149061D01*

+X210218Y149277D01*

+X210002Y149461D01*

+X209761Y149609D01*

+X209499Y149717D01*

+X209223Y149783D01*

+X208941Y149806D01*

+X208938Y149805D01*

+Y171884D01*

+X209289Y172294D01*

+X209642Y172871D01*

+X209901Y173496D01*

+X210059Y174154D01*

+X210099Y174829D01*

+X210059Y175504D01*

+X209901Y176162D01*

+X209642Y176787D01*

+X209289Y177364D01*

+X208938Y177774D01*

+Y181884D01*

+X209289Y182294D01*

+X209642Y182871D01*

+X209901Y183496D01*

+X210059Y184154D01*

+X210099Y184829D01*

+X210059Y185504D01*

+X209901Y186162D01*

+X209642Y186787D01*

+X209289Y187364D01*

+X208938Y187774D01*

+Y194384D01*

+X209289Y194794D01*

+X209642Y195371D01*

+X209901Y195996D01*

+X210059Y196654D01*

+X210099Y197329D01*

+X210059Y198004D01*

+X209901Y198662D01*

+X209642Y199287D01*

+X209289Y199864D01*

+X208938Y200274D01*

+Y211507D01*

+X208980Y211439D01*

+X209164Y211223D01*

+X209380Y211039D01*

+X209621Y210891D01*

+X209883Y210783D01*

+X210159Y210717D01*

+X210441Y210694D01*

+X210723Y210717D01*

+X210999Y210783D01*

+X211261Y210891D01*

+X211502Y211039D01*

+X211718Y211223D01*

+X211902Y211439D01*

+X212050Y211680D01*

+X212158Y211942D01*

+X212224Y212218D01*

+X212241Y212500D01*

+X212224Y212782D01*

+X212158Y213058D01*

+X212050Y213320D01*

+X211902Y213561D01*

+X211718Y213777D01*

+X211502Y213961D01*

+X211261Y214109D01*

+X210999Y214217D01*

+X210723Y214283D01*

+X210441Y214306D01*

+X210159Y214283D01*

+X209883Y214217D01*

+X209621Y214109D01*

+X209380Y213961D01*

+X209164Y213777D01*

+X208980Y213561D01*

+X208938Y213493D01*

+Y361884D01*

+X209289Y362294D01*

+X209642Y362871D01*

+X209901Y363496D01*

+X210059Y364154D01*

+X210099Y364829D01*

+X210059Y365504D01*

+X209901Y366162D01*

+X209642Y366787D01*

+X209289Y367364D01*

+X208938Y367774D01*

+Y371884D01*

+X209289Y372294D01*

+X209642Y372871D01*

+X209901Y373496D01*

+X210059Y374154D01*

+X210099Y374829D01*

+X210059Y375504D01*

+X209901Y376162D01*

+X209642Y376787D01*

+X209289Y377364D01*

+X208938Y377774D01*

+Y397000D01*

+X212938D01*

+Y378040D01*

+X212749Y377879D01*

+X212309Y377364D01*

+X211956Y376787D01*

+X211697Y376162D01*

+X211539Y375504D01*

+X211486Y374829D01*

+X211539Y374154D01*

+X211697Y373496D01*

+X211956Y372871D01*

+X212309Y372294D01*

+X212749Y371779D01*

+X212938Y371618D01*

+Y368040D01*

+X212749Y367879D01*

+X212309Y367364D01*

+X211956Y366787D01*

+X211697Y366162D01*

+X211539Y365504D01*

+X211486Y364829D01*

+X211539Y364154D01*

+X211697Y363496D01*

+X211956Y362871D01*

+X212309Y362294D01*

+X212749Y361779D01*

+X212938Y361618D01*

+Y239805D01*

+X212659Y239783D01*

+X212383Y239717D01*

+X212121Y239609D01*

+X211880Y239461D01*

+X211664Y239277D01*

+X211480Y239061D01*

+X211332Y238820D01*

+X211224Y238558D01*

+X211158Y238282D01*

+X211135Y238000D01*

+X211158Y237718D01*

+X211224Y237442D01*

+X211332Y237180D01*

+X211480Y236939D01*

+X211664Y236723D01*

+X211880Y236539D01*

+X212121Y236391D01*

+X212383Y236283D01*

+X212659Y236217D01*

+X212938Y236195D01*

+Y200540D01*

+X212749Y200379D01*

+X212309Y199864D01*

+X211956Y199287D01*

+X211697Y198662D01*

+X211539Y198004D01*

+X211486Y197329D01*

+X211539Y196654D01*

+X211697Y195996D01*

+X211956Y195371D01*

+X212309Y194794D01*

+X212749Y194279D01*

+X212938Y194118D01*

+Y188040D01*

+X212749Y187879D01*

+X212309Y187364D01*

+X211956Y186787D01*

+X211697Y186162D01*

+X211539Y185504D01*

+X211486Y184829D01*

+X211539Y184154D01*

+X211697Y183496D01*

+X211956Y182871D01*

+X212309Y182294D01*

+X212749Y181779D01*

+X212938Y181618D01*

+Y178040D01*

+X212749Y177879D01*

+X212309Y177364D01*

+X211956Y176787D01*

+X211697Y176162D01*

+X211539Y175504D01*

+X211486Y174829D01*

+X211539Y174154D01*

+X211697Y173496D01*

+X211956Y172871D01*

+X212309Y172294D01*

+X212749Y171779D01*

+X212938Y171618D01*

+Y97000D01*

+G37*

+G36*

+X208938Y377774D02*X208849Y377879D01*

+X208334Y378319D01*

+X207757Y378672D01*

+X207132Y378931D01*

+X206474Y379089D01*

+X205799Y379142D01*

+X205792Y379142D01*

+Y397000D01*

+X208938D01*

+Y377774D01*

+G37*

+G36*

+Y367774D02*X208849Y367879D01*

+X208334Y368319D01*

+X207757Y368672D01*

+X207132Y368931D01*

+X206474Y369089D01*

+X205799Y369142D01*

+X205792Y369142D01*

+Y370516D01*

+X205799Y370516D01*

+X206474Y370569D01*

+X207132Y370727D01*

+X207757Y370986D01*

+X208334Y371339D01*

+X208849Y371779D01*

+X208938Y371884D01*

+Y367774D01*

+G37*

+G36*

+Y200274D02*X208849Y200379D01*

+X208334Y200819D01*

+X207757Y201172D01*

+X207132Y201431D01*

+X206474Y201589D01*

+X205799Y201642D01*

+X205792Y201642D01*

+Y275233D01*

+X205999Y275283D01*

+X206261Y275391D01*

+X206502Y275539D01*

+X206718Y275723D01*

+X206902Y275939D01*

+X207050Y276180D01*

+X207158Y276442D01*

+X207224Y276718D01*

+X207241Y277000D01*

+X207224Y277282D01*

+X207158Y277558D01*

+X207050Y277820D01*

+X206902Y278061D01*

+X206718Y278277D01*

+X206502Y278461D01*

+X206261Y278609D01*

+X205999Y278717D01*

+X205792Y278767D01*

+Y360516D01*

+X205799Y360516D01*

+X206474Y360569D01*

+X207132Y360727D01*

+X207757Y360986D01*

+X208334Y361339D01*

+X208849Y361779D01*

+X208938Y361884D01*

+Y213493D01*

+X208832Y213320D01*

+X208724Y213058D01*

+X208658Y212782D01*

+X208635Y212500D01*

+X208658Y212218D01*

+X208724Y211942D01*

+X208832Y211680D01*

+X208938Y211507D01*

+Y200274D01*

+G37*

+G36*

+Y187774D02*X208849Y187879D01*

+X208334Y188319D01*

+X207757Y188672D01*

+X207132Y188931D01*

+X206474Y189089D01*

+X205799Y189142D01*

+X205792Y189142D01*

+Y193016D01*

+X205799Y193016D01*

+X206474Y193069D01*

+X207132Y193227D01*

+X207757Y193486D01*

+X208334Y193839D01*

+X208849Y194279D01*

+X208938Y194384D01*

+Y187774D01*

+G37*

+G36*

+Y177774D02*X208849Y177879D01*

+X208334Y178319D01*

+X207757Y178672D01*

+X207132Y178931D01*

+X206474Y179089D01*

+X205799Y179142D01*

+X205792Y179142D01*

+Y180516D01*

+X205799Y180516D01*

+X206474Y180569D01*

+X207132Y180727D01*

+X207757Y180986D01*

+X208334Y181339D01*

+X208849Y181779D01*

+X208938Y181884D01*

+Y177774D01*

+G37*

+G36*

+Y97000D02*X205792D01*

+Y170516D01*

+X205799Y170516D01*

+X206474Y170569D01*

+X207132Y170727D01*

+X207757Y170986D01*

+X208334Y171339D01*

+X208849Y171779D01*

+X208938Y171884D01*

+Y149805D01*

+X208659Y149783D01*

+X208383Y149717D01*

+X208121Y149609D01*

+X207880Y149461D01*

+X207664Y149277D01*

+X207480Y149061D01*

+X207332Y148820D01*

+X207224Y148558D01*

+X207158Y148282D01*

+X207135Y148000D01*

+X207158Y147718D01*

+X207224Y147442D01*

+X207332Y147180D01*

+X207480Y146939D01*

+X207664Y146723D01*

+X207880Y146539D01*

+X208121Y146391D01*

+X208383Y146283D01*

+X208659Y146217D01*

+X208938Y146195D01*

+Y97000D01*

+G37*

+G36*

+X203938Y180946D02*X204466Y180727D01*

+X205124Y180569D01*

+X205792Y180516D01*

+Y179142D01*

+X205124Y179089D01*

+X204466Y178931D01*

+X203938Y178712D01*

+Y180946D01*

+G37*

+G36*

+Y193446D02*X204466Y193227D01*

+X205124Y193069D01*

+X205792Y193016D01*

+Y189142D01*

+X205124Y189089D01*

+X204466Y188931D01*

+X203938Y188712D01*

+Y193446D01*

+G37*

+G36*

+Y276007D02*X203980Y275939D01*

+X204164Y275723D01*

+X204380Y275539D01*

+X204621Y275391D01*

+X204883Y275283D01*

+X205159Y275217D01*

+X205441Y275194D01*

+X205723Y275217D01*

+X205792Y275233D01*

+Y201642D01*

+X205124Y201589D01*

+X204466Y201431D01*

+X203938Y201212D01*

+Y211498D01*

+X204050Y211680D01*

+X204158Y211942D01*

+X204224Y212218D01*

+X204241Y212500D01*

+X204224Y212782D01*

+X204158Y213058D01*

+X204050Y213320D01*

+X203938Y213502D01*

+Y235695D01*

+X203941Y235694D01*

+X204223Y235717D01*

+X204499Y235783D01*

+X204761Y235891D01*

+X205002Y236039D01*

+X205218Y236223D01*

+X205402Y236439D01*

+X205550Y236680D01*

+X205658Y236942D01*

+X205724Y237218D01*

+X205741Y237500D01*

+X205724Y237782D01*

+X205658Y238058D01*

+X205550Y238320D01*

+X205402Y238561D01*

+X205218Y238777D01*

+X205002Y238961D01*

+X204761Y239109D01*

+X204499Y239217D01*

+X204223Y239283D01*

+X203941Y239306D01*

+X203938Y239305D01*

+Y276007D01*

+G37*

+G36*

+Y360946D02*X204466Y360727D01*

+X205124Y360569D01*

+X205792Y360516D01*

+Y278767D01*

+X205723Y278783D01*

+X205441Y278806D01*

+X205159Y278783D01*

+X204883Y278717D01*

+X204621Y278609D01*

+X204380Y278461D01*

+X204164Y278277D01*

+X203980Y278061D01*

+X203938Y277993D01*

+Y360946D01*

+G37*

+G36*

+Y370946D02*X204466Y370727D01*

+X205124Y370569D01*

+X205792Y370516D01*

+Y369142D01*

+X205124Y369089D01*

+X204466Y368931D01*

+X203938Y368712D01*

+Y370946D01*

+G37*

+G36*

+Y397000D02*X205792D01*

+Y379142D01*

+X205124Y379089D01*

+X204466Y378931D01*

+X203938Y378712D01*

+Y397000D01*

+G37*

+G36*

+X205792Y97000D02*X203938D01*

+Y170946D01*

+X204466Y170727D01*

+X205124Y170569D01*

+X205792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X203938D02*X198438D01*

+Y120695D01*

+X198441Y120694D01*

+X198723Y120717D01*

+X198999Y120783D01*

+X199261Y120891D01*

+X199502Y121039D01*

+X199718Y121223D01*

+X199902Y121439D01*

+X200050Y121680D01*

+X200158Y121942D01*

+X200224Y122218D01*

+X200241Y122500D01*

+X200224Y122782D01*

+X200158Y123058D01*

+X200050Y123320D01*

+X199902Y123561D01*

+X199718Y123777D01*

+X199502Y123961D01*

+X199261Y124109D01*

+X198999Y124217D01*

+X198723Y124283D01*

+X198441Y124306D01*

+X198438Y124305D01*

+Y171428D01*

+X198849Y171779D01*

+X199289Y172294D01*

+X199642Y172871D01*

+X199901Y173496D01*

+X200059Y174154D01*

+X200099Y174829D01*

+X200059Y175504D01*

+X199901Y176162D01*

+X199642Y176787D01*

+X199289Y177364D01*

+X198849Y177879D01*

+X198438Y178230D01*

+Y181428D01*

+X198849Y181779D01*

+X199289Y182294D01*

+X199642Y182871D01*

+X199901Y183496D01*

+X200059Y184154D01*

+X200099Y184829D01*

+X200059Y185504D01*

+X199901Y186162D01*

+X199642Y186787D01*

+X199289Y187364D01*

+X198849Y187879D01*

+X198438Y188230D01*

+Y193037D01*

+X199256Y193038D01*

+X199409Y193075D01*

+X199554Y193135D01*

+X199689Y193217D01*

+X199808Y193320D01*

+X199911Y193439D01*

+X199993Y193574D01*

+X200053Y193719D01*

+X200090Y193872D01*

+X200099Y194029D01*

+X200090Y200786D01*

+X200053Y200939D01*

+X199993Y201084D01*

+X199911Y201219D01*

+X199808Y201338D01*

+X199689Y201441D01*

+X199554Y201523D01*

+X199409Y201583D01*

+X199256Y201620D01*

+X199099Y201629D01*

+X198438Y201628D01*

+Y260695D01*

+X198441Y260694D01*

+X198723Y260717D01*

+X198999Y260783D01*

+X199261Y260891D01*

+X199502Y261039D01*

+X199718Y261223D01*

+X199902Y261439D01*

+X200050Y261680D01*

+X200158Y261942D01*

+X200224Y262218D01*

+X200241Y262500D01*

+X200224Y262782D01*

+X200158Y263058D01*

+X200050Y263320D01*

+X199902Y263561D01*

+X199718Y263777D01*

+X199502Y263961D01*

+X199261Y264109D01*

+X198999Y264217D01*

+X198723Y264283D01*

+X198441Y264306D01*

+X198438Y264305D01*

+Y267695D01*

+X198441Y267694D01*

+X198723Y267717D01*

+X198999Y267783D01*

+X199261Y267891D01*

+X199502Y268039D01*

+X199718Y268223D01*

+X199902Y268439D01*

+X200050Y268680D01*

+X200158Y268942D01*

+X200224Y269218D01*

+X200241Y269500D01*

+X200224Y269782D01*

+X200158Y270058D01*

+X200050Y270320D01*

+X199902Y270561D01*

+X199718Y270777D01*

+X199502Y270961D01*

+X199261Y271109D01*

+X198999Y271217D01*

+X198723Y271283D01*

+X198441Y271306D01*

+X198438Y271305D01*

+Y307000D01*

+X198502Y307039D01*

+X198718Y307223D01*

+X198902Y307439D01*

+X199050Y307680D01*

+X199158Y307942D01*

+X199224Y308218D01*

+X199241Y308500D01*

+X199224Y308782D01*

+X199158Y309058D01*

+X199050Y309320D01*

+X198902Y309561D01*

+X198718Y309777D01*

+X198502Y309961D01*

+X198438Y310000D01*

+Y313000D01*

+X198502Y313039D01*

+X198718Y313223D01*

+X198902Y313439D01*

+X199050Y313680D01*

+X199158Y313942D01*

+X199224Y314218D01*

+X199241Y314500D01*

+X199224Y314782D01*

+X199158Y315058D01*

+X199050Y315320D01*

+X198902Y315561D01*

+X198718Y315777D01*

+X198502Y315961D01*

+X198438Y316000D01*

+Y361428D01*

+X198849Y361779D01*

+X199289Y362294D01*

+X199642Y362871D01*

+X199901Y363496D01*

+X200059Y364154D01*

+X200099Y364829D01*

+X200059Y365504D01*

+X199901Y366162D01*

+X199642Y366787D01*

+X199289Y367364D01*

+X198849Y367879D01*

+X198438Y368230D01*

+Y371428D01*

+X198849Y371779D01*

+X199289Y372294D01*

+X199642Y372871D01*

+X199901Y373496D01*

+X200059Y374154D01*

+X200099Y374829D01*

+X200059Y375504D01*

+X199901Y376162D01*

+X199642Y376787D01*

+X199289Y377364D01*

+X198849Y377879D01*

+X198438Y378230D01*

+Y397000D01*

+X203938D01*

+Y378712D01*

+X203841Y378672D01*

+X203264Y378319D01*

+X202749Y377879D01*

+X202309Y377364D01*

+X201956Y376787D01*

+X201697Y376162D01*

+X201539Y375504D01*

+X201486Y374829D01*

+X201539Y374154D01*

+X201697Y373496D01*

+X201956Y372871D01*

+X202309Y372294D01*

+X202749Y371779D01*

+X203264Y371339D01*

+X203841Y370986D01*

+X203938Y370946D01*

+Y368712D01*

+X203841Y368672D01*

+X203264Y368319D01*

+X202749Y367879D01*

+X202309Y367364D01*

+X201956Y366787D01*

+X201697Y366162D01*

+X201539Y365504D01*

+X201486Y364829D01*

+X201539Y364154D01*

+X201697Y363496D01*

+X201956Y362871D01*

+X202309Y362294D01*

+X202749Y361779D01*

+X203264Y361339D01*

+X203841Y360986D01*

+X203938Y360946D01*

+Y277993D01*

+X203832Y277820D01*

+X203724Y277558D01*

+X203658Y277282D01*

+X203635Y277000D01*

+X203658Y276718D01*

+X203724Y276442D01*

+X203832Y276180D01*

+X203938Y276007D01*

+Y239305D01*

+X203659Y239283D01*

+X203383Y239217D01*

+X203121Y239109D01*

+X202880Y238961D01*

+X202664Y238777D01*

+X202480Y238561D01*

+X202332Y238320D01*

+X202224Y238058D01*

+X202158Y237782D01*

+X202135Y237500D01*

+X202158Y237218D01*

+X202224Y236942D01*

+X202332Y236680D01*

+X202480Y236439D01*

+X202664Y236223D01*

+X202880Y236039D01*

+X203121Y235891D01*

+X203383Y235783D01*

+X203659Y235717D01*

+X203938Y235695D01*

+Y213502D01*

+X203902Y213561D01*

+X203718Y213777D01*

+X203502Y213961D01*

+X203261Y214109D01*

+X202999Y214217D01*

+X202723Y214283D01*

+X202441Y214306D01*

+X202159Y214283D01*

+X201883Y214217D01*

+X201621Y214109D01*

+X201380Y213961D01*

+X201164Y213777D01*

+X200980Y213561D01*

+X200832Y213320D01*

+X200724Y213058D01*

+X200658Y212782D01*

+X200635Y212500D01*

+X200658Y212218D01*

+X200724Y211942D01*

+X200832Y211680D01*

+X200980Y211439D01*

+X201164Y211223D01*

+X201380Y211039D01*

+X201621Y210891D01*

+X201883Y210783D01*

+X202159Y210717D01*

+X202441Y210694D01*

+X202723Y210717D01*

+X202999Y210783D01*

+X203261Y210891D01*

+X203502Y211039D01*

+X203718Y211223D01*

+X203902Y211439D01*

+X203938Y211498D01*

+Y201212D01*

+X203841Y201172D01*

+X203264Y200819D01*

+X202749Y200379D01*

+X202309Y199864D01*

+X201956Y199287D01*

+X201697Y198662D01*

+X201539Y198004D01*

+X201486Y197329D01*

+X201539Y196654D01*

+X201697Y195996D01*

+X201956Y195371D01*

+X202309Y194794D01*

+X202749Y194279D01*

+X203264Y193839D01*

+X203841Y193486D01*

+X203938Y193446D01*

+Y188712D01*

+X203841Y188672D01*

+X203264Y188319D01*

+X202749Y187879D01*

+X202309Y187364D01*

+X201956Y186787D01*

+X201697Y186162D01*

+X201539Y185504D01*

+X201486Y184829D01*

+X201539Y184154D01*

+X201697Y183496D01*

+X201956Y182871D01*

+X202309Y182294D01*

+X202749Y181779D01*

+X203264Y181339D01*

+X203841Y180986D01*

+X203938Y180946D01*

+Y178712D01*

+X203841Y178672D01*

+X203264Y178319D01*

+X202749Y177879D01*

+X202309Y177364D01*

+X201956Y176787D01*

+X201697Y176162D01*

+X201539Y175504D01*

+X201486Y174829D01*

+X201539Y174154D01*

+X201697Y173496D01*

+X201956Y172871D01*

+X202309Y172294D01*

+X202749Y171779D01*

+X203264Y171339D01*

+X203841Y170986D01*

+X203938Y170946D01*

+Y97000D01*

+G37*

+G36*

+X198438Y378230D02*X198334Y378319D01*

+X197757Y378672D01*

+X197132Y378931D01*

+X196474Y379089D01*

+X195799Y379142D01*

+X195792Y379142D01*

+Y397000D01*

+X198438D01*

+Y378230D01*

+G37*

+G36*

+Y368230D02*X198334Y368319D01*

+X197757Y368672D01*

+X197132Y368931D01*

+X196474Y369089D01*

+X195799Y369142D01*

+X195792Y369142D01*

+Y370516D01*

+X195799Y370516D01*

+X196474Y370569D01*

+X197132Y370727D01*

+X197757Y370986D01*

+X198334Y371339D01*

+X198438Y371428D01*

+Y368230D01*

+G37*

+G36*

+Y316000D02*X198261Y316109D01*

+X197999Y316217D01*

+X197723Y316283D01*

+X197441Y316306D01*

+X197159Y316283D01*

+X196883Y316217D01*

+X196621Y316109D01*

+X196380Y315961D01*

+X196164Y315777D01*

+X195980Y315561D01*

+X195832Y315320D01*

+X195792Y315223D01*

+Y360516D01*

+X195799Y360516D01*

+X196474Y360569D01*

+X197132Y360727D01*

+X197757Y360986D01*

+X198334Y361339D01*

+X198438Y361428D01*

+Y316000D01*

+G37*

+G36*

+Y310000D02*X198261Y310109D01*

+X197999Y310217D01*

+X197723Y310283D01*

+X197441Y310306D01*

+X197159Y310283D01*

+X196883Y310217D01*

+X196621Y310109D01*

+X196380Y309961D01*

+X196164Y309777D01*

+X195980Y309561D01*

+X195832Y309320D01*

+X195792Y309223D01*

+Y309733D01*

+X195999Y309783D01*

+X196261Y309891D01*

+X196502Y310039D01*

+X196718Y310223D01*

+X196902Y310439D01*

+X197050Y310680D01*

+X197158Y310942D01*

+X197224Y311218D01*

+X197241Y311500D01*

+X197224Y311782D01*

+X197158Y312058D01*

+X197050Y312320D01*

+X196902Y312561D01*

+X196718Y312777D01*

+X196502Y312961D01*

+X196261Y313109D01*

+X195999Y313217D01*

+X195792Y313267D01*

+Y313777D01*

+X195832Y313680D01*

+X195980Y313439D01*

+X196164Y313223D01*

+X196380Y313039D01*

+X196621Y312891D01*

+X196883Y312783D01*

+X197159Y312717D01*

+X197441Y312694D01*

+X197723Y312717D01*

+X197999Y312783D01*

+X198261Y312891D01*

+X198438Y313000D01*

+Y310000D01*

+G37*

+G36*

+Y201628D02*X195792Y201624D01*

+Y307777D01*

+X195832Y307680D01*

+X195980Y307439D01*

+X196164Y307223D01*

+X196380Y307039D01*

+X196621Y306891D01*

+X196883Y306783D01*

+X197159Y306717D01*

+X197441Y306694D01*

+X197723Y306717D01*

+X197999Y306783D01*

+X198261Y306891D01*

+X198438Y307000D01*

+Y271305D01*

+X198159Y271283D01*

+X197883Y271217D01*

+X197621Y271109D01*

+X197380Y270961D01*

+X197164Y270777D01*

+X196980Y270561D01*

+X196832Y270320D01*

+X196724Y270058D01*

+X196658Y269782D01*

+X196635Y269500D01*

+X196658Y269218D01*

+X196724Y268942D01*

+X196832Y268680D01*

+X196980Y268439D01*

+X197164Y268223D01*

+X197380Y268039D01*

+X197621Y267891D01*

+X197883Y267783D01*

+X198159Y267717D01*

+X198438Y267695D01*

+Y264305D01*

+X198159Y264283D01*

+X197883Y264217D01*

+X197621Y264109D01*

+X197380Y263961D01*

+X197164Y263777D01*

+X196980Y263561D01*

+X196832Y263320D01*

+X196724Y263058D01*

+X196658Y262782D01*

+X196635Y262500D01*

+X196658Y262218D01*

+X196724Y261942D01*

+X196832Y261680D01*

+X196980Y261439D01*

+X197164Y261223D01*

+X197380Y261039D01*

+X197621Y260891D01*

+X197883Y260783D01*

+X198159Y260717D01*

+X198438Y260695D01*

+Y201628D01*

+G37*

+G36*

+Y188230D02*X198334Y188319D01*

+X197757Y188672D01*

+X197132Y188931D01*

+X196474Y189089D01*

+X195799Y189142D01*

+X195792Y189142D01*

+Y193034D01*

+X198438Y193037D01*

+Y188230D01*

+G37*

+G36*

+Y178230D02*X198334Y178319D01*

+X197757Y178672D01*

+X197132Y178931D01*

+X196474Y179089D01*

+X195799Y179142D01*

+X195792Y179142D01*

+Y180516D01*

+X195799Y180516D01*

+X196474Y180569D01*

+X197132Y180727D01*

+X197757Y180986D01*

+X198334Y181339D01*

+X198438Y181428D01*

+Y178230D01*

+G37*

+G36*

+Y97000D02*X195792D01*

+Y131233D01*

+X195999Y131283D01*

+X196261Y131391D01*

+X196502Y131539D01*

+X196718Y131723D01*

+X196902Y131939D01*

+X197050Y132180D01*

+X197158Y132442D01*

+X197224Y132718D01*

+X197241Y133000D01*

+X197224Y133282D01*

+X197158Y133558D01*

+X197050Y133820D01*

+X196902Y134061D01*

+X196718Y134277D01*

+X196502Y134461D01*

+X196261Y134609D01*

+X195999Y134717D01*

+X195792Y134767D01*

+Y170516D01*

+X195799Y170516D01*

+X196474Y170569D01*

+X197132Y170727D01*

+X197757Y170986D01*

+X198334Y171339D01*

+X198438Y171428D01*

+Y124305D01*

+X198159Y124283D01*

+X197883Y124217D01*

+X197621Y124109D01*

+X197380Y123961D01*

+X197164Y123777D01*

+X196980Y123561D01*

+X196832Y123320D01*

+X196724Y123058D01*

+X196658Y122782D01*

+X196635Y122500D01*

+X196658Y122218D01*

+X196724Y121942D01*

+X196832Y121680D01*

+X196980Y121439D01*

+X197164Y121223D01*

+X197380Y121039D01*

+X197621Y120891D01*

+X197883Y120783D01*

+X198159Y120717D01*

+X198438Y120695D01*

+Y97000D01*

+G37*

+G36*

+X193387Y181264D02*X193841Y180986D01*

+X194466Y180727D01*

+X195124Y180569D01*

+X195792Y180516D01*

+Y179142D01*

+X195124Y179089D01*

+X194466Y178931D01*

+X193841Y178672D01*

+X193387Y178394D01*

+Y181264D01*

+G37*

+G36*

+Y193030D02*X195792Y193034D01*

+Y189142D01*

+X195124Y189089D01*

+X194466Y188931D01*

+X193841Y188672D01*

+X193387Y188394D01*

+Y193030D01*

+G37*

+G36*

+Y361264D02*X193841Y360986D01*

+X194466Y360727D01*

+X195124Y360569D01*

+X195792Y360516D01*

+Y315223D01*

+X195724Y315058D01*

+X195658Y314782D01*

+X195635Y314500D01*

+X195658Y314218D01*

+X195724Y313942D01*

+X195792Y313777D01*

+Y313267D01*

+X195723Y313283D01*

+X195441Y313306D01*

+X195159Y313283D01*

+X194883Y313217D01*

+X194621Y313109D01*

+X194380Y312961D01*

+X194164Y312777D01*

+X193980Y312561D01*

+X193832Y312320D01*

+X193724Y312058D01*

+X193658Y311782D01*

+X193635Y311500D01*

+X193658Y311218D01*

+X193724Y310942D01*

+X193832Y310680D01*

+X193980Y310439D01*

+X194164Y310223D01*

+X194380Y310039D01*

+X194621Y309891D01*

+X194883Y309783D01*

+X195159Y309717D01*

+X195441Y309694D01*

+X195723Y309717D01*

+X195792Y309733D01*

+Y309223D01*

+X195724Y309058D01*

+X195658Y308782D01*

+X195635Y308500D01*

+X195658Y308218D01*

+X195724Y307942D01*

+X195792Y307777D01*

+Y201624D01*

+X193387Y201621D01*

+Y210782D01*

+X193659Y210717D01*

+X193941Y210694D01*

+X194223Y210717D01*

+X194499Y210783D01*

+X194761Y210891D01*

+X195002Y211039D01*

+X195218Y211223D01*

+X195402Y211439D01*

+X195550Y211680D01*

+X195658Y211942D01*

+X195724Y212218D01*

+X195741Y212500D01*

+X195724Y212782D01*

+X195658Y213058D01*

+X195550Y213320D01*

+X195402Y213561D01*

+X195218Y213777D01*

+X195002Y213961D01*

+X194761Y214109D01*

+X194499Y214217D01*

+X194223Y214283D01*

+X193941Y214306D01*

+X193659Y214283D01*

+X193387Y214218D01*

+Y235282D01*

+X193659Y235217D01*

+X193941Y235194D01*

+X194223Y235217D01*

+X194499Y235283D01*

+X194761Y235391D01*

+X195002Y235539D01*

+X195218Y235723D01*

+X195402Y235939D01*

+X195550Y236180D01*

+X195658Y236442D01*

+X195724Y236718D01*

+X195741Y237000D01*

+X195724Y237282D01*

+X195658Y237558D01*

+X195550Y237820D01*

+X195402Y238061D01*

+X195218Y238277D01*

+X195002Y238461D01*

+X194761Y238609D01*

+X194499Y238717D01*

+X194223Y238783D01*

+X193941Y238806D01*

+X193659Y238783D01*

+X193387Y238718D01*

+Y361264D01*

+G37*

+G36*

+Y371264D02*X193841Y370986D01*

+X194466Y370727D01*

+X195124Y370569D01*

+X195792Y370516D01*

+Y369142D01*

+X195124Y369089D01*

+X194466Y368931D01*

+X193841Y368672D01*

+X193387Y368394D01*

+Y371264D01*

+G37*

+G36*

+Y397000D02*X195792D01*

+Y379142D01*

+X195124Y379089D01*

+X194466Y378931D01*

+X193841Y378672D01*

+X193387Y378394D01*

+Y397000D01*

+G37*

+G36*

+X195792Y97000D02*X193387D01*

+Y125695D01*

+X193390Y125694D01*

+X193672Y125717D01*

+X193948Y125783D01*

+X194210Y125891D01*

+X194451Y126039D01*

+X194667Y126223D01*

+X194851Y126439D01*

+X194999Y126680D01*

+X195107Y126942D01*

+X195173Y127218D01*

+X195190Y127500D01*

+X195173Y127782D01*

+X195107Y128058D01*

+X194999Y128320D01*

+X194851Y128561D01*

+X194667Y128777D01*

+X194451Y128961D01*

+X194210Y129109D01*

+X193948Y129217D01*

+X193672Y129283D01*

+X193390Y129306D01*

+X193387Y129305D01*

+Y171264D01*

+X193841Y170986D01*

+X194466Y170727D01*

+X195124Y170569D01*

+X195792Y170516D01*

+Y134767D01*

+X195723Y134783D01*

+X195441Y134806D01*

+X195159Y134783D01*

+X194883Y134717D01*

+X194621Y134609D01*

+X194380Y134461D01*

+X194164Y134277D01*

+X193980Y134061D01*

+X193832Y133820D01*

+X193724Y133558D01*

+X193658Y133282D01*

+X193635Y133000D01*

+X193658Y132718D01*

+X193724Y132442D01*

+X193832Y132180D01*

+X193980Y131939D01*

+X194164Y131723D01*

+X194380Y131539D01*

+X194621Y131391D01*

+X194883Y131283D01*

+X195159Y131217D01*

+X195441Y131194D01*

+X195723Y131217D01*

+X195792Y131233D01*

+Y97000D01*

+G37*

+G36*

+X193387D02*X191360D01*

+Y342644D01*

+X191363Y342643D01*

+X191645Y342666D01*

+X191921Y342732D01*

+X192183Y342840D01*

+X192424Y342988D01*

+X192640Y343172D01*

+X192824Y343388D01*

+X192972Y343629D01*

+X193080Y343891D01*

+X193146Y344167D01*

+X193163Y344449D01*

+X193146Y344731D01*

+X193080Y345007D01*

+X192972Y345269D01*

+X192824Y345510D01*

+X192640Y345726D01*

+X192424Y345910D01*

+X192183Y346058D01*

+X191921Y346166D01*

+X191645Y346232D01*

+X191363Y346255D01*

+X191360Y346254D01*

+Y397000D01*

+X193387D01*

+Y378394D01*

+X193264Y378319D01*

+X192749Y377879D01*

+X192309Y377364D01*

+X191956Y376787D01*

+X191697Y376162D01*

+X191539Y375504D01*

+X191486Y374829D01*

+X191539Y374154D01*

+X191697Y373496D01*

+X191956Y372871D01*

+X192309Y372294D01*

+X192749Y371779D01*

+X193264Y371339D01*

+X193387Y371264D01*

+Y368394D01*

+X193264Y368319D01*

+X192749Y367879D01*

+X192309Y367364D01*

+X191956Y366787D01*

+X191697Y366162D01*

+X191539Y365504D01*

+X191486Y364829D01*

+X191539Y364154D01*

+X191697Y363496D01*

+X191956Y362871D01*

+X192309Y362294D01*

+X192749Y361779D01*

+X193264Y361339D01*

+X193387Y361264D01*

+Y238718D01*

+X193383Y238717D01*

+X193121Y238609D01*

+X192880Y238461D01*

+X192664Y238277D01*

+X192480Y238061D01*

+X192332Y237820D01*

+X192224Y237558D01*

+X192158Y237282D01*

+X192135Y237000D01*

+X192158Y236718D01*

+X192224Y236442D01*

+X192332Y236180D01*

+X192480Y235939D01*

+X192664Y235723D01*

+X192880Y235539D01*

+X193121Y235391D01*

+X193383Y235283D01*

+X193387Y235282D01*

+Y214218D01*

+X193383Y214217D01*

+X193121Y214109D01*

+X192880Y213961D01*

+X192664Y213777D01*

+X192480Y213561D01*

+X192332Y213320D01*

+X192224Y213058D01*

+X192158Y212782D01*

+X192135Y212500D01*

+X192158Y212218D01*

+X192224Y211942D01*

+X192332Y211680D01*

+X192480Y211439D01*

+X192664Y211223D01*

+X192880Y211039D01*

+X193121Y210891D01*

+X193383Y210783D01*

+X193387Y210782D01*

+Y201621D01*

+X192342Y201620D01*

+X192189Y201583D01*

+X192044Y201523D01*

+X191909Y201441D01*

+X191790Y201338D01*

+X191687Y201219D01*

+X191605Y201084D01*

+X191545Y200939D01*

+X191508Y200786D01*

+X191499Y200629D01*

+X191508Y193872D01*

+X191545Y193719D01*

+X191605Y193574D01*

+X191687Y193439D01*

+X191790Y193320D01*

+X191909Y193217D01*

+X192044Y193135D01*

+X192189Y193075D01*

+X192342Y193038D01*

+X192499Y193029D01*

+X193387Y193030D01*

+Y188394D01*

+X193264Y188319D01*

+X192749Y187879D01*

+X192309Y187364D01*

+X191956Y186787D01*

+X191697Y186162D01*

+X191539Y185504D01*

+X191486Y184829D01*

+X191539Y184154D01*

+X191697Y183496D01*

+X191956Y182871D01*

+X192309Y182294D01*

+X192749Y181779D01*

+X193264Y181339D01*

+X193387Y181264D01*

+Y178394D01*

+X193264Y178319D01*

+X192749Y177879D01*

+X192309Y177364D01*

+X191956Y176787D01*

+X191697Y176162D01*

+X191539Y175504D01*

+X191486Y174829D01*

+X191539Y174154D01*

+X191697Y173496D01*

+X191956Y172871D01*

+X192309Y172294D01*

+X192749Y171779D01*

+X193264Y171339D01*

+X193387Y171264D01*

+Y129305D01*

+X193108Y129283D01*

+X192832Y129217D01*

+X192570Y129109D01*

+X192329Y128961D01*

+X192113Y128777D01*

+X191929Y128561D01*

+X191781Y128320D01*

+X191673Y128058D01*

+X191607Y127782D01*

+X191584Y127500D01*

+X191607Y127218D01*

+X191673Y126942D01*

+X191781Y126680D01*

+X191929Y126439D01*

+X192113Y126223D01*

+X192329Y126039D01*

+X192570Y125891D01*

+X192832Y125783D01*

+X193108Y125717D01*

+X193387Y125695D01*

+Y97000D01*

+G37*

+G36*

+X191360D02*X185792D01*

+Y170516D01*

+X185799Y170516D01*

+X186474Y170569D01*

+X187132Y170727D01*

+X187757Y170986D01*

+X188334Y171339D01*

+X188849Y171779D01*

+X189289Y172294D01*

+X189642Y172871D01*

+X189901Y173496D01*

+X190059Y174154D01*

+X190099Y174829D01*

+X190059Y175504D01*

+X189901Y176162D01*

+X189642Y176787D01*

+X189289Y177364D01*

+X188849Y177879D01*

+X188334Y178319D01*

+X187757Y178672D01*

+X187132Y178931D01*

+X186474Y179089D01*

+X185799Y179142D01*

+X185792Y179142D01*

+Y180516D01*

+X185799Y180516D01*

+X186474Y180569D01*

+X187132Y180727D01*

+X187757Y180986D01*

+X188334Y181339D01*

+X188849Y181779D01*

+X189289Y182294D01*

+X189642Y182871D01*

+X189901Y183496D01*

+X190059Y184154D01*

+X190099Y184829D01*

+X190059Y185504D01*

+X189901Y186162D01*

+X189642Y186787D01*

+X189289Y187364D01*

+X188849Y187879D01*

+X188334Y188319D01*

+X187757Y188672D01*

+X187132Y188931D01*

+X186474Y189089D01*

+X185799Y189142D01*

+X185792Y189142D01*

+Y215733D01*

+X185999Y215783D01*

+X186261Y215891D01*

+X186502Y216039D01*

+X186718Y216223D01*

+X186902Y216439D01*

+X187050Y216680D01*

+X187158Y216942D01*

+X187224Y217218D01*

+X187241Y217500D01*

+X187224Y217782D01*

+X187158Y218058D01*

+X187050Y218320D01*

+X186902Y218561D01*

+X186718Y218777D01*

+X186502Y218961D01*

+X186261Y219109D01*

+X185999Y219217D01*

+X185792Y219267D01*

+Y226233D01*

+X185999Y226283D01*

+X186261Y226391D01*

+X186502Y226539D01*

+X186718Y226723D01*

+X186902Y226939D01*

+X187050Y227180D01*

+X187158Y227442D01*

+X187224Y227718D01*

+X187241Y228000D01*

+X187224Y228282D01*

+X187158Y228558D01*

+X187050Y228820D01*

+X186902Y229061D01*

+X186718Y229277D01*

+X186502Y229461D01*

+X186261Y229609D01*

+X185999Y229717D01*

+X185792Y229767D01*

+Y360516D01*

+X185799Y360516D01*

+X186474Y360569D01*

+X187132Y360727D01*

+X187757Y360986D01*

+X188334Y361339D01*

+X188849Y361779D01*

+X189289Y362294D01*

+X189642Y362871D01*

+X189901Y363496D01*

+X190059Y364154D01*

+X190099Y364829D01*

+X190059Y365504D01*

+X189901Y366162D01*

+X189642Y366787D01*

+X189289Y367364D01*

+X188849Y367879D01*

+X188334Y368319D01*

+X187757Y368672D01*

+X187132Y368931D01*

+X186474Y369089D01*

+X185799Y369142D01*

+X185792Y369142D01*

+Y370516D01*

+X185799Y370516D01*

+X186474Y370569D01*

+X187132Y370727D01*

+X187757Y370986D01*

+X188334Y371339D01*

+X188849Y371779D01*

+X189289Y372294D01*

+X189642Y372871D01*

+X189901Y373496D01*

+X190059Y374154D01*

+X190099Y374829D01*

+X190059Y375504D01*

+X189901Y376162D01*

+X189642Y376787D01*

+X189289Y377364D01*

+X188849Y377879D01*

+X188334Y378319D01*

+X187757Y378672D01*

+X187132Y378931D01*

+X186474Y379089D01*

+X185799Y379142D01*

+X185792Y379142D01*

+Y397000D01*

+X191360D01*

+Y346254D01*

+X191081Y346232D01*

+X190805Y346166D01*

+X190543Y346058D01*

+X190302Y345910D01*

+X190086Y345726D01*

+X189902Y345510D01*

+X189754Y345269D01*

+X189646Y345007D01*

+X189580Y344731D01*

+X189557Y344449D01*

+X189580Y344167D01*

+X189646Y343891D01*

+X189754Y343629D01*

+X189902Y343388D01*

+X190086Y343172D01*

+X190302Y342988D01*

+X190543Y342840D01*

+X190805Y342732D01*

+X191081Y342666D01*

+X191360Y342644D01*

+Y97000D01*

+G37*

+G36*

+X181938Y182913D02*X181956Y182871D01*

+X182309Y182294D01*

+X182749Y181779D01*

+X183264Y181339D01*

+X183841Y180986D01*

+X184466Y180727D01*

+X185124Y180569D01*

+X185792Y180516D01*

+Y179142D01*

+X185124Y179089D01*

+X184466Y178931D01*

+X183841Y178672D01*

+X183264Y178319D01*

+X182749Y177879D01*

+X182309Y177364D01*

+X181956Y176787D01*

+X181938Y176745D01*

+Y182913D01*

+G37*

+G36*

+Y362913D02*X181956Y362871D01*

+X182309Y362294D01*

+X182749Y361779D01*

+X183264Y361339D01*

+X183841Y360986D01*

+X184466Y360727D01*

+X185124Y360569D01*

+X185792Y360516D01*

+Y229767D01*

+X185723Y229783D01*

+X185441Y229806D01*

+X185159Y229783D01*

+X184883Y229717D01*

+X184621Y229609D01*

+X184380Y229461D01*

+X184164Y229277D01*

+X183980Y229061D01*

+X183832Y228820D01*

+X183724Y228558D01*

+X183658Y228282D01*

+X183635Y228000D01*

+X183658Y227718D01*

+X183724Y227442D01*

+X183832Y227180D01*

+X183980Y226939D01*

+X184164Y226723D01*

+X184380Y226539D01*

+X184621Y226391D01*

+X184883Y226283D01*

+X185159Y226217D01*

+X185441Y226194D01*

+X185723Y226217D01*

+X185792Y226233D01*

+Y219267D01*

+X185723Y219283D01*

+X185441Y219306D01*

+X185159Y219283D01*

+X184883Y219217D01*

+X184621Y219109D01*

+X184380Y218961D01*

+X184164Y218777D01*

+X183980Y218561D01*

+X183832Y218320D01*

+X183724Y218058D01*

+X183658Y217782D01*

+X183635Y217500D01*

+X183658Y217218D01*

+X183724Y216942D01*

+X183832Y216680D01*

+X183980Y216439D01*

+X184164Y216223D01*

+X184380Y216039D01*

+X184621Y215891D01*

+X184883Y215783D01*

+X185159Y215717D01*

+X185441Y215694D01*

+X185723Y215717D01*

+X185792Y215733D01*

+Y189142D01*

+X185124Y189089D01*

+X184466Y188931D01*

+X183841Y188672D01*

+X183264Y188319D01*

+X182749Y187879D01*

+X182309Y187364D01*

+X181956Y186787D01*

+X181938Y186745D01*

+Y256695D01*

+X181941Y256694D01*

+X182223Y256717D01*

+X182499Y256783D01*

+X182761Y256891D01*

+X183002Y257039D01*

+X183218Y257223D01*

+X183402Y257439D01*

+X183550Y257680D01*

+X183658Y257942D01*

+X183724Y258218D01*

+X183741Y258500D01*

+X183724Y258782D01*

+X183658Y259058D01*

+X183550Y259320D01*

+X183402Y259561D01*

+X183218Y259777D01*

+X183002Y259961D01*

+X182761Y260109D01*

+X182499Y260217D01*

+X182223Y260283D01*

+X181941Y260306D01*

+X181938Y260305D01*

+Y362913D01*

+G37*

+G36*

+Y372913D02*X181956Y372871D01*

+X182309Y372294D01*

+X182749Y371779D01*

+X183264Y371339D01*

+X183841Y370986D01*

+X184466Y370727D01*

+X185124Y370569D01*

+X185792Y370516D01*

+Y369142D01*

+X185124Y369089D01*

+X184466Y368931D01*

+X183841Y368672D01*

+X183264Y368319D01*

+X182749Y367879D01*

+X182309Y367364D01*

+X181956Y366787D01*

+X181938Y366745D01*

+Y372913D01*

+G37*

+G36*

+Y397000D02*X185792D01*

+Y379142D01*

+X185124Y379089D01*

+X184466Y378931D01*

+X183841Y378672D01*

+X183264Y378319D01*

+X182749Y377879D01*

+X182309Y377364D01*

+X181956Y376787D01*

+X181938Y376745D01*

+Y397000D01*

+G37*

+G36*

+X185792Y97000D02*X181938D01*

+Y172913D01*

+X181956Y172871D01*

+X182309Y172294D01*

+X182749Y171779D01*

+X183264Y171339D01*

+X183841Y170986D01*

+X184466Y170727D01*

+X185124Y170569D01*

+X185792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X181938D02*X178884D01*

+Y171820D01*

+X179289Y172294D01*

+X179642Y172871D01*

+X179901Y173496D01*

+X180059Y174154D01*

+X180099Y174829D01*

+X180059Y175504D01*

+X179901Y176162D01*

+X179642Y176787D01*

+X179289Y177364D01*

+X178884Y177838D01*

+Y181820D01*

+X179289Y182294D01*

+X179642Y182871D01*

+X179901Y183496D01*

+X180059Y184154D01*

+X180099Y184829D01*

+X180059Y185504D01*

+X179901Y186162D01*

+X179642Y186787D01*

+X179289Y187364D01*

+X178884Y187838D01*

+Y216418D01*

+X178902Y216439D01*

+X179050Y216680D01*

+X179158Y216942D01*

+X179224Y217218D01*

+X179241Y217500D01*

+X179224Y217782D01*

+X179158Y218058D01*

+X179050Y218320D01*

+X178902Y218561D01*

+X178884Y218582D01*

+Y226918D01*

+X178902Y226939D01*

+X179050Y227180D01*

+X179158Y227442D01*

+X179224Y227718D01*

+X179241Y228000D01*

+X179224Y228282D01*

+X179158Y228558D01*

+X179050Y228820D01*

+X178902Y229061D01*

+X178884Y229082D01*

+Y341013D01*

+X178887Y341012D01*

+X179169Y341035D01*

+X179445Y341101D01*

+X179707Y341209D01*

+X179948Y341357D01*

+X180164Y341541D01*

+X180348Y341757D01*

+X180496Y341998D01*

+X180604Y342260D01*

+X180670Y342536D01*

+X180687Y342818D01*

+X180670Y343100D01*

+X180604Y343376D01*

+X180496Y343638D01*

+X180348Y343879D01*

+X180164Y344095D01*

+X179948Y344279D01*

+X179707Y344427D01*

+X179445Y344535D01*

+X179169Y344601D01*

+X178887Y344624D01*

+X178884Y344623D01*

+Y361820D01*

+X179289Y362294D01*

+X179642Y362871D01*

+X179901Y363496D01*

+X180059Y364154D01*

+X180099Y364829D01*

+X180059Y365504D01*

+X179901Y366162D01*

+X179642Y366787D01*

+X179289Y367364D01*

+X178884Y367838D01*

+Y371820D01*

+X179289Y372294D01*

+X179642Y372871D01*

+X179901Y373496D01*

+X180059Y374154D01*

+X180099Y374829D01*

+X180059Y375504D01*

+X179901Y376162D01*

+X179642Y376787D01*

+X179289Y377364D01*

+X178884Y377838D01*

+Y397000D01*

+X181938D01*

+Y376745D01*

+X181697Y376162D01*

+X181539Y375504D01*

+X181486Y374829D01*

+X181539Y374154D01*

+X181697Y373496D01*

+X181938Y372913D01*

+Y366745D01*

+X181697Y366162D01*

+X181539Y365504D01*

+X181486Y364829D01*

+X181539Y364154D01*

+X181697Y363496D01*

+X181938Y362913D01*

+Y260305D01*

+X181659Y260283D01*

+X181383Y260217D01*

+X181121Y260109D01*

+X180880Y259961D01*

+X180664Y259777D01*

+X180480Y259561D01*

+X180332Y259320D01*

+X180224Y259058D01*

+X180158Y258782D01*

+X180135Y258500D01*

+X180158Y258218D01*

+X180224Y257942D01*

+X180332Y257680D01*

+X180480Y257439D01*

+X180664Y257223D01*

+X180880Y257039D01*

+X181121Y256891D01*

+X181383Y256783D01*

+X181659Y256717D01*

+X181938Y256695D01*

+Y186745D01*

+X181697Y186162D01*

+X181539Y185504D01*

+X181486Y184829D01*

+X181539Y184154D01*

+X181697Y183496D01*

+X181938Y182913D01*

+Y176745D01*

+X181697Y176162D01*

+X181539Y175504D01*

+X181486Y174829D01*

+X181539Y174154D01*

+X181697Y173496D01*

+X181938Y172913D01*

+Y97000D01*

+G37*

+G36*

+X178884Y377838D02*X178849Y377879D01*

+X178334Y378319D01*

+X177757Y378672D01*

+X177132Y378931D01*

+X176474Y379089D01*

+X175799Y379142D01*

+X175792Y379142D01*

+Y397000D01*

+X178884D01*

+Y377838D01*

+G37*

+G36*

+Y367838D02*X178849Y367879D01*

+X178334Y368319D01*

+X177757Y368672D01*

+X177132Y368931D01*

+X176474Y369089D01*

+X175799Y369142D01*

+X175792Y369142D01*

+Y370516D01*

+X175799Y370516D01*

+X176474Y370569D01*

+X177132Y370727D01*

+X177757Y370986D01*

+X178334Y371339D01*

+X178849Y371779D01*

+X178884Y371820D01*

+Y367838D01*

+G37*

+G36*

+Y229082D02*X178718Y229277D01*

+X178502Y229461D01*

+X178261Y229609D01*

+X177999Y229717D01*

+X177723Y229783D01*

+X177441Y229806D01*

+X177159Y229783D01*

+X176883Y229717D01*

+X176621Y229609D01*

+X176380Y229461D01*

+X176164Y229277D01*

+X175980Y229061D01*

+X175832Y228820D01*

+X175792Y228723D01*

+Y360516D01*

+X175799Y360516D01*

+X176474Y360569D01*

+X177132Y360727D01*

+X177757Y360986D01*

+X178334Y361339D01*

+X178849Y361779D01*

+X178884Y361820D01*

+Y344623D01*

+X178605Y344601D01*

+X178329Y344535D01*

+X178067Y344427D01*

+X177826Y344279D01*

+X177610Y344095D01*

+X177426Y343879D01*

+X177278Y343638D01*

+X177170Y343376D01*

+X177104Y343100D01*

+X177081Y342818D01*

+X177104Y342536D01*

+X177170Y342260D01*

+X177278Y341998D01*

+X177426Y341757D01*

+X177610Y341541D01*

+X177826Y341357D01*

+X178067Y341209D01*

+X178329Y341101D01*

+X178605Y341035D01*

+X178884Y341013D01*

+Y229082D01*

+G37*

+G36*

+Y218582D02*X178718Y218777D01*

+X178502Y218961D01*

+X178261Y219109D01*

+X177999Y219217D01*

+X177723Y219283D01*

+X177441Y219306D01*

+X177159Y219283D01*

+X176883Y219217D01*

+X176621Y219109D01*

+X176380Y218961D01*

+X176164Y218777D01*

+X175980Y218561D01*

+X175832Y218320D01*

+X175792Y218223D01*

+Y227277D01*

+X175832Y227180D01*

+X175980Y226939D01*

+X176164Y226723D01*

+X176380Y226539D01*

+X176621Y226391D01*

+X176883Y226283D01*

+X177159Y226217D01*

+X177441Y226194D01*

+X177723Y226217D01*

+X177999Y226283D01*

+X178261Y226391D01*

+X178502Y226539D01*

+X178718Y226723D01*

+X178884Y226918D01*

+Y218582D01*

+G37*

+G36*

+Y187838D02*X178849Y187879D01*

+X178334Y188319D01*

+X177757Y188672D01*

+X177132Y188931D01*

+X176474Y189089D01*

+X175799Y189142D01*

+X175792Y189142D01*

+Y216777D01*

+X175832Y216680D01*

+X175980Y216439D01*

+X176164Y216223D01*

+X176380Y216039D01*

+X176621Y215891D01*

+X176883Y215783D01*

+X177159Y215717D01*

+X177441Y215694D01*

+X177723Y215717D01*

+X177999Y215783D01*

+X178261Y215891D01*

+X178502Y216039D01*

+X178718Y216223D01*

+X178884Y216418D01*

+Y187838D01*

+G37*

+G36*

+Y177838D02*X178849Y177879D01*

+X178334Y178319D01*

+X177757Y178672D01*

+X177132Y178931D01*

+X176474Y179089D01*

+X175799Y179142D01*

+X175792Y179142D01*

+Y180516D01*

+X175799Y180516D01*

+X176474Y180569D01*

+X177132Y180727D01*

+X177757Y180986D01*

+X178334Y181339D01*

+X178849Y181779D01*

+X178884Y181820D01*

+Y177838D01*

+G37*

+G36*

+Y97000D02*X175792D01*

+Y170516D01*

+X175799Y170516D01*

+X176474Y170569D01*

+X177132Y170727D01*

+X177757Y170986D01*

+X178334Y171339D01*

+X178849Y171779D01*

+X178884Y171820D01*

+Y97000D01*

+G37*

+G36*

+X175792D02*X168729D01*

+Y171677D01*

+X168849Y171779D01*

+X169289Y172294D01*

+X169642Y172871D01*

+X169901Y173496D01*

+X170059Y174154D01*

+X170099Y174829D01*

+X170059Y175504D01*

+X169901Y176162D01*

+X169642Y176787D01*

+X169289Y177364D01*

+X168849Y177879D01*

+X168729Y177981D01*

+Y181677D01*

+X168849Y181779D01*

+X169289Y182294D01*

+X169642Y182871D01*

+X169901Y183496D01*

+X170059Y184154D01*

+X170099Y184829D01*

+X170059Y185504D01*

+X169901Y186162D01*

+X169642Y186787D01*

+X169289Y187364D01*

+X168849Y187879D01*

+X168729Y187981D01*

+Y199847D01*

+X168883Y199783D01*

+X169159Y199717D01*

+X169441Y199694D01*

+X169723Y199717D01*

+X169999Y199783D01*

+X170261Y199891D01*

+X170502Y200039D01*

+X170718Y200223D01*

+X170902Y200439D01*

+X171050Y200680D01*

+X171158Y200942D01*

+X171224Y201218D01*

+X171241Y201500D01*

+X171224Y201782D01*

+X171158Y202058D01*

+X171050Y202320D01*

+X170902Y202561D01*

+X170718Y202777D01*

+X170502Y202961D01*

+X170261Y203109D01*

+X169999Y203217D01*

+X169723Y203283D01*

+X169441Y203306D01*

+X169159Y203283D01*

+X168883Y203217D01*

+X168729Y203153D01*

+Y206847D01*

+X168883Y206783D01*

+X169159Y206717D01*

+X169441Y206694D01*

+X169723Y206717D01*

+X169999Y206783D01*

+X170261Y206891D01*

+X170502Y207039D01*

+X170718Y207223D01*

+X170902Y207439D01*

+X171050Y207680D01*

+X171158Y207942D01*

+X171224Y208218D01*

+X171241Y208500D01*

+X171224Y208782D01*

+X171158Y209058D01*

+X171050Y209320D01*

+X170902Y209561D01*

+X170718Y209777D01*

+X170502Y209961D01*

+X170261Y210109D01*

+X169999Y210217D01*

+X169723Y210283D01*

+X169441Y210306D01*

+X169159Y210283D01*

+X168883Y210217D01*

+X168729Y210153D01*

+Y212347D01*

+X168883Y212283D01*

+X169159Y212217D01*

+X169441Y212194D01*

+X169723Y212217D01*

+X169999Y212283D01*

+X170261Y212391D01*

+X170502Y212539D01*

+X170718Y212723D01*

+X170902Y212939D01*

+X171050Y213180D01*

+X171158Y213442D01*

+X171224Y213718D01*

+X171241Y214000D01*

+X171224Y214282D01*

+X171158Y214558D01*

+X171050Y214820D01*

+X170902Y215061D01*

+X170718Y215277D01*

+X170502Y215461D01*

+X170261Y215609D01*

+X169999Y215717D01*

+X169723Y215783D01*

+X169441Y215806D01*

+X169159Y215783D01*

+X168883Y215717D01*

+X168729Y215653D01*

+Y349028D01*

+X168732Y349027D01*

+X169014Y349050D01*

+X169290Y349116D01*

+X169552Y349224D01*

+X169793Y349372D01*

+X170009Y349556D01*

+X170193Y349772D01*

+X170341Y350013D01*

+X170449Y350275D01*

+X170515Y350551D01*

+X170532Y350833D01*

+X170515Y351115D01*

+X170449Y351391D01*

+X170341Y351653D01*

+X170193Y351894D01*

+X170009Y352110D01*

+X169793Y352294D01*

+X169552Y352442D01*

+X169290Y352550D01*

+X169014Y352616D01*

+X168732Y352639D01*

+X168729Y352638D01*

+Y361677D01*

+X168849Y361779D01*

+X169289Y362294D01*

+X169642Y362871D01*

+X169901Y363496D01*

+X170059Y364154D01*

+X170099Y364829D01*

+X170059Y365504D01*

+X169901Y366162D01*

+X169642Y366787D01*

+X169289Y367364D01*

+X168849Y367879D01*

+X168729Y367981D01*

+Y371677D01*

+X168849Y371779D01*

+X169289Y372294D01*

+X169642Y372871D01*

+X169901Y373496D01*

+X170059Y374154D01*

+X170099Y374829D01*

+X170059Y375504D01*

+X169901Y376162D01*

+X169642Y376787D01*

+X169289Y377364D01*

+X168849Y377879D01*

+X168729Y377981D01*

+Y397000D01*

+X175792D01*

+Y379142D01*

+X175124Y379089D01*

+X174466Y378931D01*

+X173841Y378672D01*

+X173264Y378319D01*

+X172749Y377879D01*

+X172309Y377364D01*

+X171956Y376787D01*

+X171697Y376162D01*

+X171539Y375504D01*

+X171486Y374829D01*

+X171539Y374154D01*

+X171697Y373496D01*

+X171956Y372871D01*

+X172309Y372294D01*

+X172749Y371779D01*

+X173264Y371339D01*

+X173841Y370986D01*

+X174466Y370727D01*

+X175124Y370569D01*

+X175792Y370516D01*

+Y369142D01*

+X175124Y369089D01*

+X174466Y368931D01*

+X173841Y368672D01*

+X173264Y368319D01*

+X172749Y367879D01*

+X172309Y367364D01*

+X171956Y366787D01*

+X171697Y366162D01*

+X171539Y365504D01*

+X171486Y364829D01*

+X171539Y364154D01*

+X171697Y363496D01*

+X171956Y362871D01*

+X172309Y362294D01*

+X172749Y361779D01*

+X173264Y361339D01*

+X173841Y360986D01*

+X174466Y360727D01*

+X175124Y360569D01*

+X175792Y360516D01*

+Y228723D01*

+X175724Y228558D01*

+X175658Y228282D01*

+X175635Y228000D01*

+X175658Y227718D01*

+X175724Y227442D01*

+X175792Y227277D01*

+Y218223D01*

+X175724Y218058D01*

+X175658Y217782D01*

+X175635Y217500D01*

+X175658Y217218D01*

+X175724Y216942D01*

+X175792Y216777D01*

+Y189142D01*

+X175124Y189089D01*

+X174466Y188931D01*

+X173841Y188672D01*

+X173264Y188319D01*

+X172749Y187879D01*

+X172309Y187364D01*

+X171956Y186787D01*

+X171697Y186162D01*

+X171539Y185504D01*

+X171486Y184829D01*

+X171539Y184154D01*

+X171697Y183496D01*

+X171956Y182871D01*

+X172309Y182294D01*

+X172749Y181779D01*

+X173264Y181339D01*

+X173841Y180986D01*

+X174466Y180727D01*

+X175124Y180569D01*

+X175792Y180516D01*

+Y179142D01*

+X175124Y179089D01*

+X174466Y178931D01*

+X173841Y178672D01*

+X173264Y178319D01*

+X172749Y177879D01*

+X172309Y177364D01*

+X171956Y176787D01*

+X171697Y176162D01*

+X171539Y175504D01*

+X171486Y174829D01*

+X171539Y174154D01*

+X171697Y173496D01*

+X171956Y172871D01*

+X172309Y172294D01*

+X172749Y171779D01*

+X173264Y171339D01*

+X173841Y170986D01*

+X174466Y170727D01*

+X175124Y170569D01*

+X175792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X168729Y377981D02*X168334Y378319D01*

+X167757Y378672D01*

+X167132Y378931D01*

+X166474Y379089D01*

+X165799Y379142D01*

+X165792Y379142D01*

+Y397000D01*

+X168729D01*

+Y377981D01*

+G37*

+G36*

+Y367981D02*X168334Y368319D01*

+X167757Y368672D01*

+X167132Y368931D01*

+X166474Y369089D01*

+X165799Y369142D01*

+X165792Y369142D01*

+Y370516D01*

+X165799Y370516D01*

+X166474Y370569D01*

+X167132Y370727D01*

+X167757Y370986D01*

+X168334Y371339D01*

+X168729Y371677D01*

+Y367981D01*

+G37*

+G36*

+Y187981D02*X168334Y188319D01*

+X167757Y188672D01*

+X167132Y188931D01*

+X166474Y189089D01*

+X165799Y189142D01*

+X165792Y189142D01*

+Y218706D01*

+X165941Y218694D01*

+X166223Y218717D01*

+X166499Y218783D01*

+X166761Y218891D01*

+X167002Y219039D01*

+X167218Y219223D01*

+X167402Y219439D01*

+X167550Y219680D01*

+X167658Y219942D01*

+X167724Y220218D01*

+X167741Y220500D01*

+X167724Y220782D01*

+X167658Y221058D01*

+X167550Y221320D01*

+X167402Y221561D01*

+X167218Y221777D01*

+X167002Y221961D01*

+X166761Y222109D01*

+X166499Y222217D01*

+X166223Y222283D01*

+X165941Y222306D01*

+X165792Y222294D01*

+Y224706D01*

+X165941Y224694D01*

+X166223Y224717D01*

+X166499Y224783D01*

+X166761Y224891D01*

+X167002Y225039D01*

+X167218Y225223D01*

+X167402Y225439D01*

+X167550Y225680D01*

+X167658Y225942D01*

+X167724Y226218D01*

+X167741Y226500D01*

+X167724Y226782D01*

+X167658Y227058D01*

+X167550Y227320D01*

+X167402Y227561D01*

+X167218Y227777D01*

+X167002Y227961D01*

+X166761Y228109D01*

+X166499Y228217D01*

+X166223Y228283D01*

+X165941Y228306D01*

+X165792Y228294D01*

+Y229206D01*

+X165941Y229194D01*

+X166223Y229217D01*

+X166499Y229283D01*

+X166761Y229391D01*

+X167002Y229539D01*

+X167218Y229723D01*

+X167402Y229939D01*

+X167550Y230180D01*

+X167658Y230442D01*

+X167724Y230718D01*

+X167741Y231000D01*

+X167724Y231282D01*

+X167658Y231558D01*

+X167550Y231820D01*

+X167402Y232061D01*

+X167218Y232277D01*

+X167002Y232461D01*

+X166761Y232609D01*

+X166499Y232717D01*

+X166223Y232783D01*

+X165941Y232806D01*

+X165792Y232794D01*

+Y360516D01*

+X165799Y360516D01*

+X166474Y360569D01*

+X167132Y360727D01*

+X167757Y360986D01*

+X168334Y361339D01*

+X168729Y361677D01*

+Y352638D01*

+X168450Y352616D01*

+X168174Y352550D01*

+X167912Y352442D01*

+X167671Y352294D01*

+X167455Y352110D01*

+X167271Y351894D01*

+X167123Y351653D01*

+X167015Y351391D01*

+X166949Y351115D01*

+X166926Y350833D01*

+X166949Y350551D01*

+X167015Y350275D01*

+X167123Y350013D01*

+X167271Y349772D01*

+X167455Y349556D01*

+X167671Y349372D01*

+X167912Y349224D01*

+X168174Y349116D01*

+X168450Y349050D01*

+X168729Y349028D01*

+Y215653D01*

+X168621Y215609D01*

+X168380Y215461D01*

+X168164Y215277D01*

+X167980Y215061D01*

+X167832Y214820D01*

+X167724Y214558D01*

+X167658Y214282D01*

+X167635Y214000D01*

+X167658Y213718D01*

+X167724Y213442D01*

+X167832Y213180D01*

+X167980Y212939D01*

+X168164Y212723D01*

+X168380Y212539D01*

+X168621Y212391D01*

+X168729Y212347D01*

+Y210153D01*

+X168621Y210109D01*

+X168380Y209961D01*

+X168164Y209777D01*

+X167980Y209561D01*

+X167832Y209320D01*

+X167724Y209058D01*

+X167658Y208782D01*

+X167635Y208500D01*

+X167658Y208218D01*

+X167724Y207942D01*

+X167832Y207680D01*

+X167980Y207439D01*

+X168164Y207223D01*

+X168380Y207039D01*

+X168621Y206891D01*

+X168729Y206847D01*

+Y203153D01*

+X168621Y203109D01*

+X168380Y202961D01*

+X168164Y202777D01*

+X167980Y202561D01*

+X167832Y202320D01*

+X167724Y202058D01*

+X167658Y201782D01*

+X167635Y201500D01*

+X167658Y201218D01*

+X167724Y200942D01*

+X167832Y200680D01*

+X167980Y200439D01*

+X168164Y200223D01*

+X168380Y200039D01*

+X168621Y199891D01*

+X168729Y199847D01*

+Y187981D01*

+G37*

+G36*

+Y177981D02*X168334Y178319D01*

+X167757Y178672D01*

+X167132Y178931D01*

+X166474Y179089D01*

+X165799Y179142D01*

+X165792Y179142D01*

+Y180516D01*

+X165799Y180516D01*

+X166474Y180569D01*

+X167132Y180727D01*

+X167757Y180986D01*

+X168334Y181339D01*

+X168729Y181677D01*

+Y177981D01*

+G37*

+G36*

+Y97000D02*X165792D01*

+Y170516D01*

+X165799Y170516D01*

+X166474Y170569D01*

+X167132Y170727D01*

+X167757Y170986D01*

+X168334Y171339D01*

+X168729Y171677D01*

+Y97000D01*

+G37*

+G36*

+X163938Y180946D02*X164466Y180727D01*

+X165124Y180569D01*

+X165792Y180516D01*

+Y179142D01*

+X165124Y179089D01*

+X164466Y178931D01*

+X163938Y178712D01*

+Y180946D01*

+G37*

+G36*

+Y360946D02*X164466Y360727D01*

+X165124Y360569D01*

+X165792Y360516D01*

+Y232794D01*

+X165659Y232783D01*

+X165383Y232717D01*

+X165121Y232609D01*

+X164880Y232461D01*

+X164664Y232277D01*

+X164480Y232061D01*

+X164332Y231820D01*

+X164224Y231558D01*

+X164158Y231282D01*

+X164135Y231000D01*

+X164158Y230718D01*

+X164224Y230442D01*

+X164332Y230180D01*

+X164480Y229939D01*

+X164664Y229723D01*

+X164880Y229539D01*

+X165121Y229391D01*

+X165383Y229283D01*

+X165659Y229217D01*

+X165792Y229206D01*

+Y228294D01*

+X165659Y228283D01*

+X165383Y228217D01*

+X165121Y228109D01*

+X164880Y227961D01*

+X164664Y227777D01*

+X164480Y227561D01*

+X164332Y227320D01*

+X164224Y227058D01*

+X164158Y226782D01*

+X164135Y226500D01*

+X164158Y226218D01*

+X164224Y225942D01*

+X164332Y225680D01*

+X164480Y225439D01*

+X164664Y225223D01*

+X164880Y225039D01*

+X165121Y224891D01*

+X165383Y224783D01*

+X165659Y224717D01*

+X165792Y224706D01*

+Y222294D01*

+X165659Y222283D01*

+X165383Y222217D01*

+X165121Y222109D01*

+X164880Y221961D01*

+X164664Y221777D01*

+X164480Y221561D01*

+X164332Y221320D01*

+X164224Y221058D01*

+X164158Y220782D01*

+X164135Y220500D01*

+X164158Y220218D01*

+X164224Y219942D01*

+X164332Y219680D01*

+X164480Y219439D01*

+X164664Y219223D01*

+X164880Y219039D01*

+X165121Y218891D01*

+X165383Y218783D01*

+X165659Y218717D01*

+X165792Y218706D01*

+Y189142D01*

+X165124Y189089D01*

+X164466Y188931D01*

+X163938Y188712D01*

+Y241498D01*

+X164050Y241680D01*

+X164158Y241942D01*

+X164224Y242218D01*

+X164241Y242500D01*

+X164224Y242782D01*

+X164158Y243058D01*

+X164050Y243320D01*

+X163938Y243502D01*

+Y247498D01*

+X164050Y247680D01*

+X164158Y247942D01*

+X164224Y248218D01*

+X164241Y248500D01*

+X164224Y248782D01*

+X164158Y249058D01*

+X164050Y249320D01*

+X163938Y249502D01*

+Y261498D01*

+X164050Y261680D01*

+X164158Y261942D01*

+X164224Y262218D01*

+X164241Y262500D01*

+X164224Y262782D01*

+X164158Y263058D01*

+X164050Y263320D01*

+X163938Y263502D01*

+Y267000D01*

+X164002Y267039D01*

+X164218Y267223D01*

+X164402Y267439D01*

+X164550Y267680D01*

+X164658Y267942D01*

+X164724Y268218D01*

+X164741Y268500D01*

+X164724Y268782D01*

+X164658Y269058D01*

+X164550Y269320D01*

+X164402Y269561D01*

+X164218Y269777D01*

+X164002Y269961D01*

+X163938Y270000D01*

+Y273000D01*

+X164002Y273039D01*

+X164218Y273223D01*

+X164402Y273439D01*

+X164550Y273680D01*

+X164658Y273942D01*

+X164724Y274218D01*

+X164741Y274500D01*

+X164724Y274782D01*

+X164658Y275058D01*

+X164550Y275320D01*

+X164402Y275561D01*

+X164218Y275777D01*

+X164002Y275961D01*

+X163938Y276000D01*

+Y360946D01*

+G37*

+G36*

+Y370946D02*X164466Y370727D01*

+X165124Y370569D01*

+X165792Y370516D01*

+Y369142D01*

+X165124Y369089D01*

+X164466Y368931D01*

+X163938Y368712D01*

+Y370946D01*

+G37*

+G36*

+Y397000D02*X165792D01*

+Y379142D01*

+X165124Y379089D01*

+X164466Y378931D01*

+X163938Y378712D01*

+Y397000D01*

+G37*

+G36*

+X165792Y97000D02*X163938D01*

+Y125695D01*

+X163941Y125694D01*

+X164223Y125717D01*

+X164499Y125783D01*

+X164761Y125891D01*

+X165002Y126039D01*

+X165218Y126223D01*

+X165402Y126439D01*

+X165550Y126680D01*

+X165658Y126942D01*

+X165724Y127218D01*

+X165741Y127500D01*

+X165724Y127782D01*

+X165658Y128058D01*

+X165550Y128320D01*

+X165402Y128561D01*

+X165218Y128777D01*

+X165002Y128961D01*

+X164761Y129109D01*

+X164499Y129217D01*

+X164223Y129283D01*

+X163941Y129306D01*

+X163938Y129305D01*

+Y170946D01*

+X164466Y170727D01*

+X165124Y170569D01*

+X165792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X161938Y182913D02*X161956Y182871D01*

+X162309Y182294D01*

+X162749Y181779D01*

+X163264Y181339D01*

+X163841Y180986D01*

+X163938Y180946D01*

+Y178712D01*

+X163841Y178672D01*

+X163264Y178319D01*

+X162749Y177879D01*

+X162309Y177364D01*

+X161956Y176787D01*

+X161938Y176745D01*

+Y182913D01*

+G37*

+G36*

+Y240770D02*X162159Y240717D01*

+X162441Y240694D01*

+X162723Y240717D01*

+X162999Y240783D01*

+X163261Y240891D01*

+X163502Y241039D01*

+X163718Y241223D01*

+X163902Y241439D01*

+X163938Y241498D01*

+Y188712D01*

+X163841Y188672D01*

+X163264Y188319D01*

+X162749Y187879D01*

+X162309Y187364D01*

+X161956Y186787D01*

+X161938Y186745D01*

+Y240770D01*

+G37*

+G36*

+Y246770D02*X162159Y246717D01*

+X162441Y246694D01*

+X162723Y246717D01*

+X162999Y246783D01*

+X163261Y246891D01*

+X163502Y247039D01*

+X163718Y247223D01*

+X163902Y247439D01*

+X163938Y247498D01*

+Y243502D01*

+X163902Y243561D01*

+X163718Y243777D01*

+X163502Y243961D01*

+X163261Y244109D01*

+X162999Y244217D01*

+X162723Y244283D01*

+X162441Y244306D01*

+X162159Y244283D01*

+X161938Y244230D01*

+Y246770D01*

+G37*

+G36*

+Y260770D02*X162159Y260717D01*

+X162441Y260694D01*

+X162723Y260717D01*

+X162999Y260783D01*

+X163261Y260891D01*

+X163502Y261039D01*

+X163718Y261223D01*

+X163902Y261439D01*

+X163938Y261498D01*

+Y249502D01*

+X163902Y249561D01*

+X163718Y249777D01*

+X163502Y249961D01*

+X163261Y250109D01*

+X162999Y250217D01*

+X162723Y250283D01*

+X162441Y250306D01*

+X162159Y250283D01*

+X161938Y250230D01*

+Y253195D01*

+X161941Y253194D01*

+X162223Y253217D01*

+X162499Y253283D01*

+X162761Y253391D01*

+X163002Y253539D01*

+X163218Y253723D01*

+X163402Y253939D01*

+X163550Y254180D01*

+X163658Y254442D01*

+X163724Y254718D01*

+X163741Y255000D01*

+X163724Y255282D01*

+X163658Y255558D01*

+X163550Y255820D01*

+X163402Y256061D01*

+X163218Y256277D01*

+X163002Y256461D01*

+X162761Y256609D01*

+X162499Y256717D01*

+X162223Y256783D01*

+X161941Y256806D01*

+X161938Y256805D01*

+Y260770D01*

+G37*

+G36*

+Y267003D02*X162121Y266891D01*

+X162383Y266783D01*

+X162659Y266717D01*

+X162941Y266694D01*

+X163223Y266717D01*

+X163499Y266783D01*

+X163761Y266891D01*

+X163938Y267000D01*

+Y263502D01*

+X163902Y263561D01*

+X163718Y263777D01*

+X163502Y263961D01*

+X163261Y264109D01*

+X162999Y264217D01*

+X162723Y264283D01*

+X162441Y264306D01*

+X162159Y264283D01*

+X161938Y264230D01*

+Y267003D01*

+G37*

+G36*

+Y273003D02*X162121Y272891D01*

+X162383Y272783D01*

+X162659Y272717D01*

+X162941Y272694D01*

+X163223Y272717D01*

+X163499Y272783D01*

+X163761Y272891D01*

+X163938Y273000D01*

+Y270000D01*

+X163761Y270109D01*

+X163499Y270217D01*

+X163223Y270283D01*

+X162941Y270306D01*

+X162659Y270283D01*

+X162383Y270217D01*

+X162121Y270109D01*

+X161938Y269997D01*

+Y273003D01*

+G37*

+G36*

+Y362913D02*X161956Y362871D01*

+X162309Y362294D01*

+X162749Y361779D01*

+X163264Y361339D01*

+X163841Y360986D01*

+X163938Y360946D01*

+Y276000D01*

+X163761Y276109D01*

+X163499Y276217D01*

+X163223Y276283D01*

+X162941Y276306D01*

+X162659Y276283D01*

+X162383Y276217D01*

+X162121Y276109D01*

+X161938Y275997D01*

+Y362913D01*

+G37*

+G36*

+Y372913D02*X161956Y372871D01*

+X162309Y372294D01*

+X162749Y371779D01*

+X163264Y371339D01*

+X163841Y370986D01*

+X163938Y370946D01*

+Y368712D01*

+X163841Y368672D01*

+X163264Y368319D01*

+X162749Y367879D01*

+X162309Y367364D01*

+X161956Y366787D01*

+X161938Y366745D01*

+Y372913D01*

+G37*

+G36*

+Y397000D02*X163938D01*

+Y378712D01*

+X163841Y378672D01*

+X163264Y378319D01*

+X162749Y377879D01*

+X162309Y377364D01*

+X161956Y376787D01*

+X161938Y376745D01*

+Y397000D01*

+G37*

+G36*

+X163938Y97000D02*X161938D01*

+Y172913D01*

+X161956Y172871D01*

+X162309Y172294D01*

+X162749Y171779D01*

+X163264Y171339D01*

+X163841Y170986D01*

+X163938Y170946D01*

+Y129305D01*

+X163659Y129283D01*

+X163383Y129217D01*

+X163121Y129109D01*

+X162880Y128961D01*

+X162664Y128777D01*

+X162480Y128561D01*

+X162332Y128320D01*

+X162224Y128058D01*

+X162158Y127782D01*

+X162135Y127500D01*

+X162158Y127218D01*

+X162224Y126942D01*

+X162332Y126680D01*

+X162480Y126439D01*

+X162664Y126223D01*

+X162880Y126039D01*

+X163121Y125891D01*

+X163383Y125783D01*

+X163659Y125717D01*

+X163938Y125695D01*

+Y97000D01*

+G37*

+G36*

+X161938D02*X158438D01*

+Y171428D01*

+X158849Y171779D01*

+X159289Y172294D01*

+X159642Y172871D01*

+X159901Y173496D01*

+X160059Y174154D01*

+X160099Y174829D01*

+X160059Y175504D01*

+X159901Y176162D01*

+X159642Y176787D01*

+X159289Y177364D01*

+X158849Y177879D01*

+X158438Y178230D01*

+Y181428D01*

+X158849Y181779D01*

+X159289Y182294D01*

+X159642Y182871D01*

+X159901Y183496D01*

+X160059Y184154D01*

+X160099Y184829D01*

+X160059Y185504D01*

+X159901Y186162D01*

+X159642Y186787D01*

+X159289Y187364D01*

+X158849Y187879D01*

+X158438Y188230D01*

+Y322024D01*

+X158441Y322023D01*

+X158723Y322046D01*

+X158999Y322112D01*

+X159261Y322220D01*

+X159502Y322368D01*

+X159718Y322552D01*

+X159902Y322768D01*

+X160050Y323009D01*

+X160158Y323271D01*

+X160224Y323547D01*

+X160241Y323829D01*

+X160224Y324111D01*

+X160158Y324387D01*

+X160050Y324649D01*

+X159902Y324890D01*

+X159718Y325106D01*

+X159649Y325164D01*

+X159718Y325223D01*

+X159902Y325439D01*

+X160050Y325680D01*

+X160158Y325942D01*

+X160224Y326218D01*

+X160241Y326500D01*

+X160224Y326782D01*

+X160158Y327058D01*

+X160050Y327320D01*

+X159902Y327561D01*

+X159814Y327664D01*

+X159902Y327768D01*

+X160050Y328009D01*

+X160158Y328271D01*

+X160224Y328547D01*

+X160241Y328829D01*

+X160224Y329111D01*

+X160158Y329387D01*

+X160050Y329649D01*

+X159902Y329890D01*

+X159718Y330106D01*

+X159502Y330290D01*

+X159261Y330438D01*

+X158999Y330546D01*

+X158723Y330612D01*

+X158441Y330635D01*

+X158438Y330634D01*

+Y361428D01*

+X158849Y361779D01*

+X159289Y362294D01*

+X159642Y362871D01*

+X159901Y363496D01*

+X160059Y364154D01*

+X160099Y364829D01*

+X160059Y365504D01*

+X159901Y366162D01*

+X159642Y366787D01*

+X159289Y367364D01*

+X158849Y367879D01*

+X158438Y368230D01*

+Y371428D01*

+X158849Y371779D01*

+X159289Y372294D01*

+X159642Y372871D01*

+X159901Y373496D01*

+X160059Y374154D01*

+X160099Y374829D01*

+X160059Y375504D01*

+X159901Y376162D01*

+X159642Y376787D01*

+X159289Y377364D01*

+X158849Y377879D01*

+X158438Y378230D01*

+Y397000D01*

+X161938D01*

+Y376745D01*

+X161697Y376162D01*

+X161539Y375504D01*

+X161486Y374829D01*

+X161539Y374154D01*

+X161697Y373496D01*

+X161938Y372913D01*

+Y366745D01*

+X161697Y366162D01*

+X161539Y365504D01*

+X161486Y364829D01*

+X161539Y364154D01*

+X161697Y363496D01*

+X161938Y362913D01*

+Y275997D01*

+X161880Y275961D01*

+X161664Y275777D01*

+X161480Y275561D01*

+X161332Y275320D01*

+X161224Y275058D01*

+X161158Y274782D01*

+X161135Y274500D01*

+X161158Y274218D01*

+X161224Y273942D01*

+X161332Y273680D01*

+X161480Y273439D01*

+X161664Y273223D01*

+X161880Y273039D01*

+X161938Y273003D01*

+Y269997D01*

+X161880Y269961D01*

+X161664Y269777D01*

+X161480Y269561D01*

+X161332Y269320D01*

+X161224Y269058D01*

+X161158Y268782D01*

+X161135Y268500D01*

+X161158Y268218D01*

+X161224Y267942D01*

+X161332Y267680D01*

+X161480Y267439D01*

+X161664Y267223D01*

+X161880Y267039D01*

+X161938Y267003D01*

+Y264230D01*

+X161883Y264217D01*

+X161621Y264109D01*

+X161380Y263961D01*

+X161164Y263777D01*

+X160980Y263561D01*

+X160832Y263320D01*

+X160724Y263058D01*

+X160658Y262782D01*

+X160635Y262500D01*

+X160658Y262218D01*

+X160724Y261942D01*

+X160832Y261680D01*

+X160980Y261439D01*

+X161164Y261223D01*

+X161380Y261039D01*

+X161621Y260891D01*

+X161883Y260783D01*

+X161938Y260770D01*

+Y256805D01*

+X161659Y256783D01*

+X161383Y256717D01*

+X161121Y256609D01*

+X160880Y256461D01*

+X160664Y256277D01*

+X160480Y256061D01*

+X160332Y255820D01*

+X160224Y255558D01*

+X160158Y255282D01*

+X160135Y255000D01*

+X160158Y254718D01*

+X160224Y254442D01*

+X160332Y254180D01*

+X160480Y253939D01*

+X160664Y253723D01*

+X160880Y253539D01*

+X161121Y253391D01*

+X161383Y253283D01*

+X161659Y253217D01*

+X161938Y253195D01*

+Y250230D01*

+X161883Y250217D01*

+X161621Y250109D01*

+X161380Y249961D01*

+X161164Y249777D01*

+X160980Y249561D01*

+X160832Y249320D01*

+X160724Y249058D01*

+X160658Y248782D01*

+X160635Y248500D01*

+X160658Y248218D01*

+X160724Y247942D01*

+X160832Y247680D01*

+X160980Y247439D01*

+X161164Y247223D01*

+X161380Y247039D01*

+X161621Y246891D01*

+X161883Y246783D01*

+X161938Y246770D01*

+Y244230D01*

+X161883Y244217D01*

+X161621Y244109D01*

+X161380Y243961D01*

+X161164Y243777D01*

+X160980Y243561D01*

+X160832Y243320D01*

+X160724Y243058D01*

+X160658Y242782D01*

+X160635Y242500D01*

+X160658Y242218D01*

+X160724Y241942D01*

+X160832Y241680D01*

+X160980Y241439D01*

+X161164Y241223D01*

+X161380Y241039D01*

+X161621Y240891D01*

+X161883Y240783D01*

+X161938Y240770D01*

+Y186745D01*

+X161697Y186162D01*

+X161539Y185504D01*

+X161486Y184829D01*

+X161539Y184154D01*

+X161697Y183496D01*

+X161938Y182913D01*

+Y176745D01*

+X161697Y176162D01*

+X161539Y175504D01*

+X161486Y174829D01*

+X161539Y174154D01*

+X161697Y173496D01*

+X161938Y172913D01*

+Y97000D01*

+G37*

+G36*

+X158438Y378230D02*X158334Y378319D01*

+X157757Y378672D01*

+X157132Y378931D01*

+X156474Y379089D01*

+X155799Y379142D01*

+X155792Y379142D01*

+Y397000D01*

+X158438D01*

+Y378230D01*

+G37*

+G36*

+Y368230D02*X158334Y368319D01*

+X157757Y368672D01*

+X157132Y368931D01*

+X156474Y369089D01*

+X155799Y369142D01*

+X155792Y369142D01*

+Y370516D01*

+X155799Y370516D01*

+X156474Y370569D01*

+X157132Y370727D01*

+X157757Y370986D01*

+X158334Y371339D01*

+X158438Y371428D01*

+Y368230D01*

+G37*

+G36*

+Y188230D02*X158334Y188319D01*

+X157757Y188672D01*

+X157132Y188931D01*

+X156474Y189089D01*

+X155799Y189142D01*

+X155792Y189142D01*

+Y343911D01*

+X156002Y344039D01*

+X156218Y344223D01*

+X156402Y344439D01*

+X156550Y344680D01*

+X156658Y344942D01*

+X156724Y345218D01*

+X156741Y345500D01*

+X156724Y345782D01*

+X156658Y346058D01*

+X156550Y346320D01*

+X156402Y346561D01*

+X156218Y346777D01*

+X156002Y346961D01*

+X155792Y347089D01*

+Y360516D01*

+X155799Y360516D01*

+X156474Y360569D01*

+X157132Y360727D01*

+X157757Y360986D01*

+X158334Y361339D01*

+X158438Y361428D01*

+Y330634D01*

+X158159Y330612D01*

+X157883Y330546D01*

+X157621Y330438D01*

+X157380Y330290D01*

+X157164Y330106D01*

+X156980Y329890D01*

+X156832Y329649D01*

+X156724Y329387D01*

+X156658Y329111D01*

+X156635Y328829D01*

+X156658Y328547D01*

+X156724Y328271D01*

+X156832Y328009D01*

+X156980Y327768D01*

+X157068Y327664D01*

+X156980Y327561D01*

+X156832Y327320D01*

+X156724Y327058D01*

+X156658Y326782D01*

+X156635Y326500D01*

+X156658Y326218D01*

+X156724Y325942D01*

+X156832Y325680D01*

+X156980Y325439D01*

+X157164Y325223D01*

+X157233Y325164D01*

+X157164Y325106D01*

+X156980Y324890D01*

+X156832Y324649D01*

+X156724Y324387D01*

+X156658Y324111D01*

+X156635Y323829D01*

+X156658Y323547D01*

+X156724Y323271D01*

+X156832Y323009D01*

+X156980Y322768D01*

+X157164Y322552D01*

+X157380Y322368D01*

+X157621Y322220D01*

+X157883Y322112D01*

+X158159Y322046D01*

+X158438Y322024D01*

+Y188230D01*

+G37*

+G36*

+Y178230D02*X158334Y178319D01*

+X157757Y178672D01*

+X157132Y178931D01*

+X156474Y179089D01*

+X155799Y179142D01*

+X155792Y179142D01*

+Y180516D01*

+X155799Y180516D01*

+X156474Y180569D01*

+X157132Y180727D01*

+X157757Y180986D01*

+X158334Y181339D01*

+X158438Y181428D01*

+Y178230D01*

+G37*

+G36*

+Y97000D02*X155792D01*

+Y170516D01*

+X155799Y170516D01*

+X156474Y170569D01*

+X157132Y170727D01*

+X157757Y170986D01*

+X158334Y171339D01*

+X158438Y171428D01*

+Y97000D01*

+G37*

+G36*

+X153938Y180946D02*X154466Y180727D01*

+X155124Y180569D01*

+X155792Y180516D01*

+Y179142D01*

+X155124Y179089D01*

+X154466Y178931D01*

+X153938Y178712D01*

+Y180946D01*

+G37*

+G36*

+Y344003D02*X154121Y343891D01*

+X154383Y343783D01*

+X154659Y343717D01*

+X154941Y343694D01*

+X155223Y343717D01*

+X155499Y343783D01*

+X155761Y343891D01*

+X155792Y343911D01*

+Y189142D01*

+X155124Y189089D01*

+X154466Y188931D01*

+X153938Y188712D01*

+Y336195D01*

+X153941Y336194D01*

+X154223Y336217D01*

+X154499Y336283D01*

+X154761Y336391D01*

+X155002Y336539D01*

+X155218Y336723D01*

+X155402Y336939D01*

+X155550Y337180D01*

+X155658Y337442D01*

+X155724Y337718D01*

+X155741Y338000D01*

+X155724Y338282D01*

+X155658Y338558D01*

+X155550Y338820D01*

+X155402Y339061D01*

+X155218Y339277D01*

+X155002Y339461D01*

+X154761Y339609D01*

+X154499Y339717D01*

+X154223Y339783D01*

+X153941Y339806D01*

+X153938Y339805D01*

+Y344003D01*

+G37*

+G36*

+Y360946D02*X154466Y360727D01*

+X155124Y360569D01*

+X155792Y360516D01*

+Y347089D01*

+X155761Y347109D01*

+X155499Y347217D01*

+X155223Y347283D01*

+X154941Y347306D01*

+X154659Y347283D01*

+X154383Y347217D01*

+X154121Y347109D01*

+X153938Y346997D01*

+Y360946D01*

+G37*

+G36*

+Y370946D02*X154466Y370727D01*

+X155124Y370569D01*

+X155792Y370516D01*

+Y369142D01*

+X155124Y369089D01*

+X154466Y368931D01*

+X153938Y368712D01*

+Y370946D01*

+G37*

+G36*

+Y397000D02*X155792D01*

+Y379142D01*

+X155124Y379089D01*

+X154466Y378931D01*

+X153938Y378712D01*

+Y397000D01*

+G37*

+G36*

+X155792Y97000D02*X153938D01*

+Y120498D01*

+X154050Y120680D01*

+X154158Y120942D01*

+X154224Y121218D01*

+X154241Y121500D01*

+X154224Y121782D01*

+X154158Y122058D01*

+X154050Y122320D01*

+X153938Y122502D01*

+Y170946D01*

+X154466Y170727D01*

+X155124Y170569D01*

+X155792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X151938Y172913D02*X151956Y172871D01*

+X152309Y172294D01*

+X152749Y171779D01*

+X153264Y171339D01*

+X153841Y170986D01*

+X153938Y170946D01*

+Y122502D01*

+X153902Y122561D01*

+X153718Y122777D01*

+X153502Y122961D01*

+X153261Y123109D01*

+X152999Y123217D01*

+X152723Y123283D01*

+X152441Y123306D01*

+X152159Y123283D01*

+X151938Y123230D01*

+Y130195D01*

+X151941Y130194D01*

+X152223Y130217D01*

+X152499Y130283D01*

+X152761Y130391D01*

+X153002Y130539D01*

+X153218Y130723D01*

+X153402Y130939D01*

+X153550Y131180D01*

+X153658Y131442D01*

+X153724Y131718D01*

+X153741Y132000D01*

+X153724Y132282D01*

+X153658Y132558D01*

+X153550Y132820D01*

+X153402Y133061D01*

+X153218Y133277D01*

+X153002Y133461D01*

+X152761Y133609D01*

+X152499Y133717D01*

+X152223Y133783D01*

+X151941Y133806D01*

+X151938Y133805D01*

+Y172913D01*

+G37*

+G36*

+Y182913D02*X151956Y182871D01*

+X152309Y182294D01*

+X152749Y181779D01*

+X153264Y181339D01*

+X153841Y180986D01*

+X153938Y180946D01*

+Y178712D01*

+X153841Y178672D01*

+X153264Y178319D01*

+X152749Y177879D01*

+X152309Y177364D01*

+X151956Y176787D01*

+X151938Y176745D01*

+Y182913D01*

+G37*

+G36*

+Y362913D02*X151956Y362871D01*

+X152309Y362294D01*

+X152749Y361779D01*

+X153264Y361339D01*

+X153841Y360986D01*

+X153938Y360946D01*

+Y346997D01*

+X153880Y346961D01*

+X153664Y346777D01*

+X153480Y346561D01*

+X153332Y346320D01*

+X153224Y346058D01*

+X153158Y345782D01*

+X153135Y345500D01*

+X153158Y345218D01*

+X153224Y344942D01*

+X153332Y344680D01*

+X153480Y344439D01*

+X153664Y344223D01*

+X153880Y344039D01*

+X153938Y344003D01*

+Y339805D01*

+X153659Y339783D01*

+X153383Y339717D01*

+X153121Y339609D01*

+X152880Y339461D01*

+X152664Y339277D01*

+X152480Y339061D01*

+X152332Y338820D01*

+X152224Y338558D01*

+X152158Y338282D01*

+X152135Y338000D01*

+X152158Y337718D01*

+X152224Y337442D01*

+X152332Y337180D01*

+X152480Y336939D01*

+X152664Y336723D01*

+X152880Y336539D01*

+X153121Y336391D01*

+X153383Y336283D01*

+X153659Y336217D01*

+X153938Y336195D01*

+Y188712D01*

+X153841Y188672D01*

+X153264Y188319D01*

+X152749Y187879D01*

+X152309Y187364D01*

+X151956Y186787D01*

+X151938Y186745D01*

+Y362913D01*

+G37*

+G36*

+Y372913D02*X151956Y372871D01*

+X152309Y372294D01*

+X152749Y371779D01*

+X153264Y371339D01*

+X153841Y370986D01*

+X153938Y370946D01*

+Y368712D01*

+X153841Y368672D01*

+X153264Y368319D01*

+X152749Y367879D01*

+X152309Y367364D01*

+X151956Y366787D01*

+X151938Y366745D01*

+Y372913D01*

+G37*

+G36*

+Y397000D02*X153938D01*

+Y378712D01*

+X153841Y378672D01*

+X153264Y378319D01*

+X152749Y377879D01*

+X152309Y377364D01*

+X151956Y376787D01*

+X151938Y376745D01*

+Y397000D01*

+G37*

+G36*

+X153938Y97000D02*X151938D01*

+Y119770D01*

+X152159Y119717D01*

+X152441Y119694D01*

+X152723Y119717D01*

+X152999Y119783D01*

+X153261Y119891D01*

+X153502Y120039D01*

+X153718Y120223D01*

+X153902Y120439D01*

+X153938Y120498D01*

+Y97000D01*

+G37*

+G36*

+X151938D02*X149438D01*

+Y172538D01*

+X149642Y172871D01*

+X149901Y173496D01*

+X150059Y174154D01*

+X150099Y174829D01*

+X150059Y175504D01*

+X149901Y176162D01*

+X149642Y176787D01*

+X149438Y177120D01*

+Y182538D01*

+X149642Y182871D01*

+X149901Y183496D01*

+X150059Y184154D01*

+X150099Y184829D01*

+X150059Y185504D01*

+X149901Y186162D01*

+X149642Y186787D01*

+X149438Y187120D01*

+Y347695D01*

+X149441Y347694D01*

+X149723Y347717D01*

+X149999Y347783D01*

+X150261Y347891D01*

+X150502Y348039D01*

+X150718Y348223D01*

+X150902Y348439D01*

+X151050Y348680D01*

+X151158Y348942D01*

+X151224Y349218D01*

+X151241Y349500D01*

+X151224Y349782D01*

+X151158Y350058D01*

+X151050Y350320D01*

+X150902Y350561D01*

+X150718Y350777D01*

+X150502Y350961D01*

+X150261Y351109D01*

+X149999Y351217D01*

+X149723Y351283D01*

+X149441Y351306D01*

+X149438Y351305D01*

+Y362538D01*

+X149642Y362871D01*

+X149901Y363496D01*

+X150059Y364154D01*

+X150099Y364829D01*

+X150059Y365504D01*

+X149901Y366162D01*

+X149642Y366787D01*

+X149438Y367120D01*

+Y372538D01*

+X149642Y372871D01*

+X149901Y373496D01*

+X150059Y374154D01*

+X150099Y374829D01*

+X150059Y375504D01*

+X149901Y376162D01*

+X149642Y376787D01*

+X149438Y377120D01*

+Y397000D01*

+X151938D01*

+Y376745D01*

+X151697Y376162D01*

+X151539Y375504D01*

+X151486Y374829D01*

+X151539Y374154D01*

+X151697Y373496D01*

+X151938Y372913D01*

+Y366745D01*

+X151697Y366162D01*

+X151539Y365504D01*

+X151486Y364829D01*

+X151539Y364154D01*

+X151697Y363496D01*

+X151938Y362913D01*

+Y186745D01*

+X151697Y186162D01*

+X151539Y185504D01*

+X151486Y184829D01*

+X151539Y184154D01*

+X151697Y183496D01*

+X151938Y182913D01*

+Y176745D01*

+X151697Y176162D01*

+X151539Y175504D01*

+X151486Y174829D01*

+X151539Y174154D01*

+X151697Y173496D01*

+X151938Y172913D01*

+Y133805D01*

+X151659Y133783D01*

+X151383Y133717D01*

+X151121Y133609D01*

+X150880Y133461D01*

+X150664Y133277D01*

+X150480Y133061D01*

+X150332Y132820D01*

+X150224Y132558D01*

+X150158Y132282D01*

+X150135Y132000D01*

+X150158Y131718D01*

+X150224Y131442D01*

+X150332Y131180D01*

+X150480Y130939D01*

+X150664Y130723D01*

+X150880Y130539D01*

+X151121Y130391D01*

+X151383Y130283D01*

+X151659Y130217D01*

+X151938Y130195D01*

+Y123230D01*

+X151883Y123217D01*

+X151621Y123109D01*

+X151380Y122961D01*

+X151164Y122777D01*

+X150980Y122561D01*

+X150832Y122320D01*

+X150724Y122058D01*

+X150658Y121782D01*

+X150635Y121500D01*

+X150658Y121218D01*

+X150724Y120942D01*

+X150832Y120680D01*

+X150980Y120439D01*

+X151164Y120223D01*

+X151380Y120039D01*

+X151621Y119891D01*

+X151883Y119783D01*

+X151938Y119770D01*

+Y97000D01*

+G37*

+G36*

+X149438Y377120D02*X149289Y377364D01*

+X148849Y377879D01*

+X148334Y378319D01*

+X147757Y378672D01*

+X147132Y378931D01*

+X146474Y379089D01*

+X145799Y379142D01*

+X145792Y379142D01*

+Y397000D01*

+X149438D01*

+Y377120D01*

+G37*

+G36*

+Y367120D02*X149289Y367364D01*

+X148849Y367879D01*

+X148334Y368319D01*

+X147757Y368672D01*

+X147132Y368931D01*

+X146474Y369089D01*

+X145799Y369142D01*

+X145792Y369142D01*

+Y370516D01*

+X145799Y370516D01*

+X146474Y370569D01*

+X147132Y370727D01*

+X147757Y370986D01*

+X148334Y371339D01*

+X148849Y371779D01*

+X149289Y372294D01*

+X149438Y372538D01*

+Y367120D01*

+G37*

+G36*

+Y187120D02*X149289Y187364D01*

+X148849Y187879D01*

+X148334Y188319D01*

+X147757Y188672D01*

+X147132Y188931D01*

+X146474Y189089D01*

+X145799Y189142D01*

+X145792Y189142D01*

+Y360516D01*

+X145799Y360516D01*

+X146474Y360569D01*

+X147132Y360727D01*

+X147757Y360986D01*

+X148334Y361339D01*

+X148849Y361779D01*

+X149289Y362294D01*

+X149438Y362538D01*

+Y351305D01*

+X149159Y351283D01*

+X148883Y351217D01*

+X148621Y351109D01*

+X148380Y350961D01*

+X148164Y350777D01*

+X147980Y350561D01*

+X147832Y350320D01*

+X147724Y350058D01*

+X147658Y349782D01*

+X147635Y349500D01*

+X147658Y349218D01*

+X147724Y348942D01*

+X147832Y348680D01*

+X147980Y348439D01*

+X148164Y348223D01*

+X148380Y348039D01*

+X148621Y347891D01*

+X148883Y347783D01*

+X149159Y347717D01*

+X149438Y347695D01*

+Y187120D01*

+G37*

+G36*

+Y177120D02*X149289Y177364D01*

+X148849Y177879D01*

+X148334Y178319D01*

+X147757Y178672D01*

+X147132Y178931D01*

+X146474Y179089D01*

+X145799Y179142D01*

+X145792Y179142D01*

+Y180516D01*

+X145799Y180516D01*

+X146474Y180569D01*

+X147132Y180727D01*

+X147757Y180986D01*

+X148334Y181339D01*

+X148849Y181779D01*

+X149289Y182294D01*

+X149438Y182538D01*

+Y177120D01*

+G37*

+G36*

+Y97000D02*X145792D01*

+Y170516D01*

+X145799Y170516D01*

+X146474Y170569D01*

+X147132Y170727D01*

+X147757Y170986D01*

+X148334Y171339D01*

+X148849Y171779D01*

+X149289Y172294D01*

+X149438Y172538D01*

+Y97000D01*

+G37*

+G36*

+X142438Y182143D02*X142749Y181779D01*

+X143264Y181339D01*

+X143841Y180986D01*

+X144466Y180727D01*

+X145124Y180569D01*

+X145792Y180516D01*

+Y179142D01*

+X145124Y179089D01*

+X144466Y178931D01*

+X143841Y178672D01*

+X143264Y178319D01*

+X142749Y177879D01*

+X142438Y177515D01*

+Y182143D01*

+G37*

+G36*

+Y372143D02*X142749Y371779D01*

+X143264Y371339D01*

+X143841Y370986D01*

+X144466Y370727D01*

+X145124Y370569D01*

+X145792Y370516D01*

+Y369142D01*

+X145124Y369089D01*

+X144466Y368931D01*

+X143841Y368672D01*

+X143264Y368319D01*

+X142749Y367879D01*

+X142438Y367515D01*

+Y372143D01*

+G37*

+G36*

+Y397000D02*X145792D01*

+Y379142D01*

+X145124Y379089D01*

+X144466Y378931D01*

+X143841Y378672D01*

+X143264Y378319D01*

+X142749Y377879D01*

+X142438Y377515D01*

+Y397000D01*

+G37*

+G36*

+Y299482D02*X142584Y299606D01*

+X142768Y299822D01*

+X142916Y300063D01*

+X143024Y300325D01*

+X143090Y300601D01*

+X143107Y300883D01*

+X143090Y301165D01*

+X143024Y301441D01*

+X142916Y301703D01*

+X142768Y301944D01*

+X142584Y302160D01*

+X142438Y302284D01*

+Y347695D01*

+X142441Y347694D01*

+X142723Y347717D01*

+X142999Y347783D01*

+X143261Y347891D01*

+X143502Y348039D01*

+X143718Y348223D01*

+X143902Y348439D01*

+X144050Y348680D01*

+X144158Y348942D01*

+X144224Y349218D01*

+X144241Y349500D01*

+X144224Y349782D01*

+X144158Y350058D01*

+X144050Y350320D01*

+X143902Y350561D01*

+X143718Y350777D01*

+X143502Y350961D01*

+X143261Y351109D01*

+X142999Y351217D01*

+X142723Y351283D01*

+X142441Y351306D01*

+X142438Y351305D01*

+Y355695D01*

+X142441Y355694D01*

+X142723Y355717D01*

+X142999Y355783D01*

+X143261Y355891D01*

+X143502Y356039D01*

+X143718Y356223D01*

+X143902Y356439D01*

+X144050Y356680D01*

+X144158Y356942D01*

+X144224Y357218D01*

+X144241Y357500D01*

+X144224Y357782D01*

+X144158Y358058D01*

+X144050Y358320D01*

+X143902Y358561D01*

+X143718Y358777D01*

+X143502Y358961D01*

+X143261Y359109D01*

+X142999Y359217D01*

+X142723Y359283D01*

+X142441Y359306D01*

+X142438Y359305D01*

+Y362143D01*

+X142749Y361779D01*

+X143264Y361339D01*

+X143841Y360986D01*

+X144466Y360727D01*

+X145124Y360569D01*

+X145792Y360516D01*

+Y189142D01*

+X145124Y189089D01*

+X144466Y188931D01*

+X143841Y188672D01*

+X143264Y188319D01*

+X142749Y187879D01*

+X142438Y187515D01*

+Y299482D01*

+G37*

+G36*

+X145792Y97000D02*X142438D01*

+Y146500D01*

+X142502Y146539D01*

+X142718Y146723D01*

+X142902Y146939D01*

+X143050Y147180D01*

+X143158Y147442D01*

+X143224Y147718D01*

+X143241Y148000D01*

+X143224Y148282D01*

+X143158Y148558D01*

+X143050Y148820D01*

+X142902Y149061D01*

+X142718Y149277D01*

+X142502Y149461D01*

+X142438Y149500D01*

+Y172143D01*

+X142749Y171779D01*

+X143264Y171339D01*

+X143841Y170986D01*

+X144466Y170727D01*

+X145124Y170569D01*

+X145792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X142438Y302284D02*X142368Y302344D01*

+X142127Y302492D01*

+X141865Y302600D01*

+X141589Y302666D01*

+X141307Y302689D01*

+X141025Y302666D01*

+X140749Y302600D01*

+X140487Y302492D01*

+X140246Y302344D01*

+X140030Y302160D01*

+X139938Y302052D01*

+Y336195D01*

+X139941Y336194D01*

+X140223Y336217D01*

+X140499Y336283D01*

+X140761Y336391D01*

+X141002Y336539D01*

+X141218Y336723D01*

+X141402Y336939D01*

+X141550Y337180D01*

+X141658Y337442D01*

+X141724Y337718D01*

+X141741Y338000D01*

+X141724Y338282D01*

+X141658Y338558D01*

+X141550Y338820D01*

+X141402Y339061D01*

+X141218Y339277D01*

+X141002Y339461D01*

+X140761Y339609D01*

+X140499Y339717D01*

+X140223Y339783D01*

+X139941Y339806D01*

+X139938Y339805D01*

+Y363651D01*

+X140059Y364154D01*

+X140099Y364829D01*

+X140059Y365504D01*

+X139938Y366007D01*

+Y373651D01*

+X140059Y374154D01*

+X140099Y374829D01*

+X140059Y375504D01*

+X139938Y376007D01*

+Y397000D01*

+X142438D01*

+Y377515D01*

+X142309Y377364D01*

+X141956Y376787D01*

+X141697Y376162D01*

+X141539Y375504D01*

+X141486Y374829D01*

+X141539Y374154D01*

+X141697Y373496D01*

+X141956Y372871D01*

+X142309Y372294D01*

+X142438Y372143D01*

+Y367515D01*

+X142309Y367364D01*

+X141956Y366787D01*

+X141697Y366162D01*

+X141539Y365504D01*

+X141486Y364829D01*

+X141539Y364154D01*

+X141697Y363496D01*

+X141956Y362871D01*

+X142309Y362294D01*

+X142438Y362143D01*

+Y359305D01*

+X142159Y359283D01*

+X141883Y359217D01*

+X141621Y359109D01*

+X141380Y358961D01*

+X141164Y358777D01*

+X140980Y358561D01*

+X140832Y358320D01*

+X140724Y358058D01*

+X140658Y357782D01*

+X140635Y357500D01*

+X140658Y357218D01*

+X140724Y356942D01*

+X140832Y356680D01*

+X140980Y356439D01*

+X141164Y356223D01*

+X141380Y356039D01*

+X141621Y355891D01*

+X141883Y355783D01*

+X142159Y355717D01*

+X142438Y355695D01*

+Y351305D01*

+X142159Y351283D01*

+X141883Y351217D01*

+X141621Y351109D01*

+X141380Y350961D01*

+X141164Y350777D01*

+X140980Y350561D01*

+X140832Y350320D01*

+X140724Y350058D01*

+X140658Y349782D01*

+X140635Y349500D01*

+X140658Y349218D01*

+X140724Y348942D01*

+X140832Y348680D01*

+X140980Y348439D01*

+X141164Y348223D01*

+X141380Y348039D01*

+X141621Y347891D01*

+X141883Y347783D01*

+X142159Y347717D01*

+X142438Y347695D01*

+Y302284D01*

+G37*

+G36*

+Y149500D02*X142261Y149609D01*

+X141999Y149717D01*

+X141723Y149783D01*

+X141441Y149806D01*

+X141159Y149783D01*

+X140883Y149717D01*

+X140621Y149609D01*

+X140380Y149461D01*

+X140164Y149277D01*

+X139980Y149061D01*

+X139938Y148993D01*

+Y173651D01*

+X140059Y174154D01*

+X140099Y174829D01*

+X140059Y175504D01*

+X139938Y176007D01*

+Y183651D01*

+X140059Y184154D01*

+X140099Y184829D01*

+X140059Y185504D01*

+X139938Y186007D01*

+Y299714D01*

+X140030Y299606D01*

+X140246Y299422D01*

+X140487Y299274D01*

+X140749Y299166D01*

+X141025Y299100D01*

+X141307Y299077D01*

+X141589Y299100D01*

+X141865Y299166D01*

+X142127Y299274D01*

+X142368Y299422D01*

+X142438Y299482D01*

+Y187515D01*

+X142309Y187364D01*

+X141956Y186787D01*

+X141697Y186162D01*

+X141539Y185504D01*

+X141486Y184829D01*

+X141539Y184154D01*

+X141697Y183496D01*

+X141956Y182871D01*

+X142309Y182294D01*

+X142438Y182143D01*

+Y177515D01*

+X142309Y177364D01*

+X141956Y176787D01*

+X141697Y176162D01*

+X141539Y175504D01*

+X141486Y174829D01*

+X141539Y174154D01*

+X141697Y173496D01*

+X141956Y172871D01*

+X142309Y172294D01*

+X142438Y172143D01*

+Y149500D01*

+G37*

+G36*

+Y97000D02*X139938D01*

+Y147007D01*

+X139980Y146939D01*

+X140164Y146723D01*

+X140380Y146539D01*

+X140621Y146391D01*

+X140883Y146283D01*

+X141159Y146217D01*

+X141441Y146194D01*

+X141723Y146217D01*

+X141999Y146283D01*

+X142261Y146391D01*

+X142438Y146500D01*

+Y97000D01*

+G37*

+G36*

+X139938Y376007D02*X139901Y376162D01*

+X139642Y376787D01*

+X139289Y377364D01*

+X138849Y377879D01*

+X138334Y378319D01*

+X137757Y378672D01*

+X137132Y378931D01*

+X136474Y379089D01*

+X135799Y379142D01*

+X135792Y379142D01*

+Y397000D01*

+X139938D01*

+Y376007D01*

+G37*

+G36*

+Y366007D02*X139901Y366162D01*

+X139642Y366787D01*

+X139289Y367364D01*

+X138849Y367879D01*

+X138334Y368319D01*

+X137757Y368672D01*

+X137132Y368931D01*

+X136474Y369089D01*

+X135799Y369142D01*

+X135792Y369142D01*

+Y370516D01*

+X135799Y370516D01*

+X136474Y370569D01*

+X137132Y370727D01*

+X137757Y370986D01*

+X138334Y371339D01*

+X138849Y371779D01*

+X139289Y372294D01*

+X139642Y372871D01*

+X139901Y373496D01*

+X139938Y373651D01*

+Y366007D01*

+G37*

+G36*

+Y186007D02*X139901Y186162D01*

+X139642Y186787D01*

+X139289Y187364D01*

+X138849Y187879D01*

+X138334Y188319D01*

+X137757Y188672D01*

+X137132Y188931D01*

+X136474Y189089D01*

+X135799Y189142D01*

+X135792Y189142D01*

+Y333233D01*

+X135999Y333283D01*

+X136261Y333391D01*

+X136502Y333539D01*

+X136718Y333723D01*

+X136902Y333939D01*

+X137050Y334180D01*

+X137158Y334442D01*

+X137224Y334718D01*

+X137241Y335000D01*

+X137224Y335282D01*

+X137158Y335558D01*

+X137050Y335820D01*

+X136902Y336061D01*

+X136718Y336277D01*

+X136502Y336461D01*

+X136261Y336609D01*

+X135999Y336717D01*

+X135862Y336750D01*

+X135999Y336783D01*

+X136261Y336891D01*

+X136502Y337039D01*

+X136718Y337223D01*

+X136902Y337439D01*

+X137050Y337680D01*

+X137158Y337942D01*

+X137224Y338218D01*

+X137241Y338500D01*

+X137224Y338782D01*

+X137158Y339058D01*

+X137050Y339320D01*

+X136902Y339561D01*

+X136718Y339777D01*

+X136502Y339961D01*

+X136261Y340109D01*

+X135999Y340217D01*

+X135792Y340267D01*

+Y360516D01*

+X135799Y360516D01*

+X136474Y360569D01*

+X137132Y360727D01*

+X137757Y360986D01*

+X138334Y361339D01*

+X138849Y361779D01*

+X139289Y362294D01*

+X139642Y362871D01*

+X139901Y363496D01*

+X139938Y363651D01*

+Y339805D01*

+X139659Y339783D01*

+X139383Y339717D01*

+X139121Y339609D01*

+X138880Y339461D01*

+X138664Y339277D01*

+X138480Y339061D01*

+X138332Y338820D01*

+X138224Y338558D01*

+X138158Y338282D01*

+X138135Y338000D01*

+X138158Y337718D01*

+X138224Y337442D01*

+X138332Y337180D01*

+X138480Y336939D01*

+X138664Y336723D01*

+X138880Y336539D01*

+X139121Y336391D01*

+X139383Y336283D01*

+X139659Y336217D01*

+X139938Y336195D01*

+Y302052D01*

+X139846Y301944D01*

+X139698Y301703D01*

+X139590Y301441D01*

+X139524Y301165D01*

+X139501Y300883D01*

+X139524Y300601D01*

+X139590Y300325D01*

+X139698Y300063D01*

+X139846Y299822D01*

+X139938Y299714D01*

+Y186007D01*

+G37*

+G36*

+Y176007D02*X139901Y176162D01*

+X139642Y176787D01*

+X139289Y177364D01*

+X138849Y177879D01*

+X138334Y178319D01*

+X137757Y178672D01*

+X137132Y178931D01*

+X136474Y179089D01*

+X135799Y179142D01*

+X135792Y179142D01*

+Y180516D01*

+X135799Y180516D01*

+X136474Y180569D01*

+X137132Y180727D01*

+X137757Y180986D01*

+X138334Y181339D01*

+X138849Y181779D01*

+X139289Y182294D01*

+X139642Y182871D01*

+X139901Y183496D01*

+X139938Y183651D01*

+Y176007D01*

+G37*

+G36*

+Y97000D02*X135792D01*

+Y170516D01*

+X135799Y170516D01*

+X136474Y170569D01*

+X137132Y170727D01*

+X137757Y170986D01*

+X138334Y171339D01*

+X138849Y171779D01*

+X139289Y172294D01*

+X139642Y172871D01*

+X139901Y173496D01*

+X139938Y173651D01*

+Y148993D01*

+X139832Y148820D01*

+X139724Y148558D01*

+X139658Y148282D01*

+X139635Y148000D01*

+X139658Y147718D01*

+X139724Y147442D01*

+X139832Y147180D01*

+X139938Y147007D01*

+Y97000D01*

+G37*

+G36*

+X135792D02*X130938D01*

+Y355695D01*

+X130941Y355694D01*

+X131223Y355717D01*

+X131499Y355783D01*

+X131761Y355891D01*

+X132002Y356039D01*

+X132218Y356223D01*

+X132402Y356439D01*

+X132550Y356680D01*

+X132658Y356942D01*

+X132724Y357218D01*

+X132741Y357500D01*

+X132724Y357782D01*

+X132658Y358058D01*

+X132550Y358320D01*

+X132402Y358561D01*

+X132218Y358777D01*

+X132002Y358961D01*

+X131761Y359109D01*

+X131499Y359217D01*

+X131223Y359283D01*

+X130941Y359306D01*

+X130938Y359305D01*

+Y397000D01*

+X135792D01*

+Y379142D01*

+X135124Y379089D01*

+X134466Y378931D01*

+X133841Y378672D01*

+X133264Y378319D01*

+X132749Y377879D01*

+X132309Y377364D01*

+X131956Y376787D01*

+X131697Y376162D01*

+X131539Y375504D01*

+X131486Y374829D01*

+X131539Y374154D01*

+X131697Y373496D01*

+X131956Y372871D01*

+X132309Y372294D01*

+X132749Y371779D01*

+X133264Y371339D01*

+X133841Y370986D01*

+X134466Y370727D01*

+X135124Y370569D01*

+X135792Y370516D01*

+Y369142D01*

+X135124Y369089D01*

+X134466Y368931D01*

+X133841Y368672D01*

+X133264Y368319D01*

+X132749Y367879D01*

+X132309Y367364D01*

+X131956Y366787D01*

+X131697Y366162D01*

+X131539Y365504D01*

+X131486Y364829D01*

+X131539Y364154D01*

+X131697Y363496D01*

+X131956Y362871D01*

+X132309Y362294D01*

+X132749Y361779D01*

+X133264Y361339D01*

+X133841Y360986D01*

+X134466Y360727D01*

+X135124Y360569D01*

+X135792Y360516D01*

+Y340267D01*

+X135723Y340283D01*

+X135441Y340306D01*

+X135159Y340283D01*

+X134883Y340217D01*

+X134621Y340109D01*

+X134380Y339961D01*

+X134164Y339777D01*

+X133980Y339561D01*

+X133832Y339320D01*

+X133724Y339058D01*

+X133658Y338782D01*

+X133635Y338500D01*

+X133658Y338218D01*

+X133724Y337942D01*

+X133832Y337680D01*

+X133980Y337439D01*

+X134164Y337223D01*

+X134380Y337039D01*

+X134621Y336891D01*

+X134883Y336783D01*

+X135020Y336750D01*

+X134883Y336717D01*

+X134621Y336609D01*

+X134380Y336461D01*

+X134164Y336277D01*

+X133980Y336061D01*

+X133832Y335820D01*

+X133724Y335558D01*

+X133658Y335282D01*

+X133635Y335000D01*

+X133658Y334718D01*

+X133724Y334442D01*

+X133832Y334180D01*

+X133980Y333939D01*

+X134164Y333723D01*

+X134380Y333539D01*

+X134621Y333391D01*

+X134883Y333283D01*

+X135159Y333217D01*

+X135441Y333194D01*

+X135723Y333217D01*

+X135792Y333233D01*

+Y189142D01*

+X135124Y189089D01*

+X134466Y188931D01*

+X133841Y188672D01*

+X133264Y188319D01*

+X132749Y187879D01*

+X132309Y187364D01*

+X131956Y186787D01*

+X131697Y186162D01*

+X131539Y185504D01*

+X131486Y184829D01*

+X131539Y184154D01*

+X131697Y183496D01*

+X131956Y182871D01*

+X132309Y182294D01*

+X132749Y181779D01*

+X133264Y181339D01*

+X133841Y180986D01*

+X134466Y180727D01*

+X135124Y180569D01*

+X135792Y180516D01*

+Y179142D01*

+X135124Y179089D01*

+X134466Y178931D01*

+X133841Y178672D01*

+X133264Y178319D01*

+X132749Y177879D01*

+X132309Y177364D01*

+X131956Y176787D01*

+X131697Y176162D01*

+X131539Y175504D01*

+X131486Y174829D01*

+X131539Y174154D01*

+X131697Y173496D01*

+X131956Y172871D01*

+X132309Y172294D01*

+X132749Y171779D01*

+X133264Y171339D01*

+X133841Y170986D01*

+X134466Y170727D01*

+X135124Y170569D01*

+X135792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X130938D02*X127938D01*

+Y146195D01*

+X127941Y146194D01*

+X128223Y146217D01*

+X128499Y146283D01*

+X128761Y146391D01*

+X129002Y146539D01*

+X129218Y146723D01*

+X129402Y146939D01*

+X129550Y147180D01*

+X129658Y147442D01*

+X129724Y147718D01*

+X129741Y148000D01*

+X129724Y148282D01*

+X129658Y148558D01*

+X129550Y148820D01*

+X129402Y149061D01*

+X129218Y149277D01*

+X129002Y149461D01*

+X128761Y149609D01*

+X128499Y149717D01*

+X128223Y149783D01*

+X127941Y149806D01*

+X127938Y149805D01*

+Y171097D01*

+X128334Y171339D01*

+X128849Y171779D01*

+X129289Y172294D01*

+X129642Y172871D01*

+X129901Y173496D01*

+X130059Y174154D01*

+X130099Y174829D01*

+X130059Y175504D01*

+X129901Y176162D01*

+X129642Y176787D01*

+X129289Y177364D01*

+X128849Y177879D01*

+X128334Y178319D01*

+X127938Y178561D01*

+Y181097D01*

+X128334Y181339D01*

+X128849Y181779D01*

+X129289Y182294D01*

+X129642Y182871D01*

+X129901Y183496D01*

+X130059Y184154D01*

+X130099Y184829D01*

+X130059Y185504D01*

+X129901Y186162D01*

+X129642Y186787D01*

+X129289Y187364D01*

+X128849Y187879D01*

+X128334Y188319D01*

+X127938Y188561D01*

+Y241003D01*

+X128121Y240891D01*

+X128383Y240783D01*

+X128659Y240717D01*

+X128941Y240694D01*

+X129223Y240717D01*

+X129499Y240783D01*

+X129761Y240891D01*

+X130002Y241039D01*

+X130218Y241223D01*

+X130402Y241439D01*

+X130550Y241680D01*

+X130658Y241942D01*

+X130724Y242218D01*

+X130741Y242500D01*

+X130724Y242782D01*

+X130658Y243058D01*

+X130550Y243320D01*

+X130402Y243561D01*

+X130218Y243777D01*

+X130002Y243961D01*

+X129761Y244109D01*

+X129499Y244217D01*

+X129223Y244283D01*

+X128941Y244306D01*

+X128659Y244283D01*

+X128383Y244217D01*

+X128121Y244109D01*

+X127938Y243997D01*

+Y247003D01*

+X128121Y246891D01*

+X128383Y246783D01*

+X128659Y246717D01*

+X128941Y246694D01*

+X129223Y246717D01*

+X129499Y246783D01*

+X129761Y246891D01*

+X130002Y247039D01*

+X130218Y247223D01*

+X130402Y247439D01*

+X130550Y247680D01*

+X130658Y247942D01*

+X130724Y248218D01*

+X130741Y248500D01*

+X130724Y248782D01*

+X130658Y249058D01*

+X130550Y249320D01*

+X130402Y249561D01*

+X130218Y249777D01*

+X130002Y249961D01*

+X129761Y250109D01*

+X129499Y250217D01*

+X129223Y250283D01*

+X128941Y250306D01*

+X128659Y250283D01*

+X128383Y250217D01*

+X128121Y250109D01*

+X127938Y249997D01*

+Y253503D01*

+X128121Y253391D01*

+X128383Y253283D01*

+X128659Y253217D01*

+X128941Y253194D01*

+X129223Y253217D01*

+X129499Y253283D01*

+X129761Y253391D01*

+X130002Y253539D01*

+X130218Y253723D01*

+X130402Y253939D01*

+X130550Y254180D01*

+X130658Y254442D01*

+X130724Y254718D01*

+X130741Y255000D01*

+X130724Y255282D01*

+X130658Y255558D01*

+X130550Y255820D01*

+X130402Y256061D01*

+X130218Y256277D01*

+X130002Y256461D01*

+X129761Y256609D01*

+X129499Y256717D01*

+X129223Y256783D01*

+X128941Y256806D01*

+X128659Y256783D01*

+X128383Y256717D01*

+X128121Y256609D01*

+X127938Y256497D01*

+Y261003D01*

+X128121Y260891D01*

+X128383Y260783D01*

+X128659Y260717D01*

+X128941Y260694D01*

+X129223Y260717D01*

+X129499Y260783D01*

+X129761Y260891D01*

+X130002Y261039D01*

+X130218Y261223D01*

+X130402Y261439D01*

+X130550Y261680D01*

+X130658Y261942D01*

+X130724Y262218D01*

+X130741Y262500D01*

+X130724Y262782D01*

+X130658Y263058D01*

+X130550Y263320D01*

+X130402Y263561D01*

+X130218Y263777D01*

+X130002Y263961D01*

+X129761Y264109D01*

+X129499Y264217D01*

+X129223Y264283D01*

+X128941Y264306D01*

+X128659Y264283D01*

+X128383Y264217D01*

+X128121Y264109D01*

+X127938Y263997D01*

+Y267003D01*

+X128121Y266891D01*

+X128383Y266783D01*

+X128659Y266717D01*

+X128941Y266694D01*

+X129223Y266717D01*

+X129499Y266783D01*

+X129761Y266891D01*

+X130002Y267039D01*

+X130218Y267223D01*

+X130402Y267439D01*

+X130550Y267680D01*

+X130658Y267942D01*

+X130724Y268218D01*

+X130741Y268500D01*

+X130724Y268782D01*

+X130658Y269058D01*

+X130550Y269320D01*

+X130402Y269561D01*

+X130218Y269777D01*

+X130002Y269961D01*

+X129761Y270109D01*

+X129499Y270217D01*

+X129223Y270283D01*

+X128941Y270306D01*

+X128659Y270283D01*

+X128383Y270217D01*

+X128121Y270109D01*

+X127938Y269997D01*

+Y273003D01*

+X128121Y272891D01*

+X128383Y272783D01*

+X128659Y272717D01*

+X128941Y272694D01*

+X129223Y272717D01*

+X129499Y272783D01*

+X129761Y272891D01*

+X130002Y273039D01*

+X130218Y273223D01*

+X130402Y273439D01*

+X130550Y273680D01*

+X130658Y273942D01*

+X130724Y274218D01*

+X130741Y274500D01*

+X130724Y274782D01*

+X130658Y275058D01*

+X130550Y275320D01*

+X130402Y275561D01*

+X130218Y275777D01*

+X130002Y275961D01*

+X129761Y276109D01*

+X129499Y276217D01*

+X129223Y276283D01*

+X128941Y276306D01*

+X128659Y276283D01*

+X128383Y276217D01*

+X128121Y276109D01*

+X127938Y275997D01*

+Y332998D01*

+X128050Y333180D01*

+X128158Y333442D01*

+X128224Y333718D01*

+X128241Y334000D01*

+X128224Y334282D01*

+X128158Y334558D01*

+X128050Y334820D01*

+X127938Y335002D01*

+Y339498D01*

+X128050Y339680D01*

+X128158Y339942D01*

+X128224Y340218D01*

+X128241Y340500D01*

+X128224Y340782D01*

+X128158Y341058D01*

+X128050Y341320D01*

+X127938Y341502D01*

+Y361097D01*

+X128334Y361339D01*

+X128849Y361779D01*

+X129289Y362294D01*

+X129642Y362871D01*

+X129901Y363496D01*

+X130059Y364154D01*

+X130099Y364829D01*

+X130059Y365504D01*

+X129901Y366162D01*

+X129642Y366787D01*

+X129289Y367364D01*

+X128849Y367879D01*

+X128334Y368319D01*

+X127938Y368561D01*

+Y371097D01*

+X128334Y371339D01*

+X128849Y371779D01*

+X129289Y372294D01*

+X129642Y372871D01*

+X129901Y373496D01*

+X130059Y374154D01*

+X130099Y374829D01*

+X130059Y375504D01*

+X129901Y376162D01*

+X129642Y376787D01*

+X129289Y377364D01*

+X128849Y377879D01*

+X128334Y378319D01*

+X127938Y378561D01*

+Y397000D01*

+X130938D01*

+Y359305D01*

+X130659Y359283D01*

+X130383Y359217D01*

+X130121Y359109D01*

+X129880Y358961D01*

+X129664Y358777D01*

+X129480Y358561D01*

+X129332Y358320D01*

+X129224Y358058D01*

+X129158Y357782D01*

+X129135Y357500D01*

+X129158Y357218D01*

+X129224Y356942D01*

+X129332Y356680D01*

+X129480Y356439D01*

+X129664Y356223D01*

+X129880Y356039D01*

+X130121Y355891D01*

+X130383Y355783D01*

+X130659Y355717D01*

+X130938Y355695D01*

+Y97000D01*

+G37*

+G36*

+X127938Y378561D02*X127757Y378672D01*

+X127132Y378931D01*

+X126474Y379089D01*

+X125799Y379142D01*

+X125792Y379142D01*

+Y397000D01*

+X127938D01*

+Y378561D01*

+G37*

+G36*

+Y368561D02*X127757Y368672D01*

+X127132Y368931D01*

+X126474Y369089D01*

+X125799Y369142D01*

+X125792Y369142D01*

+Y370516D01*

+X125799Y370516D01*

+X126474Y370569D01*

+X127132Y370727D01*

+X127757Y370986D01*

+X127938Y371097D01*

+Y368561D01*

+G37*

+G36*

+Y341502D02*X127902Y341561D01*

+X127718Y341777D01*

+X127502Y341961D01*

+X127261Y342109D01*

+X126999Y342217D01*

+X126723Y342283D01*

+X126441Y342306D01*

+X126159Y342283D01*

+X125883Y342217D01*

+X125792Y342180D01*

+Y360516D01*

+X125799Y360516D01*

+X126474Y360569D01*

+X127132Y360727D01*

+X127757Y360986D01*

+X127938Y361097D01*

+Y341502D01*

+G37*

+G36*

+Y335002D02*X127902Y335061D01*

+X127718Y335277D01*

+X127502Y335461D01*

+X127261Y335609D01*

+X126999Y335717D01*

+X126723Y335783D01*

+X126441Y335806D01*

+X126159Y335783D01*

+X125883Y335717D01*

+X125792Y335680D01*

+Y338820D01*

+X125883Y338783D01*

+X126159Y338717D01*

+X126441Y338694D01*

+X126723Y338717D01*

+X126999Y338783D01*

+X127261Y338891D01*

+X127502Y339039D01*

+X127718Y339223D01*

+X127902Y339439D01*

+X127938Y339498D01*

+Y335002D01*

+G37*

+G36*

+Y188561D02*X127757Y188672D01*

+X127132Y188931D01*

+X126474Y189089D01*

+X125799Y189142D01*

+X125792Y189142D01*

+Y300863D01*

+X125892Y300924D01*

+X126108Y301108D01*

+X126292Y301324D01*

+X126440Y301565D01*

+X126548Y301827D01*

+X126614Y302103D01*

+X126631Y302385D01*

+X126614Y302667D01*

+X126548Y302943D01*

+X126440Y303205D01*

+X126292Y303446D01*

+X126108Y303662D01*

+X125892Y303846D01*

+X125792Y303907D01*

+Y332320D01*

+X125883Y332283D01*

+X126159Y332217D01*

+X126441Y332194D01*

+X126723Y332217D01*

+X126999Y332283D01*

+X127261Y332391D01*

+X127502Y332539D01*

+X127718Y332723D01*

+X127902Y332939D01*

+X127938Y332998D01*

+Y275997D01*

+X127880Y275961D01*

+X127664Y275777D01*

+X127480Y275561D01*

+X127332Y275320D01*

+X127224Y275058D01*

+X127158Y274782D01*

+X127135Y274500D01*

+X127158Y274218D01*

+X127224Y273942D01*

+X127332Y273680D01*

+X127480Y273439D01*

+X127664Y273223D01*

+X127880Y273039D01*

+X127938Y273003D01*

+Y269997D01*

+X127880Y269961D01*

+X127664Y269777D01*

+X127480Y269561D01*

+X127332Y269320D01*

+X127224Y269058D01*

+X127158Y268782D01*

+X127135Y268500D01*

+X127158Y268218D01*

+X127224Y267942D01*

+X127332Y267680D01*

+X127480Y267439D01*

+X127664Y267223D01*

+X127880Y267039D01*

+X127938Y267003D01*

+Y263997D01*

+X127880Y263961D01*

+X127664Y263777D01*

+X127480Y263561D01*

+X127332Y263320D01*

+X127224Y263058D01*

+X127158Y262782D01*

+X127135Y262500D01*

+X127158Y262218D01*

+X127224Y261942D01*

+X127332Y261680D01*

+X127480Y261439D01*

+X127664Y261223D01*

+X127880Y261039D01*

+X127938Y261003D01*

+Y256497D01*

+X127880Y256461D01*

+X127664Y256277D01*

+X127480Y256061D01*

+X127332Y255820D01*

+X127224Y255558D01*

+X127158Y255282D01*

+X127135Y255000D01*

+X127158Y254718D01*

+X127224Y254442D01*

+X127332Y254180D01*

+X127480Y253939D01*

+X127664Y253723D01*

+X127880Y253539D01*

+X127938Y253503D01*

+Y249997D01*

+X127880Y249961D01*

+X127664Y249777D01*

+X127480Y249561D01*

+X127332Y249320D01*

+X127224Y249058D01*

+X127158Y248782D01*

+X127135Y248500D01*

+X127158Y248218D01*

+X127224Y247942D01*

+X127332Y247680D01*

+X127480Y247439D01*

+X127664Y247223D01*

+X127880Y247039D01*

+X127938Y247003D01*

+Y243997D01*

+X127880Y243961D01*

+X127664Y243777D01*

+X127480Y243561D01*

+X127332Y243320D01*

+X127224Y243058D01*

+X127158Y242782D01*

+X127135Y242500D01*

+X127158Y242218D01*

+X127224Y241942D01*

+X127332Y241680D01*

+X127480Y241439D01*

+X127664Y241223D01*

+X127880Y241039D01*

+X127938Y241003D01*

+Y188561D01*

+G37*

+G36*

+Y178561D02*X127757Y178672D01*

+X127132Y178931D01*

+X126474Y179089D01*

+X125799Y179142D01*

+X125792Y179142D01*

+Y180516D01*

+X125799Y180516D01*

+X126474Y180569D01*

+X127132Y180727D01*

+X127757Y180986D01*

+X127938Y181097D01*

+Y178561D01*

+G37*

+G36*

+Y97000D02*X125792D01*

+Y170516D01*

+X125799Y170516D01*

+X126474Y170569D01*

+X127132Y170727D01*

+X127757Y170986D01*

+X127938Y171097D01*

+Y149805D01*

+X127659Y149783D01*

+X127383Y149717D01*

+X127121Y149609D01*

+X126880Y149461D01*

+X126664Y149277D01*

+X126480Y149061D01*

+X126332Y148820D01*

+X126224Y148558D01*

+X126158Y148282D01*

+X126135Y148000D01*

+X126158Y147718D01*

+X126224Y147442D01*

+X126332Y147180D01*

+X126480Y146939D01*

+X126664Y146723D01*

+X126880Y146539D01*

+X127121Y146391D01*

+X127383Y146283D01*

+X127659Y146217D01*

+X127938Y146195D01*

+Y97000D01*

+G37*

+G36*

+X121938Y182913D02*X121956Y182871D01*

+X122309Y182294D01*

+X122749Y181779D01*

+X123264Y181339D01*

+X123841Y180986D01*

+X124466Y180727D01*

+X125124Y180569D01*

+X125792Y180516D01*

+Y179142D01*

+X125124Y179089D01*

+X124466Y178931D01*

+X123841Y178672D01*

+X123264Y178319D01*

+X122749Y177879D01*

+X122309Y177364D01*

+X121956Y176787D01*

+X121938Y176745D01*

+Y182913D01*

+G37*

+G36*

+Y362913D02*X121956Y362871D01*

+X122309Y362294D01*

+X122749Y361779D01*

+X123264Y361339D01*

+X123841Y360986D01*

+X124466Y360727D01*

+X125124Y360569D01*

+X125792Y360516D01*

+Y342180D01*

+X125621Y342109D01*

+X125380Y341961D01*

+X125164Y341777D01*

+X124980Y341561D01*

+X124832Y341320D01*

+X124724Y341058D01*

+X124658Y340782D01*

+X124635Y340500D01*

+X124658Y340218D01*

+X124724Y339942D01*

+X124832Y339680D01*

+X124980Y339439D01*

+X125164Y339223D01*

+X125380Y339039D01*

+X125621Y338891D01*

+X125792Y338820D01*

+Y335680D01*

+X125621Y335609D01*

+X125380Y335461D01*

+X125164Y335277D01*

+X124980Y335061D01*

+X124832Y334820D01*

+X124724Y334558D01*

+X124658Y334282D01*

+X124635Y334000D01*

+X124658Y333718D01*

+X124724Y333442D01*

+X124832Y333180D01*

+X124980Y332939D01*

+X125164Y332723D01*

+X125380Y332539D01*

+X125621Y332391D01*

+X125792Y332320D01*

+Y303907D01*

+X125651Y303994D01*

+X125389Y304102D01*

+X125113Y304168D01*

+X124831Y304191D01*

+X124549Y304168D01*

+X124273Y304102D01*

+X124011Y303994D01*

+X123770Y303846D01*

+X123554Y303662D01*

+X123370Y303446D01*

+X123222Y303205D01*

+X123114Y302943D01*

+X123048Y302667D01*

+X123025Y302385D01*

+X123048Y302103D01*

+X123114Y301827D01*

+X123222Y301565D01*

+X123370Y301324D01*

+X123554Y301108D01*

+X123770Y300924D01*

+X124011Y300776D01*

+X124273Y300668D01*

+X124549Y300602D01*

+X124831Y300579D01*

+X125113Y300602D01*

+X125389Y300668D01*

+X125651Y300776D01*

+X125792Y300863D01*

+Y189142D01*

+X125124Y189089D01*

+X124466Y188931D01*

+X123841Y188672D01*

+X123264Y188319D01*

+X122749Y187879D01*

+X122309Y187364D01*

+X121956Y186787D01*

+X121938Y186745D01*

+Y355695D01*

+X121941Y355694D01*

+X122223Y355717D01*

+X122499Y355783D01*

+X122761Y355891D01*

+X123002Y356039D01*

+X123218Y356223D01*

+X123402Y356439D01*

+X123550Y356680D01*

+X123658Y356942D01*

+X123724Y357218D01*

+X123741Y357500D01*

+X123724Y357782D01*

+X123658Y358058D01*

+X123550Y358320D01*

+X123402Y358561D01*

+X123218Y358777D01*

+X123002Y358961D01*

+X122761Y359109D01*

+X122499Y359217D01*

+X122223Y359283D01*

+X121941Y359306D01*

+X121938Y359305D01*

+Y362913D01*

+G37*

+G36*

+Y372913D02*X121956Y372871D01*

+X122309Y372294D01*

+X122749Y371779D01*

+X123264Y371339D01*

+X123841Y370986D01*

+X124466Y370727D01*

+X125124Y370569D01*

+X125792Y370516D01*

+Y369142D01*

+X125124Y369089D01*

+X124466Y368931D01*

+X123841Y368672D01*

+X123264Y368319D01*

+X122749Y367879D01*

+X122309Y367364D01*

+X121956Y366787D01*

+X121938Y366745D01*

+Y372913D01*

+G37*

+G36*

+Y397000D02*X125792D01*

+Y379142D01*

+X125124Y379089D01*

+X124466Y378931D01*

+X123841Y378672D01*

+X123264Y378319D01*

+X122749Y377879D01*

+X122309Y377364D01*

+X121956Y376787D01*

+X121938Y376745D01*

+Y397000D01*

+G37*

+G36*

+X125792Y97000D02*X121938D01*

+Y172913D01*

+X121956Y172871D01*

+X122309Y172294D01*

+X122749Y171779D01*

+X123264Y171339D01*

+X123841Y170986D01*

+X124466Y170727D01*

+X125124Y170569D01*

+X125792Y170516D01*

+Y97000D01*

+G37*

+G36*

+X121938D02*X117938D01*

+Y171097D01*

+X118334Y171339D01*

+X118849Y171779D01*

+X119289Y172294D01*

+X119642Y172871D01*

+X119901Y173496D01*

+X120059Y174154D01*

+X120099Y174829D01*

+X120059Y175504D01*

+X119901Y176162D01*

+X119642Y176787D01*

+X119289Y177364D01*

+X118849Y177879D01*

+X118334Y178319D01*

+X117938Y178561D01*

+Y181097D01*

+X118334Y181339D01*

+X118849Y181779D01*

+X119289Y182294D01*

+X119642Y182871D01*

+X119901Y183496D01*

+X120059Y184154D01*

+X120099Y184829D01*

+X120059Y185504D01*

+X119901Y186162D01*

+X119642Y186787D01*

+X119289Y187364D01*

+X118849Y187879D01*

+X118334Y188319D01*

+X117938Y188561D01*

+Y332195D01*

+X117941Y332194D01*

+X118223Y332217D01*

+X118499Y332283D01*

+X118761Y332391D01*

+X119002Y332539D01*

+X119218Y332723D01*

+X119402Y332939D01*

+X119550Y333180D01*

+X119658Y333442D01*

+X119724Y333718D01*

+X119741Y334000D01*

+X119724Y334282D01*

+X119658Y334558D01*

+X119550Y334820D01*

+X119402Y335061D01*

+X119218Y335277D01*

+X119002Y335461D01*

+X118761Y335609D01*

+X118499Y335717D01*

+X118223Y335783D01*

+X117941Y335806D01*

+X117938Y335805D01*

+Y361097D01*

+X118334Y361339D01*

+X118849Y361779D01*

+X119289Y362294D01*

+X119642Y362871D01*

+X119901Y363496D01*

+X120059Y364154D01*

+X120099Y364829D01*

+X120059Y365504D01*

+X119901Y366162D01*

+X119642Y366787D01*

+X119289Y367364D01*

+X118849Y367879D01*

+X118334Y368319D01*

+X117938Y368561D01*

+Y371097D01*

+X118334Y371339D01*

+X118849Y371779D01*

+X119289Y372294D01*

+X119642Y372871D01*

+X119901Y373496D01*

+X120059Y374154D01*

+X120099Y374829D01*

+X120059Y375504D01*

+X119901Y376162D01*

+X119642Y376787D01*

+X119289Y377364D01*

+X118849Y377879D01*

+X118334Y378319D01*

+X117938Y378561D01*

+Y397000D01*

+X121938D01*

+Y376745D01*

+X121697Y376162D01*

+X121539Y375504D01*

+X121486Y374829D01*

+X121539Y374154D01*

+X121697Y373496D01*

+X121938Y372913D01*

+Y366745D01*

+X121697Y366162D01*

+X121539Y365504D01*

+X121486Y364829D01*

+X121539Y364154D01*

+X121697Y363496D01*

+X121938Y362913D01*

+Y359305D01*

+X121659Y359283D01*

+X121383Y359217D01*

+X121121Y359109D01*

+X120880Y358961D01*

+X120664Y358777D01*

+X120480Y358561D01*

+X120332Y358320D01*

+X120224Y358058D01*

+X120158Y357782D01*

+X120135Y357500D01*

+X120158Y357218D01*

+X120224Y356942D01*

+X120332Y356680D01*

+X120480Y356439D01*

+X120664Y356223D01*

+X120880Y356039D01*

+X121121Y355891D01*

+X121383Y355783D01*

+X121659Y355717D01*

+X121938Y355695D01*

+Y186745D01*

+X121697Y186162D01*

+X121539Y185504D01*

+X121486Y184829D01*

+X121539Y184154D01*

+X121697Y183496D01*

+X121938Y182913D01*

+Y176745D01*

+X121697Y176162D01*

+X121539Y175504D01*

+X121486Y174829D01*

+X121539Y174154D01*

+X121697Y173496D01*

+X121938Y172913D01*

+Y97000D01*

+G37*

+G36*

+X117938Y378561D02*X117757Y378672D01*

+X117132Y378931D01*

+X116474Y379089D01*

+X115799Y379142D01*

+X115792Y379142D01*

+Y397000D01*

+X117938D01*

+Y378561D01*

+G37*

+G36*

+Y368561D02*X117757Y368672D01*

+X117132Y368931D01*

+X116474Y369089D01*

+X115799Y369142D01*

+X115792Y369142D01*

+Y370516D01*

+X115799Y370516D01*

+X116474Y370569D01*

+X117132Y370727D01*

+X117757Y370986D01*

+X117938Y371097D01*

+Y368561D01*

+G37*

+G36*

+Y188561D02*X117757Y188672D01*

+X117132Y188931D01*

+X116474Y189089D01*

+X115799Y189142D01*

+X115792Y189142D01*

+Y360516D01*

+X115799Y360516D01*

+X116474Y360569D01*

+X117132Y360727D01*

+X117757Y360986D01*

+X117938Y361097D01*

+Y335805D01*

+X117659Y335783D01*

+X117383Y335717D01*

+X117121Y335609D01*

+X116880Y335461D01*

+X116664Y335277D01*

+X116480Y335061D01*

+X116332Y334820D01*

+X116224Y334558D01*

+X116158Y334282D01*

+X116135Y334000D01*

+X116158Y333718D01*

+X116224Y333442D01*

+X116332Y333180D01*

+X116480Y332939D01*

+X116664Y332723D01*

+X116880Y332539D01*

+X117121Y332391D01*

+X117383Y332283D01*

+X117659Y332217D01*

+X117938Y332195D01*

+Y188561D01*

+G37*

+G36*

+Y178561D02*X117757Y178672D01*

+X117132Y178931D01*

+X116474Y179089D01*

+X115799Y179142D01*

+X115792Y179142D01*

+Y180516D01*

+X115799Y180516D01*

+X116474Y180569D01*

+X117132Y180727D01*

+X117757Y180986D01*

+X117938Y181097D01*

+Y178561D01*

+G37*

+G36*

+Y97000D02*X115792D01*

+Y120311D01*

+X115902Y120439D01*

+X116050Y120680D01*

+X116158Y120942D01*

+X116224Y121218D01*

+X116241Y121500D01*

+X116224Y121782D01*

+X116158Y122058D01*

+X116050Y122320D01*

+X115902Y122561D01*

+X115792Y122689D01*

+Y130733D01*

+X115999Y130783D01*

+X116261Y130891D01*

+X116502Y131039D01*

+X116718Y131223D01*

+X116902Y131439D01*

+X117050Y131680D01*

+X117158Y131942D01*

+X117224Y132218D01*

+X117241Y132500D01*

+X117224Y132782D01*

+X117158Y133058D01*

+X117050Y133320D01*

+X116902Y133561D01*

+X116718Y133777D01*

+X116502Y133961D01*

+X116261Y134109D01*

+X115999Y134217D01*

+X115792Y134267D01*

+Y170516D01*

+X115799Y170516D01*

+X116474Y170569D01*

+X117132Y170727D01*

+X117757Y170986D01*

+X117938Y171097D01*

+Y97000D01*

+G37*

+G36*

+X111938Y182913D02*X111956Y182871D01*

+X112309Y182294D01*

+X112749Y181779D01*

+X113264Y181339D01*

+X113841Y180986D01*

+X114466Y180727D01*

+X115124Y180569D01*

+X115792Y180516D01*

+Y179142D01*

+X115124Y179089D01*

+X114466Y178931D01*

+X113841Y178672D01*

+X113264Y178319D01*

+X112749Y177879D01*

+X112309Y177364D01*

+X111956Y176787D01*

+X111938Y176745D01*

+Y182913D01*

+G37*

+G36*

+Y362913D02*X111956Y362871D01*

+X112309Y362294D01*

+X112749Y361779D01*

+X113264Y361339D01*

+X113841Y360986D01*

+X114466Y360727D01*

+X115124Y360569D01*

+X115792Y360516D01*

+Y189142D01*

+X115124Y189089D01*

+X114466Y188931D01*

+X113841Y188672D01*

+X113264Y188319D01*

+X112749Y187879D01*

+X112309Y187364D01*

+X111956Y186787D01*

+X111938Y186745D01*

+Y332195D01*

+X111941Y332194D01*

+X112223Y332217D01*

+X112499Y332283D01*

+X112761Y332391D01*

+X113002Y332539D01*

+X113218Y332723D01*

+X113402Y332939D01*

+X113550Y333180D01*

+X113658Y333442D01*

+X113724Y333718D01*

+X113741Y334000D01*

+X113724Y334282D01*

+X113658Y334558D01*

+X113550Y334820D01*

+X113402Y335061D01*

+X113218Y335277D01*

+X113002Y335461D01*

+X112761Y335609D01*

+X112499Y335717D01*

+X112223Y335783D01*

+X111941Y335806D01*

+X111938Y335805D01*

+Y339195D01*

+X111941Y339194D01*

+X112223Y339217D01*

+X112499Y339283D01*

+X112761Y339391D01*

+X113002Y339539D01*

+X113218Y339723D01*

+X113402Y339939D01*

+X113550Y340180D01*

+X113658Y340442D01*

+X113724Y340718D01*

+X113741Y341000D01*

+X113724Y341282D01*

+X113658Y341558D01*

+X113550Y341820D01*

+X113402Y342061D01*

+X113218Y342277D01*

+X113002Y342461D01*

+X112761Y342609D01*

+X112499Y342717D01*

+X112223Y342783D01*

+X111941Y342806D01*

+X111938Y342805D01*

+Y355695D01*

+X111941Y355694D01*

+X112223Y355717D01*

+X112499Y355783D01*

+X112761Y355891D01*

+X113002Y356039D01*

+X113218Y356223D01*

+X113402Y356439D01*

+X113550Y356680D01*

+X113658Y356942D01*

+X113724Y357218D01*

+X113741Y357500D01*

+X113724Y357782D01*

+X113658Y358058D01*

+X113550Y358320D01*

+X113402Y358561D01*

+X113218Y358777D01*

+X113002Y358961D01*

+X112761Y359109D01*

+X112499Y359217D01*

+X112223Y359283D01*

+X111941Y359306D01*

+X111938Y359305D01*

+Y362913D01*

+G37*

+G36*

+Y372913D02*X111956Y372871D01*

+X112309Y372294D01*

+X112749Y371779D01*

+X113264Y371339D01*

+X113841Y370986D01*

+X114466Y370727D01*

+X115124Y370569D01*

+X115792Y370516D01*

+Y369142D01*

+X115124Y369089D01*

+X114466Y368931D01*

+X113841Y368672D01*

+X113264Y368319D01*

+X112749Y367879D01*

+X112309Y367364D01*

+X111956Y366787D01*

+X111938Y366745D01*

+Y372913D01*

+G37*

+G36*

+Y397000D02*X115792D01*

+Y379142D01*

+X115124Y379089D01*

+X114466Y378931D01*

+X113841Y378672D01*

+X113264Y378319D01*

+X112749Y377879D01*

+X112309Y377364D01*

+X111956Y376787D01*

+X111938Y376745D01*

+Y397000D01*

+G37*

+G36*

+X115792Y97000D02*X111938D01*

+Y125557D01*

+X111940Y125557D01*

+X112222Y125534D01*

+X112504Y125557D01*

+X112780Y125623D01*

+X113042Y125731D01*

+X113283Y125879D01*

+X113499Y126063D01*

+X113683Y126279D01*

+X113831Y126520D01*

+X113939Y126782D01*

+X114005Y127058D01*

+X114022Y127340D01*

+X114005Y127622D01*

+X113939Y127898D01*

+X113831Y128160D01*

+X113683Y128401D01*

+X113499Y128617D01*

+X113283Y128801D01*

+X113042Y128949D01*

+X112780Y129057D01*

+X112504Y129123D01*

+X112222Y129146D01*

+X111940Y129123D01*

+X111938Y129123D01*

+Y172913D01*

+X111956Y172871D01*

+X112309Y172294D01*

+X112749Y171779D01*

+X113264Y171339D01*

+X113841Y170986D01*

+X114466Y170727D01*

+X115124Y170569D01*

+X115792Y170516D01*

+Y134267D01*

+X115723Y134283D01*

+X115441Y134306D01*

+X115159Y134283D01*

+X114883Y134217D01*

+X114621Y134109D01*

+X114380Y133961D01*

+X114164Y133777D01*

+X113980Y133561D01*

+X113832Y133320D01*

+X113724Y133058D01*

+X113658Y132782D01*

+X113635Y132500D01*

+X113658Y132218D01*

+X113724Y131942D01*

+X113832Y131680D01*

+X113980Y131439D01*

+X114164Y131223D01*

+X114380Y131039D01*

+X114621Y130891D01*

+X114883Y130783D01*

+X115159Y130717D01*

+X115441Y130694D01*

+X115723Y130717D01*

+X115792Y130733D01*

+Y122689D01*

+X115718Y122777D01*

+X115502Y122961D01*

+X115261Y123109D01*

+X114999Y123217D01*

+X114723Y123283D01*

+X114441Y123306D01*

+X114159Y123283D01*

+X113883Y123217D01*

+X113621Y123109D01*

+X113380Y122961D01*

+X113164Y122777D01*

+X112980Y122561D01*

+X112832Y122320D01*

+X112724Y122058D01*

+X112658Y121782D01*

+X112635Y121500D01*

+X112658Y121218D01*

+X112724Y120942D01*

+X112832Y120680D01*

+X112980Y120439D01*

+X113164Y120223D01*

+X113380Y120039D01*

+X113621Y119891D01*

+X113883Y119783D01*

+X114159Y119717D01*

+X114441Y119694D01*

+X114723Y119717D01*

+X114999Y119783D01*

+X115261Y119891D01*

+X115502Y120039D01*

+X115718Y120223D01*

+X115792Y120311D01*

+Y97000D01*

+G37*

+G36*

+X111938D02*X109343D01*

+Y172099D01*

+X109371Y172082D01*

+X109444Y172052D01*

+X109521Y172034D01*

+X109599Y172027D01*

+X109677Y172034D01*

+X109754Y172052D01*

+X109827Y172082D01*

+X109894Y172123D01*

+X109954Y172174D01*

+X110005Y172234D01*

+X110046Y172301D01*

+X110076Y172374D01*

+X110094Y172451D01*

+X110099Y172529D01*

+Y177129D01*

+X110094Y177207D01*

+X110076Y177284D01*

+X110046Y177357D01*

+X110005Y177424D01*

+X109954Y177484D01*

+X109894Y177535D01*

+X109827Y177576D01*

+X109754Y177606D01*

+X109677Y177624D01*

+X109599Y177631D01*

+X109521Y177624D01*

+X109444Y177606D01*

+X109371Y177576D01*

+X109343Y177559D01*

+Y182501D01*

+X109366Y182513D01*

+X109429Y182561D01*

+X109483Y182618D01*

+X109526Y182684D01*

+X109717Y183045D01*

+X109868Y183425D01*

+X109983Y183817D01*

+X110060Y184218D01*

+X110099Y184625D01*

+Y185033D01*

+X110060Y185440D01*

+X109983Y185841D01*

+X109868Y186233D01*

+X109717Y186613D01*

+X109530Y186976D01*

+X109486Y187042D01*

+X109431Y187100D01*

+X109368Y187148D01*

+X109343Y187161D01*

+Y247000D01*

+X109941D01*

+Y322000D01*

+X109343D01*

+Y362099D01*

+X109371Y362082D01*

+X109444Y362052D01*

+X109521Y362034D01*

+X109599Y362027D01*

+X109677Y362034D01*

+X109754Y362052D01*

+X109827Y362082D01*

+X109894Y362123D01*

+X109954Y362174D01*

+X110005Y362234D01*

+X110046Y362301D01*

+X110076Y362374D01*

+X110094Y362451D01*

+X110099Y362529D01*

+Y367129D01*

+X110094Y367207D01*

+X110076Y367284D01*

+X110046Y367357D01*

+X110005Y367424D01*

+X109954Y367484D01*

+X109894Y367535D01*

+X109827Y367576D01*

+X109754Y367606D01*

+X109677Y367624D01*

+X109599Y367631D01*

+X109521Y367624D01*

+X109444Y367606D01*

+X109371Y367576D01*

+X109343Y367559D01*

+Y372501D01*

+X109366Y372513D01*

+X109429Y372561D01*

+X109483Y372618D01*

+X109526Y372684D01*

+X109717Y373045D01*

+X109868Y373425D01*

+X109983Y373817D01*

+X110060Y374218D01*

+X110099Y374625D01*

+Y375033D01*

+X110060Y375440D01*

+X109983Y375841D01*

+X109868Y376233D01*

+X109717Y376613D01*

+X109530Y376976D01*

+X109486Y377042D01*

+X109431Y377100D01*

+X109368Y377148D01*

+X109343Y377161D01*

+Y397000D01*

+X111938D01*

+Y376745D01*

+X111697Y376162D01*

+X111539Y375504D01*

+X111486Y374829D01*

+X111539Y374154D01*

+X111697Y373496D01*

+X111938Y372913D01*

+Y366745D01*

+X111697Y366162D01*

+X111539Y365504D01*

+X111486Y364829D01*

+X111539Y364154D01*

+X111697Y363496D01*

+X111938Y362913D01*

+Y359305D01*

+X111659Y359283D01*

+X111383Y359217D01*

+X111121Y359109D01*

+X110880Y358961D01*

+X110664Y358777D01*

+X110480Y358561D01*

+X110332Y358320D01*

+X110224Y358058D01*

+X110158Y357782D01*

+X110135Y357500D01*

+X110158Y357218D01*

+X110224Y356942D01*

+X110332Y356680D01*

+X110480Y356439D01*

+X110664Y356223D01*

+X110880Y356039D01*

+X111121Y355891D01*

+X111383Y355783D01*

+X111659Y355717D01*

+X111938Y355695D01*

+Y342805D01*

+X111659Y342783D01*

+X111383Y342717D01*

+X111121Y342609D01*

+X110880Y342461D01*

+X110664Y342277D01*

+X110480Y342061D01*

+X110332Y341820D01*

+X110224Y341558D01*

+X110158Y341282D01*

+X110135Y341000D01*

+X110158Y340718D01*

+X110224Y340442D01*

+X110332Y340180D01*

+X110480Y339939D01*

+X110664Y339723D01*

+X110880Y339539D01*

+X111121Y339391D01*

+X111383Y339283D01*

+X111659Y339217D01*

+X111938Y339195D01*

+Y335805D01*

+X111659Y335783D01*

+X111383Y335717D01*

+X111121Y335609D01*

+X110880Y335461D01*

+X110664Y335277D01*

+X110480Y335061D01*

+X110332Y334820D01*

+X110224Y334558D01*

+X110158Y334282D01*

+X110135Y334000D01*

+X110158Y333718D01*

+X110224Y333442D01*

+X110332Y333180D01*

+X110480Y332939D01*

+X110664Y332723D01*

+X110880Y332539D01*

+X111121Y332391D01*

+X111383Y332283D01*

+X111659Y332217D01*

+X111938Y332195D01*

+Y186745D01*

+X111697Y186162D01*

+X111539Y185504D01*

+X111486Y184829D01*

+X111539Y184154D01*

+X111697Y183496D01*

+X111938Y182913D01*

+Y176745D01*

+X111697Y176162D01*

+X111539Y175504D01*

+X111486Y174829D01*

+X111539Y174154D01*

+X111697Y173496D01*

+X111938Y172913D01*

+Y129123D01*

+X111664Y129057D01*

+X111402Y128949D01*

+X111161Y128801D01*

+X110945Y128617D01*

+X110761Y128401D01*

+X110613Y128160D01*

+X110505Y127898D01*

+X110439Y127622D01*

+X110416Y127340D01*

+X110439Y127058D01*

+X110505Y126782D01*

+X110613Y126520D01*

+X110761Y126279D01*

+X110945Y126063D01*

+X111161Y125879D01*

+X111402Y125731D01*

+X111664Y125623D01*

+X111938Y125557D01*

+Y97000D01*

+G37*

+G36*

+X109343Y322000D02*X105801D01*

+Y360529D01*

+X108099D01*

+X108177Y360534D01*

+X108254Y360552D01*

+X108327Y360582D01*

+X108394Y360623D01*

+X108454Y360674D01*

+X108505Y360734D01*

+X108546Y360801D01*

+X108576Y360874D01*

+X108594Y360951D01*

+X108601Y361029D01*

+X108594Y361107D01*

+X108576Y361184D01*

+X108546Y361257D01*

+X108505Y361324D01*

+X108454Y361384D01*

+X108394Y361435D01*

+X108327Y361476D01*

+X108254Y361506D01*

+X108177Y361524D01*

+X108099Y361529D01*

+X105801D01*

+Y368129D01*

+X108099D01*

+X108177Y368134D01*

+X108254Y368152D01*

+X108327Y368182D01*

+X108394Y368223D01*

+X108454Y368274D01*

+X108505Y368334D01*

+X108546Y368401D01*

+X108576Y368474D01*

+X108594Y368551D01*

+X108601Y368629D01*

+X108594Y368707D01*

+X108576Y368784D01*

+X108546Y368857D01*

+X108505Y368924D01*

+X108454Y368984D01*

+X108394Y369035D01*

+X108327Y369076D01*

+X108254Y369106D01*

+X108177Y369124D01*

+X108099Y369129D01*

+X105801D01*

+Y370529D01*

+X106003D01*

+X106410Y370568D01*

+X106811Y370645D01*

+X107203Y370760D01*

+X107583Y370911D01*

+X107946Y371098D01*

+X108012Y371142D01*

+X108070Y371197D01*

+X108118Y371260D01*

+X108156Y371329D01*

+X108182Y371404D01*

+X108197Y371482D01*

+X108199Y371561D01*

+X108189Y371640D01*

+X108166Y371716D01*

+X108132Y371788D01*

+X108088Y371853D01*

+X108033Y371911D01*

+X107970Y371959D01*

+X107901Y371997D01*

+X107826Y372023D01*

+X107748Y372038D01*

+X107669Y372040D01*

+X107590Y372030D01*

+X107514Y372007D01*

+X107443Y371972D01*

+X107167Y371826D01*

+X106876Y371710D01*

+X106575Y371622D01*

+X106267Y371562D01*

+X105956Y371533D01*

+X105801D01*

+Y378125D01*

+X105956D01*

+X106267Y378096D01*

+X106575Y378036D01*

+X106876Y377948D01*

+X107167Y377832D01*

+X107445Y377689D01*

+X107515Y377654D01*

+X107591Y377632D01*

+X107669Y377622D01*

+X107748Y377624D01*

+X107825Y377638D01*

+X107899Y377665D01*

+X107968Y377702D01*

+X108031Y377750D01*

+X108085Y377807D01*

+X108129Y377872D01*

+X108163Y377943D01*

+X108185Y378019D01*

+X108195Y378097D01*

+X108193Y378176D01*

+X108179Y378253D01*

+X108152Y378327D01*

+X108115Y378396D01*

+X108067Y378459D01*

+X108010Y378513D01*

+X107944Y378556D01*

+X107583Y378747D01*

+X107203Y378898D01*

+X106811Y379013D01*

+X106410Y379090D01*

+X106003Y379129D01*

+X105801D01*

+Y397000D01*

+X109343D01*

+Y377161D01*

+X109299Y377186D01*

+X109224Y377212D01*

+X109146Y377227D01*

+X109067Y377229D01*

+X108988Y377219D01*

+X108912Y377196D01*

+X108840Y377162D01*

+X108775Y377118D01*

+X108717Y377063D01*

+X108669Y377000D01*

+X108631Y376931D01*

+X108605Y376856D01*

+X108590Y376778D01*

+X108588Y376699D01*

+X108598Y376620D01*

+X108621Y376544D01*

+X108656Y376473D01*

+X108802Y376197D01*

+X108918Y375906D01*

+X109006Y375605D01*

+X109066Y375297D01*

+X109095Y374986D01*

+Y374672D01*

+X109066Y374361D01*

+X109006Y374053D01*

+X108918Y373752D01*

+X108802Y373461D01*

+X108659Y373183D01*

+X108624Y373113D01*

+X108602Y373037D01*

+X108592Y372959D01*

+X108594Y372880D01*

+X108608Y372803D01*

+X108635Y372729D01*

+X108672Y372660D01*

+X108720Y372597D01*

+X108777Y372543D01*

+X108842Y372499D01*

+X108913Y372465D01*

+X108989Y372443D01*

+X109067Y372433D01*

+X109146Y372435D01*

+X109223Y372449D01*

+X109297Y372476D01*

+X109343Y372501D01*

+Y367559D01*

+X109304Y367535D01*

+X109244Y367484D01*

+X109193Y367424D01*

+X109152Y367357D01*

+X109122Y367284D01*

+X109104Y367207D01*

+X109099Y367129D01*

+Y362529D01*

+X109104Y362451D01*

+X109122Y362374D01*

+X109152Y362301D01*

+X109193Y362234D01*

+X109244Y362174D01*

+X109304Y362123D01*

+X109343Y362099D01*

+Y322000D01*

+G37*

+G36*

+Y97000D02*X105801D01*

+Y170529D01*

+X108099D01*

+X108177Y170534D01*

+X108254Y170552D01*

+X108327Y170582D01*

+X108394Y170623D01*

+X108454Y170674D01*

+X108505Y170734D01*

+X108546Y170801D01*

+X108576Y170874D01*

+X108594Y170951D01*

+X108601Y171029D01*

+X108594Y171107D01*

+X108576Y171184D01*

+X108546Y171257D01*

+X108505Y171324D01*

+X108454Y171384D01*

+X108394Y171435D01*

+X108327Y171476D01*

+X108254Y171506D01*

+X108177Y171524D01*

+X108099Y171529D01*

+X105801D01*

+Y178129D01*

+X108099D01*

+X108177Y178134D01*

+X108254Y178152D01*

+X108327Y178182D01*

+X108394Y178223D01*

+X108454Y178274D01*

+X108505Y178334D01*

+X108546Y178401D01*

+X108576Y178474D01*

+X108594Y178551D01*

+X108601Y178629D01*

+X108594Y178707D01*

+X108576Y178784D01*

+X108546Y178857D01*

+X108505Y178924D01*

+X108454Y178984D01*

+X108394Y179035D01*

+X108327Y179076D01*

+X108254Y179106D01*

+X108177Y179124D01*

+X108099Y179129D01*

+X105801D01*

+Y180529D01*

+X106003D01*

+X106410Y180568D01*

+X106811Y180645D01*

+X107203Y180760D01*

+X107583Y180911D01*

+X107946Y181098D01*

+X108012Y181142D01*

+X108070Y181197D01*

+X108118Y181260D01*

+X108156Y181329D01*

+X108182Y181404D01*

+X108197Y181482D01*

+X108199Y181561D01*

+X108189Y181640D01*

+X108166Y181716D01*

+X108132Y181788D01*

+X108088Y181853D01*

+X108033Y181911D01*

+X107970Y181959D01*

+X107901Y181997D01*

+X107826Y182023D01*

+X107748Y182038D01*

+X107669Y182040D01*

+X107590Y182030D01*

+X107514Y182007D01*

+X107443Y181972D01*

+X107167Y181826D01*

+X106876Y181710D01*

+X106575Y181622D01*

+X106267Y181562D01*

+X105956Y181533D01*

+X105801D01*

+Y188125D01*

+X105956D01*

+X106267Y188096D01*

+X106575Y188036D01*

+X106876Y187948D01*

+X107167Y187832D01*

+X107445Y187689D01*

+X107515Y187654D01*

+X107591Y187632D01*

+X107669Y187622D01*

+X107748Y187624D01*

+X107825Y187638D01*

+X107899Y187665D01*

+X107968Y187702D01*

+X108031Y187750D01*

+X108085Y187807D01*

+X108129Y187872D01*

+X108163Y187943D01*

+X108185Y188019D01*

+X108195Y188097D01*

+X108193Y188176D01*

+X108179Y188253D01*

+X108152Y188327D01*

+X108115Y188396D01*

+X108067Y188459D01*

+X108010Y188513D01*

+X107944Y188556D01*

+X107583Y188747D01*

+X107203Y188898D01*

+X106811Y189013D01*

+X106410Y189090D01*

+X106003Y189129D01*

+X105801D01*

+Y203321D01*

+X105902Y203439D01*

+X106050Y203680D01*

+X106158Y203942D01*

+X106224Y204218D01*

+X106241Y204500D01*

+X106224Y204782D01*

+X106158Y205058D01*

+X106050Y205320D01*

+X105902Y205561D01*

+X105801Y205679D01*

+Y247000D01*

+X109343D01*

+Y187161D01*

+X109299Y187186D01*

+X109224Y187212D01*

+X109146Y187227D01*

+X109067Y187229D01*

+X108988Y187219D01*

+X108912Y187196D01*

+X108840Y187162D01*

+X108775Y187118D01*

+X108717Y187063D01*

+X108669Y187000D01*

+X108631Y186931D01*

+X108605Y186856D01*

+X108590Y186778D01*

+X108588Y186699D01*

+X108598Y186620D01*

+X108621Y186544D01*

+X108656Y186473D01*

+X108802Y186197D01*

+X108918Y185906D01*

+X109006Y185605D01*

+X109066Y185297D01*

+X109095Y184986D01*

+Y184672D01*

+X109066Y184361D01*

+X109006Y184053D01*

+X108918Y183752D01*

+X108802Y183461D01*

+X108659Y183183D01*

+X108624Y183113D01*

+X108602Y183037D01*

+X108592Y182959D01*

+X108594Y182880D01*

+X108608Y182803D01*

+X108635Y182729D01*

+X108672Y182660D01*

+X108720Y182597D01*

+X108777Y182543D01*

+X108842Y182499D01*

+X108913Y182465D01*

+X108989Y182443D01*

+X109067Y182433D01*

+X109146Y182435D01*

+X109223Y182449D01*

+X109297Y182476D01*

+X109343Y182501D01*

+Y177559D01*

+X109304Y177535D01*

+X109244Y177484D01*

+X109193Y177424D01*

+X109152Y177357D01*

+X109122Y177284D01*

+X109104Y177207D01*

+X109099Y177129D01*

+Y172529D01*

+X109104Y172451D01*

+X109122Y172374D01*

+X109152Y172301D01*

+X109193Y172234D01*

+X109244Y172174D01*

+X109304Y172123D01*

+X109343Y172099D01*

+Y97000D01*

+G37*

+G36*

+X105801Y322000D02*X102255D01*

+Y362099D01*

+X102294Y362123D01*

+X102354Y362174D01*

+X102405Y362234D01*

+X102446Y362301D01*

+X102476Y362374D01*

+X102494Y362451D01*

+X102499Y362529D01*

+Y367129D01*

+X102494Y367207D01*

+X102476Y367284D01*

+X102446Y367357D01*

+X102405Y367424D01*

+X102354Y367484D01*

+X102294Y367535D01*

+X102255Y367559D01*

+Y372497D01*

+X102299Y372472D01*

+X102374Y372446D01*

+X102452Y372431D01*

+X102531Y372429D01*

+X102610Y372439D01*

+X102686Y372462D01*

+X102758Y372496D01*

+X102823Y372540D01*

+X102881Y372595D01*

+X102929Y372658D01*

+X102967Y372727D01*

+X102993Y372802D01*

+X103008Y372880D01*

+X103010Y372959D01*

+X103000Y373038D01*

+X102977Y373114D01*

+X102942Y373185D01*

+X102796Y373461D01*

+X102680Y373752D01*

+X102592Y374053D01*

+X102532Y374361D01*

+X102503Y374672D01*

+Y374986D01*

+X102532Y375297D01*

+X102592Y375605D01*

+X102680Y375906D01*

+X102796Y376197D01*

+X102939Y376475D01*

+X102974Y376545D01*

+X102996Y376621D01*

+X103006Y376699D01*

+X103004Y376778D01*

+X102990Y376855D01*

+X102963Y376929D01*

+X102926Y376998D01*

+X102878Y377061D01*

+X102821Y377115D01*

+X102756Y377159D01*

+X102685Y377193D01*

+X102609Y377215D01*

+X102531Y377225D01*

+X102452Y377223D01*

+X102375Y377209D01*

+X102301Y377182D01*

+X102255Y377157D01*

+Y397000D01*

+X105801D01*

+Y379129D01*

+X105595D01*

+X105188Y379090D01*

+X104787Y379013D01*

+X104395Y378898D01*

+X104015Y378747D01*

+X103652Y378560D01*

+X103586Y378516D01*

+X103528Y378461D01*

+X103480Y378398D01*

+X103442Y378329D01*

+X103416Y378254D01*

+X103401Y378176D01*

+X103399Y378097D01*

+X103409Y378018D01*

+X103432Y377942D01*

+X103466Y377870D01*

+X103510Y377805D01*

+X103565Y377747D01*

+X103628Y377699D01*

+X103697Y377661D01*

+X103772Y377635D01*

+X103850Y377620D01*

+X103929Y377618D01*

+X104008Y377628D01*

+X104084Y377651D01*

+X104155Y377686D01*

+X104431Y377832D01*

+X104722Y377948D01*

+X105023Y378036D01*

+X105331Y378096D01*

+X105642Y378125D01*

+X105801D01*

+Y371533D01*

+X105642D01*

+X105331Y371562D01*

+X105023Y371622D01*

+X104722Y371710D01*

+X104431Y371826D01*

+X104153Y371969D01*

+X104083Y372004D01*

+X104007Y372026D01*

+X103929Y372036D01*

+X103850Y372034D01*

+X103773Y372020D01*

+X103699Y371993D01*

+X103630Y371956D01*

+X103567Y371908D01*

+X103513Y371851D01*

+X103469Y371786D01*

+X103435Y371715D01*

+X103413Y371639D01*

+X103403Y371561D01*

+X103405Y371482D01*

+X103419Y371405D01*

+X103446Y371331D01*

+X103483Y371262D01*

+X103531Y371199D01*

+X103588Y371145D01*

+X103654Y371102D01*

+X104015Y370911D01*

+X104395Y370760D01*

+X104787Y370645D01*

+X105188Y370568D01*

+X105595Y370529D01*

+X105801D01*

+Y369129D01*

+X103499D01*

+X103421Y369124D01*

+X103344Y369106D01*

+X103271Y369076D01*

+X103204Y369035D01*

+X103144Y368984D01*

+X103093Y368924D01*

+X103052Y368857D01*

+X103022Y368784D01*

+X103004Y368707D01*

+X102997Y368629D01*

+X103004Y368551D01*

+X103022Y368474D01*

+X103052Y368401D01*

+X103093Y368334D01*

+X103144Y368274D01*

+X103204Y368223D01*

+X103271Y368182D01*

+X103344Y368152D01*

+X103421Y368134D01*

+X103499Y368129D01*

+X105801D01*

+Y361529D01*

+X103499D01*

+X103421Y361524D01*

+X103344Y361506D01*

+X103271Y361476D01*

+X103204Y361435D01*

+X103144Y361384D01*

+X103093Y361324D01*

+X103052Y361257D01*

+X103022Y361184D01*

+X103004Y361107D01*

+X102997Y361029D01*

+X103004Y360951D01*

+X103022Y360874D01*

+X103052Y360801D01*

+X103093Y360734D01*

+X103144Y360674D01*

+X103204Y360623D01*

+X103271Y360582D01*

+X103344Y360552D01*

+X103421Y360534D01*

+X103499Y360529D01*

+X105801D01*

+Y322000D01*

+G37*

+G36*

+X102255D02*X85784D01*

+Y359749D01*

+X85799Y359748D01*

+X87376Y359872D01*

+X88914Y360241D01*

+X90376Y360847D01*

+X91724Y361673D01*

+X92927Y362701D01*

+X93955Y363904D01*

+X94781Y365252D01*

+X95387Y366714D01*

+X95756Y368252D01*

+X95849Y369829D01*

+X95756Y371406D01*

+X95387Y372944D01*

+X94781Y374406D01*

+X93955Y375754D01*

+X92927Y376957D01*

+X91724Y377985D01*

+X90376Y378811D01*

+X88914Y379417D01*

+X87376Y379786D01*

+X85799Y379910D01*

+X85784Y379909D01*

+Y397000D01*

+X102255D01*

+Y377157D01*

+X102232Y377145D01*

+X102169Y377097D01*

+X102115Y377040D01*

+X102072Y376974D01*

+X101881Y376613D01*

+X101730Y376233D01*

+X101615Y375841D01*

+X101538Y375440D01*

+X101499Y375033D01*

+Y374625D01*

+X101538Y374218D01*

+X101615Y373817D01*

+X101730Y373425D01*

+X101881Y373045D01*

+X102068Y372682D01*

+X102112Y372616D01*

+X102167Y372558D01*

+X102230Y372510D01*

+X102255Y372497D01*

+Y367559D01*

+X102227Y367576D01*

+X102154Y367606D01*

+X102077Y367624D01*

+X101999Y367631D01*

+X101921Y367624D01*

+X101844Y367606D01*

+X101771Y367576D01*

+X101704Y367535D01*

+X101644Y367484D01*

+X101593Y367424D01*

+X101552Y367357D01*

+X101522Y367284D01*

+X101504Y367207D01*

+X101499Y367129D01*

+Y362529D01*

+X101504Y362451D01*

+X101522Y362374D01*

+X101552Y362301D01*

+X101593Y362234D01*

+X101644Y362174D01*

+X101704Y362123D01*

+X101771Y362082D01*

+X101844Y362052D01*

+X101921Y362034D01*

+X101999Y362027D01*

+X102077Y362034D01*

+X102154Y362052D01*

+X102227Y362082D01*

+X102255Y362099D01*

+Y322000D01*

+G37*

+G36*

+Y247000D02*X105801D01*

+Y205679D01*

+X105718Y205777D01*

+X105502Y205961D01*

+X105261Y206109D01*

+X104999Y206217D01*

+X104723Y206283D01*

+X104441Y206306D01*

+X104159Y206283D01*

+X103883Y206217D01*

+X103621Y206109D01*

+X103380Y205961D01*

+X103164Y205777D01*

+X102980Y205561D01*

+X102832Y205320D01*

+X102724Y205058D01*

+X102691Y204921D01*

+X102658Y205058D01*

+X102550Y205320D01*

+X102402Y205561D01*

+X102255Y205734D01*

+Y247000D01*

+G37*

+G36*

+X105801Y97000D02*X102255D01*

+Y172099D01*

+X102294Y172123D01*

+X102354Y172174D01*

+X102405Y172234D01*

+X102446Y172301D01*

+X102476Y172374D01*

+X102494Y172451D01*

+X102499Y172529D01*

+Y177129D01*

+X102494Y177207D01*

+X102476Y177284D01*

+X102446Y177357D01*

+X102405Y177424D01*

+X102354Y177484D01*

+X102294Y177535D01*

+X102255Y177559D01*

+Y182497D01*

+X102299Y182472D01*

+X102374Y182446D01*

+X102452Y182431D01*

+X102531Y182429D01*

+X102610Y182439D01*

+X102686Y182462D01*

+X102758Y182496D01*

+X102823Y182540D01*

+X102881Y182595D01*

+X102929Y182658D01*

+X102967Y182727D01*

+X102993Y182802D01*

+X103008Y182880D01*

+X103010Y182959D01*

+X103000Y183038D01*

+X102977Y183114D01*

+X102942Y183185D01*

+X102796Y183461D01*

+X102680Y183752D01*

+X102592Y184053D01*

+X102532Y184361D01*

+X102503Y184672D01*

+Y184986D01*

+X102532Y185297D01*

+X102592Y185605D01*

+X102680Y185906D01*

+X102796Y186197D01*

+X102939Y186475D01*

+X102974Y186545D01*

+X102996Y186621D01*

+X103006Y186699D01*

+X103004Y186778D01*

+X102990Y186855D01*

+X102963Y186929D01*

+X102926Y186998D01*

+X102878Y187061D01*

+X102821Y187115D01*

+X102756Y187159D01*

+X102685Y187193D01*

+X102609Y187215D01*

+X102531Y187225D01*

+X102452Y187223D01*

+X102375Y187209D01*

+X102301Y187182D01*

+X102255Y187157D01*

+Y203266D01*

+X102402Y203439D01*

+X102550Y203680D01*

+X102658Y203942D01*

+X102691Y204079D01*

+X102724Y203942D01*

+X102832Y203680D01*

+X102980Y203439D01*

+X103164Y203223D01*

+X103380Y203039D01*

+X103621Y202891D01*

+X103883Y202783D01*

+X104159Y202717D01*

+X104441Y202694D01*

+X104723Y202717D01*

+X104999Y202783D01*

+X105261Y202891D01*

+X105502Y203039D01*

+X105718Y203223D01*

+X105801Y203321D01*

+Y189129D01*

+X105595D01*

+X105188Y189090D01*

+X104787Y189013D01*

+X104395Y188898D01*

+X104015Y188747D01*

+X103652Y188560D01*

+X103586Y188516D01*

+X103528Y188461D01*

+X103480Y188398D01*

+X103442Y188329D01*

+X103416Y188254D01*

+X103401Y188176D01*

+X103399Y188097D01*

+X103409Y188018D01*

+X103432Y187942D01*

+X103466Y187870D01*

+X103510Y187805D01*

+X103565Y187747D01*

+X103628Y187699D01*

+X103697Y187661D01*

+X103772Y187635D01*

+X103850Y187620D01*

+X103929Y187618D01*

+X104008Y187628D01*

+X104084Y187651D01*

+X104155Y187686D01*

+X104431Y187832D01*

+X104722Y187948D01*

+X105023Y188036D01*

+X105331Y188096D01*

+X105642Y188125D01*

+X105801D01*

+Y181533D01*

+X105642D01*

+X105331Y181562D01*

+X105023Y181622D01*

+X104722Y181710D01*

+X104431Y181826D01*

+X104153Y181969D01*

+X104083Y182004D01*

+X104007Y182026D01*

+X103929Y182036D01*

+X103850Y182034D01*

+X103773Y182020D01*

+X103699Y181993D01*

+X103630Y181956D01*

+X103567Y181908D01*

+X103513Y181851D01*

+X103469Y181786D01*

+X103435Y181715D01*

+X103413Y181639D01*

+X103403Y181561D01*

+X103405Y181482D01*

+X103419Y181405D01*

+X103446Y181331D01*

+X103483Y181262D01*

+X103531Y181199D01*

+X103588Y181145D01*

+X103654Y181102D01*

+X104015Y180911D01*

+X104395Y180760D01*

+X104787Y180645D01*

+X105188Y180568D01*

+X105595Y180529D01*

+X105801D01*

+Y179129D01*

+X103499D01*

+X103421Y179124D01*

+X103344Y179106D01*

+X103271Y179076D01*

+X103204Y179035D01*

+X103144Y178984D01*

+X103093Y178924D01*

+X103052Y178857D01*

+X103022Y178784D01*

+X103004Y178707D01*

+X102997Y178629D01*

+X103004Y178551D01*

+X103022Y178474D01*

+X103052Y178401D01*

+X103093Y178334D01*

+X103144Y178274D01*

+X103204Y178223D01*

+X103271Y178182D01*

+X103344Y178152D01*

+X103421Y178134D01*

+X103499Y178129D01*

+X105801D01*

+Y171529D01*

+X103499D01*

+X103421Y171524D01*

+X103344Y171506D01*

+X103271Y171476D01*

+X103204Y171435D01*

+X103144Y171384D01*

+X103093Y171324D01*

+X103052Y171257D01*

+X103022Y171184D01*

+X103004Y171107D01*

+X102997Y171029D01*

+X103004Y170951D01*

+X103022Y170874D01*

+X103052Y170801D01*

+X103093Y170734D01*

+X103144Y170674D01*

+X103204Y170623D01*

+X103271Y170582D01*

+X103344Y170552D01*

+X103421Y170534D01*

+X103499Y170529D01*

+X105801D01*

+Y97000D01*

+G37*

+G36*

+X102255D02*X89441D01*

+Y170460D01*

+X90376Y170847D01*

+X91724Y171673D01*

+X92927Y172701D01*

+X93955Y173904D01*

+X94781Y175252D01*

+X95387Y176714D01*

+X95756Y178252D01*

+X95849Y179829D01*

+X95756Y181406D01*

+X95387Y182944D01*

+X94781Y184406D01*

+X93955Y185754D01*

+X92927Y186957D01*

+X91724Y187985D01*

+X90376Y188811D01*

+X89441Y189198D01*

+Y217437D01*

+X89686Y217837D01*

+X89972Y218528D01*

+X90147Y219255D01*

+X90191Y220000D01*

+X90147Y220745D01*

+X89972Y221472D01*

+X89686Y222163D01*

+X89441Y222563D01*

+Y227437D01*

+X89686Y227837D01*

+X89972Y228528D01*

+X90147Y229255D01*

+X90191Y230000D01*

+X90147Y230745D01*

+X89972Y231472D01*

+X89686Y232163D01*

+X89441Y232563D01*

+Y237498D01*

+X89559Y237507D01*

+X89673Y237535D01*

+X89783Y237580D01*

+X89883Y237641D01*

+X89973Y237718D01*

+X90050Y237808D01*

+X90111Y237908D01*

+X90156Y238018D01*

+X90184Y238132D01*

+X90191Y238250D01*

+Y241750D01*

+X90184Y241868D01*

+X90156Y241982D01*

+X90111Y242092D01*

+X90050Y242192D01*

+X89973Y242282D01*

+X89883Y242359D01*

+X89783Y242420D01*

+X89673Y242465D01*

+X89559Y242493D01*

+X89441Y242502D01*

+Y247000D01*

+X102255D01*

+Y205734D01*

+X102218Y205777D01*

+X102002Y205961D01*

+X101761Y206109D01*

+X101499Y206217D01*

+X101223Y206283D01*

+X100941Y206306D01*

+X100659Y206283D01*

+X100383Y206217D01*

+X100121Y206109D01*

+X99880Y205961D01*

+X99664Y205777D01*

+X99480Y205561D01*

+X99332Y205320D01*

+X99224Y205058D01*

+X99158Y204782D01*

+X99135Y204500D01*

+X99158Y204218D01*

+X99224Y203942D01*

+X99332Y203680D01*

+X99480Y203439D01*

+X99664Y203223D01*

+X99880Y203039D01*

+X100121Y202891D01*

+X100383Y202783D01*

+X100659Y202717D01*

+X100941Y202694D01*

+X101223Y202717D01*

+X101499Y202783D01*

+X101761Y202891D01*

+X102002Y203039D01*

+X102218Y203223D01*

+X102255Y203266D01*

+Y187157D01*

+X102232Y187145D01*

+X102169Y187097D01*

+X102115Y187040D01*

+X102072Y186974D01*

+X101881Y186613D01*

+X101730Y186233D01*

+X101615Y185841D01*

+X101538Y185440D01*

+X101499Y185033D01*

+Y184625D01*

+X101538Y184218D01*

+X101615Y183817D01*

+X101730Y183425D01*

+X101881Y183045D01*

+X102068Y182682D01*

+X102112Y182616D01*

+X102167Y182558D01*

+X102230Y182510D01*

+X102255Y182497D01*

+Y177559D01*

+X102227Y177576D01*

+X102154Y177606D01*

+X102077Y177624D01*

+X101999Y177631D01*

+X101921Y177624D01*

+X101844Y177606D01*

+X101771Y177576D01*

+X101704Y177535D01*

+X101644Y177484D01*

+X101593Y177424D01*

+X101552Y177357D01*

+X101522Y177284D01*

+X101504Y177207D01*

+X101499Y177129D01*

+Y172529D01*

+X101504Y172451D01*

+X101522Y172374D01*

+X101552Y172301D01*

+X101593Y172234D01*

+X101644Y172174D01*

+X101704Y172123D01*

+X101771Y172082D01*

+X101844Y172052D01*

+X101921Y172034D01*

+X101999Y172027D01*

+X102077Y172034D01*

+X102154Y172052D01*

+X102227Y172082D01*

+X102255Y172099D01*

+Y97000D01*

+G37*

+G36*

+X89441Y232563D02*X89296Y232801D01*

+X88810Y233369D01*

+X88242Y233855D01*

+X87604Y234245D01*

+X86913Y234531D01*

+X86186Y234706D01*

+X85784Y234738D01*

+Y235250D01*

+X87191D01*

+X87309Y235257D01*

+X87423Y235285D01*

+X87533Y235330D01*

+X87633Y235391D01*

+X87723Y235468D01*

+X87800Y235558D01*

+X87861Y235658D01*

+X87906Y235768D01*

+X87934Y235882D01*

+X87943Y236000D01*

+X87934Y236118D01*

+X87906Y236232D01*

+X87861Y236342D01*

+X87800Y236442D01*

+X87723Y236532D01*

+X87633Y236609D01*

+X87533Y236670D01*

+X87423Y236715D01*

+X87309Y236743D01*

+X87191Y236750D01*

+X85784D01*

+Y243250D01*

+X87191D01*

+X87309Y243257D01*

+X87423Y243285D01*

+X87533Y243330D01*

+X87633Y243391D01*

+X87723Y243468D01*

+X87800Y243558D01*

+X87861Y243658D01*

+X87906Y243768D01*

+X87934Y243882D01*

+X87943Y244000D01*

+X87934Y244118D01*

+X87906Y244232D01*

+X87861Y244342D01*

+X87800Y244442D01*

+X87723Y244532D01*

+X87633Y244609D01*

+X87533Y244670D01*

+X87423Y244715D01*

+X87309Y244743D01*

+X87191Y244750D01*

+X85784D01*

+Y247000D01*

+X89441D01*

+Y242502D01*

+X89323Y242493D01*

+X89209Y242465D01*

+X89099Y242420D01*

+X88999Y242359D01*

+X88909Y242282D01*

+X88832Y242192D01*

+X88771Y242092D01*

+X88726Y241982D01*

+X88698Y241868D01*

+X88691Y241750D01*

+Y238250D01*

+X88698Y238132D01*

+X88726Y238018D01*

+X88771Y237908D01*

+X88832Y237808D01*

+X88909Y237718D01*

+X88999Y237641D01*

+X89099Y237580D01*

+X89209Y237535D01*

+X89323Y237507D01*

+X89441Y237498D01*

+Y232563D01*

+G37*

+G36*

+Y222563D02*X89296Y222801D01*

+X88810Y223369D01*

+X88242Y223855D01*

+X87604Y224245D01*

+X86913Y224531D01*

+X86186Y224706D01*

+X85784Y224738D01*

+Y225262D01*

+X86186Y225294D01*

+X86913Y225469D01*

+X87604Y225755D01*

+X88242Y226145D01*

+X88810Y226631D01*

+X89296Y227199D01*

+X89441Y227437D01*

+Y222563D01*

+G37*

+G36*

+Y189198D02*X88914Y189417D01*

+X87376Y189786D01*

+X85799Y189910D01*

+X85784Y189909D01*

+Y215262D01*

+X86186Y215294D01*

+X86913Y215469D01*

+X87604Y215755D01*

+X88242Y216145D01*

+X88810Y216631D01*

+X89296Y217199D01*

+X89441Y217437D01*

+Y189198D01*

+G37*

+G36*

+Y97000D02*X85784D01*

+Y169749D01*

+X85799Y169748D01*

+X87376Y169872D01*

+X88914Y170241D01*

+X89441Y170460D01*

+Y97000D01*

+G37*

+G36*

+X85784Y322000D02*X73941D01*

+X71441Y324500D01*

+Y394500D01*

+X73941Y397000D01*

+X85784D01*

+Y379909D01*

+X84222Y379786D01*

+X82684Y379417D01*

+X81222Y378811D01*

+X79874Y377985D01*

+X78671Y376957D01*

+X77643Y375754D01*

+X76817Y374406D01*

+X76211Y372944D01*

+X75842Y371406D01*

+X75718Y369829D01*

+X75842Y368252D01*

+X76211Y366714D01*

+X76817Y365252D01*

+X77643Y363904D01*

+X78671Y362701D01*

+X79874Y361673D01*

+X81222Y360847D01*

+X82684Y360241D01*

+X84222Y359872D01*

+X85784Y359749D01*

+Y322000D01*

+G37*

+G36*

+X81441Y217437D02*X81586Y217199D01*

+X82072Y216631D01*

+X82640Y216145D01*

+X83278Y215755D01*

+X83969Y215469D01*

+X84696Y215294D01*

+X85441Y215235D01*

+X85784Y215262D01*

+Y189909D01*

+X84222Y189786D01*

+X82684Y189417D01*

+X81441Y188902D01*

+Y217437D01*

+G37*

+G36*

+Y227437D02*X81586Y227199D01*

+X82072Y226631D01*

+X82640Y226145D01*

+X83278Y225755D01*

+X83969Y225469D01*

+X84696Y225294D01*

+X85441Y225235D01*

+X85784Y225262D01*

+Y224738D01*

+X85441Y224765D01*

+X84696Y224706D01*

+X83969Y224531D01*

+X83278Y224245D01*

+X82640Y223855D01*

+X82072Y223369D01*

+X81586Y222801D01*

+X81441Y222563D01*

+Y227437D01*

+G37*

+G36*

+Y247000D02*X85784D01*

+Y244750D01*

+X83691D01*

+X83573Y244743D01*

+X83459Y244715D01*

+X83349Y244670D01*

+X83249Y244609D01*

+X83159Y244532D01*

+X83082Y244442D01*

+X83021Y244342D01*

+X82976Y244232D01*

+X82948Y244118D01*

+X82939Y244000D01*

+X82948Y243882D01*

+X82976Y243768D01*

+X83021Y243658D01*

+X83082Y243558D01*

+X83159Y243468D01*

+X83249Y243391D01*

+X83349Y243330D01*

+X83459Y243285D01*

+X83573Y243257D01*

+X83691Y243250D01*

+X85784D01*

+Y236750D01*

+X83691D01*

+X83573Y236743D01*

+X83459Y236715D01*

+X83349Y236670D01*

+X83249Y236609D01*

+X83159Y236532D01*

+X83082Y236442D01*

+X83021Y236342D01*

+X82976Y236232D01*

+X82948Y236118D01*

+X82939Y236000D01*

+X82948Y235882D01*

+X82976Y235768D01*

+X83021Y235658D01*

+X83082Y235558D01*

+X83159Y235468D01*

+X83249Y235391D01*

+X83349Y235330D01*

+X83459Y235285D01*

+X83573Y235257D01*

+X83691Y235250D01*

+X85784D01*

+Y234738D01*

+X85441Y234765D01*

+X84696Y234706D01*

+X83969Y234531D01*

+X83278Y234245D01*

+X82640Y233855D01*

+X82072Y233369D01*

+X81586Y232801D01*

+X81441Y232563D01*

+Y237498D01*

+X81559Y237507D01*

+X81673Y237535D01*

+X81783Y237580D01*

+X81883Y237641D01*

+X81973Y237718D01*

+X82050Y237808D01*

+X82111Y237908D01*

+X82156Y238018D01*

+X82184Y238132D01*

+X82191Y238250D01*

+Y241750D01*

+X82184Y241868D01*

+X82156Y241982D01*

+X82111Y242092D01*

+X82050Y242192D01*

+X81973Y242282D01*

+X81883Y242359D01*

+X81783Y242420D01*

+X81673Y242465D01*

+X81559Y242493D01*

+X81441Y242502D01*

+Y247000D01*

+G37*

+G36*

+X85784Y97000D02*X81441D01*

+Y170756D01*

+X82684Y170241D01*

+X84222Y169872D01*

+X85784Y169749D01*

+Y97000D01*

+G37*

+G36*

+X81441D02*X71441D01*

+Y244500D01*

+X73941Y247000D01*

+X81441D01*

+Y242502D01*

+X81323Y242493D01*

+X81209Y242465D01*

+X81099Y242420D01*

+X80999Y242359D01*

+X80909Y242282D01*

+X80832Y242192D01*

+X80771Y242092D01*

+X80726Y241982D01*

+X80698Y241868D01*

+X80691Y241750D01*

+Y238250D01*

+X80698Y238132D01*

+X80726Y238018D01*

+X80771Y237908D01*

+X80832Y237808D01*

+X80909Y237718D01*

+X80999Y237641D01*

+X81099Y237580D01*

+X81209Y237535D01*

+X81323Y237507D01*

+X81441Y237498D01*

+Y232563D01*

+X81196Y232163D01*

+X80910Y231472D01*

+X80735Y230745D01*

+X80676Y230000D01*

+X80735Y229255D01*

+X80910Y228528D01*

+X81196Y227837D01*

+X81441Y227437D01*

+Y222563D01*

+X81196Y222163D01*

+X80910Y221472D01*

+X80735Y220745D01*

+X80676Y220000D01*

+X80735Y219255D01*

+X80910Y218528D01*

+X81196Y217837D01*

+X81441Y217437D01*

+Y188902D01*

+X81222Y188811D01*

+X79874Y187985D01*

+X78671Y186957D01*

+X77643Y185754D01*

+X76817Y184406D01*

+X76211Y182944D01*

+X75842Y181406D01*

+X75718Y179829D01*

+X75842Y178252D01*

+X76211Y176714D01*

+X76817Y175252D01*

+X77643Y173904D01*

+X78671Y172701D01*

+X79874Y171673D01*

+X81222Y170847D01*

+X81441Y170756D01*

+Y97000D01*

+G37*

+G36*

+X107941Y130500D02*X114441D01*

+Y124500D01*

+X107941D01*

+Y130500D01*

+G37*

+G36*

+X159441D02*X165941D01*

+Y124500D01*

+X159441D01*

+Y130500D01*

+G37*

+G36*

+X188941D02*X195441D01*

+Y124500D01*

+X188941D01*

+Y130500D01*

+G37*

+G36*

+X240941D02*X247441D01*

+Y124500D01*

+X240941D01*

+Y130500D01*

+G37*

+G36*

+X124941Y151000D02*X131441D01*

+Y145000D01*

+X124941D01*

+Y151000D01*

+G37*

+G36*

+X204941Y150500D02*X211441D01*

+Y144500D01*

+X204941D01*

+Y150500D01*

+G37*

+G36*

+X159941Y277500D02*X165441D01*

+Y238000D01*

+X159941D01*

+Y277500D01*

+G37*

+G36*

+X125941Y278500D02*X131441D01*

+Y239000D01*

+X125941D01*

+Y278500D01*

+G37*

+G36*

+X155197Y331546D02*X161697D01*

+Y325546D01*

+X155197D01*

+Y331546D01*

+G37*

+G36*

+X155441Y327829D02*X161941D01*

+Y321829D01*

+X155441D01*

+Y327829D01*

+G37*

+G36*

+X138021Y303849D02*X144521D01*

+Y297849D01*

+X138021D01*

+Y303849D01*

+G37*

+G36*

+X194441Y312500D02*X200941D01*

+Y306500D01*

+X194441D01*

+Y312500D01*

+G37*

+G36*

+X192441Y315500D02*X198941D01*

+Y309500D01*

+X192441D01*

+Y315500D01*

+G37*

+G36*

+X194441Y318500D02*X200941D01*

+Y312500D01*

+X194441D01*

+Y318500D01*

+G37*

+G36*

+X109941Y359500D02*X116441D01*

+Y353500D01*

+X109941D01*

+Y359500D01*

+G37*

+G36*

+X117941D02*X124441D01*

+Y353500D01*

+X117941D01*

+Y359500D01*

+G37*

+G36*

+X126941D02*X133441D01*

+Y353500D01*

+X126941D01*

+Y359500D01*

+G37*

+G36*

+X139441D02*X145941D01*

+Y353500D01*

+X139441D01*

+Y359500D01*

+G37*

+G36*

+Y353500D02*X145941D01*

+Y347500D01*

+X139441D01*

+Y353500D01*

+G37*

+G36*

+X145441D02*X151941D01*

+Y347500D01*

+X145441D01*

+Y353500D01*

+G37*

+G36*

+X150941Y349000D02*X157441D01*

+Y343000D01*

+X150941D01*

+Y349000D01*

+G37*

+G36*

+X123441Y343500D02*X129941D01*

+Y337500D01*

+X123441D01*

+Y343500D01*

+G37*

+G36*

+Y337500D02*X129941D01*

+Y331500D01*

+X123441D01*

+Y337500D01*

+G37*

+G36*

+X113441Y338000D02*X119941D01*

+Y332000D01*

+X113441D01*

+Y338000D01*

+G37*

+G36*

+X109441D02*X115941D01*

+Y332000D01*

+X109441D01*

+Y338000D01*

+G37*

+G36*

+Y344500D02*X115941D01*

+Y338500D01*

+X109441D01*

+Y344500D01*

+G37*

+G36*

+X236441Y265000D02*X244441D01*

+Y258000D01*

+X236441D01*

+Y265000D01*

+G37*

+G36*

+X165130Y353930D02*X171630D01*

+Y347930D01*

+X165130D01*

+Y353930D01*

+G37*

+G36*

+X201941Y280000D02*X208441D01*

+Y274000D01*

+X201941D01*

+Y280000D01*

+G37*

+G36*

+X194941Y272500D02*X201441D01*

+Y266500D01*

+X194941D01*

+Y272500D01*

+G37*

+G36*

+Y265500D02*X201441D01*

+Y259500D01*

+X194941D01*

+Y265500D01*

+G37*

+G36*

+X178441Y261500D02*X184941D01*

+Y255500D01*

+X178441D01*

+Y261500D01*

+G37*

+G54D201*X446441Y102000D02*X442441D01*

+G54D202*X319941Y87000D02*X98441D01*

+G54D201*X397941Y367441D02*X394441D01*

+X398441Y309000D02*X395441D01*

+X398441Y248000D02*X395441D01*

+X400441Y189000D02*X395441D01*

+X302941Y340007D02*X300453D01*

+G54D202*X98441Y87000D02*X86941Y98500D01*

+Y111500D01*

+G54D203*X417000Y384000D03*

+Y294000D03*

+Y354000D03*

+X427000Y384000D03*

+Y294000D03*

+Y354000D03*

+G54D200*G36*

+X403750Y357250D02*Y350750D01*

+X410250D01*

+Y357250D01*

+X403750D01*

+G37*

+G54D204*X345799Y357329D03*

+G54D205*X315799Y337329D03*

+G54D204*X85799Y369829D03*

+G54D206*X105799Y374829D03*

+G54D200*G36*

+X102499Y368129D02*Y361529D01*

+X109099D01*

+Y368129D01*

+X102499D01*

+G37*

+G54D206*X115799Y374829D03*

+Y364829D03*

+X125799Y374829D03*

+Y364829D03*

+X135799Y374829D03*

+Y364829D03*

+X145799Y374829D03*

+Y364829D03*

+X155799D03*

+X165799D03*

+X155799Y374829D03*

+X165799D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X175799Y364829D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X215799Y374829D03*

+X225799D03*

+X235799D03*

+X215799Y364829D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X265799D03*

+X245799Y374829D03*

+X255799D03*

+X265799D03*

+X275799D03*

+Y364829D03*

+X285799Y374829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X285799Y364829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D200*G36*

+X450250Y267250D02*Y260750D01*

+X456750D01*

+Y267250D01*

+X450250D01*

+G37*

+G36*

+Y207250D02*Y200750D01*

+X456750D01*

+Y207250D01*

+X450250D01*

+G37*

+G36*

+Y177250D02*Y170750D01*

+X456750D01*

+Y177250D01*

+X450250D01*

+G37*

+G54D203*X463500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+X473500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+G54D200*G36*

+X450250Y237250D02*Y230750D01*

+X456750D01*

+Y237250D01*

+X450250D01*

+G37*

+G54D203*X463500Y234000D03*

+X473500D03*

+G54D200*G36*

+X450250Y147250D02*Y140750D01*

+X456750D01*

+Y147250D01*

+X450250D01*

+G37*

+G36*

+Y117250D02*Y110750D01*

+X456750D01*

+Y117250D01*

+X450250D01*

+G37*

+G36*

+Y87250D02*Y80750D01*

+X456750D01*

+Y87250D01*

+X450250D01*

+G37*

+G36*

+Y57250D02*Y50750D01*

+X456750D01*

+Y57250D01*

+X450250D01*

+G37*

+G54D203*X463500Y54000D03*

+X473500D03*

+G54D200*G36*

+X450250Y327250D02*Y320750D01*

+X456750D01*

+Y327250D01*

+X450250D01*

+G37*

+G54D203*X463500Y324000D03*

+X473500D03*

+G54D200*G36*

+X450250Y297250D02*Y290750D01*

+X456750D01*

+Y297250D01*

+X450250D01*

+G37*

+G54D203*X463500Y294000D03*

+X473500D03*

+X437000Y324000D03*

+G54D200*G36*

+X309191Y252250D02*Y245750D01*

+X315691D01*

+Y252250D01*

+X309191D01*

+G37*

+G54D203*X322441Y249000D03*

+X332441D03*

+X342441D03*

+G54D207*X345799Y192329D03*

+G54D204*X353000Y150000D03*

+G54D200*G36*

+X450250Y387250D02*Y380750D01*

+X456750D01*

+Y387250D01*

+X450250D01*

+G37*

+G54D203*X463500Y384000D03*

+X473500D03*

+G54D200*G36*

+X403750Y387250D02*Y380750D01*

+X410250D01*

+Y387250D01*

+X403750D01*

+G37*

+G36*

+Y297250D02*Y290750D01*

+X410250D01*

+Y297250D01*

+X403750D01*

+G37*

+G36*

+Y327250D02*Y320750D01*

+X410250D01*

+Y327250D01*

+X403750D01*

+G37*

+G54D203*X417000Y324000D03*

+X427000D03*

+G54D200*G36*

+X450250Y357250D02*Y350750D01*

+X456750D01*

+Y357250D01*

+X450250D01*

+G37*

+G54D203*X437000Y354000D03*

+X463500D03*

+X473500D03*

+X437000Y384000D03*

+Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+Y294000D03*

+G54D200*G36*

+X403750Y177250D02*Y170750D01*

+X410250D01*

+Y177250D01*

+X403750D01*

+G37*

+G36*

+Y207250D02*Y200750D01*

+X410250D01*

+Y207250D01*

+X403750D01*

+G37*

+G36*

+Y237250D02*Y230750D01*

+X410250D01*

+Y237250D01*

+X403750D01*

+G37*

+G36*

+Y267250D02*Y260750D01*

+X410250D01*

+Y267250D01*

+X403750D01*

+G37*

+G54D203*X417000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+X427000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+G54D200*G36*

+X202191Y50750D02*Y44250D01*

+X208691D01*

+Y50750D01*

+X202191D01*

+G37*

+G54D203*X205441Y57500D03*

+Y67500D03*

+G54D200*G36*

+X232191Y50750D02*Y44250D01*

+X238691D01*

+Y50750D01*

+X232191D01*

+G37*

+G54D203*X235441Y57500D03*

+Y67500D03*

+G54D200*G36*

+X262191Y50750D02*Y44250D01*

+X268691D01*

+Y50750D01*

+X262191D01*

+G37*

+G36*

+X172191D02*Y44250D01*

+X178691D01*

+Y50750D01*

+X172191D01*

+G37*

+G36*

+X142191D02*Y44250D01*

+X148691D01*

+Y50750D01*

+X142191D01*

+G37*

+G36*

+X112191D02*Y44250D01*

+X118691D01*

+Y50750D01*

+X112191D01*

+G37*

+G36*

+X82191D02*Y44250D01*

+X88691D01*

+Y50750D01*

+X82191D01*

+G37*

+G54D203*X265441Y57500D03*

+X175441D03*

+X145441D03*

+X115441D03*

+X85441D03*

+X265441Y67500D03*

+X175441D03*

+G54D200*G36*

+X292191Y50750D02*Y44250D01*

+X298691D01*

+Y50750D01*

+X292191D01*

+G37*

+G54D203*X295441Y57500D03*

+Y67500D03*

+X145441D03*

+X115441D03*

+X85441D03*

+G54D204*X85799Y179829D03*

+G54D206*X105799Y184829D03*

+G54D200*G36*

+X102499Y178129D02*Y171529D01*

+X109099D01*

+Y178129D01*

+X102499D01*

+G37*

+G54D206*X115799Y184829D03*

+Y174829D03*

+X125799Y184829D03*

+Y174829D03*

+G54D200*G36*

+X82191Y243250D02*Y236750D01*

+X88691D01*

+Y243250D01*

+X82191D01*

+G37*

+G54D203*X85441Y230000D03*

+Y220000D03*

+G54D206*X135799Y184829D03*

+X145799D03*

+X155799D03*

+X135799Y174829D03*

+X145799D03*

+X155799D03*

+X165799Y184829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X165799Y174829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+G54D200*G36*

+X192499Y200629D02*Y194029D01*

+X199099D01*

+Y200629D01*

+X192499D01*

+G37*

+G54D206*X205799Y197329D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X205799Y184829D03*

+X215799D03*

+X225799D03*

+X205799Y174829D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X235799Y184829D03*

+X245799D03*

+X255799D03*

+X265799D03*

+Y174829D03*

+X275799Y184829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X275799Y174829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D208*X386441Y163000D03*

+X400441Y194000D03*

+X389441Y184000D03*

+X400441Y189000D03*

+G54D209*X386023Y157813D03*

+X398441Y173000D03*

+G54D208*X393441Y208000D03*

+G54D209*X358941Y208500D03*

+G54D208*X384162Y188000D03*

+X458441Y195000D03*

+Y164000D03*

+X372441Y170386D03*

+G54D209*X337441Y163000D03*

+X377347Y162178D03*

+X304584Y207483D03*

+X305280Y204383D03*

+X260941Y191500D03*

+X269441Y198500D03*

+X243941Y202000D03*

+X245863Y191524D03*

+G54D208*X432324Y111000D03*

+X446441Y102000D03*

+X434882Y75000D03*

+G54D210*X440941Y123000D03*

+G54D208*X423441Y75000D03*

+G54D209*X434449Y56500D03*

+X440449D03*

+X354441Y85000D03*

+Y89500D03*

+Y95500D03*

+Y101500D03*

+Y107500D03*

+Y113500D03*

+Y119500D03*

+X245441Y127500D03*

+X309441Y141568D03*

+Y136450D03*

+X310941Y115940D03*

+X305696Y107500D03*

+X387441Y119500D03*

+Y113500D03*

+Y107500D03*

+Y101500D03*

+Y95500D03*

+Y89500D03*

+Y85000D03*

+X390941Y76000D03*

+Y71500D03*

+X391441Y66000D03*

+X394941Y58500D03*

+X393941Y51500D03*

+X392441Y45000D03*

+G54D208*X387441Y326000D03*

+X393441Y355000D03*

+X386720Y282000D03*

+X393441Y327000D03*

+X384162Y306000D03*

+X385941Y354500D03*

+X458441Y375000D03*

+X383662Y378500D03*

+X397441Y373000D03*

+X397941Y367441D03*

+G54D209*X385941Y366000D03*

+G54D208*X458441Y345000D03*

+Y315000D03*

+Y285000D03*

+X398441Y314000D03*

+Y309000D03*

+G54D209*Y291000D03*

+G54D208*X372441Y290689D03*

+Y351189D03*

+G54D209*X339837Y341827D03*

+X353390Y339521D03*

+G54D208*X375441Y235000D03*

+G54D209*X356441Y233000D03*

+X338441Y224192D03*

+Y230124D03*

+G54D208*X384512Y258000D03*

+G54D209*X371602Y260228D03*

+G54D208*X458441Y254000D03*

+Y225000D03*

+X387070Y235000D03*

+X398441Y248000D03*

+Y253000D03*

+G54D209*X396441Y235000D03*

+X392188Y239000D03*

+X388207Y247280D03*

+G54D201*X307716Y275075D03*

+X308992Y271971D03*

+X308872Y266522D03*

+X287917Y307829D03*

+X293902Y282263D03*

+X296779Y304963D03*

+X295937Y243628D03*

+G54D209*X304706Y210583D03*

+G54D201*X296727Y256227D03*

+X312157Y300156D03*

+X312122Y295038D03*

+X303365Y330000D03*

+X285430Y325000D03*

+X302941Y340007D03*

+X245557Y279508D03*

+X242456Y293543D03*

+X254740Y298329D03*

+X242168Y298800D03*

+G54D209*X230441Y293000D03*

+X240391Y278564D03*

+G54D201*X266413Y296594D03*

+X263240Y295329D03*

+X262740Y291829D03*

+X260341Y284249D03*

+X264034Y282931D03*

+G54D209*X246731Y303031D03*

+G54D201*X262750Y268772D03*

+X253101Y261836D03*

+X239302Y262235D03*

+G54D209*X221884Y254000D03*

+X224441Y252000D03*

+X225441Y249000D03*

+X224441Y244000D03*

+X230441Y247000D03*

+G54D201*X269653Y298631D03*

+G54D209*X263441Y320000D03*

+G54D201*X268941Y314000D03*

+X273229Y298582D03*

+X278225Y279602D03*

+X278207Y298612D03*

+X277174Y308219D03*

+X277449Y347500D03*

+G54D209*X260568Y316997D03*

+X261502Y307367D03*

+X279441Y285000D03*

+X270441Y336000D03*

+X249101Y328793D03*

+X270441Y342500D03*

+Y349500D03*

+Y357000D03*

+X246941Y238000D03*

+X242441Y229500D03*

+X246441D03*

+X250941D03*

+X236441Y235500D03*

+X224941Y220500D03*

+X225441Y226500D03*

+X224941Y235500D03*

+X269941Y231500D03*

+X251941Y210500D03*

+X163941Y127500D03*

+X193390D03*

+X152441Y121500D03*

+X151941Y132000D03*

+X112222Y127340D03*

+X114441Y121500D03*

+X115441Y132500D03*

+X127941Y148000D03*

+X141441D03*

+X208941D03*

+X223941D03*

+X198441Y122500D03*

+X234441D03*

+X195441Y133000D03*

+X235941D03*

+X128941Y274500D03*

+Y268500D03*

+Y262500D03*

+Y255000D03*

+Y248500D03*

+Y242500D03*

+X162441Y248500D03*

+X161941Y255000D03*

+X181941Y258500D03*

+X162441Y262500D03*

+X198441D03*

+X219441Y272500D03*

+X217441Y279000D03*

+X198441Y269500D03*

+X205441Y277000D03*

+X220729Y265580D03*

+X220441Y259500D03*

+X218441Y261500D03*

+X162441Y242500D03*

+X165941Y231000D03*

+Y226500D03*

+Y220500D03*

+X169441Y214000D03*

+Y208500D03*

+Y201500D03*

+X185441Y228000D03*

+X212941Y238000D03*

+X203941Y237500D03*

+X193941Y237000D03*

+X177441Y228000D03*

+Y217500D03*

+X104441Y204500D03*

+X100941D03*

+X185441Y217500D03*

+X193941Y212500D03*

+X202441D03*

+X210441D03*

+X220441Y215000D03*

+X162941Y268500D03*

+Y274500D03*

+X158441Y323829D03*

+Y328829D03*

+Y326500D03*

+X141307Y300883D03*

+X197441Y314500D03*

+X195441Y311500D03*

+X197441Y308500D03*

+X124831Y302385D03*

+X135441Y338500D03*

+X126441Y340500D03*

+X111941Y341000D03*

+Y357500D03*

+X121941D03*

+X130941D03*

+X135441Y335000D03*

+X111941Y334000D03*

+X117941D03*

+X126441D03*

+X139941Y338000D03*

+X142441Y357500D03*

+Y349500D03*

+X153941Y338000D03*

+X154941Y345500D03*

+X149441Y349500D03*

+X178887Y342818D03*

+X168732Y350833D03*

+X191363Y344449D03*

+X229818Y354988D03*

+G54D211*G54D209*G54D211*G54D209*G54D211*G54D209*G54D212*G54D209*G54D211*G54D209*G54D211*G54D209*G54D211*G54D209*G54D211*G54D209*G54D211*G54D209*G54D211*G54D209*G54D211*M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.group2.gbr b/bbb_cape/schematic/gerbers/20131204/cape.group2.gbr
new file mode 100644
index 0000000..616aca5
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.group2.gbr
@@ -0,0 +1,25032 @@
+G04 start of page 4 for group 2 idx 1 *

+G04 Title: 971 BBB Cape, power *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNGROUP2*%

+%ADD224C,0.0350*%

+%ADD223C,0.0100*%

+%ADD222C,0.0600*%

+%ADD221C,0.0200*%

+%ADD220C,0.0360*%

+%ADD219C,0.2100*%

+%ADD218C,0.0660*%

+%ADD217C,0.2200*%

+%ADD216C,0.1830*%

+%ADD215C,0.0650*%

+%ADD214C,0.0250*%

+%ADD213C,0.0001*%

+G54D213*G36*

+X382941Y350500D02*Y358500D01*

+X389441D01*

+Y350500D01*

+X382941D01*

+G37*

+G36*

+X383941Y277500D02*Y285500D01*

+X390441D01*

+Y277500D01*

+X383941D01*

+G37*

+G36*

+X383441Y231000D02*Y239000D01*

+X389941D01*

+Y231000D01*

+X383441D01*

+G37*

+G36*

+X292922Y301042D02*Y309042D01*

+X299422D01*

+Y301042D01*

+X292922D01*

+G37*

+G36*

+X292941Y253000D02*Y261000D01*

+X299441D01*

+Y253000D01*

+X292941D01*

+G37*

+G36*

+X309441Y298000D02*Y303000D01*

+X314941D01*

+Y298000D01*

+X309441D01*

+G37*

+G36*

+X249877Y257055D02*Y265055D01*

+X256377D01*

+Y257055D01*

+X249877D01*

+G37*

+G36*

+X432320Y73869D02*X432379Y73725D01*

+X432610Y73349D01*

+X432896Y73014D01*

+X433231Y72728D01*

+X433603Y72500D01*

+X432320D01*

+Y73869D01*

+G37*

+G36*

+X446437Y153000D02*X449441D01*

+Y148513D01*

+X449366Y148467D01*

+X449186Y148314D01*

+X449033Y148134D01*

+X448909Y147933D01*

+X448819Y147715D01*

+X448764Y147485D01*

+X448750Y147250D01*

+X448764Y140515D01*

+X448819Y140285D01*

+X448909Y140067D01*

+X449033Y139866D01*

+X449186Y139686D01*

+X449366Y139533D01*

+X449441Y139487D01*

+Y118513D01*

+X449366Y118467D01*

+X449186Y118314D01*

+X449033Y118134D01*

+X448909Y117933D01*

+X448819Y117715D01*

+X448764Y117485D01*

+X448750Y117250D01*

+X448764Y110515D01*

+X448819Y110285D01*

+X448909Y110067D01*

+X449033Y109866D01*

+X449186Y109686D01*

+X449366Y109533D01*

+X449441Y109487D01*

+Y88513D01*

+X449366Y88467D01*

+X449186Y88314D01*

+X449033Y88134D01*

+X448909Y87933D01*

+X448819Y87715D01*

+X448764Y87485D01*

+X448750Y87250D01*

+X448764Y80515D01*

+X448819Y80285D01*

+X448909Y80067D01*

+X449033Y79866D01*

+X449186Y79686D01*

+X449366Y79533D01*

+X449441Y79487D01*

+Y72500D01*

+X446437D01*

+Y99192D01*

+X446441Y99191D01*

+X446880Y99226D01*

+X447309Y99329D01*

+X447716Y99497D01*

+X448092Y99728D01*

+X448427Y100014D01*

+X448713Y100349D01*

+X448944Y100725D01*

+X449112Y101132D01*

+X449215Y101561D01*

+X449241Y102000D01*

+X449215Y102439D01*

+X449112Y102868D01*

+X448944Y103275D01*

+X448713Y103651D01*

+X448427Y103986D01*

+X448092Y104272D01*

+X447716Y104503D01*

+X447309Y104671D01*

+X446880Y104774D01*

+X446441Y104809D01*

+X446437Y104808D01*

+Y153000D01*

+G37*

+G36*

+X440935D02*X446437D01*

+Y104808D01*

+X446002Y104774D01*

+X445573Y104671D01*

+X445166Y104503D01*

+X444790Y104272D01*

+X444455Y103986D01*

+X444169Y103651D01*

+X443938Y103275D01*

+X443770Y102868D01*

+X443667Y102439D01*

+X443632Y102000D01*

+X443667Y101561D01*

+X443770Y101132D01*

+X443938Y100725D01*

+X444169Y100349D01*

+X444455Y100014D01*

+X444790Y99728D01*

+X445166Y99497D01*

+X445573Y99329D01*

+X446002Y99226D01*

+X446437Y99192D01*

+Y72500D01*

+X440935D01*

+Y118988D01*

+X440941Y118988D01*

+X441569Y119037D01*

+X442181Y119184D01*

+X442763Y119425D01*

+X443299Y119754D01*

+X443778Y120163D01*

+X444187Y120642D01*

+X444516Y121178D01*

+X444757Y121760D01*

+X444904Y122372D01*

+X444941Y123000D01*

+X444904Y123628D01*

+X444757Y124240D01*

+X444516Y124822D01*

+X444187Y125358D01*

+X443778Y125837D01*

+X443299Y126246D01*

+X442763Y126575D01*

+X442181Y126816D01*

+X441569Y126963D01*

+X440941Y127012D01*

+X440935Y127012D01*

+Y153000D01*

+G37*

+G36*

+X432320D02*X440935D01*

+Y127012D01*

+X440313Y126963D01*

+X439701Y126816D01*

+X439119Y126575D01*

+X438583Y126246D01*

+X438104Y125837D01*

+X437695Y125358D01*

+X437366Y124822D01*

+X437125Y124240D01*

+X436978Y123628D01*

+X436929Y123000D01*

+X436978Y122372D01*

+X437125Y121760D01*

+X437366Y121178D01*

+X437695Y120642D01*

+X438104Y120163D01*

+X438583Y119754D01*

+X439119Y119425D01*

+X439701Y119184D01*

+X440313Y119037D01*

+X440935Y118988D01*

+Y72500D01*

+X436161D01*

+X436533Y72728D01*

+X436868Y73014D01*

+X437154Y73349D01*

+X437385Y73725D01*

+X437553Y74132D01*

+X437656Y74561D01*

+X437682Y75000D01*

+X437656Y75439D01*

+X437553Y75868D01*

+X437385Y76275D01*

+X437154Y76651D01*

+X436868Y76986D01*

+X436533Y77272D01*

+X436157Y77503D01*

+X435750Y77671D01*

+X435321Y77774D01*

+X434882Y77809D01*

+X434443Y77774D01*

+X434014Y77671D01*

+X433607Y77503D01*

+X433231Y77272D01*

+X432896Y76986D01*

+X432610Y76651D01*

+X432379Y76275D01*

+X432320Y76131D01*

+Y108192D01*

+X432324Y108191D01*

+X432763Y108226D01*

+X433192Y108329D01*

+X433599Y108497D01*

+X433975Y108728D01*

+X434310Y109014D01*

+X434596Y109349D01*

+X434827Y109725D01*

+X434995Y110132D01*

+X435098Y110561D01*

+X435124Y111000D01*

+X435098Y111439D01*

+X434995Y111868D01*

+X434827Y112275D01*

+X434596Y112651D01*

+X434310Y112986D01*

+X433975Y113272D01*

+X433599Y113503D01*

+X433192Y113671D01*

+X432763Y113774D01*

+X432324Y113809D01*

+X432320Y113808D01*

+Y153000D01*

+G37*

+G36*

+X398438Y187034D02*X398455Y187014D01*

+X398790Y186728D01*

+X399166Y186497D01*

+X399573Y186329D01*

+X400002Y186226D01*

+X400441Y186191D01*

+Y153000D01*

+X432320D01*

+Y113808D01*

+X431885Y113774D01*

+X431456Y113671D01*

+X431049Y113503D01*

+X430673Y113272D01*

+X430338Y112986D01*

+X430052Y112651D01*

+X429821Y112275D01*

+X429653Y111868D01*

+X429550Y111439D01*

+X429515Y111000D01*

+X429550Y110561D01*

+X429653Y110132D01*

+X429821Y109725D01*

+X430052Y109349D01*

+X430338Y109014D01*

+X430673Y108728D01*

+X431049Y108497D01*

+X431456Y108329D01*

+X431885Y108226D01*

+X432320Y108192D01*

+Y76131D01*

+X432211Y75868D01*

+X432108Y75439D01*

+X432073Y75000D01*

+X432108Y74561D01*

+X432211Y74132D01*

+X432320Y73869D01*

+Y72500D01*

+X424720D01*

+X425092Y72728D01*

+X425427Y73014D01*

+X425713Y73349D01*

+X425944Y73725D01*

+X426112Y74132D01*

+X426215Y74561D01*

+X426241Y75000D01*

+X426215Y75439D01*

+X426112Y75868D01*

+X425944Y76275D01*

+X425713Y76651D01*

+X425427Y76986D01*

+X425092Y77272D01*

+X424716Y77503D01*

+X424309Y77671D01*

+X423880Y77774D01*

+X423441Y77809D01*

+X423002Y77774D01*

+X422573Y77671D01*

+X422166Y77503D01*

+X421790Y77272D01*

+X421455Y76986D01*

+X421169Y76651D01*

+X420938Y76275D01*

+X420770Y75868D01*

+X420667Y75439D01*

+X420632Y75000D01*

+X420667Y74561D01*

+X420770Y74132D01*

+X420938Y73725D01*

+X421169Y73349D01*

+X421455Y73014D01*

+X421790Y72728D01*

+X422162Y72500D01*

+X412441D01*

+Y136500D01*

+X398438D01*

+Y171195D01*

+X398441Y171194D01*

+X398723Y171217D01*

+X398999Y171283D01*

+X399261Y171391D01*

+X399502Y171539D01*

+X399718Y171723D01*

+X399902Y171939D01*

+X400050Y172180D01*

+X400158Y172442D01*

+X400224Y172718D01*

+X400241Y173000D01*

+X400224Y173282D01*

+X400158Y173558D01*

+X400050Y173820D01*

+X399902Y174061D01*

+X399718Y174277D01*

+X399502Y174461D01*

+X399261Y174609D01*

+X398999Y174717D01*

+X398723Y174783D01*

+X398441Y174806D01*

+X398438Y174805D01*

+Y187034D01*

+G37*

+G36*

+Y192034D02*X398455Y192014D01*

+X398790Y191728D01*

+X399162Y191500D01*

+X398790Y191272D01*

+X398455Y190986D01*

+X398438Y190966D01*

+Y192034D01*

+G37*

+G36*

+Y245192D02*X398441Y245191D01*

+X398880Y245226D01*

+X399309Y245329D01*

+X399716Y245497D01*

+X400092Y245728D01*

+X400427Y246014D01*

+X400441Y246030D01*

+Y196809D01*

+X400002Y196774D01*

+X399573Y196671D01*

+X399166Y196503D01*

+X398790Y196272D01*

+X398455Y195986D01*

+X398438Y195966D01*

+Y245192D01*

+G37*

+G36*

+Y306192D02*X398441Y306191D01*

+X398880Y306226D01*

+X399309Y306329D01*

+X399716Y306497D01*

+X400092Y306728D01*

+X400427Y307014D01*

+X400441Y307030D01*

+Y254970D01*

+X400427Y254986D01*

+X400092Y255272D01*

+X399716Y255503D01*

+X399309Y255671D01*

+X398880Y255774D01*

+X398441Y255809D01*

+X398438Y255808D01*

+Y289195D01*

+X398441Y289194D01*

+X398723Y289217D01*

+X398999Y289283D01*

+X399261Y289391D01*

+X399502Y289539D01*

+X399718Y289723D01*

+X399902Y289939D01*

+X400050Y290180D01*

+X400158Y290442D01*

+X400224Y290718D01*

+X400241Y291000D01*

+X400224Y291282D01*

+X400158Y291558D01*

+X400050Y291820D01*

+X399902Y292061D01*

+X399718Y292277D01*

+X399502Y292461D01*

+X399261Y292609D01*

+X398999Y292717D01*

+X398723Y292783D01*

+X398441Y292806D01*

+X398438Y292805D01*

+Y306192D01*

+G37*

+G36*

+Y364681D02*X398809Y364770D01*

+X399216Y364938D01*

+X399592Y365169D01*

+X399927Y365455D01*

+X400213Y365790D01*

+X400441Y366162D01*

+Y315970D01*

+X400427Y315986D01*

+X400092Y316272D01*

+X399716Y316503D01*

+X399309Y316671D01*

+X398880Y316774D01*

+X398441Y316809D01*

+X398438Y316808D01*

+Y364681D01*

+G37*

+G36*

+X400441Y397000D02*Y368720D01*

+X400213Y369092D01*

+X399927Y369427D01*

+X399592Y369713D01*

+X399216Y369944D01*

+X398809Y370112D01*

+X398438Y370201D01*

+Y370382D01*

+X398716Y370497D01*

+X399092Y370728D01*

+X399427Y371014D01*

+X399713Y371349D01*

+X399944Y371725D01*

+X400112Y372132D01*

+X400215Y372561D01*

+X400241Y373000D01*

+X400215Y373439D01*

+X400112Y373868D01*

+X399944Y374275D01*

+X399713Y374651D01*

+X399427Y374986D01*

+X399092Y375272D01*

+X398716Y375503D01*

+X398438Y375618D01*

+Y397000D01*

+X400441D01*

+G37*

+G36*

+X396438Y246034D02*X396455Y246014D01*

+X396790Y245728D01*

+X397166Y245497D01*

+X397573Y245329D01*

+X398002Y245226D01*

+X398438Y245192D01*

+Y195966D01*

+X398169Y195651D01*

+X397938Y195275D01*

+X397770Y194868D01*

+X397667Y194439D01*

+X397632Y194000D01*

+X397667Y193561D01*

+X397770Y193132D01*

+X397938Y192725D01*

+X398169Y192349D01*

+X398438Y192034D01*

+Y190966D01*

+X398169Y190651D01*

+X397938Y190275D01*

+X397770Y189868D01*

+X397667Y189439D01*

+X397632Y189000D01*

+X397667Y188561D01*

+X397770Y188132D01*

+X397938Y187725D01*

+X398169Y187349D01*

+X398438Y187034D01*

+Y174805D01*

+X398159Y174783D01*

+X397883Y174717D01*

+X397621Y174609D01*

+X397380Y174461D01*

+X397164Y174277D01*

+X396980Y174061D01*

+X396832Y173820D01*

+X396724Y173558D01*

+X396658Y173282D01*

+X396635Y173000D01*

+X396658Y172718D01*

+X396724Y172442D01*

+X396832Y172180D01*

+X396980Y171939D01*

+X397164Y171723D01*

+X397380Y171539D01*

+X397621Y171391D01*

+X397883Y171283D01*

+X398159Y171217D01*

+X398438Y171195D01*

+Y136500D01*

+X396438D01*

+Y233195D01*

+X396441Y233194D01*

+X396723Y233217D01*

+X396999Y233283D01*

+X397261Y233391D01*

+X397502Y233539D01*

+X397718Y233723D01*

+X397902Y233939D01*

+X398050Y234180D01*

+X398158Y234442D01*

+X398224Y234718D01*

+X398241Y235000D01*

+X398224Y235282D01*

+X398158Y235558D01*

+X398050Y235820D01*

+X397902Y236061D01*

+X397718Y236277D01*

+X397502Y236461D01*

+X397261Y236609D01*

+X396999Y236717D01*

+X396723Y236783D01*

+X396441Y236806D01*

+X396438Y236805D01*

+Y246034D01*

+G37*

+G36*

+Y251034D02*X396455Y251014D01*

+X396790Y250728D01*

+X397162Y250500D01*

+X396790Y250272D01*

+X396455Y249986D01*

+X396438Y249966D01*

+Y251034D01*

+G37*

+G36*

+Y307034D02*X396455Y307014D01*

+X396790Y306728D01*

+X397166Y306497D01*

+X397573Y306329D01*

+X398002Y306226D01*

+X398438Y306192D01*

+Y292805D01*

+X398159Y292783D01*

+X397883Y292717D01*

+X397621Y292609D01*

+X397380Y292461D01*

+X397164Y292277D01*

+X396980Y292061D01*

+X396832Y291820D01*

+X396724Y291558D01*

+X396658Y291282D01*

+X396635Y291000D01*

+X396658Y290718D01*

+X396724Y290442D01*

+X396832Y290180D01*

+X396980Y289939D01*

+X397164Y289723D01*

+X397380Y289539D01*

+X397621Y289391D01*

+X397883Y289283D01*

+X398159Y289217D01*

+X398438Y289195D01*

+Y255808D01*

+X398002Y255774D01*

+X397573Y255671D01*

+X397166Y255503D01*

+X396790Y255272D01*

+X396455Y254986D01*

+X396438Y254966D01*

+Y307034D01*

+G37*

+G36*

+Y312034D02*X396455Y312014D01*

+X396790Y311728D01*

+X397162Y311500D01*

+X396790Y311272D01*

+X396455Y310986D01*

+X396438Y310966D01*

+Y312034D01*

+G37*

+G36*

+Y365078D02*X396666Y364938D01*

+X397073Y364770D01*

+X397502Y364667D01*

+X397941Y364632D01*

+X398380Y364667D01*

+X398438Y364681D01*

+Y316808D01*

+X398002Y316774D01*

+X397573Y316671D01*

+X397166Y316503D01*

+X396790Y316272D01*

+X396455Y315986D01*

+X396438Y315966D01*

+Y365078D01*

+G37*

+G36*

+Y370385D02*X396573Y370329D01*

+X397002Y370226D01*

+X397412Y370194D01*

+X397073Y370112D01*

+X396666Y369944D01*

+X396438Y369804D01*

+Y370385D01*

+G37*

+G36*

+X398438Y375618D02*X398309Y375671D01*

+X397880Y375774D01*

+X397441Y375809D01*

+X397002Y375774D01*

+X396573Y375671D01*

+X396438Y375615D01*

+Y397000D01*

+X398438D01*

+Y375618D01*

+G37*

+G36*

+X396438Y375615D02*X396166Y375503D01*

+X395790Y375272D01*

+X395455Y374986D01*

+X395169Y374651D01*

+X394938Y374275D01*

+X394770Y373868D01*

+X394667Y373439D01*

+X394632Y373000D01*

+X394667Y372561D01*

+X394770Y372132D01*

+X394938Y371725D01*

+X395169Y371349D01*

+X395455Y371014D01*

+X395790Y370728D01*

+X396166Y370497D01*

+X396438Y370385D01*

+Y369804D01*

+X396290Y369713D01*

+X395955Y369427D01*

+X395669Y369092D01*

+X395438Y368716D01*

+X395270Y368309D01*

+X395167Y367880D01*

+X395132Y367441D01*

+X395167Y367002D01*

+X395270Y366573D01*

+X395438Y366166D01*

+X395669Y365790D01*

+X395955Y365455D01*

+X396290Y365169D01*

+X396438Y365078D01*

+Y315966D01*

+X396169Y315651D01*

+X395938Y315275D01*

+X395770Y314868D01*

+X395667Y314439D01*

+X395632Y314000D01*

+X395667Y313561D01*

+X395770Y313132D01*

+X395938Y312725D01*

+X396169Y312349D01*

+X396438Y312034D01*

+Y310966D01*

+X396169Y310651D01*

+X395938Y310275D01*

+X395770Y309868D01*

+X395667Y309439D01*

+X395632Y309000D01*

+X395667Y308561D01*

+X395770Y308132D01*

+X395938Y307725D01*

+X396169Y307349D01*

+X396438Y307034D01*

+Y254966D01*

+X396169Y254651D01*

+X395938Y254275D01*

+X395770Y253868D01*

+X395667Y253439D01*

+X395632Y253000D01*

+X395667Y252561D01*

+X395770Y252132D01*

+X395938Y251725D01*

+X396169Y251349D01*

+X396438Y251034D01*

+Y249966D01*

+X396169Y249651D01*

+X395938Y249275D01*

+X395770Y248868D01*

+X395667Y248439D01*

+X395632Y248000D01*

+X395667Y247561D01*

+X395770Y247132D01*

+X395938Y246725D01*

+X396169Y246349D01*

+X396438Y246034D01*

+Y236805D01*

+X396159Y236783D01*

+X395883Y236717D01*

+X395621Y236609D01*

+X395380Y236461D01*

+X395164Y236277D01*

+X394980Y236061D01*

+X394832Y235820D01*

+X394724Y235558D01*

+X394658Y235282D01*

+X394635Y235000D01*

+X394658Y234718D01*

+X394724Y234442D01*

+X394832Y234180D01*

+X394980Y233939D01*

+X395164Y233723D01*

+X395380Y233539D01*

+X395621Y233391D01*

+X395883Y233283D01*

+X396159Y233217D01*

+X396438Y233195D01*

+Y136500D01*

+X393437D01*

+Y205192D01*

+X393441Y205191D01*

+X393880Y205226D01*

+X394309Y205329D01*

+X394716Y205497D01*

+X395092Y205728D01*

+X395427Y206014D01*

+X395713Y206349D01*

+X395944Y206725D01*

+X396112Y207132D01*

+X396215Y207561D01*

+X396241Y208000D01*

+X396215Y208439D01*

+X396112Y208868D01*

+X395944Y209275D01*

+X395713Y209651D01*

+X395427Y209986D01*

+X395092Y210272D01*

+X394716Y210503D01*

+X394309Y210671D01*

+X393880Y210774D01*

+X393441Y210809D01*

+X393437Y210808D01*

+Y237699D01*

+X393465Y237723D01*

+X393649Y237939D01*

+X393797Y238180D01*

+X393905Y238442D01*

+X393971Y238718D01*

+X393988Y239000D01*

+X393971Y239282D01*

+X393905Y239558D01*

+X393797Y239820D01*

+X393649Y240061D01*

+X393465Y240277D01*

+X393437Y240301D01*

+Y324192D01*

+X393441Y324191D01*

+X393880Y324226D01*

+X394309Y324329D01*

+X394716Y324497D01*

+X395092Y324728D01*

+X395427Y325014D01*

+X395713Y325349D01*

+X395944Y325725D01*

+X396112Y326132D01*

+X396215Y326561D01*

+X396241Y327000D01*

+X396215Y327439D01*

+X396112Y327868D01*

+X395944Y328275D01*

+X395713Y328651D01*

+X395427Y328986D01*

+X395092Y329272D01*

+X394716Y329503D01*

+X394309Y329671D01*

+X393880Y329774D01*

+X393441Y329809D01*

+X393437Y329808D01*

+Y352192D01*

+X393441Y352191D01*

+X393880Y352226D01*

+X394309Y352329D01*

+X394716Y352497D01*

+X395092Y352728D01*

+X395427Y353014D01*

+X395713Y353349D01*

+X395944Y353725D01*

+X396112Y354132D01*

+X396215Y354561D01*

+X396241Y355000D01*

+X396215Y355439D01*

+X396112Y355868D01*

+X395944Y356275D01*

+X395713Y356651D01*

+X395427Y356986D01*

+X395092Y357272D01*

+X394716Y357503D01*

+X394309Y357671D01*

+X393880Y357774D01*

+X393441Y357809D01*

+X393437Y357808D01*

+Y397000D01*

+X396438D01*

+Y375615D01*

+G37*

+G36*

+X393437Y136500D02*X389437D01*

+Y181192D01*

+X389441Y181191D01*

+X389880Y181226D01*

+X390309Y181329D01*

+X390716Y181497D01*

+X391092Y181728D01*

+X391427Y182014D01*

+X391713Y182349D01*

+X391944Y182725D01*

+X392112Y183132D01*

+X392215Y183561D01*

+X392241Y184000D01*

+X392215Y184439D01*

+X392112Y184868D01*

+X391944Y185275D01*

+X391713Y185651D01*

+X391427Y185986D01*

+X391092Y186272D01*

+X390716Y186503D01*

+X390309Y186671D01*

+X389880Y186774D01*

+X389441Y186809D01*

+X389437Y186808D01*

+Y233503D01*

+X389573Y233725D01*

+X389741Y234132D01*

+X389844Y234561D01*

+X389870Y235000D01*

+X389844Y235439D01*

+X389741Y235868D01*

+X389573Y236275D01*

+X389437Y236497D01*

+Y245963D01*

+X389484Y246003D01*

+X389668Y246219D01*

+X389816Y246460D01*

+X389924Y246722D01*

+X389990Y246998D01*

+X390007Y247280D01*

+X389990Y247562D01*

+X389924Y247838D01*

+X389816Y248100D01*

+X389668Y248341D01*

+X389484Y248557D01*

+X389437Y248597D01*

+Y281322D01*

+X389494Y281561D01*

+X389520Y282000D01*

+X389494Y282439D01*

+X389437Y282678D01*

+Y324025D01*

+X389713Y324349D01*

+X389944Y324725D01*

+X390112Y325132D01*

+X390215Y325561D01*

+X390241Y326000D01*

+X390215Y326439D01*

+X390112Y326868D01*

+X389944Y327275D01*

+X389713Y327651D01*

+X389437Y327975D01*

+Y397000D01*

+X393437D01*

+Y357808D01*

+X393002Y357774D01*

+X392573Y357671D01*

+X392166Y357503D01*

+X391790Y357272D01*

+X391455Y356986D01*

+X391169Y356651D01*

+X390938Y356275D01*

+X390770Y355868D01*

+X390667Y355439D01*

+X390632Y355000D01*

+X390667Y354561D01*

+X390770Y354132D01*

+X390938Y353725D01*

+X391169Y353349D01*

+X391455Y353014D01*

+X391790Y352728D01*

+X392166Y352497D01*

+X392573Y352329D01*

+X393002Y352226D01*

+X393437Y352192D01*

+Y329808D01*

+X393002Y329774D01*

+X392573Y329671D01*

+X392166Y329503D01*

+X391790Y329272D01*

+X391455Y328986D01*

+X391169Y328651D01*

+X390938Y328275D01*

+X390770Y327868D01*

+X390667Y327439D01*

+X390632Y327000D01*

+X390667Y326561D01*

+X390770Y326132D01*

+X390938Y325725D01*

+X391169Y325349D01*

+X391455Y325014D01*

+X391790Y324728D01*

+X392166Y324497D01*

+X392573Y324329D01*

+X393002Y324226D01*

+X393437Y324192D01*

+Y240301D01*

+X393249Y240461D01*

+X393008Y240609D01*

+X392746Y240717D01*

+X392470Y240783D01*

+X392188Y240806D01*

+X391906Y240783D01*

+X391630Y240717D01*

+X391368Y240609D01*

+X391127Y240461D01*

+X390911Y240277D01*

+X390727Y240061D01*

+X390579Y239820D01*

+X390471Y239558D01*

+X390405Y239282D01*

+X390382Y239000D01*

+X390405Y238718D01*

+X390471Y238442D01*

+X390579Y238180D01*

+X390727Y237939D01*

+X390911Y237723D01*

+X391127Y237539D01*

+X391368Y237391D01*

+X391630Y237283D01*

+X391906Y237217D01*

+X392188Y237194D01*

+X392470Y237217D01*

+X392746Y237283D01*

+X393008Y237391D01*

+X393249Y237539D01*

+X393437Y237699D01*

+Y210808D01*

+X393002Y210774D01*

+X392573Y210671D01*

+X392166Y210503D01*

+X391790Y210272D01*

+X391455Y209986D01*

+X391169Y209651D01*

+X390938Y209275D01*

+X390770Y208868D01*

+X390667Y208439D01*

+X390632Y208000D01*

+X390667Y207561D01*

+X390770Y207132D01*

+X390938Y206725D01*

+X391169Y206349D01*

+X391455Y206014D01*

+X391790Y205728D01*

+X392166Y205497D01*

+X392573Y205329D01*

+X393002Y205226D01*

+X393437Y205192D01*

+Y136500D01*

+G37*

+G36*

+X398438Y370201D02*X398380Y370215D01*

+X397970Y370247D01*

+X398309Y370329D01*

+X398438Y370382D01*

+Y370201D01*

+G37*

+G36*

+X389437Y327975D02*X389427Y327986D01*

+X389092Y328272D01*

+X388716Y328503D01*

+X388309Y328671D01*

+X387880Y328774D01*

+X387441Y328809D01*

+X387002Y328774D01*

+X386573Y328671D01*

+X386437Y328615D01*

+Y351739D01*

+X386809Y351829D01*

+X387216Y351997D01*

+X387592Y352228D01*

+X387927Y352514D01*

+X388213Y352849D01*

+X388444Y353225D01*

+X388612Y353632D01*

+X388715Y354061D01*

+X388741Y354500D01*

+X388715Y354939D01*

+X388612Y355368D01*

+X388444Y355775D01*

+X388213Y356151D01*

+X387927Y356486D01*

+X387592Y356772D01*

+X387216Y357003D01*

+X386809Y357171D01*

+X386437Y357261D01*

+Y364268D01*

+X386499Y364283D01*

+X386761Y364391D01*

+X387002Y364539D01*

+X387218Y364723D01*

+X387402Y364939D01*

+X387550Y365180D01*

+X387658Y365442D01*

+X387724Y365718D01*

+X387741Y366000D01*

+X387724Y366282D01*

+X387658Y366558D01*

+X387550Y366820D01*

+X387402Y367061D01*

+X387218Y367277D01*

+X387002Y367461D01*

+X386761Y367609D01*

+X386499Y367717D01*

+X386437Y367732D01*

+Y378071D01*

+X386462Y378500D01*

+X386437Y378929D01*

+Y397000D01*

+X389437D01*

+Y327975D01*

+G37*

+G36*

+Y282678D02*X389391Y282868D01*

+X389223Y283275D01*

+X388992Y283651D01*

+X388706Y283986D01*

+X388371Y284272D01*

+X387995Y284503D01*

+X387588Y284671D01*

+X387159Y284774D01*

+X386720Y284809D01*

+X386437Y284786D01*

+Y304353D01*

+X386665Y304725D01*

+X386833Y305132D01*

+X386936Y305561D01*

+X386962Y306000D01*

+X386936Y306439D01*

+X386833Y306868D01*

+X386665Y307275D01*

+X386437Y307647D01*

+Y323385D01*

+X386573Y323329D01*

+X387002Y323226D01*

+X387441Y323191D01*

+X387880Y323226D01*

+X388309Y323329D01*

+X388716Y323497D01*

+X389092Y323728D01*

+X389427Y324014D01*

+X389437Y324025D01*

+Y282678D01*

+G37*

+G36*

+Y248597D02*X389268Y248741D01*

+X389027Y248889D01*

+X388765Y248997D01*

+X388489Y249063D01*

+X388207Y249086D01*

+X387925Y249063D01*

+X387649Y248997D01*

+X387387Y248889D01*

+X387146Y248741D01*

+X386930Y248557D01*

+X386746Y248341D01*

+X386598Y248100D01*

+X386490Y247838D01*

+X386437Y247617D01*

+Y255962D01*

+X386498Y256014D01*

+X386784Y256349D01*

+X387015Y256725D01*

+X387183Y257132D01*

+X387286Y257561D01*

+X387312Y258000D01*

+X387286Y258439D01*

+X387183Y258868D01*

+X387015Y259275D01*

+X386784Y259651D01*

+X386498Y259986D01*

+X386437Y260038D01*

+Y279214D01*

+X386720Y279191D01*

+X387159Y279226D01*

+X387588Y279329D01*

+X387995Y279497D01*

+X388371Y279728D01*

+X388706Y280014D01*

+X388992Y280349D01*

+X389223Y280725D01*

+X389391Y281132D01*

+X389437Y281322D01*

+Y248597D01*

+G37*

+G36*

+Y236497D02*X389342Y236651D01*

+X389056Y236986D01*

+X388721Y237272D01*

+X388345Y237503D01*

+X387938Y237671D01*

+X387509Y237774D01*

+X387070Y237809D01*

+X386631Y237774D01*

+X386437Y237727D01*

+Y246943D01*

+X386490Y246722D01*

+X386598Y246460D01*

+X386746Y246219D01*

+X386930Y246003D01*

+X387146Y245819D01*

+X387387Y245671D01*

+X387649Y245563D01*

+X387925Y245497D01*

+X388207Y245474D01*

+X388489Y245497D01*

+X388765Y245563D01*

+X389027Y245671D01*

+X389268Y245819D01*

+X389437Y245963D01*

+Y236497D01*

+G37*

+G36*

+Y136500D02*X386437D01*

+Y156061D01*

+X386581Y156096D01*

+X386843Y156204D01*

+X387084Y156352D01*

+X387300Y156536D01*

+X387484Y156752D01*

+X387632Y156993D01*

+X387740Y157255D01*

+X387806Y157531D01*

+X387823Y157813D01*

+X387806Y158095D01*

+X387740Y158371D01*

+X387632Y158633D01*

+X387484Y158874D01*

+X387300Y159090D01*

+X387084Y159274D01*

+X386843Y159422D01*

+X386581Y159530D01*

+X386437Y159565D01*

+Y160192D01*

+X386441Y160191D01*

+X386880Y160226D01*

+X387309Y160329D01*

+X387716Y160497D01*

+X388092Y160728D01*

+X388427Y161014D01*

+X388713Y161349D01*

+X388944Y161725D01*

+X389112Y162132D01*

+X389215Y162561D01*

+X389241Y163000D01*

+X389215Y163439D01*

+X389112Y163868D01*

+X388944Y164275D01*

+X388713Y164651D01*

+X388427Y164986D01*

+X388092Y165272D01*

+X387716Y165503D01*

+X387309Y165671D01*

+X386880Y165774D01*

+X386441Y165809D01*

+X386437Y165808D01*

+Y186353D01*

+X386665Y186725D01*

+X386833Y187132D01*

+X386936Y187561D01*

+X386962Y188000D01*

+X386936Y188439D01*

+X386833Y188868D01*

+X386665Y189275D01*

+X386437Y189647D01*

+Y232273D01*

+X386631Y232226D01*

+X387070Y232191D01*

+X387509Y232226D01*

+X387938Y232329D01*

+X388345Y232497D01*

+X388721Y232728D01*

+X389056Y233014D01*

+X389342Y233349D01*

+X389437Y233503D01*

+Y186808D01*

+X389002Y186774D01*

+X388573Y186671D01*

+X388166Y186503D01*

+X387790Y186272D01*

+X387455Y185986D01*

+X387169Y185651D01*

+X386938Y185275D01*

+X386770Y184868D01*

+X386667Y184439D01*

+X386632Y184000D01*

+X386667Y183561D01*

+X386770Y183132D01*

+X386938Y182725D01*

+X387169Y182349D01*

+X387455Y182014D01*

+X387790Y181728D01*

+X388166Y181497D01*

+X388573Y181329D01*

+X389002Y181226D01*

+X389437Y181192D01*

+Y136500D01*

+G37*

+G36*

+X386437D02*X377344D01*

+Y160373D01*

+X377347Y160372D01*

+X377629Y160395D01*

+X377905Y160461D01*

+X378167Y160569D01*

+X378408Y160717D01*

+X378624Y160901D01*

+X378808Y161117D01*

+X378956Y161358D01*

+X379064Y161620D01*

+X379130Y161896D01*

+X379147Y162178D01*

+X379130Y162460D01*

+X379064Y162736D01*

+X378956Y162998D01*

+X378808Y163239D01*

+X378624Y163455D01*

+X378408Y163639D01*

+X378167Y163787D01*

+X377905Y163895D01*

+X377629Y163961D01*

+X377347Y163984D01*

+X377344Y163983D01*

+Y232943D01*

+X377427Y233014D01*

+X377713Y233349D01*

+X377944Y233725D01*

+X378112Y234132D01*

+X378215Y234561D01*

+X378241Y235000D01*

+X378215Y235439D01*

+X378112Y235868D01*

+X377944Y236275D01*

+X377713Y236651D01*

+X377427Y236986D01*

+X377344Y237057D01*

+Y397000D01*

+X386437D01*

+Y378929D01*

+X386436Y378939D01*

+X386333Y379368D01*

+X386165Y379775D01*

+X385934Y380151D01*

+X385648Y380486D01*

+X385313Y380772D01*

+X384937Y381003D01*

+X384530Y381171D01*

+X384101Y381274D01*

+X383662Y381309D01*

+X383223Y381274D01*

+X382794Y381171D01*

+X382387Y381003D01*

+X382011Y380772D01*

+X381676Y380486D01*

+X381390Y380151D01*

+X381159Y379775D01*

+X380991Y379368D01*

+X380888Y378939D01*

+X380853Y378500D01*

+X380888Y378061D01*

+X380991Y377632D01*

+X381159Y377225D01*

+X381390Y376849D01*

+X381676Y376514D01*

+X382011Y376228D01*

+X382387Y375997D01*

+X382794Y375829D01*

+X383223Y375726D01*

+X383662Y375691D01*

+X384101Y375726D01*

+X384530Y375829D01*

+X384937Y375997D01*

+X385313Y376228D01*

+X385648Y376514D01*

+X385934Y376849D01*

+X386165Y377225D01*

+X386333Y377632D01*

+X386436Y378061D01*

+X386437Y378071D01*

+Y367732D01*

+X386223Y367783D01*

+X385941Y367806D01*

+X385659Y367783D01*

+X385383Y367717D01*

+X385121Y367609D01*

+X384880Y367461D01*

+X384664Y367277D01*

+X384480Y367061D01*

+X384332Y366820D01*

+X384224Y366558D01*

+X384158Y366282D01*

+X384135Y366000D01*

+X384158Y365718D01*

+X384224Y365442D01*

+X384332Y365180D01*

+X384480Y364939D01*

+X384664Y364723D01*

+X384880Y364539D01*

+X385121Y364391D01*

+X385383Y364283D01*

+X385659Y364217D01*

+X385941Y364194D01*

+X386223Y364217D01*

+X386437Y364268D01*

+Y357261D01*

+X386380Y357274D01*

+X385941Y357309D01*

+X385502Y357274D01*

+X385073Y357171D01*

+X384666Y357003D01*

+X384290Y356772D01*

+X383955Y356486D01*

+X383669Y356151D01*

+X383438Y355775D01*

+X383270Y355368D01*

+X383167Y354939D01*

+X383132Y354500D01*

+X383167Y354061D01*

+X383270Y353632D01*

+X383438Y353225D01*

+X383669Y352849D01*

+X383955Y352514D01*

+X384290Y352228D01*

+X384666Y351997D01*

+X385073Y351829D01*

+X385502Y351726D01*

+X385941Y351691D01*

+X386380Y351726D01*

+X386437Y351739D01*

+Y328615D01*

+X386166Y328503D01*

+X385790Y328272D01*

+X385455Y327986D01*

+X385169Y327651D01*

+X384938Y327275D01*

+X384770Y326868D01*

+X384667Y326439D01*

+X384632Y326000D01*

+X384667Y325561D01*

+X384770Y325132D01*

+X384938Y324725D01*

+X385169Y324349D01*

+X385455Y324014D01*

+X385790Y323728D01*

+X386166Y323497D01*

+X386437Y323385D01*

+Y307647D01*

+X386434Y307651D01*

+X386148Y307986D01*

+X385813Y308272D01*

+X385437Y308503D01*

+X385030Y308671D01*

+X384601Y308774D01*

+X384162Y308809D01*

+X383723Y308774D01*

+X383294Y308671D01*

+X382887Y308503D01*

+X382511Y308272D01*

+X382176Y307986D01*

+X381890Y307651D01*

+X381659Y307275D01*

+X381491Y306868D01*

+X381388Y306439D01*

+X381353Y306000D01*

+X381388Y305561D01*

+X381491Y305132D01*

+X381659Y304725D01*

+X381890Y304349D01*

+X382176Y304014D01*

+X382511Y303728D01*

+X382887Y303497D01*

+X383294Y303329D01*

+X383723Y303226D01*

+X384162Y303191D01*

+X384601Y303226D01*

+X385030Y303329D01*

+X385437Y303497D01*

+X385813Y303728D01*

+X386148Y304014D01*

+X386434Y304349D01*

+X386437Y304353D01*

+Y284786D01*

+X386281Y284774D01*

+X385852Y284671D01*

+X385445Y284503D01*

+X385069Y284272D01*

+X384734Y283986D01*

+X384448Y283651D01*

+X384217Y283275D01*

+X384049Y282868D01*

+X383946Y282439D01*

+X383911Y282000D01*

+X383946Y281561D01*

+X384049Y281132D01*

+X384217Y280725D01*

+X384448Y280349D01*

+X384734Y280014D01*

+X385069Y279728D01*

+X385445Y279497D01*

+X385852Y279329D01*

+X386281Y279226D01*

+X386437Y279214D01*

+Y260038D01*

+X386163Y260272D01*

+X385787Y260503D01*

+X385380Y260671D01*

+X384951Y260774D01*

+X384512Y260809D01*

+X384073Y260774D01*

+X383644Y260671D01*

+X383237Y260503D01*

+X382861Y260272D01*

+X382526Y259986D01*

+X382240Y259651D01*

+X382009Y259275D01*

+X381841Y258868D01*

+X381738Y258439D01*

+X381703Y258000D01*

+X381738Y257561D01*

+X381841Y257132D01*

+X382009Y256725D01*

+X382240Y256349D01*

+X382526Y256014D01*

+X382861Y255728D01*

+X383237Y255497D01*

+X383644Y255329D01*

+X384073Y255226D01*

+X384512Y255191D01*

+X384951Y255226D01*

+X385380Y255329D01*

+X385787Y255497D01*

+X386163Y255728D01*

+X386437Y255962D01*

+Y247617D01*

+X386424Y247562D01*

+X386401Y247280D01*

+X386424Y246998D01*

+X386437Y246943D01*

+Y237727D01*

+X386202Y237671D01*

+X385795Y237503D01*

+X385419Y237272D01*

+X385084Y236986D01*

+X384798Y236651D01*

+X384567Y236275D01*

+X384399Y235868D01*

+X384296Y235439D01*

+X384261Y235000D01*

+X384296Y234561D01*

+X384399Y234132D01*

+X384567Y233725D01*

+X384798Y233349D01*

+X385084Y233014D01*

+X385419Y232728D01*

+X385795Y232497D01*

+X386202Y232329D01*

+X386437Y232273D01*

+Y189647D01*

+X386434Y189651D01*

+X386148Y189986D01*

+X385813Y190272D01*

+X385437Y190503D01*

+X385030Y190671D01*

+X384601Y190774D01*

+X384162Y190809D01*

+X383723Y190774D01*

+X383294Y190671D01*

+X382887Y190503D01*

+X382511Y190272D01*

+X382176Y189986D01*

+X381890Y189651D01*

+X381659Y189275D01*

+X381491Y188868D01*

+X381388Y188439D01*

+X381353Y188000D01*

+X381388Y187561D01*

+X381491Y187132D01*

+X381659Y186725D01*

+X381890Y186349D01*

+X382176Y186014D01*

+X382511Y185728D01*

+X382887Y185497D01*

+X383294Y185329D01*

+X383723Y185226D01*

+X384162Y185191D01*

+X384601Y185226D01*

+X385030Y185329D01*

+X385437Y185497D01*

+X385813Y185728D01*

+X386148Y186014D01*

+X386434Y186349D01*

+X386437Y186353D01*

+Y165808D01*

+X386002Y165774D01*

+X385573Y165671D01*

+X385166Y165503D01*

+X384790Y165272D01*

+X384455Y164986D01*

+X384169Y164651D01*

+X383938Y164275D01*

+X383770Y163868D01*

+X383667Y163439D01*

+X383632Y163000D01*

+X383667Y162561D01*

+X383770Y162132D01*

+X383938Y161725D01*

+X384169Y161349D01*

+X384455Y161014D01*

+X384790Y160728D01*

+X385166Y160497D01*

+X385573Y160329D01*

+X386002Y160226D01*

+X386437Y160192D01*

+Y159565D01*

+X386305Y159596D01*

+X386023Y159619D01*

+X385741Y159596D01*

+X385465Y159530D01*

+X385203Y159422D01*

+X384962Y159274D01*

+X384746Y159090D01*

+X384562Y158874D01*

+X384414Y158633D01*

+X384306Y158371D01*

+X384240Y158095D01*

+X384217Y157813D01*

+X384240Y157531D01*

+X384306Y157255D01*

+X384414Y156993D01*

+X384562Y156752D01*

+X384746Y156536D01*

+X384962Y156352D01*

+X385203Y156204D01*

+X385465Y156096D01*

+X385741Y156030D01*

+X386023Y156007D01*

+X386305Y156030D01*

+X386437Y156061D01*

+Y136500D01*

+G37*

+G36*

+X377344D02*X372437D01*

+Y167578D01*

+X372441Y167577D01*

+X372880Y167612D01*

+X373309Y167715D01*

+X373716Y167883D01*

+X374092Y168114D01*

+X374427Y168400D01*

+X374713Y168735D01*

+X374944Y169111D01*

+X375112Y169518D01*

+X375215Y169947D01*

+X375241Y170386D01*

+X375215Y170825D01*

+X375112Y171254D01*

+X374944Y171661D01*

+X374713Y172037D01*

+X374427Y172372D01*

+X374092Y172658D01*

+X373716Y172889D01*

+X373309Y173057D01*

+X372880Y173160D01*

+X372441Y173195D01*

+X372437Y173194D01*

+Y258628D01*

+X372663Y258767D01*

+X372879Y258951D01*

+X373063Y259167D01*

+X373211Y259408D01*

+X373319Y259670D01*

+X373385Y259946D01*

+X373402Y260228D01*

+X373385Y260510D01*

+X373319Y260786D01*

+X373211Y261048D01*

+X373063Y261289D01*

+X372879Y261505D01*

+X372663Y261689D01*

+X372437Y261828D01*

+Y287881D01*

+X372441Y287880D01*

+X372880Y287915D01*

+X373309Y288018D01*

+X373716Y288186D01*

+X374092Y288417D01*

+X374427Y288703D01*

+X374713Y289038D01*

+X374944Y289414D01*

+X375112Y289821D01*

+X375215Y290250D01*

+X375241Y290689D01*

+X375215Y291128D01*

+X375112Y291557D01*

+X374944Y291964D01*

+X374713Y292340D01*

+X374427Y292675D01*

+X374092Y292961D01*

+X373716Y293192D01*

+X373309Y293360D01*

+X372880Y293463D01*

+X372441Y293498D01*

+X372437Y293497D01*

+Y348381D01*

+X372441Y348380D01*

+X372880Y348415D01*

+X373309Y348518D01*

+X373716Y348686D01*

+X374092Y348917D01*

+X374427Y349203D01*

+X374713Y349538D01*

+X374944Y349914D01*

+X375112Y350321D01*

+X375215Y350750D01*

+X375241Y351189D01*

+X375215Y351628D01*

+X375112Y352057D01*

+X374944Y352464D01*

+X374713Y352840D01*

+X374427Y353175D01*

+X374092Y353461D01*

+X373716Y353692D01*

+X373309Y353860D01*

+X372880Y353963D01*

+X372441Y353998D01*

+X372437Y353997D01*

+Y397000D01*

+X377344D01*

+Y237057D01*

+X377092Y237272D01*

+X376716Y237503D01*

+X376309Y237671D01*

+X375880Y237774D01*

+X375441Y237809D01*

+X375002Y237774D01*

+X374573Y237671D01*

+X374166Y237503D01*

+X373790Y237272D01*

+X373455Y236986D01*

+X373169Y236651D01*

+X372938Y236275D01*

+X372770Y235868D01*

+X372667Y235439D01*

+X372632Y235000D01*

+X372667Y234561D01*

+X372770Y234132D01*

+X372938Y233725D01*

+X373169Y233349D01*

+X373455Y233014D01*

+X373790Y232728D01*

+X374166Y232497D01*

+X374573Y232329D01*

+X375002Y232226D01*

+X375441Y232191D01*

+X375880Y232226D01*

+X376309Y232329D01*

+X376716Y232497D01*

+X377092Y232728D01*

+X377344Y232943D01*

+Y163983D01*

+X377065Y163961D01*

+X376789Y163895D01*

+X376527Y163787D01*

+X376286Y163639D01*

+X376070Y163455D01*

+X375886Y163239D01*

+X375738Y162998D01*

+X375630Y162736D01*

+X375564Y162460D01*

+X375541Y162178D01*

+X375564Y161896D01*

+X375630Y161620D01*

+X375738Y161358D01*

+X375886Y161117D01*

+X376070Y160901D01*

+X376286Y160717D01*

+X376527Y160569D01*

+X376789Y160461D01*

+X377065Y160395D01*

+X377344Y160373D01*

+Y136500D01*

+G37*

+G36*

+X372437D02*X368441D01*

+Y171500D01*

+X358938D01*

+Y206695D01*

+X358941Y206694D01*

+X359223Y206717D01*

+X359499Y206783D01*

+X359761Y206891D01*

+X360002Y207039D01*

+X360218Y207223D01*

+X360402Y207439D01*

+X360550Y207680D01*

+X360658Y207942D01*

+X360724Y208218D01*

+X360741Y208500D01*

+X360724Y208782D01*

+X360658Y209058D01*

+X360550Y209320D01*

+X360402Y209561D01*

+X360218Y209777D01*

+X360002Y209961D01*

+X359761Y210109D01*

+X359499Y210217D01*

+X359223Y210283D01*

+X358941Y210306D01*

+X358938Y210305D01*

+Y397000D01*

+X372437D01*

+Y353997D01*

+X372002Y353963D01*

+X371573Y353860D01*

+X371166Y353692D01*

+X370790Y353461D01*

+X370455Y353175D01*

+X370169Y352840D01*

+X369938Y352464D01*

+X369770Y352057D01*

+X369667Y351628D01*

+X369632Y351189D01*

+X369667Y350750D01*

+X369770Y350321D01*

+X369938Y349914D01*

+X370169Y349538D01*

+X370455Y349203D01*

+X370790Y348917D01*

+X371166Y348686D01*

+X371573Y348518D01*

+X372002Y348415D01*

+X372437Y348381D01*

+Y293497D01*

+X372002Y293463D01*

+X371573Y293360D01*

+X371166Y293192D01*

+X370790Y292961D01*

+X370455Y292675D01*

+X370169Y292340D01*

+X369938Y291964D01*

+X369770Y291557D01*

+X369667Y291128D01*

+X369632Y290689D01*

+X369667Y290250D01*

+X369770Y289821D01*

+X369938Y289414D01*

+X370169Y289038D01*

+X370455Y288703D01*

+X370790Y288417D01*

+X371166Y288186D01*

+X371573Y288018D01*

+X372002Y287915D01*

+X372437Y287881D01*

+Y261828D01*

+X372422Y261837D01*

+X372160Y261945D01*

+X371884Y262011D01*

+X371602Y262034D01*

+X371320Y262011D01*

+X371044Y261945D01*

+X370782Y261837D01*

+X370541Y261689D01*

+X370325Y261505D01*

+X370141Y261289D01*

+X369993Y261048D01*

+X369885Y260786D01*

+X369819Y260510D01*

+X369796Y260228D01*

+X369819Y259946D01*

+X369885Y259670D01*

+X369993Y259408D01*

+X370141Y259167D01*

+X370325Y258951D01*

+X370541Y258767D01*

+X370782Y258619D01*

+X371044Y258511D01*

+X371320Y258445D01*

+X371602Y258422D01*

+X371884Y258445D01*

+X372160Y258511D01*

+X372422Y258619D01*

+X372437Y258628D01*

+Y173194D01*

+X372002Y173160D01*

+X371573Y173057D01*

+X371166Y172889D01*

+X370790Y172658D01*

+X370455Y172372D01*

+X370169Y172037D01*

+X369938Y171661D01*

+X369770Y171254D01*

+X369667Y170825D01*

+X369632Y170386D01*

+X369667Y169947D01*

+X369770Y169518D01*

+X369938Y169111D01*

+X370169Y168735D01*

+X370455Y168400D01*

+X370790Y168114D01*

+X371166Y167883D01*

+X371573Y167715D01*

+X372002Y167612D01*

+X372437Y167578D01*

+Y136500D01*

+G37*

+G36*

+X358938Y171500D02*X356438D01*

+Y188225D01*

+X356674Y188795D01*

+X357093Y190540D01*

+X357199Y192329D01*

+X357093Y194118D01*

+X356674Y195863D01*

+X356438Y196433D01*

+Y231195D01*

+X356441Y231194D01*

+X356723Y231217D01*

+X356999Y231283D01*

+X357261Y231391D01*

+X357502Y231539D01*

+X357718Y231723D01*

+X357902Y231939D01*

+X358050Y232180D01*

+X358158Y232442D01*

+X358224Y232718D01*

+X358241Y233000D01*

+X358224Y233282D01*

+X358158Y233558D01*

+X358050Y233820D01*

+X357902Y234061D01*

+X357718Y234277D01*

+X357502Y234461D01*

+X357261Y234609D01*

+X356999Y234717D01*

+X356723Y234783D01*

+X356441Y234806D01*

+X356438Y234805D01*

+Y397000D01*

+X358938D01*

+Y210305D01*

+X358659Y210283D01*

+X358383Y210217D01*

+X358121Y210109D01*

+X357880Y209961D01*

+X357664Y209777D01*

+X357480Y209561D01*

+X357332Y209320D01*

+X357224Y209058D01*

+X357158Y208782D01*

+X357135Y208500D01*

+X357158Y208218D01*

+X357224Y207942D01*

+X357332Y207680D01*

+X357480Y207439D01*

+X357664Y207223D01*

+X357880Y207039D01*

+X358121Y206891D01*

+X358383Y206783D01*

+X358659Y206717D01*

+X358938Y206695D01*

+Y171500D01*

+G37*

+G36*

+X356438Y196433D02*X355988Y197520D01*

+X355050Y199050D01*

+X353885Y200415D01*

+X353387Y200840D01*

+Y337716D01*

+X353390Y337715D01*

+X353672Y337738D01*

+X353948Y337804D01*

+X354210Y337912D01*

+X354451Y338060D01*

+X354667Y338244D01*

+X354851Y338460D01*

+X354999Y338701D01*

+X355107Y338963D01*

+X355173Y339239D01*

+X355190Y339521D01*

+X355173Y339803D01*

+X355107Y340079D01*

+X354999Y340341D01*

+X354851Y340582D01*

+X354667Y340798D01*

+X354451Y340982D01*

+X354210Y341130D01*

+X353948Y341238D01*

+X353672Y341304D01*

+X353390Y341327D01*

+X353387Y341326D01*

+Y350739D01*

+X353955Y351404D01*

+X354781Y352752D01*

+X355387Y354214D01*

+X355756Y355752D01*

+X355849Y357329D01*

+X355756Y358906D01*

+X355387Y360444D01*

+X354781Y361906D01*

+X353955Y363254D01*

+X353387Y363919D01*

+Y397000D01*

+X356438D01*

+Y234805D01*

+X356159Y234783D01*

+X355883Y234717D01*

+X355621Y234609D01*

+X355380Y234461D01*

+X355164Y234277D01*

+X354980Y234061D01*

+X354832Y233820D01*

+X354724Y233558D01*

+X354658Y233282D01*

+X354635Y233000D01*

+X354658Y232718D01*

+X354724Y232442D01*

+X354832Y232180D01*

+X354980Y231939D01*

+X355164Y231723D01*

+X355380Y231539D01*

+X355621Y231391D01*

+X355883Y231283D01*

+X356159Y231217D01*

+X356438Y231195D01*

+Y196433D01*

+G37*

+G36*

+Y171500D02*X353387D01*

+Y183818D01*

+X353885Y184243D01*

+X355050Y185608D01*

+X355988Y187138D01*

+X356438Y188225D01*

+Y171500D01*

+G37*

+G36*

+X353387Y363919D02*X352927Y364457D01*

+X351724Y365485D01*

+X350376Y366311D01*

+X348914Y366917D01*

+X347376Y367286D01*

+X345799Y367410D01*

+X344222Y367286D01*

+X342684Y366917D01*

+X341222Y366311D01*

+X339874Y365485D01*

+X339834Y365451D01*

+Y397000D01*

+X353387D01*

+Y363919D01*

+G37*

+G36*

+Y200840D02*X352520Y201580D01*

+X350990Y202518D01*

+X349333Y203204D01*

+X347588Y203623D01*

+X345799Y203764D01*

+X344010Y203623D01*

+X342265Y203204D01*

+X340608Y202518D01*

+X339834Y202044D01*

+Y223052D01*

+X339902Y223131D01*

+X340050Y223372D01*

+X340158Y223634D01*

+X340224Y223910D01*

+X340241Y224192D01*

+X340224Y224474D01*

+X340158Y224750D01*

+X340050Y225012D01*

+X339902Y225253D01*

+X339834Y225332D01*

+Y228984D01*

+X339902Y229063D01*

+X340050Y229304D01*

+X340158Y229566D01*

+X340224Y229842D01*

+X340241Y230124D01*

+X340224Y230406D01*

+X340158Y230682D01*

+X340050Y230944D01*

+X339902Y231185D01*

+X339834Y231264D01*

+Y245027D01*

+X340278Y244755D01*

+X340969Y244469D01*

+X341696Y244294D01*

+X342441Y244235D01*

+X343186Y244294D01*

+X343913Y244469D01*

+X344604Y244755D01*

+X345242Y245145D01*

+X345810Y245631D01*

+X346296Y246199D01*

+X346686Y246837D01*

+X346972Y247528D01*

+X347147Y248255D01*

+X347191Y249000D01*

+X347147Y249745D01*

+X346972Y250472D01*

+X346686Y251163D01*

+X346296Y251801D01*

+X345810Y252369D01*

+X345242Y252855D01*

+X344604Y253245D01*

+X343913Y253531D01*

+X343186Y253706D01*

+X342441Y253765D01*

+X341696Y253706D01*

+X340969Y253531D01*

+X340278Y253245D01*

+X339834Y252973D01*

+Y340022D01*

+X339837Y340021D01*

+X340119Y340044D01*

+X340395Y340110D01*

+X340657Y340218D01*

+X340898Y340366D01*

+X341114Y340550D01*

+X341298Y340766D01*

+X341446Y341007D01*

+X341554Y341269D01*

+X341620Y341545D01*

+X341637Y341827D01*

+X341620Y342109D01*

+X341554Y342385D01*

+X341446Y342647D01*

+X341298Y342888D01*

+X341114Y343104D01*

+X340898Y343288D01*

+X340657Y343436D01*

+X340395Y343544D01*

+X340119Y343610D01*

+X339837Y343633D01*

+X339834Y343632D01*

+Y349207D01*

+X339874Y349173D01*

+X341222Y348347D01*

+X342684Y347741D01*

+X344222Y347372D01*

+X345799Y347248D01*

+X347376Y347372D01*

+X348914Y347741D01*

+X350376Y348347D01*

+X351724Y349173D01*

+X352927Y350201D01*

+X353387Y350739D01*

+Y341326D01*

+X353108Y341304D01*

+X352832Y341238D01*

+X352570Y341130D01*

+X352329Y340982D01*

+X352113Y340798D01*

+X351929Y340582D01*

+X351781Y340341D01*

+X351673Y340079D01*

+X351607Y339803D01*

+X351584Y339521D01*

+X351607Y339239D01*

+X351673Y338963D01*

+X351781Y338701D01*

+X351929Y338460D01*

+X352113Y338244D01*

+X352329Y338060D01*

+X352570Y337912D01*

+X352832Y337804D01*

+X353108Y337738D01*

+X353387Y337716D01*

+Y200840D01*

+G37*

+G36*

+Y171500D02*X339834D01*

+Y182614D01*

+X340608Y182140D01*

+X342265Y181454D01*

+X344010Y181035D01*

+X345799Y180894D01*

+X347588Y181035D01*

+X349333Y181454D01*

+X350990Y182140D01*

+X352520Y183078D01*

+X353387Y183818D01*

+Y171500D01*

+G37*

+G36*

+X312154Y172548D02*X312309Y172294D01*

+X312749Y171779D01*

+X313076Y171500D01*

+X312154D01*

+Y172548D01*

+G37*

+G36*

+X339834Y171500D02*X332434D01*

+Y244236D01*

+X332441Y244235D01*

+X333186Y244294D01*

+X333913Y244469D01*

+X334604Y244755D01*

+X335242Y245145D01*

+X335810Y245631D01*

+X336296Y246199D01*

+X336686Y246837D01*

+X336972Y247528D01*

+X337147Y248255D01*

+X337191Y249000D01*

+X337147Y249745D01*

+X336972Y250472D01*

+X336686Y251163D01*

+X336296Y251801D01*

+X335810Y252369D01*

+X335242Y252855D01*

+X334604Y253245D01*

+X333913Y253531D01*

+X333186Y253706D01*

+X332441Y253765D01*

+X332434Y253764D01*

+Y397000D01*

+X339834D01*

+Y365451D01*

+X338671Y364457D01*

+X337643Y363254D01*

+X336817Y361906D01*

+X336211Y360444D01*

+X335842Y358906D01*

+X335718Y357329D01*

+X335842Y355752D01*

+X336211Y354214D01*

+X336817Y352752D01*

+X337643Y351404D01*

+X338671Y350201D01*

+X339834Y349207D01*

+Y343632D01*

+X339555Y343610D01*

+X339279Y343544D01*

+X339017Y343436D01*

+X338776Y343288D01*

+X338560Y343104D01*

+X338376Y342888D01*

+X338228Y342647D01*

+X338120Y342385D01*

+X338054Y342109D01*

+X338031Y341827D01*

+X338054Y341545D01*

+X338120Y341269D01*

+X338228Y341007D01*

+X338376Y340766D01*

+X338560Y340550D01*

+X338776Y340366D01*

+X339017Y340218D01*

+X339279Y340110D01*

+X339555Y340044D01*

+X339834Y340022D01*

+Y252973D01*

+X339640Y252855D01*

+X339072Y252369D01*

+X338586Y251801D01*

+X338196Y251163D01*

+X337910Y250472D01*

+X337735Y249745D01*

+X337676Y249000D01*

+X337735Y248255D01*

+X337910Y247528D01*

+X338196Y246837D01*

+X338586Y246199D01*

+X339072Y245631D01*

+X339640Y245145D01*

+X339834Y245027D01*

+Y231264D01*

+X339718Y231401D01*

+X339502Y231585D01*

+X339261Y231733D01*

+X338999Y231841D01*

+X338723Y231907D01*

+X338441Y231930D01*

+X338159Y231907D01*

+X337883Y231841D01*

+X337621Y231733D01*

+X337380Y231585D01*

+X337164Y231401D01*

+X336980Y231185D01*

+X336832Y230944D01*

+X336724Y230682D01*

+X336658Y230406D01*

+X336635Y230124D01*

+X336658Y229842D01*

+X336724Y229566D01*

+X336832Y229304D01*

+X336980Y229063D01*

+X337164Y228847D01*

+X337380Y228663D01*

+X337621Y228515D01*

+X337883Y228407D01*

+X338159Y228341D01*

+X338441Y228318D01*

+X338723Y228341D01*

+X338999Y228407D01*

+X339261Y228515D01*

+X339502Y228663D01*

+X339718Y228847D01*

+X339834Y228984D01*

+Y225332D01*

+X339718Y225469D01*

+X339502Y225653D01*

+X339261Y225801D01*

+X338999Y225909D01*

+X338723Y225975D01*

+X338441Y225998D01*

+X338159Y225975D01*

+X337883Y225909D01*

+X337621Y225801D01*

+X337380Y225653D01*

+X337164Y225469D01*

+X336980Y225253D01*

+X336832Y225012D01*

+X336724Y224750D01*

+X336658Y224474D01*

+X336635Y224192D01*

+X336658Y223910D01*

+X336724Y223634D01*

+X336832Y223372D01*

+X336980Y223131D01*

+X337164Y222915D01*

+X337380Y222731D01*

+X337621Y222583D01*

+X337883Y222475D01*

+X338159Y222409D01*

+X338441Y222386D01*

+X338723Y222409D01*

+X338999Y222475D01*

+X339261Y222583D01*

+X339502Y222731D01*

+X339718Y222915D01*

+X339834Y223052D01*

+Y202044D01*

+X339078Y201580D01*

+X337713Y200415D01*

+X336548Y199050D01*

+X335610Y197520D01*

+X334924Y195863D01*

+X334505Y194118D01*

+X334364Y192329D01*

+X334505Y190540D01*

+X334924Y188795D01*

+X335610Y187138D01*

+X336548Y185608D01*

+X337713Y184243D01*

+X339078Y183078D01*

+X339834Y182614D01*

+Y171500D01*

+G37*

+G36*

+X332434D02*X328522D01*

+X328849Y171779D01*

+X329289Y172294D01*

+X329642Y172871D01*

+X329901Y173496D01*

+X330059Y174154D01*

+X330099Y174829D01*

+X330059Y175504D01*

+X329901Y176162D01*

+X329642Y176787D01*

+X329289Y177364D01*

+X328849Y177879D01*

+X328334Y178319D01*

+X327757Y178672D01*

+X327132Y178931D01*

+X326474Y179089D01*

+X325799Y179142D01*

+X325792Y179142D01*

+Y180516D01*

+X325799Y180516D01*

+X326474Y180569D01*

+X327132Y180727D01*

+X327757Y180986D01*

+X328334Y181339D01*

+X328849Y181779D01*

+X329289Y182294D01*

+X329642Y182871D01*

+X329901Y183496D01*

+X330059Y184154D01*

+X330099Y184829D01*

+X330059Y185504D01*

+X329901Y186162D01*

+X329642Y186787D01*

+X329289Y187364D01*

+X328849Y187879D01*

+X328334Y188319D01*

+X327757Y188672D01*

+X327132Y188931D01*

+X326474Y189089D01*

+X325799Y189142D01*

+X325792Y189142D01*

+Y245616D01*

+X325810Y245631D01*

+X326296Y246199D01*

+X326686Y246837D01*

+X326972Y247528D01*

+X327147Y248255D01*

+X327191Y249000D01*

+X327147Y249745D01*

+X326972Y250472D01*

+X326686Y251163D01*

+X326296Y251801D01*

+X325810Y252369D01*

+X325792Y252384D01*

+Y330862D01*

+X326435Y331910D01*

+X327151Y333640D01*

+X327589Y335462D01*

+X327699Y337329D01*

+X327589Y339196D01*

+X327151Y341018D01*

+X326435Y342748D01*

+X325792Y343796D01*

+Y360516D01*

+X325799Y360516D01*

+X326474Y360569D01*

+X327132Y360727D01*

+X327757Y360986D01*

+X328334Y361339D01*

+X328849Y361779D01*

+X329289Y362294D01*

+X329642Y362871D01*

+X329901Y363496D01*

+X330059Y364154D01*

+X330099Y364829D01*

+X330059Y365504D01*

+X329901Y366162D01*

+X329642Y366787D01*

+X329289Y367364D01*

+X328849Y367879D01*

+X328334Y368319D01*

+X327757Y368672D01*

+X327132Y368931D01*

+X326474Y369089D01*

+X325799Y369142D01*

+X325792Y369142D01*

+Y370516D01*

+X325799Y370516D01*

+X326474Y370569D01*

+X327132Y370727D01*

+X327757Y370986D01*

+X328334Y371339D01*

+X328849Y371779D01*

+X329289Y372294D01*

+X329642Y372871D01*

+X329901Y373496D01*

+X330059Y374154D01*

+X330099Y374829D01*

+X330059Y375504D01*

+X329901Y376162D01*

+X329642Y376787D01*

+X329289Y377364D01*

+X328849Y377879D01*

+X328334Y378319D01*

+X327757Y378672D01*

+X327132Y378931D01*

+X326474Y379089D01*

+X325799Y379142D01*

+X325792Y379142D01*

+Y397000D01*

+X332434D01*

+Y253764D01*

+X331696Y253706D01*

+X330969Y253531D01*

+X330278Y253245D01*

+X329640Y252855D01*

+X329072Y252369D01*

+X328586Y251801D01*

+X328196Y251163D01*

+X327910Y250472D01*

+X327735Y249745D01*

+X327676Y249000D01*

+X327735Y248255D01*

+X327910Y247528D01*

+X328196Y246837D01*

+X328586Y246199D01*

+X329072Y245631D01*

+X329640Y245145D01*

+X330278Y244755D01*

+X330969Y244469D01*

+X331696Y244294D01*

+X332434Y244236D01*

+Y171500D01*

+G37*

+G36*

+X325792Y343796D02*X325456Y344345D01*

+X324240Y345770D01*

+X322815Y346986D01*

+X321218Y347965D01*

+X319488Y348681D01*

+X317666Y349119D01*

+X315799Y349266D01*

+X313932Y349119D01*

+X312154Y348692D01*

+Y362548D01*

+X312309Y362294D01*

+X312749Y361779D01*

+X313264Y361339D01*

+X313841Y360986D01*

+X314466Y360727D01*

+X315124Y360569D01*

+X315799Y360516D01*

+X316474Y360569D01*

+X317132Y360727D01*

+X317757Y360986D01*

+X318334Y361339D01*

+X318849Y361779D01*

+X319289Y362294D01*

+X319642Y362871D01*

+X319901Y363496D01*

+X320059Y364154D01*

+X320099Y364829D01*

+X320059Y365504D01*

+X319901Y366162D01*

+X319642Y366787D01*

+X319289Y367364D01*

+X318849Y367879D01*

+X318334Y368319D01*

+X317757Y368672D01*

+X317132Y368931D01*

+X316474Y369089D01*

+X315799Y369142D01*

+X315124Y369089D01*

+X314466Y368931D01*

+X313841Y368672D01*

+X313264Y368319D01*

+X312749Y367879D01*

+X312309Y367364D01*

+X312154Y367110D01*

+Y372548D01*

+X312309Y372294D01*

+X312749Y371779D01*

+X313264Y371339D01*

+X313841Y370986D01*

+X314466Y370727D01*

+X315124Y370569D01*

+X315799Y370516D01*

+X316474Y370569D01*

+X317132Y370727D01*

+X317757Y370986D01*

+X318334Y371339D01*

+X318849Y371779D01*

+X319289Y372294D01*

+X319642Y372871D01*

+X319901Y373496D01*

+X320059Y374154D01*

+X320099Y374829D01*

+X320059Y375504D01*

+X319901Y376162D01*

+X319642Y376787D01*

+X319289Y377364D01*

+X318849Y377879D01*

+X318334Y378319D01*

+X317757Y378672D01*

+X317132Y378931D01*

+X316474Y379089D01*

+X315799Y379142D01*

+X315124Y379089D01*

+X314466Y378931D01*

+X313841Y378672D01*

+X313264Y378319D01*

+X312749Y377879D01*

+X312309Y377364D01*

+X312154Y377110D01*

+Y397000D01*

+X325792D01*

+Y379142D01*

+X325124Y379089D01*

+X324466Y378931D01*

+X323841Y378672D01*

+X323264Y378319D01*

+X322749Y377879D01*

+X322309Y377364D01*

+X321956Y376787D01*

+X321697Y376162D01*

+X321539Y375504D01*

+X321486Y374829D01*

+X321539Y374154D01*

+X321697Y373496D01*

+X321956Y372871D01*

+X322309Y372294D01*

+X322749Y371779D01*

+X323264Y371339D01*

+X323841Y370986D01*

+X324466Y370727D01*

+X325124Y370569D01*

+X325792Y370516D01*

+Y369142D01*

+X325124Y369089D01*

+X324466Y368931D01*

+X323841Y368672D01*

+X323264Y368319D01*

+X322749Y367879D01*

+X322309Y367364D01*

+X321956Y366787D01*

+X321697Y366162D01*

+X321539Y365504D01*

+X321486Y364829D01*

+X321539Y364154D01*

+X321697Y363496D01*

+X321956Y362871D01*

+X322309Y362294D01*

+X322749Y361779D01*

+X323264Y361339D01*

+X323841Y360986D01*

+X324466Y360727D01*

+X325124Y360569D01*

+X325792Y360516D01*

+Y343796D01*

+G37*

+G36*

+Y179142D02*X325124Y179089D01*

+X324466Y178931D01*

+X323841Y178672D01*

+X323264Y178319D01*

+X322749Y177879D01*

+X322309Y177364D01*

+X321956Y176787D01*

+X321697Y176162D01*

+X321539Y175504D01*

+X321486Y174829D01*

+X321539Y174154D01*

+X321697Y173496D01*

+X321956Y172871D01*

+X322309Y172294D01*

+X322749Y171779D01*

+X323076Y171500D01*

+X318522D01*

+X318849Y171779D01*

+X319289Y172294D01*

+X319642Y172871D01*

+X319901Y173496D01*

+X320059Y174154D01*

+X320099Y174829D01*

+X320059Y175504D01*

+X319901Y176162D01*

+X319642Y176787D01*

+X319289Y177364D01*

+X318849Y177879D01*

+X318334Y178319D01*

+X317757Y178672D01*

+X317132Y178931D01*

+X316474Y179089D01*

+X315799Y179142D01*

+X315124Y179089D01*

+X314466Y178931D01*

+X313841Y178672D01*

+X313264Y178319D01*

+X312749Y177879D01*

+X312309Y177364D01*

+X312154Y177110D01*

+Y182548D01*

+X312309Y182294D01*

+X312749Y181779D01*

+X313264Y181339D01*

+X313841Y180986D01*

+X314466Y180727D01*

+X315124Y180569D01*

+X315799Y180516D01*

+X316474Y180569D01*

+X317132Y180727D01*

+X317757Y180986D01*

+X318334Y181339D01*

+X318849Y181779D01*

+X319289Y182294D01*

+X319642Y182871D01*

+X319901Y183496D01*

+X320059Y184154D01*

+X320099Y184829D01*

+X320059Y185504D01*

+X319901Y186162D01*

+X319642Y186787D01*

+X319289Y187364D01*

+X318849Y187879D01*

+X318334Y188319D01*

+X317757Y188672D01*

+X317132Y188931D01*

+X316474Y189089D01*

+X315799Y189142D01*

+X315124Y189089D01*

+X314466Y188931D01*

+X313841Y188672D01*

+X313264Y188319D01*

+X312749Y187879D01*

+X312309Y187364D01*

+X312154Y187110D01*

+Y244256D01*

+X315926Y244264D01*

+X316156Y244319D01*

+X316374Y244409D01*

+X316575Y244533D01*

+X316755Y244686D01*

+X316908Y244866D01*

+X317032Y245067D01*

+X317122Y245285D01*

+X317177Y245515D01*

+X317191Y245750D01*

+X317177Y252485D01*

+X317122Y252715D01*

+X317032Y252933D01*

+X316908Y253134D01*

+X316755Y253314D01*

+X316575Y253467D01*

+X316374Y253591D01*

+X316156Y253681D01*

+X315926Y253736D01*

+X315691Y253750D01*

+X312154Y253743D01*

+Y292984D01*

+X312444Y293007D01*

+X312757Y293082D01*

+X313056Y293206D01*

+X313331Y293374D01*

+X313576Y293584D01*

+X313786Y293829D01*

+X313954Y294104D01*

+X314078Y294403D01*

+X314153Y294716D01*

+X314172Y295038D01*

+X314153Y295360D01*

+X314078Y295673D01*

+X313954Y295972D01*

+X313786Y296247D01*

+X313576Y296492D01*

+X313331Y296702D01*

+X313056Y296870D01*

+X312757Y296994D01*

+X312444Y297069D01*

+X312154Y297092D01*

+Y298100D01*

+X312157Y298100D01*

+X312479Y298125D01*

+X312792Y298200D01*

+X313091Y298324D01*

+X313366Y298492D01*

+X313611Y298702D01*

+X313821Y298947D01*

+X313989Y299222D01*

+X314113Y299521D01*

+X314188Y299834D01*

+X314207Y300156D01*

+X314188Y300478D01*

+X314113Y300791D01*

+X313989Y301090D01*

+X313821Y301365D01*

+X313611Y301610D01*

+X313366Y301820D01*

+X313091Y301988D01*

+X312792Y302112D01*

+X312479Y302187D01*

+X312157Y302212D01*

+X312154Y302212D01*

+Y325966D01*

+X313932Y325539D01*

+X315799Y325392D01*

+X317666Y325539D01*

+X319488Y325977D01*

+X321218Y326693D01*

+X322815Y327672D01*

+X324240Y328888D01*

+X325456Y330313D01*

+X325792Y330862D01*

+Y252384D01*

+X325242Y252855D01*

+X324604Y253245D01*

+X323913Y253531D01*

+X323186Y253706D01*

+X322441Y253765D01*

+X321696Y253706D01*

+X320969Y253531D01*

+X320278Y253245D01*

+X319640Y252855D01*

+X319072Y252369D01*

+X318586Y251801D01*

+X318196Y251163D01*

+X317910Y250472D01*

+X317735Y249745D01*

+X317676Y249000D01*

+X317735Y248255D01*

+X317910Y247528D01*

+X318196Y246837D01*

+X318586Y246199D01*

+X319072Y245631D01*

+X319640Y245145D01*

+X320278Y244755D01*

+X320969Y244469D01*

+X321696Y244294D01*

+X322441Y244235D01*

+X323186Y244294D01*

+X323913Y244469D01*

+X324604Y244755D01*

+X325242Y245145D01*

+X325792Y245616D01*

+Y189142D01*

+X325124Y189089D01*

+X324466Y188931D01*

+X323841Y188672D01*

+X323264Y188319D01*

+X322749Y187879D01*

+X322309Y187364D01*

+X321956Y186787D01*

+X321697Y186162D01*

+X321539Y185504D01*

+X321486Y184829D01*

+X321539Y184154D01*

+X321697Y183496D01*

+X321956Y182871D01*

+X322309Y182294D01*

+X322749Y181779D01*

+X323264Y181339D01*

+X323841Y180986D01*

+X324466Y180727D01*

+X325124Y180569D01*

+X325792Y180516D01*

+Y179142D01*

+G37*

+G36*

+X312154Y348692D02*X312110Y348681D01*

+X310380Y347965D01*

+X308783Y346986D01*

+X308351Y346617D01*

+Y361354D01*

+X308849Y361779D01*

+X309289Y362294D01*

+X309642Y362871D01*

+X309901Y363496D01*

+X310059Y364154D01*

+X310099Y364829D01*

+X310059Y365504D01*

+X309901Y366162D01*

+X309642Y366787D01*

+X309289Y367364D01*

+X308849Y367879D01*

+X308351Y368304D01*

+Y371354D01*

+X308849Y371779D01*

+X309289Y372294D01*

+X309642Y372871D01*

+X309901Y373496D01*

+X310059Y374154D01*

+X310099Y374829D01*

+X310059Y375504D01*

+X309901Y376162D01*

+X309642Y376787D01*

+X309289Y377364D01*

+X308849Y377879D01*

+X308351Y378304D01*

+Y397000D01*

+X312154D01*

+Y377110D01*

+X311956Y376787D01*

+X311697Y376162D01*

+X311539Y375504D01*

+X311486Y374829D01*

+X311539Y374154D01*

+X311697Y373496D01*

+X311956Y372871D01*

+X312154Y372548D01*

+Y367110D01*

+X311956Y366787D01*

+X311697Y366162D01*

+X311539Y365504D01*

+X311486Y364829D01*

+X311539Y364154D01*

+X311697Y363496D01*

+X311956Y362871D01*

+X312154Y362548D01*

+Y348692D01*

+G37*

+G36*

+Y253743D02*X308956Y253736D01*

+X308726Y253681D01*

+X308508Y253591D01*

+X308351Y253494D01*

+Y264539D01*

+X308550Y264491D01*

+X308872Y264466D01*

+X309194Y264491D01*

+X309507Y264566D01*

+X309806Y264690D01*

+X310081Y264858D01*

+X310326Y265068D01*

+X310536Y265313D01*

+X310704Y265588D01*

+X310828Y265887D01*

+X310903Y266200D01*

+X310922Y266522D01*

+X310903Y266844D01*

+X310828Y267157D01*

+X310704Y267456D01*

+X310536Y267731D01*

+X310326Y267976D01*

+X310081Y268186D01*

+X309806Y268354D01*

+X309507Y268478D01*

+X309194Y268553D01*

+X308872Y268578D01*

+X308550Y268553D01*

+X308351Y268505D01*

+Y270018D01*

+X308357Y270015D01*

+X308670Y269940D01*

+X308992Y269915D01*

+X309314Y269940D01*

+X309627Y270015D01*

+X309926Y270139D01*

+X310201Y270307D01*

+X310446Y270517D01*

+X310656Y270762D01*

+X310824Y271037D01*

+X310948Y271336D01*

+X311023Y271649D01*

+X311042Y271971D01*

+X311023Y272293D01*

+X310948Y272606D01*

+X310824Y272905D01*

+X310656Y273180D01*

+X310446Y273425D01*

+X310201Y273635D01*

+X309926Y273803D01*

+X309627Y273927D01*

+X309444Y273971D01*

+X309548Y274141D01*

+X309672Y274440D01*

+X309747Y274753D01*

+X309766Y275075D01*

+X309747Y275397D01*

+X309672Y275710D01*

+X309548Y276009D01*

+X309380Y276284D01*

+X309170Y276529D01*

+X308925Y276739D01*

+X308650Y276907D01*

+X308351Y277031D01*

+X308351Y277031D01*

+Y328041D01*

+X308783Y327672D01*

+X310380Y326693D01*

+X312110Y325977D01*

+X312154Y325966D01*

+Y302212D01*

+X311835Y302187D01*

+X311522Y302112D01*

+X311223Y301988D01*

+X310948Y301820D01*

+X310703Y301610D01*

+X310493Y301365D01*

+X310325Y301090D01*

+X310201Y300791D01*

+X310126Y300478D01*

+X310101Y300156D01*

+X310126Y299834D01*

+X310201Y299521D01*

+X310325Y299222D01*

+X310493Y298947D01*

+X310703Y298702D01*

+X310948Y298492D01*

+X311223Y298324D01*

+X311522Y298200D01*

+X311835Y298125D01*

+X312154Y298100D01*

+Y297092D01*

+X312122Y297094D01*

+X311800Y297069D01*

+X311487Y296994D01*

+X311188Y296870D01*

+X310913Y296702D01*

+X310668Y296492D01*

+X310458Y296247D01*

+X310290Y295972D01*

+X310166Y295673D01*

+X310091Y295360D01*

+X310066Y295038D01*

+X310091Y294716D01*

+X310166Y294403D01*

+X310290Y294104D01*

+X310458Y293829D01*

+X310668Y293584D01*

+X310913Y293374D01*

+X311188Y293206D01*

+X311487Y293082D01*

+X311800Y293007D01*

+X312122Y292982D01*

+X312154Y292984D01*

+Y253743D01*

+G37*

+G36*

+Y177110D02*X311956Y176787D01*

+X311697Y176162D01*

+X311539Y175504D01*

+X311486Y174829D01*

+X311539Y174154D01*

+X311697Y173496D01*

+X311956Y172871D01*

+X312154Y172548D01*

+Y171500D01*

+X308522D01*

+X308849Y171779D01*

+X309289Y172294D01*

+X309642Y172871D01*

+X309901Y173496D01*

+X310059Y174154D01*

+X310099Y174829D01*

+X310059Y175504D01*

+X309901Y176162D01*

+X309642Y176787D01*

+X309289Y177364D01*

+X308849Y177879D01*

+X308351Y178304D01*

+Y181354D01*

+X308849Y181779D01*

+X309289Y182294D01*

+X309642Y182871D01*

+X309901Y183496D01*

+X310059Y184154D01*

+X310099Y184829D01*

+X310059Y185504D01*

+X309901Y186162D01*

+X309642Y186787D01*

+X309289Y187364D01*

+X308849Y187879D01*

+X308351Y188304D01*

+Y244506D01*

+X308508Y244409D01*

+X308726Y244319D01*

+X308956Y244264D01*

+X309191Y244250D01*

+X312154Y244256D01*

+Y187110D01*

+X311956Y186787D01*

+X311697Y186162D01*

+X311539Y185504D01*

+X311486Y184829D01*

+X311539Y184154D01*

+X311697Y183496D01*

+X311956Y182871D01*

+X312154Y182548D01*

+Y177110D01*

+G37*

+G36*

+X304929Y332475D02*X305163Y331910D01*

+X306142Y330313D01*

+X307358Y328888D01*

+X308351Y328041D01*

+Y277031D01*

+X308038Y277106D01*

+X307716Y277131D01*

+X307394Y277106D01*

+X307081Y277031D01*

+X306782Y276907D01*

+X306507Y276739D01*

+X306262Y276529D01*

+X306052Y276284D01*

+X305884Y276009D01*

+X305760Y275710D01*

+X305685Y275397D01*

+X305660Y275075D01*

+X305685Y274753D01*

+X305760Y274440D01*

+X305884Y274141D01*

+X306052Y273866D01*

+X306262Y273621D01*

+X306507Y273411D01*

+X306782Y273243D01*

+X307081Y273119D01*

+X307264Y273075D01*

+X307160Y272905D01*

+X307036Y272606D01*

+X306961Y272293D01*

+X306936Y271971D01*

+X306961Y271649D01*

+X307036Y271336D01*

+X307160Y271037D01*

+X307328Y270762D01*

+X307538Y270517D01*

+X307783Y270307D01*

+X308058Y270139D01*

+X308351Y270018D01*

+Y268505D01*

+X308237Y268478D01*

+X307938Y268354D01*

+X307663Y268186D01*

+X307418Y267976D01*

+X307208Y267731D01*

+X307040Y267456D01*

+X306916Y267157D01*

+X306841Y266844D01*

+X306816Y266522D01*

+X306841Y266200D01*

+X306916Y265887D01*

+X307040Y265588D01*

+X307208Y265313D01*

+X307418Y265068D01*

+X307663Y264858D01*

+X307938Y264690D01*

+X308237Y264566D01*

+X308351Y264539D01*

+Y253494D01*

+X308307Y253467D01*

+X308127Y253314D01*

+X307974Y253134D01*

+X307850Y252933D01*

+X307760Y252715D01*

+X307705Y252485D01*

+X307691Y252250D01*

+X307705Y245515D01*

+X307760Y245285D01*

+X307850Y245067D01*

+X307974Y244866D01*

+X308127Y244686D01*

+X308307Y244533D01*

+X308351Y244506D01*

+Y188304D01*

+X308334Y188319D01*

+X307757Y188672D01*

+X307132Y188931D01*

+X306474Y189089D01*

+X305799Y189142D01*

+X305124Y189089D01*

+X304929Y189042D01*

+Y202616D01*

+X304998Y202600D01*

+X305280Y202577D01*

+X305562Y202600D01*

+X305838Y202666D01*

+X306100Y202774D01*

+X306341Y202922D01*

+X306557Y203106D01*

+X306741Y203322D01*

+X306889Y203563D01*

+X306997Y203825D01*

+X307063Y204101D01*

+X307080Y204383D01*

+X307063Y204665D01*

+X306997Y204941D01*

+X306889Y205203D01*

+X306741Y205444D01*

+X306557Y205660D01*

+X306341Y205844D01*

+X306100Y205992D01*

+X305838Y206100D01*

+X305759Y206119D01*

+X305861Y206206D01*

+X306045Y206422D01*

+X306193Y206663D01*

+X306301Y206925D01*

+X306367Y207201D01*

+X306384Y207483D01*

+X306367Y207765D01*

+X306301Y208041D01*

+X306193Y208303D01*

+X306045Y208544D01*

+X305861Y208760D01*

+X305645Y208944D01*

+X305561Y208996D01*

+X305767Y209122D01*

+X305983Y209306D01*

+X306167Y209522D01*

+X306315Y209763D01*

+X306423Y210025D01*

+X306489Y210301D01*

+X306506Y210583D01*

+X306489Y210865D01*

+X306423Y211141D01*

+X306315Y211403D01*

+X306167Y211644D01*

+X305983Y211860D01*

+X305767Y212044D01*

+X305526Y212192D01*

+X305264Y212300D01*

+X304988Y212366D01*

+X304929Y212371D01*

+Y328675D01*

+X305029Y328791D01*

+X305197Y329066D01*

+X305321Y329365D01*

+X305396Y329678D01*

+X305415Y330000D01*

+X305396Y330322D01*

+X305321Y330635D01*

+X305197Y330934D01*

+X305029Y331209D01*

+X304929Y331325D01*

+Y332475D01*

+G37*

+G36*

+Y360616D02*X305124Y360569D01*

+X305799Y360516D01*

+X306474Y360569D01*

+X307132Y360727D01*

+X307757Y360986D01*

+X308334Y361339D01*

+X308351Y361354D01*

+Y346617D01*

+X307358Y345770D01*

+X306142Y344345D01*

+X305163Y342748D01*

+X304929Y342183D01*

+Y360616D01*

+G37*

+G36*

+Y370616D02*X305124Y370569D01*

+X305799Y370516D01*

+X306474Y370569D01*

+X307132Y370727D01*

+X307757Y370986D01*

+X308334Y371339D01*

+X308351Y371354D01*

+Y368304D01*

+X308334Y368319D01*

+X307757Y368672D01*

+X307132Y368931D01*

+X306474Y369089D01*

+X305799Y369142D01*

+X305124Y369089D01*

+X304929Y369042D01*

+Y370616D01*

+G37*

+G36*

+Y397000D02*X308351D01*

+Y378304D01*

+X308334Y378319D01*

+X307757Y378672D01*

+X307132Y378931D01*

+X306474Y379089D01*

+X305799Y379142D01*

+X305124Y379089D01*

+X304929Y379042D01*

+Y397000D01*

+G37*

+G36*

+X308351Y178304D02*X308334Y178319D01*

+X307757Y178672D01*

+X307132Y178931D01*

+X306474Y179089D01*

+X305799Y179142D01*

+X305124Y179089D01*

+X304929Y179042D01*

+Y180616D01*

+X305124Y180569D01*

+X305799Y180516D01*

+X306474Y180569D01*

+X307132Y180727D01*

+X307757Y180986D01*

+X308334Y181339D01*

+X308351Y181354D01*

+Y178304D01*

+G37*

+G36*

+X304929Y179042D02*X304466Y178931D01*

+X303841Y178672D01*

+X303264Y178319D01*

+X302749Y177879D01*

+X302309Y177364D01*

+X301956Y176787D01*

+X301697Y176162D01*

+X301539Y175504D01*

+X301486Y174829D01*

+X301539Y174154D01*

+X301697Y173496D01*

+X301956Y172871D01*

+X302309Y172294D01*

+X302749Y171779D01*

+X303076Y171500D01*

+X298522D01*

+X298849Y171779D01*

+X299289Y172294D01*

+X299642Y172871D01*

+X299901Y173496D01*

+X300059Y174154D01*

+X300099Y174829D01*

+X300059Y175504D01*

+X299901Y176162D01*

+X299642Y176787D01*

+X299289Y177364D01*

+X298849Y177879D01*

+X298334Y178319D01*

+X297757Y178672D01*

+X297132Y178931D01*

+X296776Y179017D01*

+Y180641D01*

+X297132Y180727D01*

+X297757Y180986D01*

+X298334Y181339D01*

+X298849Y181779D01*

+X299289Y182294D01*

+X299642Y182871D01*

+X299901Y183496D01*

+X300059Y184154D01*

+X300099Y184829D01*

+X300059Y185504D01*

+X299901Y186162D01*

+X299642Y186787D01*

+X299289Y187364D01*

+X298849Y187879D01*

+X298334Y188319D01*

+X297757Y188672D01*

+X297132Y188931D01*

+X296776Y189017D01*

+Y241757D01*

+X296871Y241796D01*

+X297146Y241964D01*

+X297391Y242174D01*

+X297601Y242419D01*

+X297769Y242694D01*

+X297893Y242993D01*

+X297968Y243306D01*

+X297987Y243628D01*

+X297968Y243950D01*

+X297893Y244263D01*

+X297769Y244562D01*

+X297601Y244837D01*

+X297391Y245082D01*

+X297146Y245292D01*

+X296871Y245460D01*

+X296776Y245499D01*

+Y254175D01*

+X297049Y254196D01*

+X297362Y254271D01*

+X297661Y254395D01*

+X297936Y254563D01*

+X298181Y254773D01*

+X298391Y255018D01*

+X298559Y255293D01*

+X298683Y255592D01*

+X298758Y255905D01*

+X298777Y256227D01*

+X298758Y256549D01*

+X298683Y256862D01*

+X298559Y257161D01*

+X298391Y257436D01*

+X298181Y257681D01*

+X297936Y257891D01*

+X297661Y258059D01*

+X297362Y258183D01*

+X297049Y258258D01*

+X296776Y258279D01*

+Y302907D01*

+X296779Y302907D01*

+X297101Y302932D01*

+X297414Y303007D01*

+X297713Y303131D01*

+X297988Y303299D01*

+X298233Y303509D01*

+X298443Y303754D01*

+X298611Y304029D01*

+X298735Y304328D01*

+X298810Y304641D01*

+X298829Y304963D01*

+X298810Y305285D01*

+X298735Y305598D01*

+X298611Y305897D01*

+X298443Y306172D01*

+X298233Y306417D01*

+X297988Y306627D01*

+X297713Y306795D01*

+X297414Y306919D01*

+X297101Y306994D01*

+X296779Y307019D01*

+X296776Y307019D01*

+Y360641D01*

+X297132Y360727D01*

+X297757Y360986D01*

+X298334Y361339D01*

+X298849Y361779D01*

+X299289Y362294D01*

+X299642Y362871D01*

+X299901Y363496D01*

+X300059Y364154D01*

+X300099Y364829D01*

+X300059Y365504D01*

+X299901Y366162D01*

+X299642Y366787D01*

+X299289Y367364D01*

+X298849Y367879D01*

+X298334Y368319D01*

+X297757Y368672D01*

+X297132Y368931D01*

+X296776Y369017D01*

+Y370641D01*

+X297132Y370727D01*

+X297757Y370986D01*

+X298334Y371339D01*

+X298849Y371779D01*

+X299289Y372294D01*

+X299642Y372871D01*

+X299901Y373496D01*

+X300059Y374154D01*

+X300099Y374829D01*

+X300059Y375504D01*

+X299901Y376162D01*

+X299642Y376787D01*

+X299289Y377364D01*

+X298849Y377879D01*

+X298334Y378319D01*

+X297757Y378672D01*

+X297132Y378931D01*

+X296776Y379017D01*

+Y397000D01*

+X304929D01*

+Y379042D01*

+X304466Y378931D01*

+X303841Y378672D01*

+X303264Y378319D01*

+X302749Y377879D01*

+X302309Y377364D01*

+X301956Y376787D01*

+X301697Y376162D01*

+X301539Y375504D01*

+X301486Y374829D01*

+X301539Y374154D01*

+X301697Y373496D01*

+X301956Y372871D01*

+X302309Y372294D01*

+X302749Y371779D01*

+X303264Y371339D01*

+X303841Y370986D01*

+X304466Y370727D01*

+X304929Y370616D01*

+Y369042D01*

+X304466Y368931D01*

+X303841Y368672D01*

+X303264Y368319D01*

+X302749Y367879D01*

+X302309Y367364D01*

+X301956Y366787D01*

+X301697Y366162D01*

+X301539Y365504D01*

+X301486Y364829D01*

+X301539Y364154D01*

+X301697Y363496D01*

+X301956Y362871D01*

+X302309Y362294D01*

+X302749Y361779D01*

+X303264Y361339D01*

+X303841Y360986D01*

+X304466Y360727D01*

+X304929Y360616D01*

+Y342183D01*

+X304553Y341276D01*

+X304395Y341461D01*

+X304150Y341671D01*

+X303875Y341839D01*

+X303576Y341963D01*

+X303263Y342038D01*

+X302941Y342063D01*

+X302619Y342038D01*

+X302306Y341963D01*

+X302007Y341839D01*

+X301732Y341671D01*

+X301487Y341461D01*

+X301277Y341216D01*

+X301109Y340941D01*

+X300985Y340642D01*

+X300910Y340329D01*

+X300885Y340007D01*

+X300910Y339685D01*

+X300985Y339372D01*

+X301109Y339073D01*

+X301277Y338798D01*

+X301487Y338553D01*

+X301732Y338343D01*

+X302007Y338175D01*

+X302306Y338051D01*

+X302619Y337976D01*

+X302941Y337951D01*

+X303263Y337976D01*

+X303576Y338051D01*

+X303875Y338175D01*

+X303932Y338210D01*

+X303862Y337329D01*

+X304009Y335462D01*

+X304447Y333640D01*

+X304929Y332475D01*

+Y331325D01*

+X304819Y331454D01*

+X304574Y331664D01*

+X304299Y331832D01*

+X304000Y331956D01*

+X303687Y332031D01*

+X303365Y332056D01*

+X303043Y332031D01*

+X302730Y331956D01*

+X302431Y331832D01*

+X302156Y331664D01*

+X301911Y331454D01*

+X301701Y331209D01*

+X301533Y330934D01*

+X301409Y330635D01*

+X301334Y330322D01*

+X301309Y330000D01*

+X301334Y329678D01*

+X301409Y329365D01*

+X301533Y329066D01*

+X301701Y328791D01*

+X301911Y328546D01*

+X302156Y328336D01*

+X302431Y328168D01*

+X302730Y328044D01*

+X303043Y327969D01*

+X303365Y327944D01*

+X303687Y327969D01*

+X304000Y328044D01*

+X304299Y328168D01*

+X304574Y328336D01*

+X304819Y328546D01*

+X304929Y328675D01*

+Y212371D01*

+X304706Y212389D01*

+X304424Y212366D01*

+X304148Y212300D01*

+X303886Y212192D01*

+X303645Y212044D01*

+X303429Y211860D01*

+X303245Y211644D01*

+X303097Y211403D01*

+X302989Y211141D01*

+X302923Y210865D01*

+X302900Y210583D01*

+X302923Y210301D01*

+X302989Y210025D01*

+X303097Y209763D01*

+X303245Y209522D01*

+X303429Y209306D01*

+X303645Y209122D01*

+X303729Y209070D01*

+X303523Y208944D01*

+X303307Y208760D01*

+X303123Y208544D01*

+X302975Y208303D01*

+X302867Y208041D01*

+X302801Y207765D01*

+X302778Y207483D01*

+X302801Y207201D01*

+X302867Y206925D01*

+X302975Y206663D01*

+X303123Y206422D01*

+X303307Y206206D01*

+X303523Y206022D01*

+X303764Y205874D01*

+X304026Y205766D01*

+X304105Y205747D01*

+X304003Y205660D01*

+X303819Y205444D01*

+X303671Y205203D01*

+X303563Y204941D01*

+X303497Y204665D01*

+X303474Y204383D01*

+X303497Y204101D01*

+X303563Y203825D01*

+X303671Y203563D01*

+X303819Y203322D01*

+X304003Y203106D01*

+X304219Y202922D01*

+X304460Y202774D01*

+X304722Y202666D01*

+X304929Y202616D01*

+Y189042D01*

+X304466Y188931D01*

+X303841Y188672D01*

+X303264Y188319D01*

+X302749Y187879D01*

+X302309Y187364D01*

+X301956Y186787D01*

+X301697Y186162D01*

+X301539Y185504D01*

+X301486Y184829D01*

+X301539Y184154D01*

+X301697Y183496D01*

+X301956Y182871D01*

+X302309Y182294D01*

+X302749Y181779D01*

+X303264Y181339D01*

+X303841Y180986D01*

+X304466Y180727D01*

+X304929Y180616D01*

+Y179042D01*

+G37*

+G36*

+X296776Y379017D02*X296474Y379089D01*

+X295799Y379142D01*

+X295124Y379089D01*

+X294466Y378931D01*

+X293899Y378696D01*

+Y397000D01*

+X296776D01*

+Y379017D01*

+G37*

+G36*

+Y369017D02*X296474Y369089D01*

+X295799Y369142D01*

+X295124Y369089D01*

+X294466Y368931D01*

+X293899Y368696D01*

+Y370962D01*

+X294466Y370727D01*

+X295124Y370569D01*

+X295799Y370516D01*

+X296474Y370569D01*

+X296776Y370641D01*

+Y369017D01*

+G37*

+G36*

+Y245499D02*X296572Y245584D01*

+X296259Y245659D01*

+X295937Y245684D01*

+X295615Y245659D01*

+X295302Y245584D01*

+X295003Y245460D01*

+X294728Y245292D01*

+X294483Y245082D01*

+X294273Y244837D01*

+X294105Y244562D01*

+X293981Y244263D01*

+X293906Y243950D01*

+X293899Y243859D01*

+Y280207D01*

+X293902Y280207D01*

+X294224Y280232D01*

+X294537Y280307D01*

+X294836Y280431D01*

+X295111Y280599D01*

+X295356Y280809D01*

+X295566Y281054D01*

+X295734Y281329D01*

+X295858Y281628D01*

+X295933Y281941D01*

+X295952Y282263D01*

+X295933Y282585D01*

+X295858Y282898D01*

+X295734Y283197D01*

+X295566Y283472D01*

+X295356Y283717D01*

+X295111Y283927D01*

+X294836Y284095D01*

+X294537Y284219D01*

+X294224Y284294D01*

+X293902Y284319D01*

+X293899Y284319D01*

+Y360962D01*

+X294466Y360727D01*

+X295124Y360569D01*

+X295799Y360516D01*

+X296474Y360569D01*

+X296776Y360641D01*

+Y307019D01*

+X296457Y306994D01*

+X296144Y306919D01*

+X295845Y306795D01*

+X295570Y306627D01*

+X295325Y306417D01*

+X295115Y306172D01*

+X294947Y305897D01*

+X294823Y305598D01*

+X294748Y305285D01*

+X294723Y304963D01*

+X294748Y304641D01*

+X294823Y304328D01*

+X294947Y304029D01*

+X295115Y303754D01*

+X295325Y303509D01*

+X295570Y303299D01*

+X295845Y303131D01*

+X296144Y303007D01*

+X296457Y302932D01*

+X296776Y302907D01*

+Y258279D01*

+X296727Y258283D01*

+X296405Y258258D01*

+X296092Y258183D01*

+X295793Y258059D01*

+X295518Y257891D01*

+X295273Y257681D01*

+X295063Y257436D01*

+X294895Y257161D01*

+X294771Y256862D01*

+X294696Y256549D01*

+X294671Y256227D01*

+X294696Y255905D01*

+X294771Y255592D01*

+X294895Y255293D01*

+X295063Y255018D01*

+X295273Y254773D01*

+X295518Y254563D01*

+X295793Y254395D01*

+X296092Y254271D01*

+X296405Y254196D01*

+X296727Y254171D01*

+X296776Y254175D01*

+Y245499D01*

+G37*

+G36*

+Y189017D02*X296474Y189089D01*

+X295799Y189142D01*

+X295124Y189089D01*

+X294466Y188931D01*

+X293899Y188696D01*

+Y243397D01*

+X293906Y243306D01*

+X293981Y242993D01*

+X294105Y242694D01*

+X294273Y242419D01*

+X294483Y242174D01*

+X294728Y241964D01*

+X295003Y241796D01*

+X295302Y241672D01*

+X295615Y241597D01*

+X295937Y241572D01*

+X296259Y241597D01*

+X296572Y241672D01*

+X296776Y241757D01*

+Y189017D01*

+G37*

+G36*

+Y179017D02*X296474Y179089D01*

+X295799Y179142D01*

+X295124Y179089D01*

+X294466Y178931D01*

+X293899Y178696D01*

+Y180962D01*

+X294466Y180727D01*

+X295124Y180569D01*

+X295799Y180516D01*

+X296474Y180569D01*

+X296776Y180641D01*

+Y179017D01*

+G37*

+G36*

+X293899Y178696D02*X293841Y178672D01*

+X293264Y178319D01*

+X292749Y177879D01*

+X292309Y177364D01*

+X291956Y176787D01*

+X291697Y176162D01*

+X291539Y175504D01*

+X291486Y174829D01*

+X291539Y174154D01*

+X291697Y173496D01*

+X291956Y172871D01*

+X292309Y172294D01*

+X292749Y171779D01*

+X293076Y171500D01*

+X288522D01*

+X288849Y171779D01*

+X289289Y172294D01*

+X289642Y172871D01*

+X289901Y173496D01*

+X290059Y174154D01*

+X290099Y174829D01*

+X290059Y175504D01*

+X289901Y176162D01*

+X289642Y176787D01*

+X289289Y177364D01*

+X288849Y177879D01*

+X288334Y178319D01*

+X287914Y178576D01*

+Y181082D01*

+X288334Y181339D01*

+X288849Y181779D01*

+X289289Y182294D01*

+X289642Y182871D01*

+X289901Y183496D01*

+X290059Y184154D01*

+X290099Y184829D01*

+X290059Y185504D01*

+X289901Y186162D01*

+X289642Y186787D01*

+X289289Y187364D01*

+X288849Y187879D01*

+X288334Y188319D01*

+X287914Y188576D01*

+Y305773D01*

+X287917Y305773D01*

+X288239Y305798D01*

+X288552Y305873D01*

+X288851Y305997D01*

+X289126Y306165D01*

+X289371Y306375D01*

+X289581Y306620D01*

+X289749Y306895D01*

+X289873Y307194D01*

+X289948Y307507D01*

+X289967Y307829D01*

+X289948Y308151D01*

+X289873Y308464D01*

+X289749Y308763D01*

+X289581Y309038D01*

+X289371Y309283D01*

+X289126Y309493D01*

+X288851Y309661D01*

+X288552Y309785D01*

+X288239Y309860D01*

+X287917Y309885D01*

+X287914Y309885D01*

+Y361082D01*

+X288334Y361339D01*

+X288849Y361779D01*

+X289289Y362294D01*

+X289642Y362871D01*

+X289901Y363496D01*

+X290059Y364154D01*

+X290099Y364829D01*

+X290059Y365504D01*

+X289901Y366162D01*

+X289642Y366787D01*

+X289289Y367364D01*

+X288849Y367879D01*

+X288334Y368319D01*

+X287914Y368576D01*

+Y371082D01*

+X288334Y371339D01*

+X288849Y371779D01*

+X289289Y372294D01*

+X289642Y372871D01*

+X289901Y373496D01*

+X290059Y374154D01*

+X290099Y374829D01*

+X290059Y375504D01*

+X289901Y376162D01*

+X289642Y376787D01*

+X289289Y377364D01*

+X288849Y377879D01*

+X288334Y378319D01*

+X287914Y378576D01*

+Y397000D01*

+X293899D01*

+Y378696D01*

+X293841Y378672D01*

+X293264Y378319D01*

+X292749Y377879D01*

+X292309Y377364D01*

+X291956Y376787D01*

+X291697Y376162D01*

+X291539Y375504D01*

+X291486Y374829D01*

+X291539Y374154D01*

+X291697Y373496D01*

+X291956Y372871D01*

+X292309Y372294D01*

+X292749Y371779D01*

+X293264Y371339D01*

+X293841Y370986D01*

+X293899Y370962D01*

+Y368696D01*

+X293841Y368672D01*

+X293264Y368319D01*

+X292749Y367879D01*

+X292309Y367364D01*

+X291956Y366787D01*

+X291697Y366162D01*

+X291539Y365504D01*

+X291486Y364829D01*

+X291539Y364154D01*

+X291697Y363496D01*

+X291956Y362871D01*

+X292309Y362294D01*

+X292749Y361779D01*

+X293264Y361339D01*

+X293841Y360986D01*

+X293899Y360962D01*

+Y284319D01*

+X293580Y284294D01*

+X293267Y284219D01*

+X292968Y284095D01*

+X292693Y283927D01*

+X292448Y283717D01*

+X292238Y283472D01*

+X292070Y283197D01*

+X291946Y282898D01*

+X291871Y282585D01*

+X291846Y282263D01*

+X291871Y281941D01*

+X291946Y281628D01*

+X292070Y281329D01*

+X292238Y281054D01*

+X292448Y280809D01*

+X292693Y280599D01*

+X292968Y280431D01*

+X293267Y280307D01*

+X293580Y280232D01*

+X293899Y280207D01*

+Y243859D01*

+X293881Y243628D01*

+X293899Y243397D01*

+Y188696D01*

+X293841Y188672D01*

+X293264Y188319D01*

+X292749Y187879D01*

+X292309Y187364D01*

+X291956Y186787D01*

+X291697Y186162D01*

+X291539Y185504D01*

+X291486Y184829D01*

+X291539Y184154D01*

+X291697Y183496D01*

+X291956Y182871D01*

+X292309Y182294D01*

+X292749Y181779D01*

+X293264Y181339D01*

+X293841Y180986D01*

+X293899Y180962D01*

+Y178696D01*

+G37*

+G36*

+X285427Y360545D02*X285799Y360516D01*

+X286474Y360569D01*

+X287132Y360727D01*

+X287757Y360986D01*

+X287914Y361082D01*

+Y309885D01*

+X287595Y309860D01*

+X287282Y309785D01*

+X286983Y309661D01*

+X286708Y309493D01*

+X286463Y309283D01*

+X286253Y309038D01*

+X286085Y308763D01*

+X285961Y308464D01*

+X285886Y308151D01*

+X285861Y307829D01*

+X285886Y307507D01*

+X285961Y307194D01*

+X286085Y306895D01*

+X286253Y306620D01*

+X286463Y306375D01*

+X286708Y306165D01*

+X286983Y305997D01*

+X287282Y305873D01*

+X287595Y305798D01*

+X287914Y305773D01*

+Y188576D01*

+X287757Y188672D01*

+X287132Y188931D01*

+X286474Y189089D01*

+X285799Y189142D01*

+X285427Y189113D01*

+Y322944D01*

+X285430Y322944D01*

+X285752Y322969D01*

+X286065Y323044D01*

+X286364Y323168D01*

+X286639Y323336D01*

+X286884Y323546D01*

+X287094Y323791D01*

+X287262Y324066D01*

+X287386Y324365D01*

+X287461Y324678D01*

+X287480Y325000D01*

+X287461Y325322D01*

+X287386Y325635D01*

+X287262Y325934D01*

+X287094Y326209D01*

+X286884Y326454D01*

+X286639Y326664D01*

+X286364Y326832D01*

+X286065Y326956D01*

+X285752Y327031D01*

+X285430Y327056D01*

+X285427Y327056D01*

+Y360545D01*

+G37*

+G36*

+Y370545D02*X285799Y370516D01*

+X286474Y370569D01*

+X287132Y370727D01*

+X287757Y370986D01*

+X287914Y371082D01*

+Y368576D01*

+X287757Y368672D01*

+X287132Y368931D01*

+X286474Y369089D01*

+X285799Y369142D01*

+X285427Y369113D01*

+Y370545D01*

+G37*

+G36*

+Y397000D02*X287914D01*

+Y378576D01*

+X287757Y378672D01*

+X287132Y378931D01*

+X286474Y379089D01*

+X285799Y379142D01*

+X285427Y379113D01*

+Y397000D01*

+G37*

+G36*

+X287914Y178576D02*X287757Y178672D01*

+X287132Y178931D01*

+X286474Y179089D01*

+X285799Y179142D01*

+X285427Y179113D01*

+Y180545D01*

+X285799Y180516D01*

+X286474Y180569D01*

+X287132Y180727D01*

+X287757Y180986D01*

+X287914Y181082D01*

+Y178576D01*

+G37*

+G36*

+X285427Y179113D02*X285124Y179089D01*

+X284466Y178931D01*

+X283841Y178672D01*

+X283264Y178319D01*

+X282749Y177879D01*

+X282309Y177364D01*

+X281956Y176787D01*

+X281697Y176162D01*

+X281539Y175504D01*

+X281486Y174829D01*

+X281539Y174154D01*

+X281697Y173496D01*

+X281956Y172871D01*

+X282309Y172294D01*

+X282749Y171779D01*

+X283076Y171500D01*

+X278522D01*

+X278849Y171779D01*

+X279289Y172294D01*

+X279642Y172871D01*

+X279901Y173496D01*

+X280059Y174154D01*

+X280099Y174829D01*

+X280059Y175504D01*

+X279901Y176162D01*

+X279642Y176787D01*

+X279289Y177364D01*

+X278849Y177879D01*

+X278334Y178319D01*

+X278222Y178387D01*

+Y181271D01*

+X278334Y181339D01*

+X278849Y181779D01*

+X279289Y182294D01*

+X279642Y182871D01*

+X279901Y183496D01*

+X280059Y184154D01*

+X280099Y184829D01*

+X280059Y185504D01*

+X279901Y186162D01*

+X279642Y186787D01*

+X279289Y187364D01*

+X278849Y187879D01*

+X278334Y188319D01*

+X278222Y188387D01*

+Y277546D01*

+X278225Y277546D01*

+X278547Y277571D01*

+X278860Y277646D01*

+X279159Y277770D01*

+X279434Y277938D01*

+X279679Y278148D01*

+X279889Y278393D01*

+X280057Y278668D01*

+X280181Y278967D01*

+X280256Y279280D01*

+X280275Y279602D01*

+X280256Y279924D01*

+X280181Y280237D01*

+X280057Y280536D01*

+X279889Y280811D01*

+X279679Y281056D01*

+X279434Y281266D01*

+X279159Y281434D01*

+X278860Y281558D01*

+X278547Y281633D01*

+X278225Y281658D01*

+X278222Y281658D01*

+Y283674D01*

+X278380Y283539D01*

+X278621Y283391D01*

+X278883Y283283D01*

+X279159Y283217D01*

+X279441Y283194D01*

+X279723Y283217D01*

+X279999Y283283D01*

+X280261Y283391D01*

+X280502Y283539D01*

+X280718Y283723D01*

+X280902Y283939D01*

+X281050Y284180D01*

+X281158Y284442D01*

+X281224Y284718D01*

+X281241Y285000D01*

+X281224Y285282D01*

+X281158Y285558D01*

+X281050Y285820D01*

+X280902Y286061D01*

+X280718Y286277D01*

+X280502Y286461D01*

+X280261Y286609D01*

+X279999Y286717D01*

+X279723Y286783D01*

+X279441Y286806D01*

+X279159Y286783D01*

+X278883Y286717D01*

+X278621Y286609D01*

+X278380Y286461D01*

+X278222Y286326D01*

+Y296557D01*

+X278529Y296581D01*

+X278842Y296656D01*

+X279141Y296780D01*

+X279416Y296948D01*

+X279661Y297158D01*

+X279871Y297403D01*

+X280039Y297678D01*

+X280163Y297977D01*

+X280238Y298290D01*

+X280257Y298612D01*

+X280238Y298934D01*

+X280163Y299247D01*

+X280039Y299546D01*

+X279871Y299821D01*

+X279661Y300066D01*

+X279416Y300276D01*

+X279141Y300444D01*

+X278842Y300568D01*

+X278529Y300643D01*

+X278222Y300667D01*

+Y306457D01*

+X278383Y306555D01*

+X278628Y306765D01*

+X278838Y307010D01*

+X279006Y307285D01*

+X279130Y307584D01*

+X279205Y307897D01*

+X279224Y308219D01*

+X279205Y308541D01*

+X279130Y308854D01*

+X279006Y309153D01*

+X278838Y309428D01*

+X278628Y309673D01*

+X278383Y309883D01*

+X278222Y309981D01*

+Y345601D01*

+X278383Y345668D01*

+X278658Y345836D01*

+X278903Y346046D01*

+X279113Y346291D01*

+X279281Y346566D01*

+X279405Y346865D01*

+X279480Y347178D01*

+X279499Y347500D01*

+X279480Y347822D01*

+X279405Y348135D01*

+X279281Y348434D01*

+X279113Y348709D01*

+X278903Y348954D01*

+X278658Y349164D01*

+X278383Y349332D01*

+X278222Y349399D01*

+Y361271D01*

+X278334Y361339D01*

+X278849Y361779D01*

+X279289Y362294D01*

+X279642Y362871D01*

+X279901Y363496D01*

+X280059Y364154D01*

+X280099Y364829D01*

+X280059Y365504D01*

+X279901Y366162D01*

+X279642Y366787D01*

+X279289Y367364D01*

+X278849Y367879D01*

+X278334Y368319D01*

+X278222Y368387D01*

+Y371271D01*

+X278334Y371339D01*

+X278849Y371779D01*

+X279289Y372294D01*

+X279642Y372871D01*

+X279901Y373496D01*

+X280059Y374154D01*

+X280099Y374829D01*

+X280059Y375504D01*

+X279901Y376162D01*

+X279642Y376787D01*

+X279289Y377364D01*

+X278849Y377879D01*

+X278334Y378319D01*

+X278222Y378387D01*

+Y397000D01*

+X285427D01*

+Y379113D01*

+X285124Y379089D01*

+X284466Y378931D01*

+X283841Y378672D01*

+X283264Y378319D01*

+X282749Y377879D01*

+X282309Y377364D01*

+X281956Y376787D01*

+X281697Y376162D01*

+X281539Y375504D01*

+X281486Y374829D01*

+X281539Y374154D01*

+X281697Y373496D01*

+X281956Y372871D01*

+X282309Y372294D01*

+X282749Y371779D01*

+X283264Y371339D01*

+X283841Y370986D01*

+X284466Y370727D01*

+X285124Y370569D01*

+X285427Y370545D01*

+Y369113D01*

+X285124Y369089D01*

+X284466Y368931D01*

+X283841Y368672D01*

+X283264Y368319D01*

+X282749Y367879D01*

+X282309Y367364D01*

+X281956Y366787D01*

+X281697Y366162D01*

+X281539Y365504D01*

+X281486Y364829D01*

+X281539Y364154D01*

+X281697Y363496D01*

+X281956Y362871D01*

+X282309Y362294D01*

+X282749Y361779D01*

+X283264Y361339D01*

+X283841Y360986D01*

+X284466Y360727D01*

+X285124Y360569D01*

+X285427Y360545D01*

+Y327056D01*

+X285108Y327031D01*

+X284795Y326956D01*

+X284496Y326832D01*

+X284221Y326664D01*

+X283976Y326454D01*

+X283766Y326209D01*

+X283598Y325934D01*

+X283474Y325635D01*

+X283399Y325322D01*

+X283374Y325000D01*

+X283399Y324678D01*

+X283474Y324365D01*

+X283598Y324066D01*

+X283766Y323791D01*

+X283976Y323546D01*

+X284221Y323336D01*

+X284496Y323168D01*

+X284795Y323044D01*

+X285108Y322969D01*

+X285427Y322944D01*

+Y189113D01*

+X285124Y189089D01*

+X284466Y188931D01*

+X283841Y188672D01*

+X283264Y188319D01*

+X282749Y187879D01*

+X282309Y187364D01*

+X281956Y186787D01*

+X281697Y186162D01*

+X281539Y185504D01*

+X281486Y184829D01*

+X281539Y184154D01*

+X281697Y183496D01*

+X281956Y182871D01*

+X282309Y182294D01*

+X282749Y181779D01*

+X283264Y181339D01*

+X283841Y180986D01*

+X284466Y180727D01*

+X285124Y180569D01*

+X285427Y180545D01*

+Y179113D01*

+G37*

+G36*

+X278222Y178387D02*X277757Y178672D01*

+X277132Y178931D01*

+X276474Y179089D01*

+X275799Y179142D01*

+X275124Y179089D01*

+X274466Y178931D01*

+X273841Y178672D01*

+X273264Y178319D01*

+X272749Y177879D01*

+X272309Y177364D01*

+X271956Y176787D01*

+X271697Y176162D01*

+X271539Y175504D01*

+X271486Y174829D01*

+X271539Y174154D01*

+X271697Y173496D01*

+X271956Y172871D01*

+X272309Y172294D01*

+X272749Y171779D01*

+X273076Y171500D01*

+X269438D01*

+Y172538D01*

+X269642Y172871D01*

+X269901Y173496D01*

+X270059Y174154D01*

+X270099Y174829D01*

+X270059Y175504D01*

+X269901Y176162D01*

+X269642Y176787D01*

+X269438Y177120D01*

+Y182538D01*

+X269642Y182871D01*

+X269901Y183496D01*

+X270059Y184154D01*

+X270099Y184829D01*

+X270059Y185504D01*

+X269901Y186162D01*

+X269642Y186787D01*

+X269438Y187120D01*

+Y196695D01*

+X269441Y196694D01*

+X269723Y196717D01*

+X269999Y196783D01*

+X270261Y196891D01*

+X270502Y197039D01*

+X270718Y197223D01*

+X270902Y197439D01*

+X271050Y197680D01*

+X271158Y197942D01*

+X271224Y198218D01*

+X271241Y198500D01*

+X271224Y198782D01*

+X271158Y199058D01*

+X271050Y199320D01*

+X270902Y199561D01*

+X270718Y199777D01*

+X270502Y199961D01*

+X270261Y200109D01*

+X269999Y200217D01*

+X269723Y200283D01*

+X269441Y200306D01*

+X269438Y200305D01*

+Y229770D01*

+X269659Y229717D01*

+X269941Y229694D01*

+X270223Y229717D01*

+X270499Y229783D01*

+X270761Y229891D01*

+X271002Y230039D01*

+X271218Y230223D01*

+X271402Y230439D01*

+X271550Y230680D01*

+X271658Y230942D01*

+X271724Y231218D01*

+X271741Y231500D01*

+X271724Y231782D01*

+X271658Y232058D01*

+X271550Y232320D01*

+X271402Y232561D01*

+X271218Y232777D01*

+X271002Y232961D01*

+X270761Y233109D01*

+X270499Y233217D01*

+X270223Y233283D01*

+X269941Y233306D01*

+X269659Y233283D01*

+X269438Y233230D01*

+Y296592D01*

+X269653Y296575D01*

+X269975Y296600D01*

+X270288Y296675D01*

+X270587Y296799D01*

+X270862Y296967D01*

+X271107Y297177D01*

+X271317Y297422D01*

+X271426Y297601D01*

+X271565Y297373D01*

+X271775Y297128D01*

+X272020Y296918D01*

+X272295Y296750D01*

+X272594Y296626D01*

+X272907Y296551D01*

+X273229Y296526D01*

+X273551Y296551D01*

+X273864Y296626D01*

+X274163Y296750D01*

+X274438Y296918D01*

+X274683Y297128D01*

+X274893Y297373D01*

+X275061Y297648D01*

+X275185Y297947D01*

+X275260Y298260D01*

+X275279Y298582D01*

+X275260Y298904D01*

+X275185Y299217D01*

+X275061Y299516D01*

+X274893Y299791D01*

+X274683Y300036D01*

+X274438Y300246D01*

+X274163Y300414D01*

+X273864Y300538D01*

+X273551Y300613D01*

+X273229Y300638D01*

+X272907Y300613D01*

+X272594Y300538D01*

+X272295Y300414D01*

+X272020Y300246D01*

+X271775Y300036D01*

+X271565Y299791D01*

+X271456Y299612D01*

+X271317Y299840D01*

+X271107Y300085D01*

+X270862Y300295D01*

+X270587Y300463D01*

+X270288Y300587D01*

+X269975Y300662D01*

+X269653Y300687D01*

+X269438Y300670D01*

+Y312011D01*

+X269576Y312044D01*

+X269875Y312168D01*

+X270150Y312336D01*

+X270395Y312546D01*

+X270605Y312791D01*

+X270773Y313066D01*

+X270897Y313365D01*

+X270972Y313678D01*

+X270991Y314000D01*

+X270972Y314322D01*

+X270897Y314635D01*

+X270773Y314934D01*

+X270605Y315209D01*

+X270395Y315454D01*

+X270150Y315664D01*

+X269875Y315832D01*

+X269576Y315956D01*

+X269438Y315989D01*

+Y334503D01*

+X269621Y334391D01*

+X269883Y334283D01*

+X270159Y334217D01*

+X270441Y334194D01*

+X270723Y334217D01*

+X270999Y334283D01*

+X271261Y334391D01*

+X271502Y334539D01*

+X271718Y334723D01*

+X271902Y334939D01*

+X272050Y335180D01*

+X272158Y335442D01*

+X272224Y335718D01*

+X272241Y336000D01*

+X272224Y336282D01*

+X272158Y336558D01*

+X272050Y336820D01*

+X271902Y337061D01*

+X271718Y337277D01*

+X271502Y337461D01*

+X271261Y337609D01*

+X270999Y337717D01*

+X270723Y337783D01*

+X270441Y337806D01*

+X270159Y337783D01*

+X269883Y337717D01*

+X269621Y337609D01*

+X269438Y337497D01*

+Y341003D01*

+X269621Y340891D01*

+X269883Y340783D01*

+X270159Y340717D01*

+X270441Y340694D01*

+X270723Y340717D01*

+X270999Y340783D01*

+X271261Y340891D01*

+X271502Y341039D01*

+X271718Y341223D01*

+X271902Y341439D01*

+X272050Y341680D01*

+X272158Y341942D01*

+X272224Y342218D01*

+X272241Y342500D01*

+X272224Y342782D01*

+X272158Y343058D01*

+X272050Y343320D01*

+X271902Y343561D01*

+X271718Y343777D01*

+X271502Y343961D01*

+X271261Y344109D01*

+X270999Y344217D01*

+X270723Y344283D01*

+X270441Y344306D01*

+X270159Y344283D01*

+X269883Y344217D01*

+X269621Y344109D01*

+X269438Y343997D01*

+Y348003D01*

+X269621Y347891D01*

+X269883Y347783D01*

+X270159Y347717D01*

+X270441Y347694D01*

+X270723Y347717D01*

+X270999Y347783D01*

+X271261Y347891D01*

+X271502Y348039D01*

+X271718Y348223D01*

+X271902Y348439D01*

+X272050Y348680D01*

+X272158Y348942D01*

+X272224Y349218D01*

+X272241Y349500D01*

+X272224Y349782D01*

+X272158Y350058D01*

+X272050Y350320D01*

+X271902Y350561D01*

+X271718Y350777D01*

+X271502Y350961D01*

+X271261Y351109D01*

+X270999Y351217D01*

+X270723Y351283D01*

+X270441Y351306D01*

+X270159Y351283D01*

+X269883Y351217D01*

+X269621Y351109D01*

+X269438Y350997D01*

+Y355503D01*

+X269621Y355391D01*

+X269883Y355283D01*

+X270159Y355217D01*

+X270441Y355194D01*

+X270723Y355217D01*

+X270999Y355283D01*

+X271261Y355391D01*

+X271502Y355539D01*

+X271718Y355723D01*

+X271902Y355939D01*

+X272050Y356180D01*

+X272158Y356442D01*

+X272224Y356718D01*

+X272241Y357000D01*

+X272224Y357282D01*

+X272158Y357558D01*

+X272050Y357820D01*

+X271902Y358061D01*

+X271718Y358277D01*

+X271502Y358461D01*

+X271261Y358609D01*

+X270999Y358717D01*

+X270723Y358783D01*

+X270441Y358806D01*

+X270159Y358783D01*

+X269883Y358717D01*

+X269621Y358609D01*

+X269438Y358497D01*

+Y362538D01*

+X269642Y362871D01*

+X269901Y363496D01*

+X270059Y364154D01*

+X270099Y364829D01*

+X270059Y365504D01*

+X269901Y366162D01*

+X269642Y366787D01*

+X269438Y367120D01*

+Y372538D01*

+X269642Y372871D01*

+X269901Y373496D01*

+X270059Y374154D01*

+X270099Y374829D01*

+X270059Y375504D01*

+X269901Y376162D01*

+X269642Y376787D01*

+X269438Y377120D01*

+Y397000D01*

+X278222D01*

+Y378387D01*

+X277757Y378672D01*

+X277132Y378931D01*

+X276474Y379089D01*

+X275799Y379142D01*

+X275124Y379089D01*

+X274466Y378931D01*

+X273841Y378672D01*

+X273264Y378319D01*

+X272749Y377879D01*

+X272309Y377364D01*

+X271956Y376787D01*

+X271697Y376162D01*

+X271539Y375504D01*

+X271486Y374829D01*

+X271539Y374154D01*

+X271697Y373496D01*

+X271956Y372871D01*

+X272309Y372294D01*

+X272749Y371779D01*

+X273264Y371339D01*

+X273841Y370986D01*

+X274466Y370727D01*

+X275124Y370569D01*

+X275799Y370516D01*

+X276474Y370569D01*

+X277132Y370727D01*

+X277757Y370986D01*

+X278222Y371271D01*

+Y368387D01*

+X277757Y368672D01*

+X277132Y368931D01*

+X276474Y369089D01*

+X275799Y369142D01*

+X275124Y369089D01*

+X274466Y368931D01*

+X273841Y368672D01*

+X273264Y368319D01*

+X272749Y367879D01*

+X272309Y367364D01*

+X271956Y366787D01*

+X271697Y366162D01*

+X271539Y365504D01*

+X271486Y364829D01*

+X271539Y364154D01*

+X271697Y363496D01*

+X271956Y362871D01*

+X272309Y362294D01*

+X272749Y361779D01*

+X273264Y361339D01*

+X273841Y360986D01*

+X274466Y360727D01*

+X275124Y360569D01*

+X275799Y360516D01*

+X276474Y360569D01*

+X277132Y360727D01*

+X277757Y360986D01*

+X278222Y361271D01*

+Y349399D01*

+X278084Y349456D01*

+X277771Y349531D01*

+X277449Y349556D01*

+X277127Y349531D01*

+X276814Y349456D01*

+X276515Y349332D01*

+X276240Y349164D01*

+X275995Y348954D01*

+X275785Y348709D01*

+X275617Y348434D01*

+X275493Y348135D01*

+X275418Y347822D01*

+X275393Y347500D01*

+X275418Y347178D01*

+X275493Y346865D01*

+X275617Y346566D01*

+X275785Y346291D01*

+X275995Y346046D01*

+X276240Y345836D01*

+X276515Y345668D01*

+X276814Y345544D01*

+X277127Y345469D01*

+X277449Y345444D01*

+X277771Y345469D01*

+X278084Y345544D01*

+X278222Y345601D01*

+Y309981D01*

+X278108Y310051D01*

+X277809Y310175D01*

+X277496Y310250D01*

+X277174Y310275D01*

+X276852Y310250D01*

+X276539Y310175D01*

+X276240Y310051D01*

+X275965Y309883D01*

+X275720Y309673D01*

+X275510Y309428D01*

+X275342Y309153D01*

+X275218Y308854D01*

+X275143Y308541D01*

+X275118Y308219D01*

+X275143Y307897D01*

+X275218Y307584D01*

+X275342Y307285D01*

+X275510Y307010D01*

+X275720Y306765D01*

+X275965Y306555D01*

+X276240Y306387D01*

+X276539Y306263D01*

+X276852Y306188D01*

+X277174Y306163D01*

+X277496Y306188D01*

+X277809Y306263D01*

+X278108Y306387D01*

+X278222Y306457D01*

+Y300667D01*

+X278207Y300668D01*

+X277885Y300643D01*

+X277572Y300568D01*

+X277273Y300444D01*

+X276998Y300276D01*

+X276753Y300066D01*

+X276543Y299821D01*

+X276375Y299546D01*

+X276251Y299247D01*

+X276176Y298934D01*

+X276151Y298612D01*

+X276176Y298290D01*

+X276251Y297977D01*

+X276375Y297678D01*

+X276543Y297403D01*

+X276753Y297158D01*

+X276998Y296948D01*

+X277273Y296780D01*

+X277572Y296656D01*

+X277885Y296581D01*

+X278207Y296556D01*

+X278222Y296557D01*

+Y286326D01*

+X278164Y286277D01*

+X277980Y286061D01*

+X277832Y285820D01*

+X277724Y285558D01*

+X277658Y285282D01*

+X277635Y285000D01*

+X277658Y284718D01*

+X277724Y284442D01*

+X277832Y284180D01*

+X277980Y283939D01*

+X278164Y283723D01*

+X278222Y283674D01*

+Y281658D01*

+X277903Y281633D01*

+X277590Y281558D01*

+X277291Y281434D01*

+X277016Y281266D01*

+X276771Y281056D01*

+X276561Y280811D01*

+X276393Y280536D01*

+X276269Y280237D01*

+X276194Y279924D01*

+X276169Y279602D01*

+X276194Y279280D01*

+X276269Y278967D01*

+X276393Y278668D01*

+X276561Y278393D01*

+X276771Y278148D01*

+X277016Y277938D01*

+X277291Y277770D01*

+X277590Y277646D01*

+X277903Y277571D01*

+X278222Y277546D01*

+Y188387D01*

+X277757Y188672D01*

+X277132Y188931D01*

+X276474Y189089D01*

+X275799Y189142D01*

+X275124Y189089D01*

+X274466Y188931D01*

+X273841Y188672D01*

+X273264Y188319D01*

+X272749Y187879D01*

+X272309Y187364D01*

+X271956Y186787D01*

+X271697Y186162D01*

+X271539Y185504D01*

+X271486Y184829D01*

+X271539Y184154D01*

+X271697Y183496D01*

+X271956Y182871D01*

+X272309Y182294D01*

+X272749Y181779D01*

+X273264Y181339D01*

+X273841Y180986D01*

+X274466Y180727D01*

+X275124Y180569D01*

+X275799Y180516D01*

+X276474Y180569D01*

+X277132Y180727D01*

+X277757Y180986D01*

+X278222Y181271D01*

+Y178387D01*

+G37*

+G36*

+X263438Y371233D02*X263841Y370986D01*

+X264466Y370727D01*

+X265124Y370569D01*

+X265799Y370516D01*

+X266474Y370569D01*

+X267132Y370727D01*

+X267757Y370986D01*

+X268334Y371339D01*

+X268849Y371779D01*

+X269289Y372294D01*

+X269438Y372538D01*

+Y367120D01*

+X269289Y367364D01*

+X268849Y367879D01*

+X268334Y368319D01*

+X267757Y368672D01*

+X267132Y368931D01*

+X266474Y369089D01*

+X265799Y369142D01*

+X265124Y369089D01*

+X264466Y368931D01*

+X263841Y368672D01*

+X263438Y368425D01*

+Y371233D01*

+G37*

+G36*

+Y397000D02*X269438D01*

+Y377120D01*

+X269289Y377364D01*

+X268849Y377879D01*

+X268334Y378319D01*

+X267757Y378672D01*

+X267132Y378931D01*

+X266474Y379089D01*

+X265799Y379142D01*

+X265124Y379089D01*

+X264466Y378931D01*

+X263841Y378672D01*

+X263438Y378425D01*

+Y397000D01*

+G37*

+G36*

+X269438Y300670D02*X269331Y300662D01*

+X269018Y300587D01*

+X268719Y300463D01*

+X268444Y300295D01*

+X268199Y300085D01*

+X267989Y299840D01*

+X267821Y299565D01*

+X267697Y299266D01*

+X267622Y298953D01*

+X267597Y298631D01*

+X267622Y298309D01*

+X267638Y298244D01*

+X267622Y298258D01*

+X267347Y298426D01*

+X267048Y298550D01*

+X266735Y298625D01*

+X266413Y298650D01*

+X266091Y298625D01*

+X265778Y298550D01*

+X265479Y298426D01*

+X265204Y298258D01*

+X264959Y298048D01*

+X264749Y297803D01*

+X264581Y297528D01*

+X264457Y297229D01*

+X264407Y297018D01*

+X264174Y297161D01*

+X263875Y297285D01*

+X263562Y297360D01*

+X263438Y297370D01*

+Y318195D01*

+X263441Y318194D01*

+X263723Y318217D01*

+X263999Y318283D01*

+X264261Y318391D01*

+X264502Y318539D01*

+X264718Y318723D01*

+X264902Y318939D01*

+X265050Y319180D01*

+X265158Y319442D01*

+X265224Y319718D01*

+X265241Y320000D01*

+X265224Y320282D01*

+X265158Y320558D01*

+X265050Y320820D01*

+X264902Y321061D01*

+X264718Y321277D01*

+X264502Y321461D01*

+X264261Y321609D01*

+X263999Y321717D01*

+X263723Y321783D01*

+X263441Y321806D01*

+X263438Y321805D01*

+Y361233D01*

+X263841Y360986D01*

+X264466Y360727D01*

+X265124Y360569D01*

+X265799Y360516D01*

+X266474Y360569D01*

+X267132Y360727D01*

+X267757Y360986D01*

+X268334Y361339D01*

+X268849Y361779D01*

+X269289Y362294D01*

+X269438Y362538D01*

+Y358497D01*

+X269380Y358461D01*

+X269164Y358277D01*

+X268980Y358061D01*

+X268832Y357820D01*

+X268724Y357558D01*

+X268658Y357282D01*

+X268635Y357000D01*

+X268658Y356718D01*

+X268724Y356442D01*

+X268832Y356180D01*

+X268980Y355939D01*

+X269164Y355723D01*

+X269380Y355539D01*

+X269438Y355503D01*

+Y350997D01*

+X269380Y350961D01*

+X269164Y350777D01*

+X268980Y350561D01*

+X268832Y350320D01*

+X268724Y350058D01*

+X268658Y349782D01*

+X268635Y349500D01*

+X268658Y349218D01*

+X268724Y348942D01*

+X268832Y348680D01*

+X268980Y348439D01*

+X269164Y348223D01*

+X269380Y348039D01*

+X269438Y348003D01*

+Y343997D01*

+X269380Y343961D01*

+X269164Y343777D01*

+X268980Y343561D01*

+X268832Y343320D01*

+X268724Y343058D01*

+X268658Y342782D01*

+X268635Y342500D01*

+X268658Y342218D01*

+X268724Y341942D01*

+X268832Y341680D01*

+X268980Y341439D01*

+X269164Y341223D01*

+X269380Y341039D01*

+X269438Y341003D01*

+Y337497D01*

+X269380Y337461D01*

+X269164Y337277D01*

+X268980Y337061D01*

+X268832Y336820D01*

+X268724Y336558D01*

+X268658Y336282D01*

+X268635Y336000D01*

+X268658Y335718D01*

+X268724Y335442D01*

+X268832Y335180D01*

+X268980Y334939D01*

+X269164Y334723D01*

+X269380Y334539D01*

+X269438Y334503D01*

+Y315989D01*

+X269263Y316031D01*

+X268941Y316056D01*

+X268619Y316031D01*

+X268306Y315956D01*

+X268007Y315832D01*

+X267732Y315664D01*

+X267487Y315454D01*

+X267277Y315209D01*

+X267109Y314934D01*

+X266985Y314635D01*

+X266910Y314322D01*

+X266885Y314000D01*

+X266910Y313678D01*

+X266985Y313365D01*

+X267109Y313066D01*

+X267277Y312791D01*

+X267487Y312546D01*

+X267732Y312336D01*

+X268007Y312168D01*

+X268306Y312044D01*

+X268619Y311969D01*

+X268941Y311944D01*

+X269263Y311969D01*

+X269438Y312011D01*

+Y300670D01*

+G37*

+G36*

+X263438Y297370D02*X263240Y297385D01*

+X262918Y297360D01*

+X262605Y297285D01*

+X262306Y297161D01*

+X262031Y296993D01*

+X261786Y296783D01*

+X261576Y296538D01*

+X261408Y296263D01*

+X261284Y295964D01*

+X261209Y295651D01*

+X261184Y295329D01*

+X261209Y295007D01*

+X261284Y294694D01*

+X261408Y294395D01*

+X261576Y294120D01*

+X261786Y293875D01*

+X261961Y293725D01*

+X261806Y293661D01*

+X261531Y293493D01*

+X261286Y293283D01*

+X261076Y293038D01*

+X260938Y292812D01*

+Y305652D01*

+X260944Y305650D01*

+X261220Y305584D01*

+X261502Y305561D01*

+X261784Y305584D01*

+X262060Y305650D01*

+X262322Y305758D01*

+X262563Y305906D01*

+X262779Y306090D01*

+X262963Y306306D01*

+X263111Y306547D01*

+X263219Y306809D01*

+X263285Y307085D01*

+X263302Y307367D01*

+X263285Y307649D01*

+X263219Y307925D01*

+X263111Y308187D01*

+X262963Y308428D01*

+X262779Y308644D01*

+X262563Y308828D01*

+X262322Y308976D01*

+X262060Y309084D01*

+X261784Y309150D01*

+X261502Y309173D01*

+X261220Y309150D01*

+X260944Y309084D01*

+X260938Y309082D01*

+Y315235D01*

+X261126Y315280D01*

+X261388Y315388D01*

+X261629Y315536D01*

+X261845Y315720D01*

+X262029Y315936D01*

+X262177Y316177D01*

+X262285Y316439D01*

+X262351Y316715D01*

+X262368Y316997D01*

+X262351Y317279D01*

+X262285Y317555D01*

+X262177Y317817D01*

+X262029Y318058D01*

+X261845Y318274D01*

+X261629Y318458D01*

+X261388Y318606D01*

+X261126Y318714D01*

+X260938Y318759D01*

+Y397000D01*

+X263438D01*

+Y378425D01*

+X263264Y378319D01*

+X262749Y377879D01*

+X262309Y377364D01*

+X261956Y376787D01*

+X261697Y376162D01*

+X261539Y375504D01*

+X261486Y374829D01*

+X261539Y374154D01*

+X261697Y373496D01*

+X261956Y372871D01*

+X262309Y372294D01*

+X262749Y371779D01*

+X263264Y371339D01*

+X263438Y371233D01*

+Y368425D01*

+X263264Y368319D01*

+X262749Y367879D01*

+X262309Y367364D01*

+X261956Y366787D01*

+X261697Y366162D01*

+X261539Y365504D01*

+X261486Y364829D01*

+X261539Y364154D01*

+X261697Y363496D01*

+X261956Y362871D01*

+X262309Y362294D01*

+X262749Y361779D01*

+X263264Y361339D01*

+X263438Y361233D01*

+Y321805D01*

+X263159Y321783D01*

+X262883Y321717D01*

+X262621Y321609D01*

+X262380Y321461D01*

+X262164Y321277D01*

+X261980Y321061D01*

+X261832Y320820D01*

+X261724Y320558D01*

+X261658Y320282D01*

+X261635Y320000D01*

+X261658Y319718D01*

+X261724Y319442D01*

+X261832Y319180D01*

+X261980Y318939D01*

+X262164Y318723D01*

+X262380Y318539D01*

+X262621Y318391D01*

+X262883Y318283D01*

+X263159Y318217D01*

+X263438Y318195D01*

+Y297370D01*

+G37*

+G36*

+X269438Y177120D02*X269289Y177364D01*

+X268849Y177879D01*

+X268334Y178319D01*

+X267757Y178672D01*

+X267132Y178931D01*

+X266474Y179089D01*

+X265799Y179142D01*

+X265124Y179089D01*

+X264466Y178931D01*

+X263841Y178672D01*

+X263264Y178319D01*

+X262749Y177879D01*

+X262309Y177364D01*

+X261956Y176787D01*

+X261697Y176162D01*

+X261539Y175504D01*

+X261486Y174829D01*

+X261539Y174154D01*

+X261697Y173496D01*

+X261956Y172871D01*

+X262309Y172294D01*

+X262749Y171779D01*

+X263076Y171500D01*

+X260938D01*

+Y189695D01*

+X260941Y189694D01*

+X261223Y189717D01*

+X261499Y189783D01*

+X261761Y189891D01*

+X262002Y190039D01*

+X262218Y190223D01*

+X262402Y190439D01*

+X262550Y190680D01*

+X262658Y190942D01*

+X262724Y191218D01*

+X262741Y191500D01*

+X262724Y191782D01*

+X262658Y192058D01*

+X262550Y192320D01*

+X262402Y192561D01*

+X262218Y192777D01*

+X262002Y192961D01*

+X261761Y193109D01*

+X261499Y193217D01*

+X261223Y193283D01*

+X260941Y193306D01*

+X260938Y193305D01*

+Y267805D01*

+X261086Y267563D01*

+X261296Y267318D01*

+X261541Y267108D01*

+X261816Y266940D01*

+X262115Y266816D01*

+X262428Y266741D01*

+X262750Y266716D01*

+X263072Y266741D01*

+X263385Y266816D01*

+X263684Y266940D01*

+X263959Y267108D01*

+X264204Y267318D01*

+X264414Y267563D01*

+X264582Y267838D01*

+X264706Y268137D01*

+X264781Y268450D01*

+X264800Y268772D01*

+X264781Y269094D01*

+X264706Y269407D01*

+X264582Y269706D01*

+X264414Y269981D01*

+X264204Y270226D01*

+X263959Y270436D01*

+X263684Y270604D01*

+X263385Y270728D01*

+X263072Y270803D01*

+X262750Y270828D01*

+X262428Y270803D01*

+X262115Y270728D01*

+X261816Y270604D01*

+X261541Y270436D01*

+X261296Y270226D01*

+X261086Y269981D01*

+X260938Y269739D01*

+Y282284D01*

+X260976Y282293D01*

+X261275Y282417D01*

+X261550Y282585D01*

+X261795Y282795D01*

+X261984Y283017D01*

+X261978Y282931D01*

+X262003Y282609D01*

+X262078Y282296D01*

+X262202Y281997D01*

+X262370Y281722D01*

+X262580Y281477D01*

+X262825Y281267D01*

+X263100Y281099D01*

+X263399Y280975D01*

+X263712Y280900D01*

+X264034Y280875D01*

+X264356Y280900D01*

+X264669Y280975D01*

+X264968Y281099D01*

+X265243Y281267D01*

+X265488Y281477D01*

+X265698Y281722D01*

+X265866Y281997D01*

+X265990Y282296D01*

+X266065Y282609D01*

+X266084Y282931D01*

+X266065Y283253D01*

+X265990Y283566D01*

+X265866Y283865D01*

+X265698Y284140D01*

+X265488Y284385D01*

+X265243Y284595D01*

+X264968Y284763D01*

+X264669Y284887D01*

+X264356Y284962D01*

+X264034Y284987D01*

+X263712Y284962D01*

+X263399Y284887D01*

+X263100Y284763D01*

+X262825Y284595D01*

+X262580Y284385D01*

+X262386Y284157D01*

+X262391Y284249D01*

+X262372Y284571D01*

+X262297Y284884D01*

+X262173Y285183D01*

+X262005Y285458D01*

+X261795Y285703D01*

+X261550Y285913D01*

+X261275Y286081D01*

+X260976Y286205D01*

+X260938Y286214D01*

+Y290846D01*

+X261076Y290620D01*

+X261286Y290375D01*

+X261531Y290165D01*

+X261806Y289997D01*

+X262105Y289873D01*

+X262418Y289798D01*

+X262740Y289773D01*

+X263062Y289798D01*

+X263375Y289873D01*

+X263674Y289997D01*

+X263949Y290165D01*

+X264194Y290375D01*

+X264404Y290620D01*

+X264572Y290895D01*

+X264696Y291194D01*

+X264771Y291507D01*

+X264790Y291829D01*

+X264771Y292151D01*

+X264696Y292464D01*

+X264572Y292763D01*

+X264404Y293038D01*

+X264194Y293283D01*

+X264019Y293433D01*

+X264174Y293497D01*

+X264449Y293665D01*

+X264694Y293875D01*

+X264904Y294120D01*

+X265072Y294395D01*

+X265196Y294694D01*

+X265246Y294905D01*

+X265479Y294762D01*

+X265778Y294638D01*

+X266091Y294563D01*

+X266413Y294538D01*

+X266735Y294563D01*

+X267048Y294638D01*

+X267347Y294762D01*

+X267622Y294930D01*

+X267867Y295140D01*

+X268077Y295385D01*

+X268245Y295660D01*

+X268369Y295959D01*

+X268444Y296272D01*

+X268463Y296594D01*

+X268444Y296916D01*

+X268428Y296981D01*

+X268444Y296967D01*

+X268719Y296799D01*

+X269018Y296675D01*

+X269331Y296600D01*

+X269438Y296592D01*

+Y233230D01*

+X269383Y233217D01*

+X269121Y233109D01*

+X268880Y232961D01*

+X268664Y232777D01*

+X268480Y232561D01*

+X268332Y232320D01*

+X268224Y232058D01*

+X268158Y231782D01*

+X268135Y231500D01*

+X268158Y231218D01*

+X268224Y230942D01*

+X268332Y230680D01*

+X268480Y230439D01*

+X268664Y230223D01*

+X268880Y230039D01*

+X269121Y229891D01*

+X269383Y229783D01*

+X269438Y229770D01*

+Y200305D01*

+X269159Y200283D01*

+X268883Y200217D01*

+X268621Y200109D01*

+X268380Y199961D01*

+X268164Y199777D01*

+X267980Y199561D01*

+X267832Y199320D01*

+X267724Y199058D01*

+X267658Y198782D01*

+X267635Y198500D01*

+X267658Y198218D01*

+X267724Y197942D01*

+X267832Y197680D01*

+X267980Y197439D01*

+X268164Y197223D01*

+X268380Y197039D01*

+X268621Y196891D01*

+X268883Y196783D01*

+X269159Y196717D01*

+X269438Y196695D01*

+Y187120D01*

+X269289Y187364D01*

+X268849Y187879D01*

+X268334Y188319D01*

+X267757Y188672D01*

+X267132Y188931D01*

+X266474Y189089D01*

+X265799Y189142D01*

+X265124Y189089D01*

+X264466Y188931D01*

+X263841Y188672D01*

+X263264Y188319D01*

+X262749Y187879D01*

+X262309Y187364D01*

+X261956Y186787D01*

+X261697Y186162D01*

+X261539Y185504D01*

+X261486Y184829D01*

+X261539Y184154D01*

+X261697Y183496D01*

+X261956Y182871D01*

+X262309Y182294D01*

+X262749Y181779D01*

+X263264Y181339D01*

+X263841Y180986D01*

+X264466Y180727D01*

+X265124Y180569D01*

+X265799Y180516D01*

+X266474Y180569D01*

+X267132Y180727D01*

+X267757Y180986D01*

+X268334Y181339D01*

+X268849Y181779D01*

+X269289Y182294D01*

+X269438Y182538D01*

+Y177120D01*

+G37*

+G36*

+Y171500D02*X268522D01*

+X268849Y171779D01*

+X269289Y172294D01*

+X269438Y172538D01*

+Y171500D01*

+G37*

+G36*

+X260938D02*X258522D01*

+X258849Y171779D01*

+X259289Y172294D01*

+X259642Y172871D01*

+X259901Y173496D01*

+X260059Y174154D01*

+X260099Y174829D01*

+X260059Y175504D01*

+X259901Y176162D01*

+X259642Y176787D01*

+X259289Y177364D01*

+X258849Y177879D01*

+X258334Y178319D01*

+X257757Y178672D01*

+X257132Y178931D01*

+X256474Y179089D01*

+X255799Y179142D01*

+X255124Y179089D01*

+X254737Y178996D01*

+Y180662D01*

+X255124Y180569D01*

+X255799Y180516D01*

+X256474Y180569D01*

+X257132Y180727D01*

+X257757Y180986D01*

+X258334Y181339D01*

+X258849Y181779D01*

+X259289Y182294D01*

+X259642Y182871D01*

+X259901Y183496D01*

+X260059Y184154D01*

+X260099Y184829D01*

+X260059Y185504D01*

+X259901Y186162D01*

+X259642Y186787D01*

+X259289Y187364D01*

+X258849Y187879D01*

+X258334Y188319D01*

+X257757Y188672D01*

+X257132Y188931D01*

+X256474Y189089D01*

+X255799Y189142D01*

+X255124Y189089D01*

+X254737Y188996D01*

+Y260595D01*

+X254765Y260627D01*

+X254933Y260902D01*

+X255057Y261201D01*

+X255132Y261514D01*

+X255151Y261836D01*

+X255132Y262158D01*

+X255057Y262471D01*

+X254933Y262770D01*

+X254765Y263045D01*

+X254737Y263077D01*

+Y296273D01*

+X254740Y296273D01*

+X255062Y296298D01*

+X255375Y296373D01*

+X255674Y296497D01*

+X255949Y296665D01*

+X256194Y296875D01*

+X256404Y297120D01*

+X256572Y297395D01*

+X256696Y297694D01*

+X256771Y298007D01*

+X256790Y298329D01*

+X256771Y298651D01*

+X256696Y298964D01*

+X256572Y299263D01*

+X256404Y299538D01*

+X256194Y299783D01*

+X255949Y299993D01*

+X255674Y300161D01*

+X255375Y300285D01*

+X255062Y300360D01*

+X254740Y300385D01*

+X254737Y300385D01*

+Y360662D01*

+X255124Y360569D01*

+X255799Y360516D01*

+X256474Y360569D01*

+X257132Y360727D01*

+X257757Y360986D01*

+X258334Y361339D01*

+X258849Y361779D01*

+X259289Y362294D01*

+X259642Y362871D01*

+X259901Y363496D01*

+X260059Y364154D01*

+X260099Y364829D01*

+X260059Y365504D01*

+X259901Y366162D01*

+X259642Y366787D01*

+X259289Y367364D01*

+X258849Y367879D01*

+X258334Y368319D01*

+X257757Y368672D01*

+X257132Y368931D01*

+X256474Y369089D01*

+X255799Y369142D01*

+X255124Y369089D01*

+X254737Y368996D01*

+Y370662D01*

+X255124Y370569D01*

+X255799Y370516D01*

+X256474Y370569D01*

+X257132Y370727D01*

+X257757Y370986D01*

+X258334Y371339D01*

+X258849Y371779D01*

+X259289Y372294D01*

+X259642Y372871D01*

+X259901Y373496D01*

+X260059Y374154D01*

+X260099Y374829D01*

+X260059Y375504D01*

+X259901Y376162D01*

+X259642Y376787D01*

+X259289Y377364D01*

+X258849Y377879D01*

+X258334Y378319D01*

+X257757Y378672D01*

+X257132Y378931D01*

+X256474Y379089D01*

+X255799Y379142D01*

+X255124Y379089D01*

+X254737Y378996D01*

+Y397000D01*

+X260938D01*

+Y318759D01*

+X260850Y318780D01*

+X260568Y318803D01*

+X260286Y318780D01*

+X260010Y318714D01*

+X259748Y318606D01*

+X259507Y318458D01*

+X259291Y318274D01*

+X259107Y318058D01*

+X258959Y317817D01*

+X258851Y317555D01*

+X258785Y317279D01*

+X258762Y316997D01*

+X258785Y316715D01*

+X258851Y316439D01*

+X258959Y316177D01*

+X259107Y315936D01*

+X259291Y315720D01*

+X259507Y315536D01*

+X259748Y315388D01*

+X260010Y315280D01*

+X260286Y315214D01*

+X260568Y315191D01*

+X260850Y315214D01*

+X260938Y315235D01*

+Y309082D01*

+X260682Y308976D01*

+X260441Y308828D01*

+X260225Y308644D01*

+X260041Y308428D01*

+X259893Y308187D01*

+X259785Y307925D01*

+X259719Y307649D01*

+X259696Y307367D01*

+X259719Y307085D01*

+X259785Y306809D01*

+X259893Y306547D01*

+X260041Y306306D01*

+X260225Y306090D01*

+X260441Y305906D01*

+X260682Y305758D01*

+X260938Y305652D01*

+Y292812D01*

+X260908Y292763D01*

+X260784Y292464D01*

+X260709Y292151D01*

+X260684Y291829D01*

+X260709Y291507D01*

+X260784Y291194D01*

+X260908Y290895D01*

+X260938Y290846D01*

+Y286214D01*

+X260663Y286280D01*

+X260341Y286305D01*

+X260019Y286280D01*

+X259706Y286205D01*

+X259407Y286081D01*

+X259132Y285913D01*

+X258887Y285703D01*

+X258677Y285458D01*

+X258509Y285183D01*

+X258385Y284884D01*

+X258310Y284571D01*

+X258285Y284249D01*

+X258310Y283927D01*

+X258385Y283614D01*

+X258509Y283315D01*

+X258677Y283040D01*

+X258887Y282795D01*

+X259132Y282585D01*

+X259407Y282417D01*

+X259706Y282293D01*

+X260019Y282218D01*

+X260341Y282193D01*

+X260663Y282218D01*

+X260938Y282284D01*

+Y269739D01*

+X260918Y269706D01*

+X260794Y269407D01*

+X260719Y269094D01*

+X260694Y268772D01*

+X260719Y268450D01*

+X260794Y268137D01*

+X260918Y267838D01*

+X260938Y267805D01*

+Y193305D01*

+X260659Y193283D01*

+X260383Y193217D01*

+X260121Y193109D01*

+X259880Y192961D01*

+X259664Y192777D01*

+X259480Y192561D01*

+X259332Y192320D01*

+X259224Y192058D01*

+X259158Y191782D01*

+X259135Y191500D01*

+X259158Y191218D01*

+X259224Y190942D01*

+X259332Y190680D01*

+X259480Y190439D01*

+X259664Y190223D01*

+X259880Y190039D01*

+X260121Y189891D01*

+X260383Y189783D01*

+X260659Y189717D01*

+X260938Y189695D01*

+Y171500D01*

+G37*

+G36*

+X254737Y178996D02*X254466Y178931D01*

+X253841Y178672D01*

+X253264Y178319D01*

+X252749Y177879D01*

+X252309Y177364D01*

+X251956Y176787D01*

+X251697Y176162D01*

+X251539Y175504D01*

+X251486Y174829D01*

+X251539Y174154D01*

+X251697Y173496D01*

+X251956Y172871D01*

+X252309Y172294D01*

+X252749Y171779D01*

+X253076Y171500D01*

+X250938D01*

+Y209003D01*

+X251121Y208891D01*

+X251383Y208783D01*

+X251659Y208717D01*

+X251941Y208694D01*

+X252223Y208717D01*

+X252499Y208783D01*

+X252761Y208891D01*

+X253002Y209039D01*

+X253218Y209223D01*

+X253402Y209439D01*

+X253550Y209680D01*

+X253658Y209942D01*

+X253724Y210218D01*

+X253741Y210500D01*

+X253724Y210782D01*

+X253658Y211058D01*

+X253550Y211320D01*

+X253402Y211561D01*

+X253218Y211777D01*

+X253002Y211961D01*

+X252761Y212109D01*

+X252499Y212217D01*

+X252223Y212283D01*

+X251941Y212306D01*

+X251659Y212283D01*

+X251383Y212217D01*

+X251121Y212109D01*

+X250938Y211997D01*

+Y227695D01*

+X250941Y227694D01*

+X251223Y227717D01*

+X251499Y227783D01*

+X251761Y227891D01*

+X252002Y228039D01*

+X252218Y228223D01*

+X252402Y228439D01*

+X252550Y228680D01*

+X252658Y228942D01*

+X252724Y229218D01*

+X252741Y229500D01*

+X252724Y229782D01*

+X252658Y230058D01*

+X252550Y230320D01*

+X252402Y230561D01*

+X252218Y230777D01*

+X252002Y230961D01*

+X251761Y231109D01*

+X251499Y231217D01*

+X251223Y231283D01*

+X250941Y231306D01*

+X250938Y231305D01*

+Y397000D01*

+X254737D01*

+Y378996D01*

+X254466Y378931D01*

+X253841Y378672D01*

+X253264Y378319D01*

+X252749Y377879D01*

+X252309Y377364D01*

+X251956Y376787D01*

+X251697Y376162D01*

+X251539Y375504D01*

+X251486Y374829D01*

+X251539Y374154D01*

+X251697Y373496D01*

+X251956Y372871D01*

+X252309Y372294D01*

+X252749Y371779D01*

+X253264Y371339D01*

+X253841Y370986D01*

+X254466Y370727D01*

+X254737Y370662D01*

+Y368996D01*

+X254466Y368931D01*

+X253841Y368672D01*

+X253264Y368319D01*

+X252749Y367879D01*

+X252309Y367364D01*

+X251956Y366787D01*

+X251697Y366162D01*

+X251539Y365504D01*

+X251486Y364829D01*

+X251539Y364154D01*

+X251697Y363496D01*

+X251956Y362871D01*

+X252309Y362294D01*

+X252749Y361779D01*

+X253264Y361339D01*

+X253841Y360986D01*

+X254466Y360727D01*

+X254737Y360662D01*

+Y300385D01*

+X254418Y300360D01*

+X254105Y300285D01*

+X253806Y300161D01*

+X253531Y299993D01*

+X253286Y299783D01*

+X253076Y299538D01*

+X252908Y299263D01*

+X252784Y298964D01*

+X252709Y298651D01*

+X252684Y298329D01*

+X252709Y298007D01*

+X252784Y297694D01*

+X252908Y297395D01*

+X253076Y297120D01*

+X253286Y296875D01*

+X253531Y296665D01*

+X253806Y296497D01*

+X254105Y296373D01*

+X254418Y296298D01*

+X254737Y296273D01*

+Y263077D01*

+X254555Y263290D01*

+X254310Y263500D01*

+X254035Y263668D01*

+X253736Y263792D01*

+X253423Y263867D01*

+X253101Y263892D01*

+X252779Y263867D01*

+X252466Y263792D01*

+X252167Y263668D01*

+X251892Y263500D01*

+X251647Y263290D01*

+X251437Y263045D01*

+X251269Y262770D01*

+X251145Y262471D01*

+X251070Y262158D01*

+X251045Y261836D01*

+X251070Y261514D01*

+X251145Y261201D01*

+X251269Y260902D01*

+X251437Y260627D01*

+X251647Y260382D01*

+X251892Y260172D01*

+X252167Y260004D01*

+X252466Y259880D01*

+X252779Y259805D01*

+X253101Y259780D01*

+X253423Y259805D01*

+X253736Y259880D01*

+X254035Y260004D01*

+X254310Y260172D01*

+X254555Y260382D01*

+X254737Y260595D01*

+Y188996D01*

+X254466Y188931D01*

+X253841Y188672D01*

+X253264Y188319D01*

+X252749Y187879D01*

+X252309Y187364D01*

+X251956Y186787D01*

+X251697Y186162D01*

+X251539Y185504D01*

+X251486Y184829D01*

+X251539Y184154D01*

+X251697Y183496D01*

+X251956Y182871D01*

+X252309Y182294D01*

+X252749Y181779D01*

+X253264Y181339D01*

+X253841Y180986D01*

+X254466Y180727D01*

+X254737Y180662D01*

+Y178996D01*

+G37*

+G36*

+X250938Y171500D02*X249098D01*

+Y172071D01*

+X249289Y172294D01*

+X249642Y172871D01*

+X249901Y173496D01*

+X250059Y174154D01*

+X250099Y174829D01*

+X250059Y175504D01*

+X249901Y176162D01*

+X249642Y176787D01*

+X249289Y177364D01*

+X249098Y177587D01*

+Y182071D01*

+X249289Y182294D01*

+X249642Y182871D01*

+X249901Y183496D01*

+X250059Y184154D01*

+X250099Y184829D01*

+X250059Y185504D01*

+X249901Y186162D01*

+X249642Y186787D01*

+X249289Y187364D01*

+X249098Y187587D01*

+Y326988D01*

+X249101Y326987D01*

+X249383Y327010D01*

+X249659Y327076D01*

+X249921Y327184D01*

+X250162Y327332D01*

+X250378Y327516D01*

+X250562Y327732D01*

+X250710Y327973D01*

+X250818Y328235D01*

+X250884Y328511D01*

+X250901Y328793D01*

+X250884Y329075D01*

+X250818Y329351D01*

+X250710Y329613D01*

+X250562Y329854D01*

+X250378Y330070D01*

+X250162Y330254D01*

+X249921Y330402D01*

+X249659Y330510D01*

+X249383Y330576D01*

+X249101Y330599D01*

+X249098Y330598D01*

+Y362071D01*

+X249289Y362294D01*

+X249642Y362871D01*

+X249901Y363496D01*

+X250059Y364154D01*

+X250099Y364829D01*

+X250059Y365504D01*

+X249901Y366162D01*

+X249642Y366787D01*

+X249289Y367364D01*

+X249098Y367587D01*

+Y372071D01*

+X249289Y372294D01*

+X249642Y372871D01*

+X249901Y373496D01*

+X250059Y374154D01*

+X250099Y374829D01*

+X250059Y375504D01*

+X249901Y376162D01*

+X249642Y376787D01*

+X249289Y377364D01*

+X249098Y377587D01*

+Y397000D01*

+X250938D01*

+Y231305D01*

+X250659Y231283D01*

+X250383Y231217D01*

+X250121Y231109D01*

+X249880Y230961D01*

+X249664Y230777D01*

+X249480Y230561D01*

+X249332Y230320D01*

+X249224Y230058D01*

+X249158Y229782D01*

+X249135Y229500D01*

+X249158Y229218D01*

+X249224Y228942D01*

+X249332Y228680D01*

+X249480Y228439D01*

+X249664Y228223D01*

+X249880Y228039D01*

+X250121Y227891D01*

+X250383Y227783D01*

+X250659Y227717D01*

+X250938Y227695D01*

+Y211997D01*

+X250880Y211961D01*

+X250664Y211777D01*

+X250480Y211561D01*

+X250332Y211320D01*

+X250224Y211058D01*

+X250158Y210782D01*

+X250135Y210500D01*

+X250158Y210218D01*

+X250224Y209942D01*

+X250332Y209680D01*

+X250480Y209439D01*

+X250664Y209223D01*

+X250880Y209039D01*

+X250938Y209003D01*

+Y171500D01*

+G37*

+G36*

+X249098Y377587D02*X248849Y377879D01*

+X248334Y378319D01*

+X247757Y378672D01*

+X247132Y378931D01*

+X246474Y379089D01*

+X245860Y379137D01*

+Y397000D01*

+X249098D01*

+Y377587D01*

+G37*

+G36*

+Y367587D02*X248849Y367879D01*

+X248334Y368319D01*

+X247757Y368672D01*

+X247132Y368931D01*

+X246474Y369089D01*

+X245860Y369137D01*

+Y370521D01*

+X246474Y370569D01*

+X247132Y370727D01*

+X247757Y370986D01*

+X248334Y371339D01*

+X248849Y371779D01*

+X249098Y372071D01*

+Y367587D01*

+G37*

+G36*

+Y187587D02*X248849Y187879D01*

+X248334Y188319D01*

+X247757Y188672D01*

+X247132Y188931D01*

+X246474Y189089D01*

+X245860Y189137D01*

+Y189719D01*

+X245863Y189718D01*

+X246145Y189741D01*

+X246421Y189807D01*

+X246683Y189915D01*

+X246924Y190063D01*

+X247140Y190247D01*

+X247324Y190463D01*

+X247472Y190704D01*

+X247580Y190966D01*

+X247646Y191242D01*

+X247663Y191524D01*

+X247646Y191806D01*

+X247580Y192082D01*

+X247472Y192344D01*

+X247324Y192585D01*

+X247140Y192801D01*

+X246924Y192985D01*

+X246683Y193133D01*

+X246421Y193241D01*

+X246145Y193307D01*

+X245863Y193330D01*

+X245860Y193329D01*

+Y227792D01*

+X245883Y227783D01*

+X246159Y227717D01*

+X246441Y227694D01*

+X246723Y227717D01*

+X246999Y227783D01*

+X247261Y227891D01*

+X247502Y228039D01*

+X247718Y228223D01*

+X247902Y228439D01*

+X248050Y228680D01*

+X248158Y228942D01*

+X248224Y229218D01*

+X248241Y229500D01*

+X248224Y229782D01*

+X248158Y230058D01*

+X248050Y230320D01*

+X247902Y230561D01*

+X247718Y230777D01*

+X247502Y230961D01*

+X247261Y231109D01*

+X246999Y231217D01*

+X246723Y231283D01*

+X246441Y231306D01*

+X246159Y231283D01*

+X245883Y231217D01*

+X245860Y231208D01*

+Y236556D01*

+X245880Y236539D01*

+X246121Y236391D01*

+X246383Y236283D01*

+X246659Y236217D01*

+X246941Y236194D01*

+X247223Y236217D01*

+X247499Y236283D01*

+X247761Y236391D01*

+X248002Y236539D01*

+X248218Y236723D01*

+X248402Y236939D01*

+X248550Y237180D01*

+X248658Y237442D01*

+X248724Y237718D01*

+X248741Y238000D01*

+X248724Y238282D01*

+X248658Y238558D01*

+X248550Y238820D01*

+X248402Y239061D01*

+X248218Y239277D01*

+X248002Y239461D01*

+X247761Y239609D01*

+X247499Y239717D01*

+X247223Y239783D01*

+X246941Y239806D01*

+X246659Y239783D01*

+X246383Y239717D01*

+X246121Y239609D01*

+X245880Y239461D01*

+X245860Y239444D01*

+Y277476D01*

+X245879Y277477D01*

+X246192Y277552D01*

+X246491Y277676D01*

+X246766Y277844D01*

+X247011Y278054D01*

+X247221Y278299D01*

+X247389Y278574D01*

+X247513Y278873D01*

+X247588Y279186D01*

+X247607Y279508D01*

+X247588Y279830D01*

+X247513Y280143D01*

+X247389Y280442D01*

+X247221Y280717D01*

+X247011Y280962D01*

+X246766Y281172D01*

+X246491Y281340D01*

+X246192Y281464D01*

+X245879Y281539D01*

+X245860Y281540D01*

+Y301454D01*

+X245911Y301422D01*

+X246173Y301314D01*

+X246449Y301248D01*

+X246731Y301225D01*

+X247013Y301248D01*

+X247289Y301314D01*

+X247551Y301422D01*

+X247792Y301570D01*

+X248008Y301754D01*

+X248192Y301970D01*

+X248340Y302211D01*

+X248448Y302473D01*

+X248514Y302749D01*

+X248531Y303031D01*

+X248514Y303313D01*

+X248448Y303589D01*

+X248340Y303851D01*

+X248192Y304092D01*

+X248008Y304308D01*

+X247792Y304492D01*

+X247551Y304640D01*

+X247289Y304748D01*

+X247013Y304814D01*

+X246731Y304837D01*

+X246449Y304814D01*

+X246173Y304748D01*

+X245911Y304640D01*

+X245860Y304608D01*

+Y360521D01*

+X246474Y360569D01*

+X247132Y360727D01*

+X247757Y360986D01*

+X248334Y361339D01*

+X248849Y361779D01*

+X249098Y362071D01*

+Y330598D01*

+X248819Y330576D01*

+X248543Y330510D01*

+X248281Y330402D01*

+X248040Y330254D01*

+X247824Y330070D01*

+X247640Y329854D01*

+X247492Y329613D01*

+X247384Y329351D01*

+X247318Y329075D01*

+X247295Y328793D01*

+X247318Y328511D01*

+X247384Y328235D01*

+X247492Y327973D01*

+X247640Y327732D01*

+X247824Y327516D01*

+X248040Y327332D01*

+X248281Y327184D01*

+X248543Y327076D01*

+X248819Y327010D01*

+X249098Y326988D01*

+Y187587D01*

+G37*

+G36*

+Y177587D02*X248849Y177879D01*

+X248334Y178319D01*

+X247757Y178672D01*

+X247132Y178931D01*

+X246474Y179089D01*

+X245860Y179137D01*

+Y180521D01*

+X246474Y180569D01*

+X247132Y180727D01*

+X247757Y180986D01*

+X248334Y181339D01*

+X248849Y181779D01*

+X249098Y182071D01*

+Y177587D01*

+G37*

+G36*

+Y171500D02*X248522D01*

+X248849Y171779D01*

+X249098Y172071D01*

+Y171500D01*

+G37*

+G36*

+X245860Y379137D02*X245799Y379142D01*

+X245124Y379089D01*

+X244466Y378931D01*

+X243938Y378712D01*

+Y397000D01*

+X245860D01*

+Y379137D01*

+G37*

+G36*

+Y369137D02*X245799Y369142D01*

+X245124Y369089D01*

+X244466Y368931D01*

+X243938Y368712D01*

+Y370946D01*

+X244466Y370727D01*

+X245124Y370569D01*

+X245799Y370516D01*

+X245860Y370521D01*

+Y369137D01*

+G37*

+G36*

+Y281540D02*X245557Y281564D01*

+X245235Y281539D01*

+X244922Y281464D01*

+X244623Y281340D01*

+X244348Y281172D01*

+X244103Y280962D01*

+X243938Y280769D01*

+Y292122D01*

+X244120Y292334D01*

+X244288Y292609D01*

+X244412Y292908D01*

+X244487Y293221D01*

+X244506Y293543D01*

+X244487Y293865D01*

+X244412Y294178D01*

+X244288Y294477D01*

+X244120Y294752D01*

+X243938Y294964D01*

+Y297765D01*

+X244000Y297866D01*

+X244124Y298165D01*

+X244199Y298478D01*

+X244218Y298800D01*

+X244199Y299122D01*

+X244124Y299435D01*

+X244000Y299734D01*

+X243938Y299835D01*

+Y360946D01*

+X244466Y360727D01*

+X245124Y360569D01*

+X245799Y360516D01*

+X245860Y360521D01*

+Y304608D01*

+X245670Y304492D01*

+X245454Y304308D01*

+X245270Y304092D01*

+X245122Y303851D01*

+X245014Y303589D01*

+X244948Y303313D01*

+X244925Y303031D01*

+X244948Y302749D01*

+X245014Y302473D01*

+X245122Y302211D01*

+X245270Y301970D01*

+X245454Y301754D01*

+X245670Y301570D01*

+X245860Y301454D01*

+Y281540D01*

+G37*

+G36*

+Y189137D02*X245799Y189142D01*

+X245124Y189089D01*

+X244466Y188931D01*

+X243938Y188712D01*

+Y200195D01*

+X243941Y200194D01*

+X244223Y200217D01*

+X244499Y200283D01*

+X244761Y200391D01*

+X245002Y200539D01*

+X245218Y200723D01*

+X245402Y200939D01*

+X245550Y201180D01*

+X245658Y201442D01*

+X245724Y201718D01*

+X245741Y202000D01*

+X245724Y202282D01*

+X245658Y202558D01*

+X245550Y202820D01*

+X245402Y203061D01*

+X245218Y203277D01*

+X245002Y203461D01*

+X244761Y203609D01*

+X244499Y203717D01*

+X244223Y203783D01*

+X243941Y203806D01*

+X243938Y203805D01*

+Y228498D01*

+X244050Y228680D01*

+X244158Y228942D01*

+X244224Y229218D01*

+X244241Y229500D01*

+X244224Y229782D01*

+X244158Y230058D01*

+X244050Y230320D01*

+X243938Y230502D01*

+Y278247D01*

+X244103Y278054D01*

+X244348Y277844D01*

+X244623Y277676D01*

+X244922Y277552D01*

+X245235Y277477D01*

+X245557Y277452D01*

+X245860Y277476D01*

+Y239444D01*

+X245664Y239277D01*

+X245480Y239061D01*

+X245332Y238820D01*

+X245224Y238558D01*

+X245158Y238282D01*

+X245135Y238000D01*

+X245158Y237718D01*

+X245224Y237442D01*

+X245332Y237180D01*

+X245480Y236939D01*

+X245664Y236723D01*

+X245860Y236556D01*

+Y231208D01*

+X245621Y231109D01*

+X245380Y230961D01*

+X245164Y230777D01*

+X244980Y230561D01*

+X244832Y230320D01*

+X244724Y230058D01*

+X244658Y229782D01*

+X244635Y229500D01*

+X244658Y229218D01*

+X244724Y228942D01*

+X244832Y228680D01*

+X244980Y228439D01*

+X245164Y228223D01*

+X245380Y228039D01*

+X245621Y227891D01*

+X245860Y227792D01*

+Y193329D01*

+X245581Y193307D01*

+X245305Y193241D01*

+X245043Y193133D01*

+X244802Y192985D01*

+X244586Y192801D01*

+X244402Y192585D01*

+X244254Y192344D01*

+X244146Y192082D01*

+X244080Y191806D01*

+X244057Y191524D01*

+X244080Y191242D01*

+X244146Y190966D01*

+X244254Y190704D01*

+X244402Y190463D01*

+X244586Y190247D01*

+X244802Y190063D01*

+X245043Y189915D01*

+X245305Y189807D01*

+X245581Y189741D01*

+X245860Y189719D01*

+Y189137D01*

+G37*

+G36*

+Y179137D02*X245799Y179142D01*

+X245124Y179089D01*

+X244466Y178931D01*

+X243938Y178712D01*

+Y180946D01*

+X244466Y180727D01*

+X245124Y180569D01*

+X245799Y180516D01*

+X245860Y180521D01*

+Y179137D01*

+G37*

+G36*

+X240388Y397000D02*X243938D01*

+Y378712D01*

+X243841Y378672D01*

+X243264Y378319D01*

+X242749Y377879D01*

+X242309Y377364D01*

+X241956Y376787D01*

+X241697Y376162D01*

+X241539Y375504D01*

+X241486Y374829D01*

+X241539Y374154D01*

+X241697Y373496D01*

+X241956Y372871D01*

+X242309Y372294D01*

+X242749Y371779D01*

+X243264Y371339D01*

+X243841Y370986D01*

+X243938Y370946D01*

+Y368712D01*

+X243841Y368672D01*

+X243264Y368319D01*

+X242749Y367879D01*

+X242309Y367364D01*

+X241956Y366787D01*

+X241697Y366162D01*

+X241539Y365504D01*

+X241486Y364829D01*

+X241539Y364154D01*

+X241697Y363496D01*

+X241956Y362871D01*

+X242309Y362294D01*

+X242749Y361779D01*

+X243264Y361339D01*

+X243841Y360986D01*

+X243938Y360946D01*

+Y299835D01*

+X243832Y300009D01*

+X243622Y300254D01*

+X243377Y300464D01*

+X243102Y300632D01*

+X242803Y300756D01*

+X242490Y300831D01*

+X242168Y300856D01*

+X241846Y300831D01*

+X241533Y300756D01*

+X241234Y300632D01*

+X240959Y300464D01*

+X240714Y300254D01*

+X240504Y300009D01*

+X240388Y299819D01*

+Y397000D01*

+G37*

+G36*

+X243938Y178712D02*X243841Y178672D01*

+X243264Y178319D01*

+X242749Y177879D01*

+X242309Y177364D01*

+X241956Y176787D01*

+X241697Y176162D01*

+X241539Y175504D01*

+X241486Y174829D01*

+X241539Y174154D01*

+X241697Y173496D01*

+X241956Y172871D01*

+X242309Y172294D01*

+X242749Y171779D01*

+X243076Y171500D01*

+X240388D01*

+Y260496D01*

+X240511Y260571D01*

+X240756Y260781D01*

+X240966Y261026D01*

+X241134Y261301D01*

+X241258Y261600D01*

+X241333Y261913D01*

+X241352Y262235D01*

+X241333Y262557D01*

+X241258Y262870D01*

+X241134Y263169D01*

+X240966Y263444D01*

+X240756Y263689D01*

+X240511Y263899D01*

+X240388Y263974D01*

+Y276759D01*

+X240391Y276758D01*

+X240673Y276781D01*

+X240949Y276847D01*

+X241211Y276955D01*

+X241452Y277103D01*

+X241668Y277287D01*

+X241852Y277503D01*

+X242000Y277744D01*

+X242108Y278006D01*

+X242174Y278282D01*

+X242191Y278564D01*

+X242174Y278846D01*

+X242108Y279122D01*

+X242000Y279384D01*

+X241852Y279625D01*

+X241668Y279841D01*

+X241452Y280025D01*

+X241211Y280173D01*

+X240949Y280281D01*

+X240673Y280347D01*

+X240391Y280370D01*

+X240388Y280369D01*

+Y297781D01*

+X240504Y297591D01*

+X240714Y297346D01*

+X240959Y297136D01*

+X241234Y296968D01*

+X241533Y296844D01*

+X241846Y296769D01*

+X242168Y296744D01*

+X242490Y296769D01*

+X242803Y296844D01*

+X243102Y296968D01*

+X243377Y297136D01*

+X243622Y297346D01*

+X243832Y297591D01*

+X243938Y297765D01*

+Y294964D01*

+X243910Y294997D01*

+X243665Y295207D01*

+X243390Y295375D01*

+X243091Y295499D01*

+X242778Y295574D01*

+X242456Y295599D01*

+X242134Y295574D01*

+X241821Y295499D01*

+X241522Y295375D01*

+X241247Y295207D01*

+X241002Y294997D01*

+X240792Y294752D01*

+X240624Y294477D01*

+X240500Y294178D01*

+X240425Y293865D01*

+X240400Y293543D01*

+X240425Y293221D01*

+X240500Y292908D01*

+X240624Y292609D01*

+X240792Y292334D01*

+X241002Y292089D01*

+X241247Y291879D01*

+X241522Y291711D01*

+X241821Y291587D01*

+X242134Y291512D01*

+X242456Y291487D01*

+X242778Y291512D01*

+X243091Y291587D01*

+X243390Y291711D01*

+X243665Y291879D01*

+X243910Y292089D01*

+X243938Y292122D01*

+Y280769D01*

+X243893Y280717D01*

+X243725Y280442D01*

+X243601Y280143D01*

+X243526Y279830D01*

+X243501Y279508D01*

+X243526Y279186D01*

+X243601Y278873D01*

+X243725Y278574D01*

+X243893Y278299D01*

+X243938Y278247D01*

+Y230502D01*

+X243902Y230561D01*

+X243718Y230777D01*

+X243502Y230961D01*

+X243261Y231109D01*

+X242999Y231217D01*

+X242723Y231283D01*

+X242441Y231306D01*

+X242159Y231283D01*

+X241883Y231217D01*

+X241621Y231109D01*

+X241380Y230961D01*

+X241164Y230777D01*

+X240980Y230561D01*

+X240832Y230320D01*

+X240724Y230058D01*

+X240658Y229782D01*

+X240635Y229500D01*

+X240658Y229218D01*

+X240724Y228942D01*

+X240832Y228680D01*

+X240980Y228439D01*

+X241164Y228223D01*

+X241380Y228039D01*

+X241621Y227891D01*

+X241883Y227783D01*

+X242159Y227717D01*

+X242441Y227694D01*

+X242723Y227717D01*

+X242999Y227783D01*

+X243261Y227891D01*

+X243502Y228039D01*

+X243718Y228223D01*

+X243902Y228439D01*

+X243938Y228498D01*

+Y203805D01*

+X243659Y203783D01*

+X243383Y203717D01*

+X243121Y203609D01*

+X242880Y203461D01*

+X242664Y203277D01*

+X242480Y203061D01*

+X242332Y202820D01*

+X242224Y202558D01*

+X242158Y202282D01*

+X242135Y202000D01*

+X242158Y201718D01*

+X242224Y201442D01*

+X242332Y201180D01*

+X242480Y200939D01*

+X242664Y200723D01*

+X242880Y200539D01*

+X243121Y200391D01*

+X243383Y200283D01*

+X243659Y200217D01*

+X243938Y200195D01*

+Y188712D01*

+X243841Y188672D01*

+X243264Y188319D01*

+X242749Y187879D01*

+X242309Y187364D01*

+X241956Y186787D01*

+X241697Y186162D01*

+X241539Y185504D01*

+X241486Y184829D01*

+X241539Y184154D01*

+X241697Y183496D01*

+X241956Y182871D01*

+X242309Y182294D01*

+X242749Y181779D01*

+X243264Y181339D01*

+X243841Y180986D01*

+X243938Y180946D01*

+Y178712D01*

+G37*

+G36*

+X240388Y171500D02*X238522D01*

+X238849Y171779D01*

+X239289Y172294D01*

+X239642Y172871D01*

+X239901Y173496D01*

+X240059Y174154D01*

+X240099Y174829D01*

+X240059Y175504D01*

+X239901Y176162D01*

+X239642Y176787D01*

+X239289Y177364D01*

+X238849Y177879D01*

+X238334Y178319D01*

+X237757Y178672D01*

+X237132Y178931D01*

+X236474Y179089D01*

+X236438Y179092D01*

+Y180566D01*

+X236474Y180569D01*

+X237132Y180727D01*

+X237757Y180986D01*

+X238334Y181339D01*

+X238849Y181779D01*

+X239289Y182294D01*

+X239642Y182871D01*

+X239901Y183496D01*

+X240059Y184154D01*

+X240099Y184829D01*

+X240059Y185504D01*

+X239901Y186162D01*

+X239642Y186787D01*

+X239289Y187364D01*

+X238849Y187879D01*

+X238334Y188319D01*

+X237757Y188672D01*

+X237132Y188931D01*

+X236474Y189089D01*

+X236438Y189092D01*

+Y193066D01*

+X236474Y193069D01*

+X237132Y193227D01*

+X237757Y193486D01*

+X238334Y193839D01*

+X238849Y194279D01*

+X239289Y194794D01*

+X239642Y195371D01*

+X239901Y195996D01*

+X240059Y196654D01*

+X240099Y197329D01*

+X240059Y198004D01*

+X239901Y198662D01*

+X239642Y199287D01*

+X239289Y199864D01*

+X238849Y200379D01*

+X238334Y200819D01*

+X237757Y201172D01*

+X237132Y201431D01*

+X236474Y201589D01*

+X236438Y201592D01*

+Y233695D01*

+X236441Y233694D01*

+X236723Y233717D01*

+X236999Y233783D01*

+X237261Y233891D01*

+X237502Y234039D01*

+X237718Y234223D01*

+X237902Y234439D01*

+X238050Y234680D01*

+X238158Y234942D01*

+X238224Y235218D01*

+X238241Y235500D01*

+X238224Y235782D01*

+X238158Y236058D01*

+X238050Y236320D01*

+X237902Y236561D01*

+X237718Y236777D01*

+X237502Y236961D01*

+X237261Y237109D01*

+X236999Y237217D01*

+X236723Y237283D01*

+X236441Y237306D01*

+X236438Y237305D01*

+Y360566D01*

+X236474Y360569D01*

+X237132Y360727D01*

+X237757Y360986D01*

+X238334Y361339D01*

+X238849Y361779D01*

+X239289Y362294D01*

+X239642Y362871D01*

+X239901Y363496D01*

+X240059Y364154D01*

+X240099Y364829D01*

+X240059Y365504D01*

+X239901Y366162D01*

+X239642Y366787D01*

+X239289Y367364D01*

+X238849Y367879D01*

+X238334Y368319D01*

+X237757Y368672D01*

+X237132Y368931D01*

+X236474Y369089D01*

+X236438Y369092D01*

+Y370566D01*

+X236474Y370569D01*

+X237132Y370727D01*

+X237757Y370986D01*

+X238334Y371339D01*

+X238849Y371779D01*

+X239289Y372294D01*

+X239642Y372871D01*

+X239901Y373496D01*

+X240059Y374154D01*

+X240099Y374829D01*

+X240059Y375504D01*

+X239901Y376162D01*

+X239642Y376787D01*

+X239289Y377364D01*

+X238849Y377879D01*

+X238334Y378319D01*

+X237757Y378672D01*

+X237132Y378931D01*

+X236474Y379089D01*

+X236438Y379092D01*

+Y397000D01*

+X240388D01*

+Y299819D01*

+X240336Y299734D01*

+X240212Y299435D01*

+X240137Y299122D01*

+X240112Y298800D01*

+X240137Y298478D01*

+X240212Y298165D01*

+X240336Y297866D01*

+X240388Y297781D01*

+Y280369D01*

+X240109Y280347D01*

+X239833Y280281D01*

+X239571Y280173D01*

+X239330Y280025D01*

+X239114Y279841D01*

+X238930Y279625D01*

+X238782Y279384D01*

+X238674Y279122D01*

+X238608Y278846D01*

+X238585Y278564D01*

+X238608Y278282D01*

+X238674Y278006D01*

+X238782Y277744D01*

+X238930Y277503D01*

+X239114Y277287D01*

+X239330Y277103D01*

+X239571Y276955D01*

+X239833Y276847D01*

+X240109Y276781D01*

+X240388Y276759D01*

+Y263974D01*

+X240236Y264067D01*

+X239937Y264191D01*

+X239624Y264266D01*

+X239302Y264291D01*

+X238980Y264266D01*

+X238667Y264191D01*

+X238368Y264067D01*

+X238093Y263899D01*

+X237848Y263689D01*

+X237638Y263444D01*

+X237470Y263169D01*

+X237346Y262870D01*

+X237271Y262557D01*

+X237246Y262235D01*

+X237271Y261913D01*

+X237346Y261600D01*

+X237470Y261301D01*

+X237638Y261026D01*

+X237848Y260781D01*

+X238093Y260571D01*

+X238368Y260403D01*

+X238667Y260279D01*

+X238980Y260204D01*

+X239302Y260179D01*

+X239624Y260204D01*

+X239937Y260279D01*

+X240236Y260403D01*

+X240388Y260496D01*

+Y171500D01*

+G37*

+G36*

+X236438Y179092D02*X235799Y179142D01*

+X235124Y179089D01*

+X234466Y178931D01*

+X233841Y178672D01*

+X233264Y178319D01*

+X232749Y177879D01*

+X232309Y177364D01*

+X231956Y176787D01*

+X231697Y176162D01*

+X231539Y175504D01*

+X231486Y174829D01*

+X231539Y174154D01*

+X231697Y173496D01*

+X231956Y172871D01*

+X232309Y172294D01*

+X232749Y171779D01*

+X233076Y171500D01*

+X230438D01*

+Y245195D01*

+X230441Y245194D01*

+X230723Y245217D01*

+X230999Y245283D01*

+X231261Y245391D01*

+X231502Y245539D01*

+X231718Y245723D01*

+X231902Y245939D01*

+X232050Y246180D01*

+X232158Y246442D01*

+X232224Y246718D01*

+X232241Y247000D01*

+X232224Y247282D01*

+X232158Y247558D01*

+X232050Y247820D01*

+X231902Y248061D01*

+X231718Y248277D01*

+X231502Y248461D01*

+X231261Y248609D01*

+X230999Y248717D01*

+X230723Y248783D01*

+X230441Y248806D01*

+X230438Y248805D01*

+Y291195D01*

+X230441Y291194D01*

+X230723Y291217D01*

+X230999Y291283D01*

+X231261Y291391D01*

+X231502Y291539D01*

+X231718Y291723D01*

+X231902Y291939D01*

+X232050Y292180D01*

+X232158Y292442D01*

+X232224Y292718D01*

+X232241Y293000D01*

+X232224Y293282D01*

+X232158Y293558D01*

+X232050Y293820D01*

+X231902Y294061D01*

+X231718Y294277D01*

+X231502Y294461D01*

+X231261Y294609D01*

+X230999Y294717D01*

+X230723Y294783D01*

+X230441Y294806D01*

+X230438Y294805D01*

+Y353297D01*

+X230638Y353379D01*

+X230879Y353527D01*

+X231095Y353711D01*

+X231279Y353927D01*

+X231427Y354168D01*

+X231535Y354430D01*

+X231601Y354706D01*

+X231618Y354988D01*

+X231601Y355270D01*

+X231535Y355546D01*

+X231427Y355808D01*

+X231279Y356049D01*

+X231095Y356265D01*

+X230879Y356449D01*

+X230638Y356597D01*

+X230438Y356679D01*

+Y397000D01*

+X236438D01*

+Y379092D01*

+X235799Y379142D01*

+X235124Y379089D01*

+X234466Y378931D01*

+X233841Y378672D01*

+X233264Y378319D01*

+X232749Y377879D01*

+X232309Y377364D01*

+X231956Y376787D01*

+X231697Y376162D01*

+X231539Y375504D01*

+X231486Y374829D01*

+X231539Y374154D01*

+X231697Y373496D01*

+X231956Y372871D01*

+X232309Y372294D01*

+X232749Y371779D01*

+X233264Y371339D01*

+X233841Y370986D01*

+X234466Y370727D01*

+X235124Y370569D01*

+X235799Y370516D01*

+X236438Y370566D01*

+Y369092D01*

+X235799Y369142D01*

+X235124Y369089D01*

+X234466Y368931D01*

+X233841Y368672D01*

+X233264Y368319D01*

+X232749Y367879D01*

+X232309Y367364D01*

+X231956Y366787D01*

+X231697Y366162D01*

+X231539Y365504D01*

+X231486Y364829D01*

+X231539Y364154D01*

+X231697Y363496D01*

+X231956Y362871D01*

+X232309Y362294D01*

+X232749Y361779D01*

+X233264Y361339D01*

+X233841Y360986D01*

+X234466Y360727D01*

+X235124Y360569D01*

+X235799Y360516D01*

+X236438Y360566D01*

+Y237305D01*

+X236159Y237283D01*

+X235883Y237217D01*

+X235621Y237109D01*

+X235380Y236961D01*

+X235164Y236777D01*

+X234980Y236561D01*

+X234832Y236320D01*

+X234724Y236058D01*

+X234658Y235782D01*

+X234635Y235500D01*

+X234658Y235218D01*

+X234724Y234942D01*

+X234832Y234680D01*

+X234980Y234439D01*

+X235164Y234223D01*

+X235380Y234039D01*

+X235621Y233891D01*

+X235883Y233783D01*

+X236159Y233717D01*

+X236438Y233695D01*

+Y201592D01*

+X235799Y201642D01*

+X235124Y201589D01*

+X234466Y201431D01*

+X233841Y201172D01*

+X233264Y200819D01*

+X232749Y200379D01*

+X232309Y199864D01*

+X231956Y199287D01*

+X231697Y198662D01*

+X231539Y198004D01*

+X231486Y197329D01*

+X231539Y196654D01*

+X231697Y195996D01*

+X231956Y195371D01*

+X232309Y194794D01*

+X232749Y194279D01*

+X233264Y193839D01*

+X233841Y193486D01*

+X234466Y193227D01*

+X235124Y193069D01*

+X235799Y193016D01*

+X236438Y193066D01*

+Y189092D01*

+X235799Y189142D01*

+X235124Y189089D01*

+X234466Y188931D01*

+X233841Y188672D01*

+X233264Y188319D01*

+X232749Y187879D01*

+X232309Y187364D01*

+X231956Y186787D01*

+X231697Y186162D01*

+X231539Y185504D01*

+X231486Y184829D01*

+X231539Y184154D01*

+X231697Y183496D01*

+X231956Y182871D01*

+X232309Y182294D01*

+X232749Y181779D01*

+X233264Y181339D01*

+X233841Y180986D01*

+X234466Y180727D01*

+X235124Y180569D01*

+X235799Y180516D01*

+X236438Y180566D01*

+Y179092D01*

+G37*

+G36*

+X223660Y250375D02*X223883Y250283D01*

+X224121Y250226D01*

+X223980Y250061D01*

+X223832Y249820D01*

+X223724Y249558D01*

+X223660Y249291D01*

+Y250375D01*

+G37*

+G36*

+X230438Y171500D02*X228522D01*

+X228849Y171779D01*

+X229289Y172294D01*

+X229642Y172871D01*

+X229901Y173496D01*

+X230059Y174154D01*

+X230099Y174829D01*

+X230059Y175504D01*

+X229901Y176162D01*

+X229642Y176787D01*

+X229289Y177364D01*

+X228849Y177879D01*

+X228334Y178319D01*

+X227757Y178672D01*

+X227132Y178931D01*

+X226474Y179089D01*

+X225799Y179142D01*

+X225124Y179089D01*

+X224466Y178931D01*

+X223841Y178672D01*

+X223660Y178561D01*

+Y181097D01*

+X223841Y180986D01*

+X224466Y180727D01*

+X225124Y180569D01*

+X225799Y180516D01*

+X226474Y180569D01*

+X227132Y180727D01*

+X227757Y180986D01*

+X228334Y181339D01*

+X228849Y181779D01*

+X229289Y182294D01*

+X229642Y182871D01*

+X229901Y183496D01*

+X230059Y184154D01*

+X230099Y184829D01*

+X230059Y185504D01*

+X229901Y186162D01*

+X229642Y186787D01*

+X229289Y187364D01*

+X228849Y187879D01*

+X228334Y188319D01*

+X227757Y188672D01*

+X227132Y188931D01*

+X226474Y189089D01*

+X225799Y189142D01*

+X225124Y189089D01*

+X224466Y188931D01*

+X223841Y188672D01*

+X223660Y188561D01*

+Y193597D01*

+X223841Y193486D01*

+X224466Y193227D01*

+X225124Y193069D01*

+X225799Y193016D01*

+X226474Y193069D01*

+X227132Y193227D01*

+X227757Y193486D01*

+X228334Y193839D01*

+X228849Y194279D01*

+X229289Y194794D01*

+X229642Y195371D01*

+X229901Y195996D01*

+X230059Y196654D01*

+X230099Y197329D01*

+X230059Y198004D01*

+X229901Y198662D01*

+X229642Y199287D01*

+X229289Y199864D01*

+X228849Y200379D01*

+X228334Y200819D01*

+X227757Y201172D01*

+X227132Y201431D01*

+X226474Y201589D01*

+X225799Y201642D01*

+X225124Y201589D01*

+X224466Y201431D01*

+X223841Y201172D01*

+X223660Y201061D01*

+Y219229D01*

+X223664Y219223D01*

+X223880Y219039D01*

+X224121Y218891D01*

+X224383Y218783D01*

+X224659Y218717D01*

+X224941Y218694D01*

+X225223Y218717D01*

+X225499Y218783D01*

+X225761Y218891D01*

+X226002Y219039D01*

+X226218Y219223D01*

+X226402Y219439D01*

+X226550Y219680D01*

+X226658Y219942D01*

+X226724Y220218D01*

+X226741Y220500D01*

+X226724Y220782D01*

+X226658Y221058D01*

+X226550Y221320D01*

+X226402Y221561D01*

+X226218Y221777D01*

+X226002Y221961D01*

+X225761Y222109D01*

+X225499Y222217D01*

+X225223Y222283D01*

+X224941Y222306D01*

+X224659Y222283D01*

+X224383Y222217D01*

+X224121Y222109D01*

+X223880Y221961D01*

+X223664Y221777D01*

+X223660Y221771D01*

+Y226209D01*

+X223724Y225942D01*

+X223832Y225680D01*

+X223980Y225439D01*

+X224164Y225223D01*

+X224380Y225039D01*

+X224621Y224891D01*

+X224883Y224783D01*

+X225159Y224717D01*

+X225441Y224694D01*

+X225723Y224717D01*

+X225999Y224783D01*

+X226261Y224891D01*

+X226502Y225039D01*

+X226718Y225223D01*

+X226902Y225439D01*

+X227050Y225680D01*

+X227158Y225942D01*

+X227224Y226218D01*

+X227241Y226500D01*

+X227224Y226782D01*

+X227158Y227058D01*

+X227050Y227320D01*

+X226902Y227561D01*

+X226718Y227777D01*

+X226502Y227961D01*

+X226261Y228109D01*

+X225999Y228217D01*

+X225723Y228283D01*

+X225441Y228306D01*

+X225159Y228283D01*

+X224883Y228217D01*

+X224621Y228109D01*

+X224380Y227961D01*

+X224164Y227777D01*

+X223980Y227561D01*

+X223832Y227320D01*

+X223724Y227058D01*

+X223660Y226791D01*

+Y234229D01*

+X223664Y234223D01*

+X223880Y234039D01*

+X224121Y233891D01*

+X224383Y233783D01*

+X224659Y233717D01*

+X224941Y233694D01*

+X225223Y233717D01*

+X225499Y233783D01*

+X225761Y233891D01*

+X226002Y234039D01*

+X226218Y234223D01*

+X226402Y234439D01*

+X226550Y234680D01*

+X226658Y234942D01*

+X226724Y235218D01*

+X226741Y235500D01*

+X226724Y235782D01*

+X226658Y236058D01*

+X226550Y236320D01*

+X226402Y236561D01*

+X226218Y236777D01*

+X226002Y236961D01*

+X225761Y237109D01*

+X225499Y237217D01*

+X225223Y237283D01*

+X224941Y237306D01*

+X224659Y237283D01*

+X224383Y237217D01*

+X224121Y237109D01*

+X223880Y236961D01*

+X223664Y236777D01*

+X223660Y236771D01*

+Y242375D01*

+X223883Y242283D01*

+X224159Y242217D01*

+X224441Y242194D01*

+X224723Y242217D01*

+X224999Y242283D01*

+X225261Y242391D01*

+X225502Y242539D01*

+X225718Y242723D01*

+X225902Y242939D01*

+X226050Y243180D01*

+X226158Y243442D01*

+X226224Y243718D01*

+X226241Y244000D01*

+X226224Y244282D01*

+X226158Y244558D01*

+X226050Y244820D01*

+X225902Y245061D01*

+X225718Y245277D01*

+X225502Y245461D01*

+X225261Y245609D01*

+X224999Y245717D01*

+X224723Y245783D01*

+X224441Y245806D01*

+X224159Y245783D01*

+X223883Y245717D01*

+X223660Y245625D01*

+Y248709D01*

+X223724Y248442D01*

+X223832Y248180D01*

+X223980Y247939D01*

+X224164Y247723D01*

+X224380Y247539D01*

+X224621Y247391D01*

+X224883Y247283D01*

+X225159Y247217D01*

+X225441Y247194D01*

+X225723Y247217D01*

+X225999Y247283D01*

+X226261Y247391D01*

+X226502Y247539D01*

+X226718Y247723D01*

+X226902Y247939D01*

+X227050Y248180D01*

+X227158Y248442D01*

+X227224Y248718D01*

+X227241Y249000D01*

+X227224Y249282D01*

+X227158Y249558D01*

+X227050Y249820D01*

+X226902Y250061D01*

+X226718Y250277D01*

+X226502Y250461D01*

+X226261Y250609D01*

+X225999Y250717D01*

+X225761Y250774D01*

+X225902Y250939D01*

+X226050Y251180D01*

+X226158Y251442D01*

+X226224Y251718D01*

+X226241Y252000D01*

+X226224Y252282D01*

+X226158Y252558D01*

+X226050Y252820D01*

+X225902Y253061D01*

+X225718Y253277D01*

+X225502Y253461D01*

+X225261Y253609D01*

+X224999Y253717D01*

+X224723Y253783D01*

+X224441Y253806D01*

+X224159Y253783D01*

+X223883Y253717D01*

+X223660Y253625D01*

+Y253686D01*

+X223667Y253718D01*

+X223684Y254000D01*

+X223667Y254282D01*

+X223660Y254314D01*

+Y361097D01*

+X223841Y360986D01*

+X224466Y360727D01*

+X225124Y360569D01*

+X225799Y360516D01*

+X226474Y360569D01*

+X227132Y360727D01*

+X227757Y360986D01*

+X228334Y361339D01*

+X228849Y361779D01*

+X229289Y362294D01*

+X229642Y362871D01*

+X229901Y363496D01*

+X230059Y364154D01*

+X230099Y364829D01*

+X230059Y365504D01*

+X229901Y366162D01*

+X229642Y366787D01*

+X229289Y367364D01*

+X228849Y367879D01*

+X228334Y368319D01*

+X227757Y368672D01*

+X227132Y368931D01*

+X226474Y369089D01*

+X225799Y369142D01*

+X225124Y369089D01*

+X224466Y368931D01*

+X223841Y368672D01*

+X223660Y368561D01*

+Y371097D01*

+X223841Y370986D01*

+X224466Y370727D01*

+X225124Y370569D01*

+X225799Y370516D01*

+X226474Y370569D01*

+X227132Y370727D01*

+X227757Y370986D01*

+X228334Y371339D01*

+X228849Y371779D01*

+X229289Y372294D01*

+X229642Y372871D01*

+X229901Y373496D01*

+X230059Y374154D01*

+X230099Y374829D01*

+X230059Y375504D01*

+X229901Y376162D01*

+X229642Y376787D01*

+X229289Y377364D01*

+X228849Y377879D01*

+X228334Y378319D01*

+X227757Y378672D01*

+X227132Y378931D01*

+X226474Y379089D01*

+X225799Y379142D01*

+X225124Y379089D01*

+X224466Y378931D01*

+X223841Y378672D01*

+X223660Y378561D01*

+Y397000D01*

+X230438D01*

+Y356679D01*

+X230376Y356705D01*

+X230100Y356771D01*

+X229818Y356794D01*

+X229536Y356771D01*

+X229260Y356705D01*

+X228998Y356597D01*

+X228757Y356449D01*

+X228541Y356265D01*

+X228357Y356049D01*

+X228209Y355808D01*

+X228101Y355546D01*

+X228035Y355270D01*

+X228012Y354988D01*

+X228035Y354706D01*

+X228101Y354430D01*

+X228209Y354168D01*

+X228357Y353927D01*

+X228541Y353711D01*

+X228757Y353527D01*

+X228998Y353379D01*

+X229260Y353271D01*

+X229536Y353205D01*

+X229818Y353182D01*

+X230100Y353205D01*

+X230376Y353271D01*

+X230438Y353297D01*

+Y294805D01*

+X230159Y294783D01*

+X229883Y294717D01*

+X229621Y294609D01*

+X229380Y294461D01*

+X229164Y294277D01*

+X228980Y294061D01*

+X228832Y293820D01*

+X228724Y293558D01*

+X228658Y293282D01*

+X228635Y293000D01*

+X228658Y292718D01*

+X228724Y292442D01*

+X228832Y292180D01*

+X228980Y291939D01*

+X229164Y291723D01*

+X229380Y291539D01*

+X229621Y291391D01*

+X229883Y291283D01*

+X230159Y291217D01*

+X230438Y291195D01*

+Y248805D01*

+X230159Y248783D01*

+X229883Y248717D01*

+X229621Y248609D01*

+X229380Y248461D01*

+X229164Y248277D01*

+X228980Y248061D01*

+X228832Y247820D01*

+X228724Y247558D01*

+X228658Y247282D01*

+X228635Y247000D01*

+X228658Y246718D01*

+X228724Y246442D01*

+X228832Y246180D01*

+X228980Y245939D01*

+X229164Y245723D01*

+X229380Y245539D01*

+X229621Y245391D01*

+X229883Y245283D01*

+X230159Y245217D01*

+X230438Y245195D01*

+Y171500D01*

+G37*

+G36*

+X223660Y253625D02*X223643Y253618D01*

+X223660Y253686D01*

+Y253625D01*

+G37*

+G36*

+X181938Y172913D02*X181956Y172871D01*

+X182309Y172294D01*

+X182749Y171779D01*

+X183076Y171500D01*

+X181938D01*

+Y172913D01*

+G37*

+G36*

+X223660Y178561D02*X223264Y178319D01*

+X222749Y177879D01*

+X222309Y177364D01*

+X221956Y176787D01*

+X221697Y176162D01*

+X221539Y175504D01*

+X221486Y174829D01*

+X221539Y174154D01*

+X221697Y173496D01*

+X221956Y172871D01*

+X222309Y172294D01*

+X222749Y171779D01*

+X223076Y171500D01*

+X219438D01*

+Y172538D01*

+X219642Y172871D01*

+X219901Y173496D01*

+X220059Y174154D01*

+X220099Y174829D01*

+X220059Y175504D01*

+X219901Y176162D01*

+X219642Y176787D01*

+X219438Y177120D01*

+Y182538D01*

+X219642Y182871D01*

+X219901Y183496D01*

+X220059Y184154D01*

+X220099Y184829D01*

+X220059Y185504D01*

+X219901Y186162D01*

+X219642Y186787D01*

+X219438Y187120D01*

+Y195038D01*

+X219642Y195371D01*

+X219901Y195996D01*

+X220059Y196654D01*

+X220099Y197329D01*

+X220059Y198004D01*

+X219901Y198662D01*

+X219642Y199287D01*

+X219438Y199620D01*

+Y213503D01*

+X219621Y213391D01*

+X219883Y213283D01*

+X220159Y213217D01*

+X220441Y213194D01*

+X220723Y213217D01*

+X220999Y213283D01*

+X221261Y213391D01*

+X221502Y213539D01*

+X221718Y213723D01*

+X221902Y213939D01*

+X222050Y214180D01*

+X222158Y214442D01*

+X222224Y214718D01*

+X222241Y215000D01*

+X222224Y215282D01*

+X222158Y215558D01*

+X222050Y215820D01*

+X221902Y216061D01*

+X221718Y216277D01*

+X221502Y216461D01*

+X221261Y216609D01*

+X220999Y216717D01*

+X220723Y216783D01*

+X220441Y216806D01*

+X220159Y216783D01*

+X219883Y216717D01*

+X219621Y216609D01*

+X219438Y216497D01*

+Y258003D01*

+X219621Y257891D01*

+X219883Y257783D01*

+X220159Y257717D01*

+X220441Y257694D01*

+X220723Y257717D01*

+X220999Y257783D01*

+X221261Y257891D01*

+X221502Y258039D01*

+X221718Y258223D01*

+X221902Y258439D01*

+X222050Y258680D01*

+X222158Y258942D01*

+X222224Y259218D01*

+X222241Y259500D01*

+X222224Y259782D01*

+X222158Y260058D01*

+X222050Y260320D01*

+X221902Y260561D01*

+X221718Y260777D01*

+X221502Y260961D01*

+X221261Y261109D01*

+X220999Y261217D01*

+X220723Y261283D01*

+X220441Y261306D01*

+X220229Y261289D01*

+X220241Y261500D01*

+X220224Y261782D01*

+X220158Y262058D01*

+X220050Y262320D01*

+X219902Y262561D01*

+X219718Y262777D01*

+X219502Y262961D01*

+X219438Y263000D01*

+Y264320D01*

+X219452Y264303D01*

+X219668Y264119D01*

+X219909Y263971D01*

+X220171Y263863D01*

+X220447Y263797D01*

+X220729Y263774D01*

+X221011Y263797D01*

+X221287Y263863D01*

+X221549Y263971D01*

+X221790Y264119D01*

+X222006Y264303D01*

+X222190Y264519D01*

+X222338Y264760D01*

+X222446Y265022D01*

+X222512Y265298D01*

+X222529Y265580D01*

+X222512Y265862D01*

+X222446Y266138D01*

+X222338Y266400D01*

+X222190Y266641D01*

+X222006Y266857D01*

+X221790Y267041D01*

+X221549Y267189D01*

+X221287Y267297D01*

+X221011Y267363D01*

+X220729Y267386D01*

+X220447Y267363D01*

+X220171Y267297D01*

+X219909Y267189D01*

+X219668Y267041D01*

+X219452Y266857D01*

+X219438Y266840D01*

+Y270695D01*

+X219441Y270694D01*

+X219723Y270717D01*

+X219999Y270783D01*

+X220261Y270891D01*

+X220502Y271039D01*

+X220718Y271223D01*

+X220902Y271439D01*

+X221050Y271680D01*

+X221158Y271942D01*

+X221224Y272218D01*

+X221241Y272500D01*

+X221224Y272782D01*

+X221158Y273058D01*

+X221050Y273320D01*

+X220902Y273561D01*

+X220718Y273777D01*

+X220502Y273961D01*

+X220261Y274109D01*

+X219999Y274217D01*

+X219723Y274283D01*

+X219441Y274306D01*

+X219438Y274305D01*

+Y362538D01*

+X219642Y362871D01*

+X219901Y363496D01*

+X220059Y364154D01*

+X220099Y364829D01*

+X220059Y365504D01*

+X219901Y366162D01*

+X219642Y366787D01*

+X219438Y367120D01*

+Y372538D01*

+X219642Y372871D01*

+X219901Y373496D01*

+X220059Y374154D01*

+X220099Y374829D01*

+X220059Y375504D01*

+X219901Y376162D01*

+X219642Y376787D01*

+X219438Y377120D01*

+Y397000D01*

+X223660D01*

+Y378561D01*

+X223264Y378319D01*

+X222749Y377879D01*

+X222309Y377364D01*

+X221956Y376787D01*

+X221697Y376162D01*

+X221539Y375504D01*

+X221486Y374829D01*

+X221539Y374154D01*

+X221697Y373496D01*

+X221956Y372871D01*

+X222309Y372294D01*

+X222749Y371779D01*

+X223264Y371339D01*

+X223660Y371097D01*

+Y368561D01*

+X223264Y368319D01*

+X222749Y367879D01*

+X222309Y367364D01*

+X221956Y366787D01*

+X221697Y366162D01*

+X221539Y365504D01*

+X221486Y364829D01*

+X221539Y364154D01*

+X221697Y363496D01*

+X221956Y362871D01*

+X222309Y362294D01*

+X222749Y361779D01*

+X223264Y361339D01*

+X223660Y361097D01*

+Y254314D01*

+X223601Y254558D01*

+X223493Y254820D01*

+X223345Y255061D01*

+X223161Y255277D01*

+X222945Y255461D01*

+X222704Y255609D01*

+X222442Y255717D01*

+X222166Y255783D01*

+X221884Y255806D01*

+X221602Y255783D01*

+X221326Y255717D01*

+X221064Y255609D01*

+X220823Y255461D01*

+X220607Y255277D01*

+X220423Y255061D01*

+X220275Y254820D01*

+X220167Y254558D01*

+X220101Y254282D01*

+X220078Y254000D01*

+X220101Y253718D01*

+X220167Y253442D01*

+X220275Y253180D01*

+X220423Y252939D01*

+X220607Y252723D01*

+X220823Y252539D01*

+X221064Y252391D01*

+X221326Y252283D01*

+X221602Y252217D01*

+X221884Y252194D01*

+X222166Y252217D01*

+X222442Y252283D01*

+X222682Y252382D01*

+X222658Y252282D01*

+X222635Y252000D01*

+X222658Y251718D01*

+X222724Y251442D01*

+X222832Y251180D01*

+X222980Y250939D01*

+X223164Y250723D01*

+X223380Y250539D01*

+X223621Y250391D01*

+X223660Y250375D01*

+Y249291D01*

+X223658Y249282D01*

+X223635Y249000D01*

+X223658Y248718D01*

+X223660Y248709D01*

+Y245625D01*

+X223621Y245609D01*

+X223380Y245461D01*

+X223164Y245277D01*

+X222980Y245061D01*

+X222832Y244820D01*

+X222724Y244558D01*

+X222658Y244282D01*

+X222635Y244000D01*

+X222658Y243718D01*

+X222724Y243442D01*

+X222832Y243180D01*

+X222980Y242939D01*

+X223164Y242723D01*

+X223380Y242539D01*

+X223621Y242391D01*

+X223660Y242375D01*

+Y236771D01*

+X223480Y236561D01*

+X223332Y236320D01*

+X223224Y236058D01*

+X223158Y235782D01*

+X223135Y235500D01*

+X223158Y235218D01*

+X223224Y234942D01*

+X223332Y234680D01*

+X223480Y234439D01*

+X223660Y234229D01*

+Y226791D01*

+X223658Y226782D01*

+X223635Y226500D01*

+X223658Y226218D01*

+X223660Y226209D01*

+Y221771D01*

+X223480Y221561D01*

+X223332Y221320D01*

+X223224Y221058D01*

+X223158Y220782D01*

+X223135Y220500D01*

+X223158Y220218D01*

+X223224Y219942D01*

+X223332Y219680D01*

+X223480Y219439D01*

+X223660Y219229D01*

+Y201061D01*

+X223264Y200819D01*

+X222749Y200379D01*

+X222309Y199864D01*

+X221956Y199287D01*

+X221697Y198662D01*

+X221539Y198004D01*

+X221486Y197329D01*

+X221539Y196654D01*

+X221697Y195996D01*

+X221956Y195371D01*

+X222309Y194794D01*

+X222749Y194279D01*

+X223264Y193839D01*

+X223660Y193597D01*

+Y188561D01*

+X223264Y188319D01*

+X222749Y187879D01*

+X222309Y187364D01*

+X221956Y186787D01*

+X221697Y186162D01*

+X221539Y185504D01*

+X221486Y184829D01*

+X221539Y184154D01*

+X221697Y183496D01*

+X221956Y182871D01*

+X222309Y182294D01*

+X222749Y181779D01*

+X223264Y181339D01*

+X223660Y181097D01*

+Y178561D01*

+G37*

+G36*

+X217438Y193354D02*X217757Y193486D01*

+X218334Y193839D01*

+X218849Y194279D01*

+X219289Y194794D01*

+X219438Y195038D01*

+Y187120D01*

+X219289Y187364D01*

+X218849Y187879D01*

+X218334Y188319D01*

+X217757Y188672D01*

+X217438Y188804D01*

+Y193354D01*

+G37*

+G36*

+Y260003D02*X217621Y259891D01*

+X217883Y259783D01*

+X218159Y259717D01*

+X218441Y259694D01*

+X218652Y259711D01*

+X218635Y259500D01*

+X218658Y259218D01*

+X218724Y258942D01*

+X218832Y258680D01*

+X218980Y258439D01*

+X219164Y258223D01*

+X219380Y258039D01*

+X219438Y258003D01*

+Y216497D01*

+X219380Y216461D01*

+X219164Y216277D01*

+X218980Y216061D01*

+X218832Y215820D01*

+X218724Y215558D01*

+X218658Y215282D01*

+X218635Y215000D01*

+X218658Y214718D01*

+X218724Y214442D01*

+X218832Y214180D01*

+X218980Y213939D01*

+X219164Y213723D01*

+X219380Y213539D01*

+X219438Y213503D01*

+Y199620D01*

+X219289Y199864D01*

+X218849Y200379D01*

+X218334Y200819D01*

+X217757Y201172D01*

+X217438Y201304D01*

+Y260003D01*

+G37*

+G36*

+Y360854D02*X217757Y360986D01*

+X218334Y361339D01*

+X218849Y361779D01*

+X219289Y362294D01*

+X219438Y362538D01*

+Y274305D01*

+X219159Y274283D01*

+X218883Y274217D01*

+X218621Y274109D01*

+X218380Y273961D01*

+X218164Y273777D01*

+X217980Y273561D01*

+X217832Y273320D01*

+X217724Y273058D01*

+X217658Y272782D01*

+X217635Y272500D01*

+X217658Y272218D01*

+X217724Y271942D01*

+X217832Y271680D01*

+X217980Y271439D01*

+X218164Y271223D01*

+X218380Y271039D01*

+X218621Y270891D01*

+X218883Y270783D01*

+X219159Y270717D01*

+X219438Y270695D01*

+Y266840D01*

+X219268Y266641D01*

+X219120Y266400D01*

+X219012Y266138D01*

+X218946Y265862D01*

+X218923Y265580D01*

+X218946Y265298D01*

+X219012Y265022D01*

+X219120Y264760D01*

+X219268Y264519D01*

+X219438Y264320D01*

+Y263000D01*

+X219261Y263109D01*

+X218999Y263217D01*

+X218723Y263283D01*

+X218441Y263306D01*

+X218159Y263283D01*

+X217883Y263217D01*

+X217621Y263109D01*

+X217438Y262997D01*

+Y277195D01*

+X217441Y277194D01*

+X217723Y277217D01*

+X217999Y277283D01*

+X218261Y277391D01*

+X218502Y277539D01*

+X218718Y277723D01*

+X218902Y277939D01*

+X219050Y278180D01*

+X219158Y278442D01*

+X219224Y278718D01*

+X219241Y279000D01*

+X219224Y279282D01*

+X219158Y279558D01*

+X219050Y279820D01*

+X218902Y280061D01*

+X218718Y280277D01*

+X218502Y280461D01*

+X218261Y280609D01*

+X217999Y280717D01*

+X217723Y280783D01*

+X217441Y280806D01*

+X217438Y280805D01*

+Y360854D01*

+G37*

+G36*

+Y370854D02*X217757Y370986D01*

+X218334Y371339D01*

+X218849Y371779D01*

+X219289Y372294D01*

+X219438Y372538D01*

+Y367120D01*

+X219289Y367364D01*

+X218849Y367879D01*

+X218334Y368319D01*

+X217757Y368672D01*

+X217438Y368804D01*

+Y370854D01*

+G37*

+G36*

+Y397000D02*X219438D01*

+Y377120D01*

+X219289Y377364D01*

+X218849Y377879D01*

+X218334Y378319D01*

+X217757Y378672D01*

+X217438Y378804D01*

+Y397000D01*

+G37*

+G36*

+X219438Y177120D02*X219289Y177364D01*

+X218849Y177879D01*

+X218334Y178319D01*

+X217757Y178672D01*

+X217438Y178804D01*

+Y180854D01*

+X217757Y180986D01*

+X218334Y181339D01*

+X218849Y181779D01*

+X219289Y182294D01*

+X219438Y182538D01*

+Y177120D01*

+G37*

+G36*

+X212938Y194118D02*X213264Y193839D01*

+X213841Y193486D01*

+X214466Y193227D01*

+X215124Y193069D01*

+X215799Y193016D01*

+X216474Y193069D01*

+X217132Y193227D01*

+X217438Y193354D01*

+Y188804D01*

+X217132Y188931D01*

+X216474Y189089D01*

+X215799Y189142D01*

+X215124Y189089D01*

+X214466Y188931D01*

+X213841Y188672D01*

+X213264Y188319D01*

+X212938Y188040D01*

+Y194118D01*

+G37*

+G36*

+Y361618D02*X213264Y361339D01*

+X213841Y360986D01*

+X214466Y360727D01*

+X215124Y360569D01*

+X215799Y360516D01*

+X216474Y360569D01*

+X217132Y360727D01*

+X217438Y360854D01*

+Y280805D01*

+X217159Y280783D01*

+X216883Y280717D01*

+X216621Y280609D01*

+X216380Y280461D01*

+X216164Y280277D01*

+X215980Y280061D01*

+X215832Y279820D01*

+X215724Y279558D01*

+X215658Y279282D01*

+X215635Y279000D01*

+X215658Y278718D01*

+X215724Y278442D01*

+X215832Y278180D01*

+X215980Y277939D01*

+X216164Y277723D01*

+X216380Y277539D01*

+X216621Y277391D01*

+X216883Y277283D01*

+X217159Y277217D01*

+X217438Y277195D01*

+Y262997D01*

+X217380Y262961D01*

+X217164Y262777D01*

+X216980Y262561D01*

+X216832Y262320D01*

+X216724Y262058D01*

+X216658Y261782D01*

+X216635Y261500D01*

+X216658Y261218D01*

+X216724Y260942D01*

+X216832Y260680D01*

+X216980Y260439D01*

+X217164Y260223D01*

+X217380Y260039D01*

+X217438Y260003D01*

+Y201304D01*

+X217132Y201431D01*

+X216474Y201589D01*

+X215799Y201642D01*

+X215124Y201589D01*

+X214466Y201431D01*

+X213841Y201172D01*

+X213264Y200819D01*

+X212938Y200540D01*

+Y236195D01*

+X212941Y236194D01*

+X213223Y236217D01*

+X213499Y236283D01*

+X213761Y236391D01*

+X214002Y236539D01*

+X214218Y236723D01*

+X214402Y236939D01*

+X214550Y237180D01*

+X214658Y237442D01*

+X214724Y237718D01*

+X214741Y238000D01*

+X214724Y238282D01*

+X214658Y238558D01*

+X214550Y238820D01*

+X214402Y239061D01*

+X214218Y239277D01*

+X214002Y239461D01*

+X213761Y239609D01*

+X213499Y239717D01*

+X213223Y239783D01*

+X212941Y239806D01*

+X212938Y239805D01*

+Y361618D01*

+G37*

+G36*

+Y371618D02*X213264Y371339D01*

+X213841Y370986D01*

+X214466Y370727D01*

+X215124Y370569D01*

+X215799Y370516D01*

+X216474Y370569D01*

+X217132Y370727D01*

+X217438Y370854D01*

+Y368804D01*

+X217132Y368931D01*

+X216474Y369089D01*

+X215799Y369142D01*

+X215124Y369089D01*

+X214466Y368931D01*

+X213841Y368672D01*

+X213264Y368319D01*

+X212938Y368040D01*

+Y371618D01*

+G37*

+G36*

+Y397000D02*X217438D01*

+Y378804D01*

+X217132Y378931D01*

+X216474Y379089D01*

+X215799Y379142D01*

+X215124Y379089D01*

+X214466Y378931D01*

+X213841Y378672D01*

+X213264Y378319D01*

+X212938Y378040D01*

+Y397000D01*

+G37*

+G36*

+Y171618D02*X213076Y171500D01*

+X212938D01*

+Y171618D01*

+G37*

+G36*

+X217438Y178804D02*X217132Y178931D01*

+X216474Y179089D01*

+X215799Y179142D01*

+X215124Y179089D01*

+X214466Y178931D01*

+X213841Y178672D01*

+X213264Y178319D01*

+X212938Y178040D01*

+Y181618D01*

+X213264Y181339D01*

+X213841Y180986D01*

+X214466Y180727D01*

+X215124Y180569D01*

+X215799Y180516D01*

+X216474Y180569D01*

+X217132Y180727D01*

+X217438Y180854D01*

+Y178804D01*

+G37*

+G36*

+X212938Y178040D02*X212749Y177879D01*

+X212309Y177364D01*

+X211956Y176787D01*

+X211697Y176162D01*

+X211539Y175504D01*

+X211486Y174829D01*

+X211539Y174154D01*

+X211697Y173496D01*

+X211956Y172871D01*

+X212309Y172294D01*

+X212749Y171779D01*

+X212938Y171618D01*

+Y171500D01*

+X210438D01*

+Y210695D01*

+X210441Y210694D01*

+X210723Y210717D01*

+X210999Y210783D01*

+X211261Y210891D01*

+X211502Y211039D01*

+X211718Y211223D01*

+X211902Y211439D01*

+X212050Y211680D01*

+X212158Y211942D01*

+X212224Y212218D01*

+X212241Y212500D01*

+X212224Y212782D01*

+X212158Y213058D01*

+X212050Y213320D01*

+X211902Y213561D01*

+X211718Y213777D01*

+X211502Y213961D01*

+X211261Y214109D01*

+X210999Y214217D01*

+X210723Y214283D01*

+X210441Y214306D01*

+X210438Y214305D01*

+Y397000D01*

+X212938D01*

+Y378040D01*

+X212749Y377879D01*

+X212309Y377364D01*

+X211956Y376787D01*

+X211697Y376162D01*

+X211539Y375504D01*

+X211486Y374829D01*

+X211539Y374154D01*

+X211697Y373496D01*

+X211956Y372871D01*

+X212309Y372294D01*

+X212749Y371779D01*

+X212938Y371618D01*

+Y368040D01*

+X212749Y367879D01*

+X212309Y367364D01*

+X211956Y366787D01*

+X211697Y366162D01*

+X211539Y365504D01*

+X211486Y364829D01*

+X211539Y364154D01*

+X211697Y363496D01*

+X211956Y362871D01*

+X212309Y362294D01*

+X212749Y361779D01*

+X212938Y361618D01*

+Y239805D01*

+X212659Y239783D01*

+X212383Y239717D01*

+X212121Y239609D01*

+X211880Y239461D01*

+X211664Y239277D01*

+X211480Y239061D01*

+X211332Y238820D01*

+X211224Y238558D01*

+X211158Y238282D01*

+X211135Y238000D01*

+X211158Y237718D01*

+X211224Y237442D01*

+X211332Y237180D01*

+X211480Y236939D01*

+X211664Y236723D01*

+X211880Y236539D01*

+X212121Y236391D01*

+X212383Y236283D01*

+X212659Y236217D01*

+X212938Y236195D01*

+Y200540D01*

+X212749Y200379D01*

+X212309Y199864D01*

+X211956Y199287D01*

+X211697Y198662D01*

+X211539Y198004D01*

+X211486Y197329D01*

+X211539Y196654D01*

+X211697Y195996D01*

+X211956Y195371D01*

+X212309Y194794D01*

+X212749Y194279D01*

+X212938Y194118D01*

+Y188040D01*

+X212749Y187879D01*

+X212309Y187364D01*

+X211956Y186787D01*

+X211697Y186162D01*

+X211539Y185504D01*

+X211486Y184829D01*

+X211539Y184154D01*

+X211697Y183496D01*

+X211956Y182871D01*

+X212309Y182294D01*

+X212749Y181779D01*

+X212938Y181618D01*

+Y178040D01*

+G37*

+G36*

+X210438Y171500D02*X208522D01*

+X208849Y171779D01*

+X209289Y172294D01*

+X209642Y172871D01*

+X209901Y173496D01*

+X210059Y174154D01*

+X210099Y174829D01*

+X210059Y175504D01*

+X209901Y176162D01*

+X209642Y176787D01*

+X209289Y177364D01*

+X208849Y177879D01*

+X208334Y178319D01*

+X207757Y178672D01*

+X207132Y178931D01*

+X206474Y179089D01*

+X205799Y179142D01*

+X205438Y179114D01*

+Y180544D01*

+X205799Y180516D01*

+X206474Y180569D01*

+X207132Y180727D01*

+X207757Y180986D01*

+X208334Y181339D01*

+X208849Y181779D01*

+X209289Y182294D01*

+X209642Y182871D01*

+X209901Y183496D01*

+X210059Y184154D01*

+X210099Y184829D01*

+X210059Y185504D01*

+X209901Y186162D01*

+X209642Y186787D01*

+X209289Y187364D01*

+X208849Y187879D01*

+X208334Y188319D01*

+X207757Y188672D01*

+X207132Y188931D01*

+X206474Y189089D01*

+X205799Y189142D01*

+X205438Y189114D01*

+Y193044D01*

+X205799Y193016D01*

+X206474Y193069D01*

+X207132Y193227D01*

+X207757Y193486D01*

+X208334Y193839D01*

+X208849Y194279D01*

+X209289Y194794D01*

+X209642Y195371D01*

+X209901Y195996D01*

+X210059Y196654D01*

+X210099Y197329D01*

+X210059Y198004D01*

+X209901Y198662D01*

+X209642Y199287D01*

+X209289Y199864D01*

+X208849Y200379D01*

+X208334Y200819D01*

+X207757Y201172D01*

+X207132Y201431D01*

+X206474Y201589D01*

+X205799Y201642D01*

+X205438Y201614D01*

+Y236498D01*

+X205550Y236680D01*

+X205658Y236942D01*

+X205724Y237218D01*

+X205741Y237500D01*

+X205724Y237782D01*

+X205658Y238058D01*

+X205550Y238320D01*

+X205438Y238502D01*

+Y275195D01*

+X205441Y275194D01*

+X205723Y275217D01*

+X205999Y275283D01*

+X206261Y275391D01*

+X206502Y275539D01*

+X206718Y275723D01*

+X206902Y275939D01*

+X207050Y276180D01*

+X207158Y276442D01*

+X207224Y276718D01*

+X207241Y277000D01*

+X207224Y277282D01*

+X207158Y277558D01*

+X207050Y277820D01*

+X206902Y278061D01*

+X206718Y278277D01*

+X206502Y278461D01*

+X206261Y278609D01*

+X205999Y278717D01*

+X205723Y278783D01*

+X205441Y278806D01*

+X205438Y278805D01*

+Y360544D01*

+X205799Y360516D01*

+X206474Y360569D01*

+X207132Y360727D01*

+X207757Y360986D01*

+X208334Y361339D01*

+X208849Y361779D01*

+X209289Y362294D01*

+X209642Y362871D01*

+X209901Y363496D01*

+X210059Y364154D01*

+X210099Y364829D01*

+X210059Y365504D01*

+X209901Y366162D01*

+X209642Y366787D01*

+X209289Y367364D01*

+X208849Y367879D01*

+X208334Y368319D01*

+X207757Y368672D01*

+X207132Y368931D01*

+X206474Y369089D01*

+X205799Y369142D01*

+X205438Y369114D01*

+Y370544D01*

+X205799Y370516D01*

+X206474Y370569D01*

+X207132Y370727D01*

+X207757Y370986D01*

+X208334Y371339D01*

+X208849Y371779D01*

+X209289Y372294D01*

+X209642Y372871D01*

+X209901Y373496D01*

+X210059Y374154D01*

+X210099Y374829D01*

+X210059Y375504D01*

+X209901Y376162D01*

+X209642Y376787D01*

+X209289Y377364D01*

+X208849Y377879D01*

+X208334Y378319D01*

+X207757Y378672D01*

+X207132Y378931D01*

+X206474Y379089D01*

+X205799Y379142D01*

+X205438Y379114D01*

+Y397000D01*

+X210438D01*

+Y214305D01*

+X210159Y214283D01*

+X209883Y214217D01*

+X209621Y214109D01*

+X209380Y213961D01*

+X209164Y213777D01*

+X208980Y213561D01*

+X208832Y213320D01*

+X208724Y213058D01*

+X208658Y212782D01*

+X208635Y212500D01*

+X208658Y212218D01*

+X208724Y211942D01*

+X208832Y211680D01*

+X208980Y211439D01*

+X209164Y211223D01*

+X209380Y211039D01*

+X209621Y210891D01*

+X209883Y210783D01*

+X210159Y210717D01*

+X210438Y210695D01*

+Y171500D01*

+G37*

+G36*

+X202438Y194643D02*X202749Y194279D01*

+X203264Y193839D01*

+X203841Y193486D01*

+X204466Y193227D01*

+X205124Y193069D01*

+X205438Y193044D01*

+Y189114D01*

+X205124Y189089D01*

+X204466Y188931D01*

+X203841Y188672D01*

+X203264Y188319D01*

+X202749Y187879D01*

+X202438Y187515D01*

+Y194643D01*

+G37*

+G36*

+Y236507D02*X202480Y236439D01*

+X202664Y236223D01*

+X202880Y236039D01*

+X203121Y235891D01*

+X203383Y235783D01*

+X203659Y235717D01*

+X203941Y235694D01*

+X204223Y235717D01*

+X204499Y235783D01*

+X204761Y235891D01*

+X205002Y236039D01*

+X205218Y236223D01*

+X205402Y236439D01*

+X205438Y236498D01*

+Y201614D01*

+X205124Y201589D01*

+X204466Y201431D01*

+X203841Y201172D01*

+X203264Y200819D01*

+X202749Y200379D01*

+X202438Y200015D01*

+Y210695D01*

+X202441Y210694D01*

+X202723Y210717D01*

+X202999Y210783D01*

+X203261Y210891D01*

+X203502Y211039D01*

+X203718Y211223D01*

+X203902Y211439D01*

+X204050Y211680D01*

+X204158Y211942D01*

+X204224Y212218D01*

+X204241Y212500D01*

+X204224Y212782D01*

+X204158Y213058D01*

+X204050Y213320D01*

+X203902Y213561D01*

+X203718Y213777D01*

+X203502Y213961D01*

+X203261Y214109D01*

+X202999Y214217D01*

+X202723Y214283D01*

+X202441Y214306D01*

+X202438Y214305D01*

+Y236507D01*

+G37*

+G36*

+Y362143D02*X202749Y361779D01*

+X203264Y361339D01*

+X203841Y360986D01*

+X204466Y360727D01*

+X205124Y360569D01*

+X205438Y360544D01*

+Y278805D01*

+X205159Y278783D01*

+X204883Y278717D01*

+X204621Y278609D01*

+X204380Y278461D01*

+X204164Y278277D01*

+X203980Y278061D01*

+X203832Y277820D01*

+X203724Y277558D01*

+X203658Y277282D01*

+X203635Y277000D01*

+X203658Y276718D01*

+X203724Y276442D01*

+X203832Y276180D01*

+X203980Y275939D01*

+X204164Y275723D01*

+X204380Y275539D01*

+X204621Y275391D01*

+X204883Y275283D01*

+X205159Y275217D01*

+X205438Y275195D01*

+Y238502D01*

+X205402Y238561D01*

+X205218Y238777D01*

+X205002Y238961D01*

+X204761Y239109D01*

+X204499Y239217D01*

+X204223Y239283D01*

+X203941Y239306D01*

+X203659Y239283D01*

+X203383Y239217D01*

+X203121Y239109D01*

+X202880Y238961D01*

+X202664Y238777D01*

+X202480Y238561D01*

+X202438Y238493D01*

+Y362143D01*

+G37*

+G36*

+Y372143D02*X202749Y371779D01*

+X203264Y371339D01*

+X203841Y370986D01*

+X204466Y370727D01*

+X205124Y370569D01*

+X205438Y370544D01*

+Y369114D01*

+X205124Y369089D01*

+X204466Y368931D01*

+X203841Y368672D01*

+X203264Y368319D01*

+X202749Y367879D01*

+X202438Y367515D01*

+Y372143D01*

+G37*

+G36*

+Y397000D02*X205438D01*

+Y379114D01*

+X205124Y379089D01*

+X204466Y378931D01*

+X203841Y378672D01*

+X203264Y378319D01*

+X202749Y377879D01*

+X202438Y377515D01*

+Y397000D01*

+G37*

+G36*

+Y172143D02*X202749Y171779D01*

+X203076Y171500D01*

+X202438D01*

+Y172143D01*

+G37*

+G36*

+X205438Y179114D02*X205124Y179089D01*

+X204466Y178931D01*

+X203841Y178672D01*

+X203264Y178319D01*

+X202749Y177879D01*

+X202438Y177515D01*

+Y182143D01*

+X202749Y181779D01*

+X203264Y181339D01*

+X203841Y180986D01*

+X204466Y180727D01*

+X205124Y180569D01*

+X205438Y180544D01*

+Y179114D01*

+G37*

+G36*

+X202438Y177515D02*X202309Y177364D01*

+X201956Y176787D01*

+X201697Y176162D01*

+X201539Y175504D01*

+X201486Y174829D01*

+X201539Y174154D01*

+X201697Y173496D01*

+X201956Y172871D01*

+X202309Y172294D01*

+X202438Y172143D01*

+Y171500D01*

+X198522D01*

+X198849Y171779D01*

+X199289Y172294D01*

+X199642Y172871D01*

+X199901Y173496D01*

+X200059Y174154D01*

+X200099Y174829D01*

+X200059Y175504D01*

+X199901Y176162D01*

+X199642Y176787D01*

+X199289Y177364D01*

+X198849Y177879D01*

+X198438Y178230D01*

+Y181428D01*

+X198849Y181779D01*

+X199289Y182294D01*

+X199642Y182871D01*

+X199901Y183496D01*

+X200059Y184154D01*

+X200099Y184829D01*

+X200059Y185504D01*

+X199901Y186162D01*

+X199642Y186787D01*

+X199289Y187364D01*

+X198849Y187879D01*

+X198438Y188230D01*

+Y193037D01*

+X199256Y193038D01*

+X199409Y193075D01*

+X199554Y193135D01*

+X199689Y193217D01*

+X199808Y193320D01*

+X199911Y193439D01*

+X199993Y193574D01*

+X200053Y193719D01*

+X200090Y193872D01*

+X200099Y194029D01*

+X200090Y200786D01*

+X200053Y200939D01*

+X199993Y201084D01*

+X199911Y201219D01*

+X199808Y201338D01*

+X199689Y201441D01*

+X199554Y201523D01*

+X199409Y201583D01*

+X199256Y201620D01*

+X199099Y201629D01*

+X198438Y201628D01*

+Y260695D01*

+X198441Y260694D01*

+X198723Y260717D01*

+X198999Y260783D01*

+X199261Y260891D01*

+X199502Y261039D01*

+X199718Y261223D01*

+X199902Y261439D01*

+X200050Y261680D01*

+X200158Y261942D01*

+X200224Y262218D01*

+X200241Y262500D01*

+X200224Y262782D01*

+X200158Y263058D01*

+X200050Y263320D01*

+X199902Y263561D01*

+X199718Y263777D01*

+X199502Y263961D01*

+X199261Y264109D01*

+X198999Y264217D01*

+X198723Y264283D01*

+X198441Y264306D01*

+X198438Y264305D01*

+Y267695D01*

+X198441Y267694D01*

+X198723Y267717D01*

+X198999Y267783D01*

+X199261Y267891D01*

+X199502Y268039D01*

+X199718Y268223D01*

+X199902Y268439D01*

+X200050Y268680D01*

+X200158Y268942D01*

+X200224Y269218D01*

+X200241Y269500D01*

+X200224Y269782D01*

+X200158Y270058D01*

+X200050Y270320D01*

+X199902Y270561D01*

+X199718Y270777D01*

+X199502Y270961D01*

+X199261Y271109D01*

+X198999Y271217D01*

+X198723Y271283D01*

+X198441Y271306D01*

+X198438Y271305D01*

+Y307000D01*

+X198502Y307039D01*

+X198718Y307223D01*

+X198902Y307439D01*

+X199050Y307680D01*

+X199158Y307942D01*

+X199224Y308218D01*

+X199241Y308500D01*

+X199224Y308782D01*

+X199158Y309058D01*

+X199050Y309320D01*

+X198902Y309561D01*

+X198718Y309777D01*

+X198502Y309961D01*

+X198438Y310000D01*

+Y313000D01*

+X198502Y313039D01*

+X198718Y313223D01*

+X198902Y313439D01*

+X199050Y313680D01*

+X199158Y313942D01*

+X199224Y314218D01*

+X199241Y314500D01*

+X199224Y314782D01*

+X199158Y315058D01*

+X199050Y315320D01*

+X198902Y315561D01*

+X198718Y315777D01*

+X198502Y315961D01*

+X198438Y316000D01*

+Y361428D01*

+X198849Y361779D01*

+X199289Y362294D01*

+X199642Y362871D01*

+X199901Y363496D01*

+X200059Y364154D01*

+X200099Y364829D01*

+X200059Y365504D01*

+X199901Y366162D01*

+X199642Y366787D01*

+X199289Y367364D01*

+X198849Y367879D01*

+X198438Y368230D01*

+Y371428D01*

+X198849Y371779D01*

+X199289Y372294D01*

+X199642Y372871D01*

+X199901Y373496D01*

+X200059Y374154D01*

+X200099Y374829D01*

+X200059Y375504D01*

+X199901Y376162D01*

+X199642Y376787D01*

+X199289Y377364D01*

+X198849Y377879D01*

+X198438Y378230D01*

+Y397000D01*

+X202438D01*

+Y377515D01*

+X202309Y377364D01*

+X201956Y376787D01*

+X201697Y376162D01*

+X201539Y375504D01*

+X201486Y374829D01*

+X201539Y374154D01*

+X201697Y373496D01*

+X201956Y372871D01*

+X202309Y372294D01*

+X202438Y372143D01*

+Y367515D01*

+X202309Y367364D01*

+X201956Y366787D01*

+X201697Y366162D01*

+X201539Y365504D01*

+X201486Y364829D01*

+X201539Y364154D01*

+X201697Y363496D01*

+X201956Y362871D01*

+X202309Y362294D01*

+X202438Y362143D01*

+Y238493D01*

+X202332Y238320D01*

+X202224Y238058D01*

+X202158Y237782D01*

+X202135Y237500D01*

+X202158Y237218D01*

+X202224Y236942D01*

+X202332Y236680D01*

+X202438Y236507D01*

+Y214305D01*

+X202159Y214283D01*

+X201883Y214217D01*

+X201621Y214109D01*

+X201380Y213961D01*

+X201164Y213777D01*

+X200980Y213561D01*

+X200832Y213320D01*

+X200724Y213058D01*

+X200658Y212782D01*

+X200635Y212500D01*

+X200658Y212218D01*

+X200724Y211942D01*

+X200832Y211680D01*

+X200980Y211439D01*

+X201164Y211223D01*

+X201380Y211039D01*

+X201621Y210891D01*

+X201883Y210783D01*

+X202159Y210717D01*

+X202438Y210695D01*

+Y200015D01*

+X202309Y199864D01*

+X201956Y199287D01*

+X201697Y198662D01*

+X201539Y198004D01*

+X201486Y197329D01*

+X201539Y196654D01*

+X201697Y195996D01*

+X201956Y195371D01*

+X202309Y194794D01*

+X202438Y194643D01*

+Y187515D01*

+X202309Y187364D01*

+X201956Y186787D01*

+X201697Y186162D01*

+X201539Y185504D01*

+X201486Y184829D01*

+X201539Y184154D01*

+X201697Y183496D01*

+X201956Y182871D01*

+X202309Y182294D01*

+X202438Y182143D01*

+Y177515D01*

+G37*

+G36*

+X219438Y171500D02*X218522D01*

+X218849Y171779D01*

+X219289Y172294D01*

+X219438Y172538D01*

+Y171500D01*

+G37*

+G36*

+X193938Y193031D02*X198438Y193037D01*

+Y188230D01*

+X198334Y188319D01*

+X197757Y188672D01*

+X197132Y188931D01*

+X196474Y189089D01*

+X195799Y189142D01*

+X195124Y189089D01*

+X194466Y188931D01*

+X193938Y188712D01*

+Y193031D01*

+G37*

+G36*

+Y360946D02*X194466Y360727D01*

+X195124Y360569D01*

+X195799Y360516D01*

+X196474Y360569D01*

+X197132Y360727D01*

+X197757Y360986D01*

+X198334Y361339D01*

+X198438Y361428D01*

+Y316000D01*

+X198261Y316109D01*

+X197999Y316217D01*

+X197723Y316283D01*

+X197441Y316306D01*

+X197159Y316283D01*

+X196883Y316217D01*

+X196621Y316109D01*

+X196380Y315961D01*

+X196164Y315777D01*

+X195980Y315561D01*

+X195832Y315320D01*

+X195724Y315058D01*

+X195658Y314782D01*

+X195635Y314500D01*

+X195658Y314218D01*

+X195724Y313942D01*

+X195832Y313680D01*

+X195980Y313439D01*

+X196164Y313223D01*

+X196380Y313039D01*

+X196621Y312891D01*

+X196883Y312783D01*

+X197159Y312717D01*

+X197441Y312694D01*

+X197723Y312717D01*

+X197999Y312783D01*

+X198261Y312891D01*

+X198438Y313000D01*

+Y310000D01*

+X198261Y310109D01*

+X197999Y310217D01*

+X197723Y310283D01*

+X197441Y310306D01*

+X197159Y310283D01*

+X196883Y310217D01*

+X196621Y310109D01*

+X196380Y309961D01*

+X196164Y309777D01*

+X195980Y309561D01*

+X195832Y309320D01*

+X195724Y309058D01*

+X195658Y308782D01*

+X195635Y308500D01*

+X195658Y308218D01*

+X195724Y307942D01*

+X195832Y307680D01*

+X195980Y307439D01*

+X196164Y307223D01*

+X196380Y307039D01*

+X196621Y306891D01*

+X196883Y306783D01*

+X197159Y306717D01*

+X197441Y306694D01*

+X197723Y306717D01*

+X197999Y306783D01*

+X198261Y306891D01*

+X198438Y307000D01*

+Y271305D01*

+X198159Y271283D01*

+X197883Y271217D01*

+X197621Y271109D01*

+X197380Y270961D01*

+X197164Y270777D01*

+X196980Y270561D01*

+X196832Y270320D01*

+X196724Y270058D01*

+X196658Y269782D01*

+X196635Y269500D01*

+X196658Y269218D01*

+X196724Y268942D01*

+X196832Y268680D01*

+X196980Y268439D01*

+X197164Y268223D01*

+X197380Y268039D01*

+X197621Y267891D01*

+X197883Y267783D01*

+X198159Y267717D01*

+X198438Y267695D01*

+Y264305D01*

+X198159Y264283D01*

+X197883Y264217D01*

+X197621Y264109D01*

+X197380Y263961D01*

+X197164Y263777D01*

+X196980Y263561D01*

+X196832Y263320D01*

+X196724Y263058D01*

+X196658Y262782D01*

+X196635Y262500D01*

+X196658Y262218D01*

+X196724Y261942D01*

+X196832Y261680D01*

+X196980Y261439D01*

+X197164Y261223D01*

+X197380Y261039D01*

+X197621Y260891D01*

+X197883Y260783D01*

+X198159Y260717D01*

+X198438Y260695D01*

+Y201628D01*

+X193938Y201622D01*

+Y210695D01*

+X193941Y210694D01*

+X194223Y210717D01*

+X194499Y210783D01*

+X194761Y210891D01*

+X195002Y211039D01*

+X195218Y211223D01*

+X195402Y211439D01*

+X195550Y211680D01*

+X195658Y211942D01*

+X195724Y212218D01*

+X195741Y212500D01*

+X195724Y212782D01*

+X195658Y213058D01*

+X195550Y213320D01*

+X195402Y213561D01*

+X195218Y213777D01*

+X195002Y213961D01*

+X194761Y214109D01*

+X194499Y214217D01*

+X194223Y214283D01*

+X193941Y214306D01*

+X193938Y214305D01*

+Y235195D01*

+X193941Y235194D01*

+X194223Y235217D01*

+X194499Y235283D01*

+X194761Y235391D01*

+X195002Y235539D01*

+X195218Y235723D01*

+X195402Y235939D01*

+X195550Y236180D01*

+X195658Y236442D01*

+X195724Y236718D01*

+X195741Y237000D01*

+X195724Y237282D01*

+X195658Y237558D01*

+X195550Y237820D01*

+X195402Y238061D01*

+X195218Y238277D01*

+X195002Y238461D01*

+X194761Y238609D01*

+X194499Y238717D01*

+X194223Y238783D01*

+X193941Y238806D01*

+X193938Y238805D01*

+Y310507D01*

+X193980Y310439D01*

+X194164Y310223D01*

+X194380Y310039D01*

+X194621Y309891D01*

+X194883Y309783D01*

+X195159Y309717D01*

+X195441Y309694D01*

+X195723Y309717D01*

+X195999Y309783D01*

+X196261Y309891D01*

+X196502Y310039D01*

+X196718Y310223D01*

+X196902Y310439D01*

+X197050Y310680D01*

+X197158Y310942D01*

+X197224Y311218D01*

+X197241Y311500D01*

+X197224Y311782D01*

+X197158Y312058D01*

+X197050Y312320D01*

+X196902Y312561D01*

+X196718Y312777D01*

+X196502Y312961D01*

+X196261Y313109D01*

+X195999Y313217D01*

+X195723Y313283D01*

+X195441Y313306D01*

+X195159Y313283D01*

+X194883Y313217D01*

+X194621Y313109D01*

+X194380Y312961D01*

+X194164Y312777D01*

+X193980Y312561D01*

+X193938Y312493D01*

+Y360946D01*

+G37*

+G36*

+Y370946D02*X194466Y370727D01*

+X195124Y370569D01*

+X195799Y370516D01*

+X196474Y370569D01*

+X197132Y370727D01*

+X197757Y370986D01*

+X198334Y371339D01*

+X198438Y371428D01*

+Y368230D01*

+X198334Y368319D01*

+X197757Y368672D01*

+X197132Y368931D01*

+X196474Y369089D01*

+X195799Y369142D01*

+X195124Y369089D01*

+X194466Y368931D01*

+X193938Y368712D01*

+Y370946D01*

+G37*

+G36*

+Y397000D02*X198438D01*

+Y378230D01*

+X198334Y378319D01*

+X197757Y378672D01*

+X197132Y378931D01*

+X196474Y379089D01*

+X195799Y379142D01*

+X195124Y379089D01*

+X194466Y378931D01*

+X193938Y378712D01*

+Y397000D01*

+G37*

+G36*

+X198438Y178230D02*X198334Y178319D01*

+X197757Y178672D01*

+X197132Y178931D01*

+X196474Y179089D01*

+X195799Y179142D01*

+X195124Y179089D01*

+X194466Y178931D01*

+X193938Y178712D01*

+Y180946D01*

+X194466Y180727D01*

+X195124Y180569D01*

+X195799Y180516D01*

+X196474Y180569D01*

+X197132Y180727D01*

+X197757Y180986D01*

+X198334Y181339D01*

+X198438Y181428D01*

+Y178230D01*

+G37*

+G36*

+X193938Y178712D02*X193841Y178672D01*

+X193264Y178319D01*

+X192749Y177879D01*

+X192309Y177364D01*

+X191956Y176787D01*

+X191697Y176162D01*

+X191539Y175504D01*

+X191486Y174829D01*

+X191539Y174154D01*

+X191697Y173496D01*

+X191956Y172871D01*

+X192309Y172294D01*

+X192749Y171779D01*

+X193076Y171500D01*

+X191360D01*

+Y342644D01*

+X191363Y342643D01*

+X191645Y342666D01*

+X191921Y342732D01*

+X192183Y342840D01*

+X192424Y342988D01*

+X192640Y343172D01*

+X192824Y343388D01*

+X192972Y343629D01*

+X193080Y343891D01*

+X193146Y344167D01*

+X193163Y344449D01*

+X193146Y344731D01*

+X193080Y345007D01*

+X192972Y345269D01*

+X192824Y345510D01*

+X192640Y345726D01*

+X192424Y345910D01*

+X192183Y346058D01*

+X191921Y346166D01*

+X191645Y346232D01*

+X191363Y346255D01*

+X191360Y346254D01*

+Y397000D01*

+X193938D01*

+Y378712D01*

+X193841Y378672D01*

+X193264Y378319D01*

+X192749Y377879D01*

+X192309Y377364D01*

+X191956Y376787D01*

+X191697Y376162D01*

+X191539Y375504D01*

+X191486Y374829D01*

+X191539Y374154D01*

+X191697Y373496D01*

+X191956Y372871D01*

+X192309Y372294D01*

+X192749Y371779D01*

+X193264Y371339D01*

+X193841Y370986D01*

+X193938Y370946D01*

+Y368712D01*

+X193841Y368672D01*

+X193264Y368319D01*

+X192749Y367879D01*

+X192309Y367364D01*

+X191956Y366787D01*

+X191697Y366162D01*

+X191539Y365504D01*

+X191486Y364829D01*

+X191539Y364154D01*

+X191697Y363496D01*

+X191956Y362871D01*

+X192309Y362294D01*

+X192749Y361779D01*

+X193264Y361339D01*

+X193841Y360986D01*

+X193938Y360946D01*

+Y312493D01*

+X193832Y312320D01*

+X193724Y312058D01*

+X193658Y311782D01*

+X193635Y311500D01*

+X193658Y311218D01*

+X193724Y310942D01*

+X193832Y310680D01*

+X193938Y310507D01*

+Y238805D01*

+X193659Y238783D01*

+X193383Y238717D01*

+X193121Y238609D01*

+X192880Y238461D01*

+X192664Y238277D01*

+X192480Y238061D01*

+X192332Y237820D01*

+X192224Y237558D01*

+X192158Y237282D01*

+X192135Y237000D01*

+X192158Y236718D01*

+X192224Y236442D01*

+X192332Y236180D01*

+X192480Y235939D01*

+X192664Y235723D01*

+X192880Y235539D01*

+X193121Y235391D01*

+X193383Y235283D01*

+X193659Y235217D01*

+X193938Y235195D01*

+Y214305D01*

+X193659Y214283D01*

+X193383Y214217D01*

+X193121Y214109D01*

+X192880Y213961D01*

+X192664Y213777D01*

+X192480Y213561D01*

+X192332Y213320D01*

+X192224Y213058D01*

+X192158Y212782D01*

+X192135Y212500D01*

+X192158Y212218D01*

+X192224Y211942D01*

+X192332Y211680D01*

+X192480Y211439D01*

+X192664Y211223D01*

+X192880Y211039D01*

+X193121Y210891D01*

+X193383Y210783D01*

+X193659Y210717D01*

+X193938Y210695D01*

+Y201622D01*

+X192342Y201620D01*

+X192189Y201583D01*

+X192044Y201523D01*

+X191909Y201441D01*

+X191790Y201338D01*

+X191687Y201219D01*

+X191605Y201084D01*

+X191545Y200939D01*

+X191508Y200786D01*

+X191499Y200629D01*

+X191508Y193872D01*

+X191545Y193719D01*

+X191605Y193574D01*

+X191687Y193439D01*

+X191790Y193320D01*

+X191909Y193217D01*

+X192044Y193135D01*

+X192189Y193075D01*

+X192342Y193038D01*

+X192499Y193029D01*

+X193938Y193031D01*

+Y188712D01*

+X193841Y188672D01*

+X193264Y188319D01*

+X192749Y187879D01*

+X192309Y187364D01*

+X191956Y186787D01*

+X191697Y186162D01*

+X191539Y185504D01*

+X191486Y184829D01*

+X191539Y184154D01*

+X191697Y183496D01*

+X191956Y182871D01*

+X192309Y182294D01*

+X192749Y181779D01*

+X193264Y181339D01*

+X193841Y180986D01*

+X193938Y180946D01*

+Y178712D01*

+G37*

+G36*

+X191360Y171500D02*X188522D01*

+X188849Y171779D01*

+X189289Y172294D01*

+X189642Y172871D01*

+X189901Y173496D01*

+X190059Y174154D01*

+X190099Y174829D01*

+X190059Y175504D01*

+X189901Y176162D01*

+X189642Y176787D01*

+X189289Y177364D01*

+X188849Y177879D01*

+X188334Y178319D01*

+X187757Y178672D01*

+X187132Y178931D01*

+X186474Y179089D01*

+X185799Y179142D01*

+X185438Y179114D01*

+Y180544D01*

+X185799Y180516D01*

+X186474Y180569D01*

+X187132Y180727D01*

+X187757Y180986D01*

+X188334Y181339D01*

+X188849Y181779D01*

+X189289Y182294D01*

+X189642Y182871D01*

+X189901Y183496D01*

+X190059Y184154D01*

+X190099Y184829D01*

+X190059Y185504D01*

+X189901Y186162D01*

+X189642Y186787D01*

+X189289Y187364D01*

+X188849Y187879D01*

+X188334Y188319D01*

+X187757Y188672D01*

+X187132Y188931D01*

+X186474Y189089D01*

+X185799Y189142D01*

+X185438Y189114D01*

+Y215695D01*

+X185441Y215694D01*

+X185723Y215717D01*

+X185999Y215783D01*

+X186261Y215891D01*

+X186502Y216039D01*

+X186718Y216223D01*

+X186902Y216439D01*

+X187050Y216680D01*

+X187158Y216942D01*

+X187224Y217218D01*

+X187241Y217500D01*

+X187224Y217782D01*

+X187158Y218058D01*

+X187050Y218320D01*

+X186902Y218561D01*

+X186718Y218777D01*

+X186502Y218961D01*

+X186261Y219109D01*

+X185999Y219217D01*

+X185723Y219283D01*

+X185441Y219306D01*

+X185438Y219305D01*

+Y226195D01*

+X185441Y226194D01*

+X185723Y226217D01*

+X185999Y226283D01*

+X186261Y226391D01*

+X186502Y226539D01*

+X186718Y226723D01*

+X186902Y226939D01*

+X187050Y227180D01*

+X187158Y227442D01*

+X187224Y227718D01*

+X187241Y228000D01*

+X187224Y228282D01*

+X187158Y228558D01*

+X187050Y228820D01*

+X186902Y229061D01*

+X186718Y229277D01*

+X186502Y229461D01*

+X186261Y229609D01*

+X185999Y229717D01*

+X185723Y229783D01*

+X185441Y229806D01*

+X185438Y229805D01*

+Y360544D01*

+X185799Y360516D01*

+X186474Y360569D01*

+X187132Y360727D01*

+X187757Y360986D01*

+X188334Y361339D01*

+X188849Y361779D01*

+X189289Y362294D01*

+X189642Y362871D01*

+X189901Y363496D01*

+X190059Y364154D01*

+X190099Y364829D01*

+X190059Y365504D01*

+X189901Y366162D01*

+X189642Y366787D01*

+X189289Y367364D01*

+X188849Y367879D01*

+X188334Y368319D01*

+X187757Y368672D01*

+X187132Y368931D01*

+X186474Y369089D01*

+X185799Y369142D01*

+X185438Y369114D01*

+Y370544D01*

+X185799Y370516D01*

+X186474Y370569D01*

+X187132Y370727D01*

+X187757Y370986D01*

+X188334Y371339D01*

+X188849Y371779D01*

+X189289Y372294D01*

+X189642Y372871D01*

+X189901Y373496D01*

+X190059Y374154D01*

+X190099Y374829D01*

+X190059Y375504D01*

+X189901Y376162D01*

+X189642Y376787D01*

+X189289Y377364D01*

+X188849Y377879D01*

+X188334Y378319D01*

+X187757Y378672D01*

+X187132Y378931D01*

+X186474Y379089D01*

+X185799Y379142D01*

+X185438Y379114D01*

+Y397000D01*

+X191360D01*

+Y346254D01*

+X191081Y346232D01*

+X190805Y346166D01*

+X190543Y346058D01*

+X190302Y345910D01*

+X190086Y345726D01*

+X189902Y345510D01*

+X189754Y345269D01*

+X189646Y345007D01*

+X189580Y344731D01*

+X189557Y344449D01*

+X189580Y344167D01*

+X189646Y343891D01*

+X189754Y343629D01*

+X189902Y343388D01*

+X190086Y343172D01*

+X190302Y342988D01*

+X190543Y342840D01*

+X190805Y342732D01*

+X191081Y342666D01*

+X191360Y342644D01*

+Y171500D01*

+G37*

+G36*

+X185438Y379114D02*X185124Y379089D01*

+X184466Y378931D01*

+X183841Y378672D01*

+X183264Y378319D01*

+X182749Y377879D01*

+X182309Y377364D01*

+X181956Y376787D01*

+X181938Y376745D01*

+Y397000D01*

+X185438D01*

+Y379114D01*

+G37*

+G36*

+Y369114D02*X185124Y369089D01*

+X184466Y368931D01*

+X183841Y368672D01*

+X183264Y368319D01*

+X182749Y367879D01*

+X182309Y367364D01*

+X181956Y366787D01*

+X181938Y366745D01*

+Y372913D01*

+X181956Y372871D01*

+X182309Y372294D01*

+X182749Y371779D01*

+X183264Y371339D01*

+X183841Y370986D01*

+X184466Y370727D01*

+X185124Y370569D01*

+X185438Y370544D01*

+Y369114D01*

+G37*

+G36*

+Y189114D02*X185124Y189089D01*

+X184466Y188931D01*

+X183841Y188672D01*

+X183264Y188319D01*

+X182749Y187879D01*

+X182309Y187364D01*

+X181956Y186787D01*

+X181938Y186745D01*

+Y256695D01*

+X181941Y256694D01*

+X182223Y256717D01*

+X182499Y256783D01*

+X182761Y256891D01*

+X183002Y257039D01*

+X183218Y257223D01*

+X183402Y257439D01*

+X183550Y257680D01*

+X183658Y257942D01*

+X183724Y258218D01*

+X183741Y258500D01*

+X183724Y258782D01*

+X183658Y259058D01*

+X183550Y259320D01*

+X183402Y259561D01*

+X183218Y259777D01*

+X183002Y259961D01*

+X182761Y260109D01*

+X182499Y260217D01*

+X182223Y260283D01*

+X181941Y260306D01*

+X181938Y260305D01*

+Y362913D01*

+X181956Y362871D01*

+X182309Y362294D01*

+X182749Y361779D01*

+X183264Y361339D01*

+X183841Y360986D01*

+X184466Y360727D01*

+X185124Y360569D01*

+X185438Y360544D01*

+Y229805D01*

+X185159Y229783D01*

+X184883Y229717D01*

+X184621Y229609D01*

+X184380Y229461D01*

+X184164Y229277D01*

+X183980Y229061D01*

+X183832Y228820D01*

+X183724Y228558D01*

+X183658Y228282D01*

+X183635Y228000D01*

+X183658Y227718D01*

+X183724Y227442D01*

+X183832Y227180D01*

+X183980Y226939D01*

+X184164Y226723D01*

+X184380Y226539D01*

+X184621Y226391D01*

+X184883Y226283D01*

+X185159Y226217D01*

+X185438Y226195D01*

+Y219305D01*

+X185159Y219283D01*

+X184883Y219217D01*

+X184621Y219109D01*

+X184380Y218961D01*

+X184164Y218777D01*

+X183980Y218561D01*

+X183832Y218320D01*

+X183724Y218058D01*

+X183658Y217782D01*

+X183635Y217500D01*

+X183658Y217218D01*

+X183724Y216942D01*

+X183832Y216680D01*

+X183980Y216439D01*

+X184164Y216223D01*

+X184380Y216039D01*

+X184621Y215891D01*

+X184883Y215783D01*

+X185159Y215717D01*

+X185438Y215695D01*

+Y189114D01*

+G37*

+G36*

+Y179114D02*X185124Y179089D01*

+X184466Y178931D01*

+X183841Y178672D01*

+X183264Y178319D01*

+X182749Y177879D01*

+X182309Y177364D01*

+X181956Y176787D01*

+X181938Y176745D01*

+Y182913D01*

+X181956Y182871D01*

+X182309Y182294D01*

+X182749Y181779D01*

+X183264Y181339D01*

+X183841Y180986D01*

+X184466Y180727D01*

+X185124Y180569D01*

+X185438Y180544D01*

+Y179114D01*

+G37*

+G36*

+X181938Y176745D02*X181697Y176162D01*

+X181539Y175504D01*

+X181486Y174829D01*

+X181539Y174154D01*

+X181697Y173496D01*

+X181938Y172913D01*

+Y171500D01*

+X178522D01*

+X178849Y171779D01*

+X179289Y172294D01*

+X179642Y172871D01*

+X179901Y173496D01*

+X180059Y174154D01*

+X180099Y174829D01*

+X180059Y175504D01*

+X179901Y176162D01*

+X179642Y176787D01*

+X179289Y177364D01*

+X178849Y177879D01*

+X178334Y178319D01*

+X177757Y178672D01*

+X177438Y178804D01*

+Y180854D01*

+X177757Y180986D01*

+X178334Y181339D01*

+X178849Y181779D01*

+X179289Y182294D01*

+X179642Y182871D01*

+X179901Y183496D01*

+X180059Y184154D01*

+X180099Y184829D01*

+X180059Y185504D01*

+X179901Y186162D01*

+X179642Y186787D01*

+X179289Y187364D01*

+X178849Y187879D01*

+X178334Y188319D01*

+X177757Y188672D01*

+X177438Y188804D01*

+Y215695D01*

+X177441Y215694D01*

+X177723Y215717D01*

+X177999Y215783D01*

+X178261Y215891D01*

+X178502Y216039D01*

+X178718Y216223D01*

+X178902Y216439D01*

+X179050Y216680D01*

+X179158Y216942D01*

+X179224Y217218D01*

+X179241Y217500D01*

+X179224Y217782D01*

+X179158Y218058D01*

+X179050Y218320D01*

+X178902Y218561D01*

+X178718Y218777D01*

+X178502Y218961D01*

+X178261Y219109D01*

+X177999Y219217D01*

+X177723Y219283D01*

+X177441Y219306D01*

+X177438Y219305D01*

+Y226195D01*

+X177441Y226194D01*

+X177723Y226217D01*

+X177999Y226283D01*

+X178261Y226391D01*

+X178502Y226539D01*

+X178718Y226723D01*

+X178902Y226939D01*

+X179050Y227180D01*

+X179158Y227442D01*

+X179224Y227718D01*

+X179241Y228000D01*

+X179224Y228282D01*

+X179158Y228558D01*

+X179050Y228820D01*

+X178902Y229061D01*

+X178718Y229277D01*

+X178502Y229461D01*

+X178261Y229609D01*

+X177999Y229717D01*

+X177723Y229783D01*

+X177441Y229806D01*

+X177438Y229805D01*

+Y341743D01*

+X177610Y341541D01*

+X177826Y341357D01*

+X178067Y341209D01*

+X178329Y341101D01*

+X178605Y341035D01*

+X178887Y341012D01*

+X179169Y341035D01*

+X179445Y341101D01*

+X179707Y341209D01*

+X179948Y341357D01*

+X180164Y341541D01*

+X180348Y341757D01*

+X180496Y341998D01*

+X180604Y342260D01*

+X180670Y342536D01*

+X180687Y342818D01*

+X180670Y343100D01*

+X180604Y343376D01*

+X180496Y343638D01*

+X180348Y343879D01*

+X180164Y344095D01*

+X179948Y344279D01*

+X179707Y344427D01*

+X179445Y344535D01*

+X179169Y344601D01*

+X178887Y344624D01*

+X178605Y344601D01*

+X178329Y344535D01*

+X178067Y344427D01*

+X177826Y344279D01*

+X177610Y344095D01*

+X177438Y343893D01*

+Y360854D01*

+X177757Y360986D01*

+X178334Y361339D01*

+X178849Y361779D01*

+X179289Y362294D01*

+X179642Y362871D01*

+X179901Y363496D01*

+X180059Y364154D01*

+X180099Y364829D01*

+X180059Y365504D01*

+X179901Y366162D01*

+X179642Y366787D01*

+X179289Y367364D01*

+X178849Y367879D01*

+X178334Y368319D01*

+X177757Y368672D01*

+X177438Y368804D01*

+Y370854D01*

+X177757Y370986D01*

+X178334Y371339D01*

+X178849Y371779D01*

+X179289Y372294D01*

+X179642Y372871D01*

+X179901Y373496D01*

+X180059Y374154D01*

+X180099Y374829D01*

+X180059Y375504D01*

+X179901Y376162D01*

+X179642Y376787D01*

+X179289Y377364D01*

+X178849Y377879D01*

+X178334Y378319D01*

+X177757Y378672D01*

+X177438Y378804D01*

+Y397000D01*

+X181938D01*

+Y376745D01*

+X181697Y376162D01*

+X181539Y375504D01*

+X181486Y374829D01*

+X181539Y374154D01*

+X181697Y373496D01*

+X181938Y372913D01*

+Y366745D01*

+X181697Y366162D01*

+X181539Y365504D01*

+X181486Y364829D01*

+X181539Y364154D01*

+X181697Y363496D01*

+X181938Y362913D01*

+Y260305D01*

+X181659Y260283D01*

+X181383Y260217D01*

+X181121Y260109D01*

+X180880Y259961D01*

+X180664Y259777D01*

+X180480Y259561D01*

+X180332Y259320D01*

+X180224Y259058D01*

+X180158Y258782D01*

+X180135Y258500D01*

+X180158Y258218D01*

+X180224Y257942D01*

+X180332Y257680D01*

+X180480Y257439D01*

+X180664Y257223D01*

+X180880Y257039D01*

+X181121Y256891D01*

+X181383Y256783D01*

+X181659Y256717D01*

+X181938Y256695D01*

+Y186745D01*

+X181697Y186162D01*

+X181539Y185504D01*

+X181486Y184829D01*

+X181539Y184154D01*

+X181697Y183496D01*

+X181938Y182913D01*

+Y176745D01*

+G37*

+G36*

+X177438Y188804D02*X177132Y188931D01*

+X176474Y189089D01*

+X175799Y189142D01*

+X175124Y189089D01*

+X174941Y189045D01*

+Y221500D01*

+X169941D01*

+X170307Y349958D01*

+X170341Y350013D01*

+X170449Y350275D01*

+X170515Y350551D01*

+X170532Y350833D01*

+X170515Y351115D01*

+X170449Y351391D01*

+X170341Y351653D01*

+X170312Y351700D01*

+X170441Y397000D01*

+X177438D01*

+Y378804D01*

+X177132Y378931D01*

+X176474Y379089D01*

+X175799Y379142D01*

+X175124Y379089D01*

+X174466Y378931D01*

+X173841Y378672D01*

+X173264Y378319D01*

+X172749Y377879D01*

+X172309Y377364D01*

+X171956Y376787D01*

+X171697Y376162D01*

+X171539Y375504D01*

+X171486Y374829D01*

+X171539Y374154D01*

+X171697Y373496D01*

+X171956Y372871D01*

+X172309Y372294D01*

+X172749Y371779D01*

+X173264Y371339D01*

+X173841Y370986D01*

+X174466Y370727D01*

+X175124Y370569D01*

+X175799Y370516D01*

+X176474Y370569D01*

+X177132Y370727D01*

+X177438Y370854D01*

+Y368804D01*

+X177132Y368931D01*

+X176474Y369089D01*

+X175799Y369142D01*

+X175124Y369089D01*

+X174466Y368931D01*

+X173841Y368672D01*

+X173264Y368319D01*

+X172749Y367879D01*

+X172309Y367364D01*

+X171956Y366787D01*

+X171697Y366162D01*

+X171539Y365504D01*

+X171486Y364829D01*

+X171539Y364154D01*

+X171697Y363496D01*

+X171956Y362871D01*

+X172309Y362294D01*

+X172749Y361779D01*

+X173264Y361339D01*

+X173841Y360986D01*

+X174466Y360727D01*

+X175124Y360569D01*

+X175799Y360516D01*

+X176474Y360569D01*

+X177132Y360727D01*

+X177438Y360854D01*

+Y343893D01*

+X177426Y343879D01*

+X177278Y343638D01*

+X177170Y343376D01*

+X177104Y343100D01*

+X177081Y342818D01*

+X177104Y342536D01*

+X177170Y342260D01*

+X177278Y341998D01*

+X177426Y341757D01*

+X177438Y341743D01*

+Y229805D01*

+X177159Y229783D01*

+X176883Y229717D01*

+X176621Y229609D01*

+X176380Y229461D01*

+X176164Y229277D01*

+X175980Y229061D01*

+X175832Y228820D01*

+X175724Y228558D01*

+X175658Y228282D01*

+X175635Y228000D01*

+X175658Y227718D01*

+X175724Y227442D01*

+X175832Y227180D01*

+X175980Y226939D01*

+X176164Y226723D01*

+X176380Y226539D01*

+X176621Y226391D01*

+X176883Y226283D01*

+X177159Y226217D01*

+X177438Y226195D01*

+Y219305D01*

+X177159Y219283D01*

+X176883Y219217D01*

+X176621Y219109D01*

+X176380Y218961D01*

+X176164Y218777D01*

+X175980Y218561D01*

+X175832Y218320D01*

+X175724Y218058D01*

+X175658Y217782D01*

+X175635Y217500D01*

+X175658Y217218D01*

+X175724Y216942D01*

+X175832Y216680D01*

+X175980Y216439D01*

+X176164Y216223D01*

+X176380Y216039D01*

+X176621Y215891D01*

+X176883Y215783D01*

+X177159Y215717D01*

+X177438Y215695D01*

+Y188804D01*

+G37*

+G36*

+Y178804D02*X177132Y178931D01*

+X176474Y179089D01*

+X175799Y179142D01*

+X175124Y179089D01*

+X174941Y179045D01*

+Y180613D01*

+X175124Y180569D01*

+X175799Y180516D01*

+X176474Y180569D01*

+X177132Y180727D01*

+X177438Y180854D01*

+Y178804D01*

+G37*

+G36*

+X481441Y394000D02*Y41500D01*

+X478941Y39000D01*

+X473493D01*

+Y49236D01*

+X473500Y49235D01*

+X474245Y49294D01*

+X474972Y49469D01*

+X475663Y49755D01*

+X476301Y50145D01*

+X476869Y50631D01*

+X477355Y51199D01*

+X477745Y51837D01*

+X478031Y52528D01*

+X478206Y53255D01*

+X478250Y54000D01*

+X478206Y54745D01*

+X478031Y55472D01*

+X477745Y56163D01*

+X477355Y56801D01*

+X476869Y57369D01*

+X476301Y57855D01*

+X475663Y58245D01*

+X474972Y58531D01*

+X474245Y58706D01*

+X473500Y58765D01*

+X473493Y58764D01*

+Y79236D01*

+X473500Y79235D01*

+X474245Y79294D01*

+X474972Y79469D01*

+X475663Y79755D01*

+X476301Y80145D01*

+X476869Y80631D01*

+X477355Y81199D01*

+X477745Y81837D01*

+X478031Y82528D01*

+X478206Y83255D01*

+X478250Y84000D01*

+X478206Y84745D01*

+X478031Y85472D01*

+X477745Y86163D01*

+X477355Y86801D01*

+X476869Y87369D01*

+X476301Y87855D01*

+X475663Y88245D01*

+X474972Y88531D01*

+X474245Y88706D01*

+X473500Y88765D01*

+X473493Y88764D01*

+Y109236D01*

+X473500Y109235D01*

+X474245Y109294D01*

+X474972Y109469D01*

+X475663Y109755D01*

+X476301Y110145D01*

+X476869Y110631D01*

+X477355Y111199D01*

+X477745Y111837D01*

+X478031Y112528D01*

+X478206Y113255D01*

+X478250Y114000D01*

+X478206Y114745D01*

+X478031Y115472D01*

+X477745Y116163D01*

+X477355Y116801D01*

+X476869Y117369D01*

+X476301Y117855D01*

+X475663Y118245D01*

+X474972Y118531D01*

+X474245Y118706D01*

+X473500Y118765D01*

+X473493Y118764D01*

+Y139236D01*

+X473500Y139235D01*

+X474245Y139294D01*

+X474972Y139469D01*

+X475663Y139755D01*

+X476301Y140145D01*

+X476869Y140631D01*

+X477355Y141199D01*

+X477745Y141837D01*

+X478031Y142528D01*

+X478206Y143255D01*

+X478250Y144000D01*

+X478206Y144745D01*

+X478031Y145472D01*

+X477745Y146163D01*

+X477355Y146801D01*

+X476869Y147369D01*

+X476301Y147855D01*

+X475663Y148245D01*

+X474972Y148531D01*

+X474245Y148706D01*

+X473500Y148765D01*

+X473493Y148764D01*

+Y169236D01*

+X473500Y169235D01*

+X474245Y169294D01*

+X474972Y169469D01*

+X475663Y169755D01*

+X476301Y170145D01*

+X476869Y170631D01*

+X477355Y171199D01*

+X477745Y171837D01*

+X478031Y172528D01*

+X478206Y173255D01*

+X478250Y174000D01*

+X478206Y174745D01*

+X478031Y175472D01*

+X477745Y176163D01*

+X477355Y176801D01*

+X476869Y177369D01*

+X476301Y177855D01*

+X475663Y178245D01*

+X474972Y178531D01*

+X474245Y178706D01*

+X473500Y178765D01*

+X473493Y178764D01*

+Y199236D01*

+X473500Y199235D01*

+X474245Y199294D01*

+X474972Y199469D01*

+X475663Y199755D01*

+X476301Y200145D01*

+X476869Y200631D01*

+X477355Y201199D01*

+X477745Y201837D01*

+X478031Y202528D01*

+X478206Y203255D01*

+X478250Y204000D01*

+X478206Y204745D01*

+X478031Y205472D01*

+X477745Y206163D01*

+X477355Y206801D01*

+X476869Y207369D01*

+X476301Y207855D01*

+X475663Y208245D01*

+X474972Y208531D01*

+X474245Y208706D01*

+X473500Y208765D01*

+X473493Y208764D01*

+Y229236D01*

+X473500Y229235D01*

+X474245Y229294D01*

+X474972Y229469D01*

+X475663Y229755D01*

+X476301Y230145D01*

+X476869Y230631D01*

+X477355Y231199D01*

+X477745Y231837D01*

+X478031Y232528D01*

+X478206Y233255D01*

+X478250Y234000D01*

+X478206Y234745D01*

+X478031Y235472D01*

+X477745Y236163D01*

+X477355Y236801D01*

+X476869Y237369D01*

+X476301Y237855D01*

+X475663Y238245D01*

+X474972Y238531D01*

+X474245Y238706D01*

+X473500Y238765D01*

+X473493Y238764D01*

+Y259236D01*

+X473500Y259235D01*

+X474245Y259294D01*

+X474972Y259469D01*

+X475663Y259755D01*

+X476301Y260145D01*

+X476869Y260631D01*

+X477355Y261199D01*

+X477745Y261837D01*

+X478031Y262528D01*

+X478206Y263255D01*

+X478250Y264000D01*

+X478206Y264745D01*

+X478031Y265472D01*

+X477745Y266163D01*

+X477355Y266801D01*

+X476869Y267369D01*

+X476301Y267855D01*

+X475663Y268245D01*

+X474972Y268531D01*

+X474245Y268706D01*

+X473500Y268765D01*

+X473493Y268764D01*

+Y289236D01*

+X473500Y289235D01*

+X474245Y289294D01*

+X474972Y289469D01*

+X475663Y289755D01*

+X476301Y290145D01*

+X476869Y290631D01*

+X477355Y291199D01*

+X477745Y291837D01*

+X478031Y292528D01*

+X478206Y293255D01*

+X478250Y294000D01*

+X478206Y294745D01*

+X478031Y295472D01*

+X477745Y296163D01*

+X477355Y296801D01*

+X476869Y297369D01*

+X476301Y297855D01*

+X475663Y298245D01*

+X474972Y298531D01*

+X474245Y298706D01*

+X473500Y298765D01*

+X473493Y298764D01*

+Y319236D01*

+X473500Y319235D01*

+X474245Y319294D01*

+X474972Y319469D01*

+X475663Y319755D01*

+X476301Y320145D01*

+X476869Y320631D01*

+X477355Y321199D01*

+X477745Y321837D01*

+X478031Y322528D01*

+X478206Y323255D01*

+X478250Y324000D01*

+X478206Y324745D01*

+X478031Y325472D01*

+X477745Y326163D01*

+X477355Y326801D01*

+X476869Y327369D01*

+X476301Y327855D01*

+X475663Y328245D01*

+X474972Y328531D01*

+X474245Y328706D01*

+X473500Y328765D01*

+X473493Y328764D01*

+Y349236D01*

+X473500Y349235D01*

+X474245Y349294D01*

+X474972Y349469D01*

+X475663Y349755D01*

+X476301Y350145D01*

+X476869Y350631D01*

+X477355Y351199D01*

+X477745Y351837D01*

+X478031Y352528D01*

+X478206Y353255D01*

+X478250Y354000D01*

+X478206Y354745D01*

+X478031Y355472D01*

+X477745Y356163D01*

+X477355Y356801D01*

+X476869Y357369D01*

+X476301Y357855D01*

+X475663Y358245D01*

+X474972Y358531D01*

+X474245Y358706D01*

+X473500Y358765D01*

+X473493Y358764D01*

+Y379236D01*

+X473500Y379235D01*

+X474245Y379294D01*

+X474972Y379469D01*

+X475663Y379755D01*

+X476301Y380145D01*

+X476869Y380631D01*

+X477355Y381199D01*

+X477745Y381837D01*

+X478031Y382528D01*

+X478206Y383255D01*

+X478250Y384000D01*

+X478206Y384745D01*

+X478031Y385472D01*

+X477745Y386163D01*

+X477355Y386801D01*

+X476869Y387369D01*

+X476301Y387855D01*

+X475663Y388245D01*

+X474972Y388531D01*

+X474245Y388706D01*

+X473500Y388765D01*

+X473493Y388764D01*

+Y397000D01*

+X478941D01*

+X481441Y394000D01*

+G37*

+G36*

+X473493Y39000D02*X467332D01*

+Y51670D01*

+X467443Y51704D01*

+X467550Y51756D01*

+X467646Y51823D01*

+X467731Y51905D01*

+X467802Y52000D01*

+X467856Y52105D01*

+X468015Y52508D01*

+X468132Y52925D01*

+X468211Y53352D01*

+X468250Y53783D01*

+Y54217D01*

+X468211Y54648D01*

+X468132Y55075D01*

+X468015Y55492D01*

+X467860Y55897D01*

+X467805Y56002D01*

+X467734Y56097D01*

+X467648Y56179D01*

+X467551Y56247D01*

+X467445Y56299D01*

+X467332Y56334D01*

+Y81670D01*

+X467443Y81704D01*

+X467550Y81756D01*

+X467646Y81823D01*

+X467731Y81905D01*

+X467802Y82000D01*

+X467856Y82105D01*

+X468015Y82508D01*

+X468132Y82925D01*

+X468211Y83352D01*

+X468250Y83783D01*

+Y84217D01*

+X468211Y84648D01*

+X468132Y85075D01*

+X468015Y85492D01*

+X467860Y85897D01*

+X467805Y86002D01*

+X467734Y86097D01*

+X467648Y86179D01*

+X467551Y86247D01*

+X467445Y86299D01*

+X467332Y86334D01*

+Y111670D01*

+X467443Y111704D01*

+X467550Y111756D01*

+X467646Y111823D01*

+X467731Y111905D01*

+X467802Y112000D01*

+X467856Y112105D01*

+X468015Y112508D01*

+X468132Y112925D01*

+X468211Y113352D01*

+X468250Y113783D01*

+Y114217D01*

+X468211Y114648D01*

+X468132Y115075D01*

+X468015Y115492D01*

+X467860Y115897D01*

+X467805Y116002D01*

+X467734Y116097D01*

+X467648Y116179D01*

+X467551Y116247D01*

+X467445Y116299D01*

+X467332Y116334D01*

+Y141670D01*

+X467443Y141704D01*

+X467550Y141756D01*

+X467646Y141823D01*

+X467731Y141905D01*

+X467802Y142000D01*

+X467856Y142105D01*

+X468015Y142508D01*

+X468132Y142925D01*

+X468211Y143352D01*

+X468250Y143783D01*

+Y144217D01*

+X468211Y144648D01*

+X468132Y145075D01*

+X468015Y145492D01*

+X467860Y145897D01*

+X467805Y146002D01*

+X467734Y146097D01*

+X467648Y146179D01*

+X467551Y146247D01*

+X467445Y146299D01*

+X467332Y146334D01*

+Y171670D01*

+X467443Y171704D01*

+X467550Y171756D01*

+X467646Y171823D01*

+X467731Y171905D01*

+X467802Y172000D01*

+X467856Y172105D01*

+X468015Y172508D01*

+X468132Y172925D01*

+X468211Y173352D01*

+X468250Y173783D01*

+Y174217D01*

+X468211Y174648D01*

+X468132Y175075D01*

+X468015Y175492D01*

+X467860Y175897D01*

+X467805Y176002D01*

+X467734Y176097D01*

+X467648Y176179D01*

+X467551Y176247D01*

+X467445Y176299D01*

+X467332Y176334D01*

+Y201670D01*

+X467443Y201704D01*

+X467550Y201756D01*

+X467646Y201823D01*

+X467731Y201905D01*

+X467802Y202000D01*

+X467856Y202105D01*

+X468015Y202508D01*

+X468132Y202925D01*

+X468211Y203352D01*

+X468250Y203783D01*

+Y204217D01*

+X468211Y204648D01*

+X468132Y205075D01*

+X468015Y205492D01*

+X467860Y205897D01*

+X467805Y206002D01*

+X467734Y206097D01*

+X467648Y206179D01*

+X467551Y206247D01*

+X467445Y206299D01*

+X467332Y206334D01*

+Y231670D01*

+X467443Y231704D01*

+X467550Y231756D01*

+X467646Y231823D01*

+X467731Y231905D01*

+X467802Y232000D01*

+X467856Y232105D01*

+X468015Y232508D01*

+X468132Y232925D01*

+X468211Y233352D01*

+X468250Y233783D01*

+Y234217D01*

+X468211Y234648D01*

+X468132Y235075D01*

+X468015Y235492D01*

+X467860Y235897D01*

+X467805Y236002D01*

+X467734Y236097D01*

+X467648Y236179D01*

+X467551Y236247D01*

+X467445Y236299D01*

+X467332Y236334D01*

+Y261670D01*

+X467443Y261704D01*

+X467550Y261756D01*

+X467646Y261823D01*

+X467731Y261905D01*

+X467802Y262000D01*

+X467856Y262105D01*

+X468015Y262508D01*

+X468132Y262925D01*

+X468211Y263352D01*

+X468250Y263783D01*

+Y264217D01*

+X468211Y264648D01*

+X468132Y265075D01*

+X468015Y265492D01*

+X467860Y265897D01*

+X467805Y266002D01*

+X467734Y266097D01*

+X467648Y266179D01*

+X467551Y266247D01*

+X467445Y266299D01*

+X467332Y266334D01*

+Y291670D01*

+X467443Y291704D01*

+X467550Y291756D01*

+X467646Y291823D01*

+X467731Y291905D01*

+X467802Y292000D01*

+X467856Y292105D01*

+X468015Y292508D01*

+X468132Y292925D01*

+X468211Y293352D01*

+X468250Y293783D01*

+Y294217D01*

+X468211Y294648D01*

+X468132Y295075D01*

+X468015Y295492D01*

+X467860Y295897D01*

+X467805Y296002D01*

+X467734Y296097D01*

+X467648Y296179D01*

+X467551Y296247D01*

+X467445Y296299D01*

+X467332Y296334D01*

+Y321670D01*

+X467443Y321704D01*

+X467550Y321756D01*

+X467646Y321823D01*

+X467731Y321905D01*

+X467802Y322000D01*

+X467856Y322105D01*

+X468015Y322508D01*

+X468132Y322925D01*

+X468211Y323352D01*

+X468250Y323783D01*

+Y324217D01*

+X468211Y324648D01*

+X468132Y325075D01*

+X468015Y325492D01*

+X467860Y325897D01*

+X467805Y326002D01*

+X467734Y326097D01*

+X467648Y326179D01*

+X467551Y326247D01*

+X467445Y326299D01*

+X467332Y326334D01*

+Y351670D01*

+X467443Y351704D01*

+X467550Y351756D01*

+X467646Y351823D01*

+X467731Y351905D01*

+X467802Y352000D01*

+X467856Y352105D01*

+X468015Y352508D01*

+X468132Y352925D01*

+X468211Y353352D01*

+X468250Y353783D01*

+Y354217D01*

+X468211Y354648D01*

+X468132Y355075D01*

+X468015Y355492D01*

+X467860Y355897D01*

+X467805Y356002D01*

+X467734Y356097D01*

+X467648Y356179D01*

+X467551Y356247D01*

+X467445Y356299D01*

+X467332Y356334D01*

+Y381670D01*

+X467443Y381704D01*

+X467550Y381756D01*

+X467646Y381823D01*

+X467731Y381905D01*

+X467802Y382000D01*

+X467856Y382105D01*

+X468015Y382508D01*

+X468132Y382925D01*

+X468211Y383352D01*

+X468250Y383783D01*

+Y384217D01*

+X468211Y384648D01*

+X468132Y385075D01*

+X468015Y385492D01*

+X467860Y385897D01*

+X467805Y386002D01*

+X467734Y386097D01*

+X467648Y386179D01*

+X467551Y386247D01*

+X467445Y386299D01*

+X467332Y386334D01*

+Y397000D01*

+X473493D01*

+Y388764D01*

+X472755Y388706D01*

+X472028Y388531D01*

+X471337Y388245D01*

+X470699Y387855D01*

+X470131Y387369D01*

+X469645Y386801D01*

+X469255Y386163D01*

+X468969Y385472D01*

+X468794Y384745D01*

+X468735Y384000D01*

+X468794Y383255D01*

+X468969Y382528D01*

+X469255Y381837D01*

+X469645Y381199D01*

+X470131Y380631D01*

+X470699Y380145D01*

+X471337Y379755D01*

+X472028Y379469D01*

+X472755Y379294D01*

+X473493Y379236D01*

+Y358764D01*

+X472755Y358706D01*

+X472028Y358531D01*

+X471337Y358245D01*

+X470699Y357855D01*

+X470131Y357369D01*

+X469645Y356801D01*

+X469255Y356163D01*

+X468969Y355472D01*

+X468794Y354745D01*

+X468735Y354000D01*

+X468794Y353255D01*

+X468969Y352528D01*

+X469255Y351837D01*

+X469645Y351199D01*

+X470131Y350631D01*

+X470699Y350145D01*

+X471337Y349755D01*

+X472028Y349469D01*

+X472755Y349294D01*

+X473493Y349236D01*

+Y328764D01*

+X472755Y328706D01*

+X472028Y328531D01*

+X471337Y328245D01*

+X470699Y327855D01*

+X470131Y327369D01*

+X469645Y326801D01*

+X469255Y326163D01*

+X468969Y325472D01*

+X468794Y324745D01*

+X468735Y324000D01*

+X468794Y323255D01*

+X468969Y322528D01*

+X469255Y321837D01*

+X469645Y321199D01*

+X470131Y320631D01*

+X470699Y320145D01*

+X471337Y319755D01*

+X472028Y319469D01*

+X472755Y319294D01*

+X473493Y319236D01*

+Y298764D01*

+X472755Y298706D01*

+X472028Y298531D01*

+X471337Y298245D01*

+X470699Y297855D01*

+X470131Y297369D01*

+X469645Y296801D01*

+X469255Y296163D01*

+X468969Y295472D01*

+X468794Y294745D01*

+X468735Y294000D01*

+X468794Y293255D01*

+X468969Y292528D01*

+X469255Y291837D01*

+X469645Y291199D01*

+X470131Y290631D01*

+X470699Y290145D01*

+X471337Y289755D01*

+X472028Y289469D01*

+X472755Y289294D01*

+X473493Y289236D01*

+Y268764D01*

+X472755Y268706D01*

+X472028Y268531D01*

+X471337Y268245D01*

+X470699Y267855D01*

+X470131Y267369D01*

+X469645Y266801D01*

+X469255Y266163D01*

+X468969Y265472D01*

+X468794Y264745D01*

+X468735Y264000D01*

+X468794Y263255D01*

+X468969Y262528D01*

+X469255Y261837D01*

+X469645Y261199D01*

+X470131Y260631D01*

+X470699Y260145D01*

+X471337Y259755D01*

+X472028Y259469D01*

+X472755Y259294D01*

+X473493Y259236D01*

+Y238764D01*

+X472755Y238706D01*

+X472028Y238531D01*

+X471337Y238245D01*

+X470699Y237855D01*

+X470131Y237369D01*

+X469645Y236801D01*

+X469255Y236163D01*

+X468969Y235472D01*

+X468794Y234745D01*

+X468735Y234000D01*

+X468794Y233255D01*

+X468969Y232528D01*

+X469255Y231837D01*

+X469645Y231199D01*

+X470131Y230631D01*

+X470699Y230145D01*

+X471337Y229755D01*

+X472028Y229469D01*

+X472755Y229294D01*

+X473493Y229236D01*

+Y208764D01*

+X472755Y208706D01*

+X472028Y208531D01*

+X471337Y208245D01*

+X470699Y207855D01*

+X470131Y207369D01*

+X469645Y206801D01*

+X469255Y206163D01*

+X468969Y205472D01*

+X468794Y204745D01*

+X468735Y204000D01*

+X468794Y203255D01*

+X468969Y202528D01*

+X469255Y201837D01*

+X469645Y201199D01*

+X470131Y200631D01*

+X470699Y200145D01*

+X471337Y199755D01*

+X472028Y199469D01*

+X472755Y199294D01*

+X473493Y199236D01*

+Y178764D01*

+X472755Y178706D01*

+X472028Y178531D01*

+X471337Y178245D01*

+X470699Y177855D01*

+X470131Y177369D01*

+X469645Y176801D01*

+X469255Y176163D01*

+X468969Y175472D01*

+X468794Y174745D01*

+X468735Y174000D01*

+X468794Y173255D01*

+X468969Y172528D01*

+X469255Y171837D01*

+X469645Y171199D01*

+X470131Y170631D01*

+X470699Y170145D01*

+X471337Y169755D01*

+X472028Y169469D01*

+X472755Y169294D01*

+X473493Y169236D01*

+Y148764D01*

+X472755Y148706D01*

+X472028Y148531D01*

+X471337Y148245D01*

+X470699Y147855D01*

+X470131Y147369D01*

+X469645Y146801D01*

+X469255Y146163D01*

+X468969Y145472D01*

+X468794Y144745D01*

+X468735Y144000D01*

+X468794Y143255D01*

+X468969Y142528D01*

+X469255Y141837D01*

+X469645Y141199D01*

+X470131Y140631D01*

+X470699Y140145D01*

+X471337Y139755D01*

+X472028Y139469D01*

+X472755Y139294D01*

+X473493Y139236D01*

+Y118764D01*

+X472755Y118706D01*

+X472028Y118531D01*

+X471337Y118245D01*

+X470699Y117855D01*

+X470131Y117369D01*

+X469645Y116801D01*

+X469255Y116163D01*

+X468969Y115472D01*

+X468794Y114745D01*

+X468735Y114000D01*

+X468794Y113255D01*

+X468969Y112528D01*

+X469255Y111837D01*

+X469645Y111199D01*

+X470131Y110631D01*

+X470699Y110145D01*

+X471337Y109755D01*

+X472028Y109469D01*

+X472755Y109294D01*

+X473493Y109236D01*

+Y88764D01*

+X472755Y88706D01*

+X472028Y88531D01*

+X471337Y88245D01*

+X470699Y87855D01*

+X470131Y87369D01*

+X469645Y86801D01*

+X469255Y86163D01*

+X468969Y85472D01*

+X468794Y84745D01*

+X468735Y84000D01*

+X468794Y83255D01*

+X468969Y82528D01*

+X469255Y81837D01*

+X469645Y81199D01*

+X470131Y80631D01*

+X470699Y80145D01*

+X471337Y79755D01*

+X472028Y79469D01*

+X472755Y79294D01*

+X473493Y79236D01*

+Y58764D01*

+X472755Y58706D01*

+X472028Y58531D01*

+X471337Y58245D01*

+X470699Y57855D01*

+X470131Y57369D01*

+X469645Y56801D01*

+X469255Y56163D01*

+X468969Y55472D01*

+X468794Y54745D01*

+X468735Y54000D01*

+X468794Y53255D01*

+X468969Y52528D01*

+X469255Y51837D01*

+X469645Y51199D01*

+X470131Y50631D01*

+X470699Y50145D01*

+X471337Y49755D01*

+X472028Y49469D01*

+X472755Y49294D01*

+X473493Y49236D01*

+Y39000D01*

+G37*

+G36*

+X467332D02*X463502D01*

+Y49250D01*

+X463717D01*

+X464148Y49289D01*

+X464575Y49368D01*

+X464992Y49485D01*

+X465397Y49640D01*

+X465502Y49695D01*

+X465597Y49766D01*

+X465679Y49852D01*

+X465747Y49949D01*

+X465799Y50055D01*

+X465834Y50169D01*

+X465850Y50286D01*

+X465848Y50405D01*

+X465827Y50522D01*

+X465789Y50634D01*

+X465733Y50738D01*

+X465662Y50833D01*

+X465576Y50915D01*

+X465479Y50983D01*

+X465373Y51035D01*

+X465259Y51070D01*

+X465142Y51086D01*

+X465023Y51084D01*

+X464906Y51064D01*

+X464795Y51023D01*

+X464520Y50914D01*

+X464235Y50834D01*

+X463943Y50780D01*

+X463648Y50753D01*

+X463502D01*

+Y57247D01*

+X463648D01*

+X463943Y57220D01*

+X464235Y57166D01*

+X464520Y57086D01*

+X464797Y56980D01*

+X464907Y56940D01*

+X465024Y56919D01*

+X465142Y56917D01*

+X465259Y56933D01*

+X465371Y56968D01*

+X465478Y57020D01*

+X465574Y57087D01*

+X465659Y57169D01*

+X465730Y57263D01*

+X465786Y57368D01*

+X465824Y57479D01*

+X465845Y57596D01*

+X465847Y57714D01*

+X465830Y57830D01*

+X465796Y57943D01*

+X465744Y58050D01*

+X465677Y58146D01*

+X465595Y58231D01*

+X465500Y58302D01*

+X465395Y58356D01*

+X464992Y58515D01*

+X464575Y58632D01*

+X464148Y58711D01*

+X463717Y58750D01*

+X463502D01*

+Y79250D01*

+X463717D01*

+X464148Y79289D01*

+X464575Y79368D01*

+X464992Y79485D01*

+X465397Y79640D01*

+X465502Y79695D01*

+X465597Y79766D01*

+X465679Y79852D01*

+X465747Y79949D01*

+X465799Y80055D01*

+X465834Y80169D01*

+X465850Y80286D01*

+X465848Y80405D01*

+X465827Y80522D01*

+X465789Y80634D01*

+X465733Y80738D01*

+X465662Y80833D01*

+X465576Y80915D01*

+X465479Y80983D01*

+X465373Y81035D01*

+X465259Y81070D01*

+X465142Y81086D01*

+X465023Y81084D01*

+X464906Y81064D01*

+X464795Y81023D01*

+X464520Y80914D01*

+X464235Y80834D01*

+X463943Y80780D01*

+X463648Y80753D01*

+X463502D01*

+Y87247D01*

+X463648D01*

+X463943Y87220D01*

+X464235Y87166D01*

+X464520Y87086D01*

+X464797Y86980D01*

+X464907Y86940D01*

+X465024Y86919D01*

+X465142Y86917D01*

+X465259Y86933D01*

+X465371Y86968D01*

+X465478Y87020D01*

+X465574Y87087D01*

+X465659Y87169D01*

+X465730Y87263D01*

+X465786Y87368D01*

+X465824Y87479D01*

+X465845Y87596D01*

+X465847Y87714D01*

+X465830Y87830D01*

+X465796Y87943D01*

+X465744Y88050D01*

+X465677Y88146D01*

+X465595Y88231D01*

+X465500Y88302D01*

+X465395Y88356D01*

+X464992Y88515D01*

+X464575Y88632D01*

+X464148Y88711D01*

+X463717Y88750D01*

+X463502D01*

+Y109250D01*

+X463717D01*

+X464148Y109289D01*

+X464575Y109368D01*

+X464992Y109485D01*

+X465397Y109640D01*

+X465502Y109695D01*

+X465597Y109766D01*

+X465679Y109852D01*

+X465747Y109949D01*

+X465799Y110055D01*

+X465834Y110169D01*

+X465850Y110286D01*

+X465848Y110405D01*

+X465827Y110522D01*

+X465789Y110634D01*

+X465733Y110738D01*

+X465662Y110833D01*

+X465576Y110915D01*

+X465479Y110983D01*

+X465373Y111035D01*

+X465259Y111070D01*

+X465142Y111086D01*

+X465023Y111084D01*

+X464906Y111064D01*

+X464795Y111023D01*

+X464520Y110914D01*

+X464235Y110834D01*

+X463943Y110780D01*

+X463648Y110753D01*

+X463502D01*

+Y117247D01*

+X463648D01*

+X463943Y117220D01*

+X464235Y117166D01*

+X464520Y117086D01*

+X464797Y116980D01*

+X464907Y116940D01*

+X465024Y116919D01*

+X465142Y116917D01*

+X465259Y116933D01*

+X465371Y116968D01*

+X465478Y117020D01*

+X465574Y117087D01*

+X465659Y117169D01*

+X465730Y117263D01*

+X465786Y117368D01*

+X465824Y117479D01*

+X465845Y117596D01*

+X465847Y117714D01*

+X465830Y117830D01*

+X465796Y117943D01*

+X465744Y118050D01*

+X465677Y118146D01*

+X465595Y118231D01*

+X465500Y118302D01*

+X465395Y118356D01*

+X464992Y118515D01*

+X464575Y118632D01*

+X464148Y118711D01*

+X463717Y118750D01*

+X463502D01*

+Y139250D01*

+X463717D01*

+X464148Y139289D01*

+X464575Y139368D01*

+X464992Y139485D01*

+X465397Y139640D01*

+X465502Y139695D01*

+X465597Y139766D01*

+X465679Y139852D01*

+X465747Y139949D01*

+X465799Y140055D01*

+X465834Y140169D01*

+X465850Y140286D01*

+X465848Y140405D01*

+X465827Y140522D01*

+X465789Y140634D01*

+X465733Y140738D01*

+X465662Y140833D01*

+X465576Y140915D01*

+X465479Y140983D01*

+X465373Y141035D01*

+X465259Y141070D01*

+X465142Y141086D01*

+X465023Y141084D01*

+X464906Y141064D01*

+X464795Y141023D01*

+X464520Y140914D01*

+X464235Y140834D01*

+X463943Y140780D01*

+X463648Y140753D01*

+X463502D01*

+Y147247D01*

+X463648D01*

+X463943Y147220D01*

+X464235Y147166D01*

+X464520Y147086D01*

+X464797Y146980D01*

+X464907Y146940D01*

+X465024Y146919D01*

+X465142Y146917D01*

+X465259Y146933D01*

+X465371Y146968D01*

+X465478Y147020D01*

+X465574Y147087D01*

+X465659Y147169D01*

+X465730Y147263D01*

+X465786Y147368D01*

+X465824Y147479D01*

+X465845Y147596D01*

+X465847Y147714D01*

+X465830Y147830D01*

+X465796Y147943D01*

+X465744Y148050D01*

+X465677Y148146D01*

+X465595Y148231D01*

+X465500Y148302D01*

+X465395Y148356D01*

+X464992Y148515D01*

+X464575Y148632D01*

+X464148Y148711D01*

+X463717Y148750D01*

+X463502D01*

+Y169250D01*

+X463717D01*

+X464148Y169289D01*

+X464575Y169368D01*

+X464992Y169485D01*

+X465397Y169640D01*

+X465502Y169695D01*

+X465597Y169766D01*

+X465679Y169852D01*

+X465747Y169949D01*

+X465799Y170055D01*

+X465834Y170169D01*

+X465850Y170286D01*

+X465848Y170405D01*

+X465827Y170522D01*

+X465789Y170634D01*

+X465733Y170738D01*

+X465662Y170833D01*

+X465576Y170915D01*

+X465479Y170983D01*

+X465373Y171035D01*

+X465259Y171070D01*

+X465142Y171086D01*

+X465023Y171084D01*

+X464906Y171064D01*

+X464795Y171023D01*

+X464520Y170914D01*

+X464235Y170834D01*

+X463943Y170780D01*

+X463648Y170753D01*

+X463502D01*

+Y177247D01*

+X463648D01*

+X463943Y177220D01*

+X464235Y177166D01*

+X464520Y177086D01*

+X464797Y176980D01*

+X464907Y176940D01*

+X465024Y176919D01*

+X465142Y176917D01*

+X465259Y176933D01*

+X465371Y176968D01*

+X465478Y177020D01*

+X465574Y177087D01*

+X465659Y177169D01*

+X465730Y177263D01*

+X465786Y177368D01*

+X465824Y177479D01*

+X465845Y177596D01*

+X465847Y177714D01*

+X465830Y177830D01*

+X465796Y177943D01*

+X465744Y178050D01*

+X465677Y178146D01*

+X465595Y178231D01*

+X465500Y178302D01*

+X465395Y178356D01*

+X464992Y178515D01*

+X464575Y178632D01*

+X464148Y178711D01*

+X463717Y178750D01*

+X463502D01*

+Y199250D01*

+X463717D01*

+X464148Y199289D01*

+X464575Y199368D01*

+X464992Y199485D01*

+X465397Y199640D01*

+X465502Y199695D01*

+X465597Y199766D01*

+X465679Y199852D01*

+X465747Y199949D01*

+X465799Y200055D01*

+X465834Y200169D01*

+X465850Y200286D01*

+X465848Y200405D01*

+X465827Y200522D01*

+X465789Y200634D01*

+X465733Y200738D01*

+X465662Y200833D01*

+X465576Y200915D01*

+X465479Y200983D01*

+X465373Y201035D01*

+X465259Y201070D01*

+X465142Y201086D01*

+X465023Y201084D01*

+X464906Y201064D01*

+X464795Y201023D01*

+X464520Y200914D01*

+X464235Y200834D01*

+X463943Y200780D01*

+X463648Y200753D01*

+X463502D01*

+Y207247D01*

+X463648D01*

+X463943Y207220D01*

+X464235Y207166D01*

+X464520Y207086D01*

+X464797Y206980D01*

+X464907Y206940D01*

+X465024Y206919D01*

+X465142Y206917D01*

+X465259Y206933D01*

+X465371Y206968D01*

+X465478Y207020D01*

+X465574Y207087D01*

+X465659Y207169D01*

+X465730Y207263D01*

+X465786Y207368D01*

+X465824Y207479D01*

+X465845Y207596D01*

+X465847Y207714D01*

+X465830Y207830D01*

+X465796Y207943D01*

+X465744Y208050D01*

+X465677Y208146D01*

+X465595Y208231D01*

+X465500Y208302D01*

+X465395Y208356D01*

+X464992Y208515D01*

+X464575Y208632D01*

+X464148Y208711D01*

+X463717Y208750D01*

+X463502D01*

+Y229250D01*

+X463717D01*

+X464148Y229289D01*

+X464575Y229368D01*

+X464992Y229485D01*

+X465397Y229640D01*

+X465502Y229695D01*

+X465597Y229766D01*

+X465679Y229852D01*

+X465747Y229949D01*

+X465799Y230055D01*

+X465834Y230169D01*

+X465850Y230286D01*

+X465848Y230405D01*

+X465827Y230522D01*

+X465789Y230634D01*

+X465733Y230738D01*

+X465662Y230833D01*

+X465576Y230915D01*

+X465479Y230983D01*

+X465373Y231035D01*

+X465259Y231070D01*

+X465142Y231086D01*

+X465023Y231084D01*

+X464906Y231064D01*

+X464795Y231023D01*

+X464520Y230914D01*

+X464235Y230834D01*

+X463943Y230780D01*

+X463648Y230753D01*

+X463502D01*

+Y237247D01*

+X463648D01*

+X463943Y237220D01*

+X464235Y237166D01*

+X464520Y237086D01*

+X464797Y236980D01*

+X464907Y236940D01*

+X465024Y236919D01*

+X465142Y236917D01*

+X465259Y236933D01*

+X465371Y236968D01*

+X465478Y237020D01*

+X465574Y237087D01*

+X465659Y237169D01*

+X465730Y237263D01*

+X465786Y237368D01*

+X465824Y237479D01*

+X465845Y237596D01*

+X465847Y237714D01*

+X465830Y237830D01*

+X465796Y237943D01*

+X465744Y238050D01*

+X465677Y238146D01*

+X465595Y238231D01*

+X465500Y238302D01*

+X465395Y238356D01*

+X464992Y238515D01*

+X464575Y238632D01*

+X464148Y238711D01*

+X463717Y238750D01*

+X463502D01*

+Y259250D01*

+X463717D01*

+X464148Y259289D01*

+X464575Y259368D01*

+X464992Y259485D01*

+X465397Y259640D01*

+X465502Y259695D01*

+X465597Y259766D01*

+X465679Y259852D01*

+X465747Y259949D01*

+X465799Y260055D01*

+X465834Y260169D01*

+X465850Y260286D01*

+X465848Y260405D01*

+X465827Y260522D01*

+X465789Y260634D01*

+X465733Y260738D01*

+X465662Y260833D01*

+X465576Y260915D01*

+X465479Y260983D01*

+X465373Y261035D01*

+X465259Y261070D01*

+X465142Y261086D01*

+X465023Y261084D01*

+X464906Y261064D01*

+X464795Y261023D01*

+X464520Y260914D01*

+X464235Y260834D01*

+X463943Y260780D01*

+X463648Y260753D01*

+X463502D01*

+Y267247D01*

+X463648D01*

+X463943Y267220D01*

+X464235Y267166D01*

+X464520Y267086D01*

+X464797Y266980D01*

+X464907Y266940D01*

+X465024Y266919D01*

+X465142Y266917D01*

+X465259Y266933D01*

+X465371Y266968D01*

+X465478Y267020D01*

+X465574Y267087D01*

+X465659Y267169D01*

+X465730Y267263D01*

+X465786Y267368D01*

+X465824Y267479D01*

+X465845Y267596D01*

+X465847Y267714D01*

+X465830Y267830D01*

+X465796Y267943D01*

+X465744Y268050D01*

+X465677Y268146D01*

+X465595Y268231D01*

+X465500Y268302D01*

+X465395Y268356D01*

+X464992Y268515D01*

+X464575Y268632D01*

+X464148Y268711D01*

+X463717Y268750D01*

+X463502D01*

+Y289250D01*

+X463717D01*

+X464148Y289289D01*

+X464575Y289368D01*

+X464992Y289485D01*

+X465397Y289640D01*

+X465502Y289695D01*

+X465597Y289766D01*

+X465679Y289852D01*

+X465747Y289949D01*

+X465799Y290055D01*

+X465834Y290169D01*

+X465850Y290286D01*

+X465848Y290405D01*

+X465827Y290522D01*

+X465789Y290634D01*

+X465733Y290738D01*

+X465662Y290833D01*

+X465576Y290915D01*

+X465479Y290983D01*

+X465373Y291035D01*

+X465259Y291070D01*

+X465142Y291086D01*

+X465023Y291084D01*

+X464906Y291064D01*

+X464795Y291023D01*

+X464520Y290914D01*

+X464235Y290834D01*

+X463943Y290780D01*

+X463648Y290753D01*

+X463502D01*

+Y297247D01*

+X463648D01*

+X463943Y297220D01*

+X464235Y297166D01*

+X464520Y297086D01*

+X464797Y296980D01*

+X464907Y296940D01*

+X465024Y296919D01*

+X465142Y296917D01*

+X465259Y296933D01*

+X465371Y296968D01*

+X465478Y297020D01*

+X465574Y297087D01*

+X465659Y297169D01*

+X465730Y297263D01*

+X465786Y297368D01*

+X465824Y297479D01*

+X465845Y297596D01*

+X465847Y297714D01*

+X465830Y297830D01*

+X465796Y297943D01*

+X465744Y298050D01*

+X465677Y298146D01*

+X465595Y298231D01*

+X465500Y298302D01*

+X465395Y298356D01*

+X464992Y298515D01*

+X464575Y298632D01*

+X464148Y298711D01*

+X463717Y298750D01*

+X463502D01*

+Y319250D01*

+X463717D01*

+X464148Y319289D01*

+X464575Y319368D01*

+X464992Y319485D01*

+X465397Y319640D01*

+X465502Y319695D01*

+X465597Y319766D01*

+X465679Y319852D01*

+X465747Y319949D01*

+X465799Y320055D01*

+X465834Y320169D01*

+X465850Y320286D01*

+X465848Y320405D01*

+X465827Y320522D01*

+X465789Y320634D01*

+X465733Y320738D01*

+X465662Y320833D01*

+X465576Y320915D01*

+X465479Y320983D01*

+X465373Y321035D01*

+X465259Y321070D01*

+X465142Y321086D01*

+X465023Y321084D01*

+X464906Y321064D01*

+X464795Y321023D01*

+X464520Y320914D01*

+X464235Y320834D01*

+X463943Y320780D01*

+X463648Y320753D01*

+X463502D01*

+Y327247D01*

+X463648D01*

+X463943Y327220D01*

+X464235Y327166D01*

+X464520Y327086D01*

+X464797Y326980D01*

+X464907Y326940D01*

+X465024Y326919D01*

+X465142Y326917D01*

+X465259Y326933D01*

+X465371Y326968D01*

+X465478Y327020D01*

+X465574Y327087D01*

+X465659Y327169D01*

+X465730Y327263D01*

+X465786Y327368D01*

+X465824Y327479D01*

+X465845Y327596D01*

+X465847Y327714D01*

+X465830Y327830D01*

+X465796Y327943D01*

+X465744Y328050D01*

+X465677Y328146D01*

+X465595Y328231D01*

+X465500Y328302D01*

+X465395Y328356D01*

+X464992Y328515D01*

+X464575Y328632D01*

+X464148Y328711D01*

+X463717Y328750D01*

+X463502D01*

+Y349250D01*

+X463717D01*

+X464148Y349289D01*

+X464575Y349368D01*

+X464992Y349485D01*

+X465397Y349640D01*

+X465502Y349695D01*

+X465597Y349766D01*

+X465679Y349852D01*

+X465747Y349949D01*

+X465799Y350055D01*

+X465834Y350169D01*

+X465850Y350286D01*

+X465848Y350405D01*

+X465827Y350522D01*

+X465789Y350634D01*

+X465733Y350738D01*

+X465662Y350833D01*

+X465576Y350915D01*

+X465479Y350983D01*

+X465373Y351035D01*

+X465259Y351070D01*

+X465142Y351086D01*

+X465023Y351084D01*

+X464906Y351064D01*

+X464795Y351023D01*

+X464520Y350914D01*

+X464235Y350834D01*

+X463943Y350780D01*

+X463648Y350753D01*

+X463502D01*

+Y357247D01*

+X463648D01*

+X463943Y357220D01*

+X464235Y357166D01*

+X464520Y357086D01*

+X464797Y356980D01*

+X464907Y356940D01*

+X465024Y356919D01*

+X465142Y356917D01*

+X465259Y356933D01*

+X465371Y356968D01*

+X465478Y357020D01*

+X465574Y357087D01*

+X465659Y357169D01*

+X465730Y357263D01*

+X465786Y357368D01*

+X465824Y357479D01*

+X465845Y357596D01*

+X465847Y357714D01*

+X465830Y357830D01*

+X465796Y357943D01*

+X465744Y358050D01*

+X465677Y358146D01*

+X465595Y358231D01*

+X465500Y358302D01*

+X465395Y358356D01*

+X464992Y358515D01*

+X464575Y358632D01*

+X464148Y358711D01*

+X463717Y358750D01*

+X463502D01*

+Y379250D01*

+X463717D01*

+X464148Y379289D01*

+X464575Y379368D01*

+X464992Y379485D01*

+X465397Y379640D01*

+X465502Y379695D01*

+X465597Y379766D01*

+X465679Y379852D01*

+X465747Y379949D01*

+X465799Y380055D01*

+X465834Y380169D01*

+X465850Y380286D01*

+X465848Y380405D01*

+X465827Y380522D01*

+X465789Y380634D01*

+X465733Y380738D01*

+X465662Y380833D01*

+X465576Y380915D01*

+X465479Y380983D01*

+X465373Y381035D01*

+X465259Y381070D01*

+X465142Y381086D01*

+X465023Y381084D01*

+X464906Y381064D01*

+X464795Y381023D01*

+X464520Y380914D01*

+X464235Y380834D01*

+X463943Y380780D01*

+X463648Y380753D01*

+X463502D01*

+Y387247D01*

+X463648D01*

+X463943Y387220D01*

+X464235Y387166D01*

+X464520Y387086D01*

+X464797Y386980D01*

+X464907Y386940D01*

+X465024Y386919D01*

+X465142Y386917D01*

+X465259Y386933D01*

+X465371Y386968D01*

+X465478Y387020D01*

+X465574Y387087D01*

+X465659Y387169D01*

+X465730Y387263D01*

+X465786Y387368D01*

+X465824Y387479D01*

+X465845Y387596D01*

+X465847Y387714D01*

+X465830Y387830D01*

+X465796Y387943D01*

+X465744Y388050D01*

+X465677Y388146D01*

+X465595Y388231D01*

+X465500Y388302D01*

+X465395Y388356D01*

+X464992Y388515D01*

+X464575Y388632D01*

+X464148Y388711D01*

+X463717Y388750D01*

+X463502D01*

+Y397000D01*

+X467332D01*

+Y386334D01*

+X467331Y386334D01*

+X467214Y386350D01*

+X467095Y386348D01*

+X466978Y386327D01*

+X466866Y386289D01*

+X466762Y386233D01*

+X466667Y386162D01*

+X466585Y386076D01*

+X466517Y385979D01*

+X466465Y385873D01*

+X466430Y385759D01*

+X466414Y385642D01*

+X466416Y385523D01*

+X466436Y385407D01*

+X466477Y385295D01*

+X466586Y385020D01*

+X466666Y384735D01*

+X466720Y384443D01*

+X466747Y384148D01*

+Y383852D01*

+X466720Y383557D01*

+X466666Y383265D01*

+X466586Y382980D01*

+X466480Y382703D01*

+X466440Y382593D01*

+X466419Y382476D01*

+X466417Y382358D01*

+X466433Y382241D01*

+X466468Y382129D01*

+X466520Y382022D01*

+X466587Y381926D01*

+X466669Y381841D01*

+X466763Y381770D01*

+X466868Y381714D01*

+X466979Y381676D01*

+X467096Y381655D01*

+X467214Y381653D01*

+X467330Y381670D01*

+X467332Y381670D01*

+Y356334D01*

+X467331Y356334D01*

+X467214Y356350D01*

+X467095Y356348D01*

+X466978Y356327D01*

+X466866Y356289D01*

+X466762Y356233D01*

+X466667Y356162D01*

+X466585Y356076D01*

+X466517Y355979D01*

+X466465Y355873D01*

+X466430Y355759D01*

+X466414Y355642D01*

+X466416Y355523D01*

+X466436Y355407D01*

+X466477Y355295D01*

+X466586Y355020D01*

+X466666Y354735D01*

+X466720Y354443D01*

+X466747Y354148D01*

+Y353852D01*

+X466720Y353557D01*

+X466666Y353265D01*

+X466586Y352980D01*

+X466480Y352703D01*

+X466440Y352593D01*

+X466419Y352476D01*

+X466417Y352358D01*

+X466433Y352241D01*

+X466468Y352129D01*

+X466520Y352022D01*

+X466587Y351926D01*

+X466669Y351841D01*

+X466763Y351770D01*

+X466868Y351714D01*

+X466979Y351676D01*

+X467096Y351655D01*

+X467214Y351653D01*

+X467330Y351670D01*

+X467332Y351670D01*

+Y326334D01*

+X467331Y326334D01*

+X467214Y326350D01*

+X467095Y326348D01*

+X466978Y326327D01*

+X466866Y326289D01*

+X466762Y326233D01*

+X466667Y326162D01*

+X466585Y326076D01*

+X466517Y325979D01*

+X466465Y325873D01*

+X466430Y325759D01*

+X466414Y325642D01*

+X466416Y325523D01*

+X466436Y325407D01*

+X466477Y325295D01*

+X466586Y325020D01*

+X466666Y324735D01*

+X466720Y324443D01*

+X466747Y324148D01*

+Y323852D01*

+X466720Y323557D01*

+X466666Y323265D01*

+X466586Y322980D01*

+X466480Y322703D01*

+X466440Y322593D01*

+X466419Y322476D01*

+X466417Y322358D01*

+X466433Y322241D01*

+X466468Y322129D01*

+X466520Y322022D01*

+X466587Y321926D01*

+X466669Y321841D01*

+X466763Y321770D01*

+X466868Y321714D01*

+X466979Y321676D01*

+X467096Y321655D01*

+X467214Y321653D01*

+X467330Y321670D01*

+X467332Y321670D01*

+Y296334D01*

+X467331Y296334D01*

+X467214Y296350D01*

+X467095Y296348D01*

+X466978Y296327D01*

+X466866Y296289D01*

+X466762Y296233D01*

+X466667Y296162D01*

+X466585Y296076D01*

+X466517Y295979D01*

+X466465Y295873D01*

+X466430Y295759D01*

+X466414Y295642D01*

+X466416Y295523D01*

+X466436Y295407D01*

+X466477Y295295D01*

+X466586Y295020D01*

+X466666Y294735D01*

+X466720Y294443D01*

+X466747Y294148D01*

+Y293852D01*

+X466720Y293557D01*

+X466666Y293265D01*

+X466586Y292980D01*

+X466480Y292703D01*

+X466440Y292593D01*

+X466419Y292476D01*

+X466417Y292358D01*

+X466433Y292241D01*

+X466468Y292129D01*

+X466520Y292022D01*

+X466587Y291926D01*

+X466669Y291841D01*

+X466763Y291770D01*

+X466868Y291714D01*

+X466979Y291676D01*

+X467096Y291655D01*

+X467214Y291653D01*

+X467330Y291670D01*

+X467332Y291670D01*

+Y266334D01*

+X467331Y266334D01*

+X467214Y266350D01*

+X467095Y266348D01*

+X466978Y266327D01*

+X466866Y266289D01*

+X466762Y266233D01*

+X466667Y266162D01*

+X466585Y266076D01*

+X466517Y265979D01*

+X466465Y265873D01*

+X466430Y265759D01*

+X466414Y265642D01*

+X466416Y265523D01*

+X466436Y265407D01*

+X466477Y265295D01*

+X466586Y265020D01*

+X466666Y264735D01*

+X466720Y264443D01*

+X466747Y264148D01*

+Y263852D01*

+X466720Y263557D01*

+X466666Y263265D01*

+X466586Y262980D01*

+X466480Y262703D01*

+X466440Y262593D01*

+X466419Y262476D01*

+X466417Y262358D01*

+X466433Y262241D01*

+X466468Y262129D01*

+X466520Y262022D01*

+X466587Y261926D01*

+X466669Y261841D01*

+X466763Y261770D01*

+X466868Y261714D01*

+X466979Y261676D01*

+X467096Y261655D01*

+X467214Y261653D01*

+X467330Y261670D01*

+X467332Y261670D01*

+Y236334D01*

+X467331Y236334D01*

+X467214Y236350D01*

+X467095Y236348D01*

+X466978Y236327D01*

+X466866Y236289D01*

+X466762Y236233D01*

+X466667Y236162D01*

+X466585Y236076D01*

+X466517Y235979D01*

+X466465Y235873D01*

+X466430Y235759D01*

+X466414Y235642D01*

+X466416Y235523D01*

+X466436Y235407D01*

+X466477Y235295D01*

+X466586Y235020D01*

+X466666Y234735D01*

+X466720Y234443D01*

+X466747Y234148D01*

+Y233852D01*

+X466720Y233557D01*

+X466666Y233265D01*

+X466586Y232980D01*

+X466480Y232703D01*

+X466440Y232593D01*

+X466419Y232476D01*

+X466417Y232358D01*

+X466433Y232241D01*

+X466468Y232129D01*

+X466520Y232022D01*

+X466587Y231926D01*

+X466669Y231841D01*

+X466763Y231770D01*

+X466868Y231714D01*

+X466979Y231676D01*

+X467096Y231655D01*

+X467214Y231653D01*

+X467330Y231670D01*

+X467332Y231670D01*

+Y206334D01*

+X467331Y206334D01*

+X467214Y206350D01*

+X467095Y206348D01*

+X466978Y206327D01*

+X466866Y206289D01*

+X466762Y206233D01*

+X466667Y206162D01*

+X466585Y206076D01*

+X466517Y205979D01*

+X466465Y205873D01*

+X466430Y205759D01*

+X466414Y205642D01*

+X466416Y205523D01*

+X466436Y205407D01*

+X466477Y205295D01*

+X466586Y205020D01*

+X466666Y204735D01*

+X466720Y204443D01*

+X466747Y204148D01*

+Y203852D01*

+X466720Y203557D01*

+X466666Y203265D01*

+X466586Y202980D01*

+X466480Y202703D01*

+X466440Y202593D01*

+X466419Y202476D01*

+X466417Y202358D01*

+X466433Y202241D01*

+X466468Y202129D01*

+X466520Y202022D01*

+X466587Y201926D01*

+X466669Y201841D01*

+X466763Y201770D01*

+X466868Y201714D01*

+X466979Y201676D01*

+X467096Y201655D01*

+X467214Y201653D01*

+X467330Y201670D01*

+X467332Y201670D01*

+Y176334D01*

+X467331Y176334D01*

+X467214Y176350D01*

+X467095Y176348D01*

+X466978Y176327D01*

+X466866Y176289D01*

+X466762Y176233D01*

+X466667Y176162D01*

+X466585Y176076D01*

+X466517Y175979D01*

+X466465Y175873D01*

+X466430Y175759D01*

+X466414Y175642D01*

+X466416Y175523D01*

+X466436Y175407D01*

+X466477Y175295D01*

+X466586Y175020D01*

+X466666Y174735D01*

+X466720Y174443D01*

+X466747Y174148D01*

+Y173852D01*

+X466720Y173557D01*

+X466666Y173265D01*

+X466586Y172980D01*

+X466480Y172703D01*

+X466440Y172593D01*

+X466419Y172476D01*

+X466417Y172358D01*

+X466433Y172241D01*

+X466468Y172129D01*

+X466520Y172022D01*

+X466587Y171926D01*

+X466669Y171841D01*

+X466763Y171770D01*

+X466868Y171714D01*

+X466979Y171676D01*

+X467096Y171655D01*

+X467214Y171653D01*

+X467330Y171670D01*

+X467332Y171670D01*

+Y146334D01*

+X467331Y146334D01*

+X467214Y146350D01*

+X467095Y146348D01*

+X466978Y146327D01*

+X466866Y146289D01*

+X466762Y146233D01*

+X466667Y146162D01*

+X466585Y146076D01*

+X466517Y145979D01*

+X466465Y145873D01*

+X466430Y145759D01*

+X466414Y145642D01*

+X466416Y145523D01*

+X466436Y145407D01*

+X466477Y145295D01*

+X466586Y145020D01*

+X466666Y144735D01*

+X466720Y144443D01*

+X466747Y144148D01*

+Y143852D01*

+X466720Y143557D01*

+X466666Y143265D01*

+X466586Y142980D01*

+X466480Y142703D01*

+X466440Y142593D01*

+X466419Y142476D01*

+X466417Y142358D01*

+X466433Y142241D01*

+X466468Y142129D01*

+X466520Y142022D01*

+X466587Y141926D01*

+X466669Y141841D01*

+X466763Y141770D01*

+X466868Y141714D01*

+X466979Y141676D01*

+X467096Y141655D01*

+X467214Y141653D01*

+X467330Y141670D01*

+X467332Y141670D01*

+Y116334D01*

+X467331Y116334D01*

+X467214Y116350D01*

+X467095Y116348D01*

+X466978Y116327D01*

+X466866Y116289D01*

+X466762Y116233D01*

+X466667Y116162D01*

+X466585Y116076D01*

+X466517Y115979D01*

+X466465Y115873D01*

+X466430Y115759D01*

+X466414Y115642D01*

+X466416Y115523D01*

+X466436Y115407D01*

+X466477Y115295D01*

+X466586Y115020D01*

+X466666Y114735D01*

+X466720Y114443D01*

+X466747Y114148D01*

+Y113852D01*

+X466720Y113557D01*

+X466666Y113265D01*

+X466586Y112980D01*

+X466480Y112703D01*

+X466440Y112593D01*

+X466419Y112476D01*

+X466417Y112358D01*

+X466433Y112241D01*

+X466468Y112129D01*

+X466520Y112022D01*

+X466587Y111926D01*

+X466669Y111841D01*

+X466763Y111770D01*

+X466868Y111714D01*

+X466979Y111676D01*

+X467096Y111655D01*

+X467214Y111653D01*

+X467330Y111670D01*

+X467332Y111670D01*

+Y86334D01*

+X467331Y86334D01*

+X467214Y86350D01*

+X467095Y86348D01*

+X466978Y86327D01*

+X466866Y86289D01*

+X466762Y86233D01*

+X466667Y86162D01*

+X466585Y86076D01*

+X466517Y85979D01*

+X466465Y85873D01*

+X466430Y85759D01*

+X466414Y85642D01*

+X466416Y85523D01*

+X466436Y85407D01*

+X466477Y85295D01*

+X466586Y85020D01*

+X466666Y84735D01*

+X466720Y84443D01*

+X466747Y84148D01*

+Y83852D01*

+X466720Y83557D01*

+X466666Y83265D01*

+X466586Y82980D01*

+X466480Y82703D01*

+X466440Y82593D01*

+X466419Y82476D01*

+X466417Y82358D01*

+X466433Y82241D01*

+X466468Y82129D01*

+X466520Y82022D01*

+X466587Y81926D01*

+X466669Y81841D01*

+X466763Y81770D01*

+X466868Y81714D01*

+X466979Y81676D01*

+X467096Y81655D01*

+X467214Y81653D01*

+X467330Y81670D01*

+X467332Y81670D01*

+Y56334D01*

+X467331Y56334D01*

+X467214Y56350D01*

+X467095Y56348D01*

+X466978Y56327D01*

+X466866Y56289D01*

+X466762Y56233D01*

+X466667Y56162D01*

+X466585Y56076D01*

+X466517Y55979D01*

+X466465Y55873D01*

+X466430Y55759D01*

+X466414Y55642D01*

+X466416Y55523D01*

+X466436Y55407D01*

+X466477Y55295D01*

+X466586Y55020D01*

+X466666Y54735D01*

+X466720Y54443D01*

+X466747Y54148D01*

+Y53852D01*

+X466720Y53557D01*

+X466666Y53265D01*

+X466586Y52980D01*

+X466480Y52703D01*

+X466440Y52593D01*

+X466419Y52476D01*

+X466417Y52358D01*

+X466433Y52241D01*

+X466468Y52129D01*

+X466520Y52022D01*

+X466587Y51926D01*

+X466669Y51841D01*

+X466763Y51770D01*

+X466868Y51714D01*

+X466979Y51676D01*

+X467096Y51655D01*

+X467214Y51653D01*

+X467330Y51670D01*

+X467332Y51670D01*

+Y39000D01*

+G37*

+G36*

+X463502D02*X459668D01*

+Y51666D01*

+X459669Y51666D01*

+X459786Y51650D01*

+X459905Y51652D01*

+X460022Y51673D01*

+X460134Y51711D01*

+X460238Y51767D01*

+X460333Y51838D01*

+X460415Y51924D01*

+X460483Y52021D01*

+X460535Y52127D01*

+X460570Y52241D01*

+X460586Y52358D01*

+X460584Y52477D01*

+X460564Y52593D01*

+X460523Y52705D01*

+X460414Y52980D01*

+X460334Y53265D01*

+X460280Y53557D01*

+X460253Y53852D01*

+Y54148D01*

+X460280Y54443D01*

+X460334Y54735D01*

+X460414Y55020D01*

+X460520Y55297D01*

+X460560Y55407D01*

+X460581Y55524D01*

+X460583Y55642D01*

+X460567Y55759D01*

+X460532Y55871D01*

+X460480Y55978D01*

+X460413Y56074D01*

+X460331Y56159D01*

+X460237Y56230D01*

+X460132Y56286D01*

+X460021Y56324D01*

+X459904Y56345D01*

+X459786Y56347D01*

+X459670Y56330D01*

+X459668Y56330D01*

+Y81666D01*

+X459669Y81666D01*

+X459786Y81650D01*

+X459905Y81652D01*

+X460022Y81673D01*

+X460134Y81711D01*

+X460238Y81767D01*

+X460333Y81838D01*

+X460415Y81924D01*

+X460483Y82021D01*

+X460535Y82127D01*

+X460570Y82241D01*

+X460586Y82358D01*

+X460584Y82477D01*

+X460564Y82594D01*

+X460523Y82705D01*

+X460414Y82980D01*

+X460334Y83265D01*

+X460280Y83557D01*

+X460253Y83852D01*

+Y84148D01*

+X460280Y84443D01*

+X460334Y84735D01*

+X460414Y85020D01*

+X460520Y85297D01*

+X460560Y85407D01*

+X460581Y85524D01*

+X460583Y85642D01*

+X460567Y85759D01*

+X460532Y85871D01*

+X460480Y85978D01*

+X460413Y86074D01*

+X460331Y86159D01*

+X460237Y86230D01*

+X460132Y86286D01*

+X460021Y86324D01*

+X459904Y86345D01*

+X459786Y86347D01*

+X459670Y86330D01*

+X459668Y86330D01*

+Y111666D01*

+X459669Y111666D01*

+X459786Y111650D01*

+X459905Y111652D01*

+X460022Y111673D01*

+X460134Y111711D01*

+X460238Y111767D01*

+X460333Y111838D01*

+X460415Y111924D01*

+X460483Y112021D01*

+X460535Y112127D01*

+X460570Y112241D01*

+X460586Y112358D01*

+X460584Y112477D01*

+X460564Y112594D01*

+X460523Y112705D01*

+X460414Y112980D01*

+X460334Y113265D01*

+X460280Y113557D01*

+X460253Y113852D01*

+Y114148D01*

+X460280Y114443D01*

+X460334Y114735D01*

+X460414Y115020D01*

+X460520Y115297D01*

+X460560Y115407D01*

+X460581Y115524D01*

+X460583Y115642D01*

+X460567Y115759D01*

+X460532Y115871D01*

+X460480Y115978D01*

+X460413Y116074D01*

+X460331Y116159D01*

+X460237Y116230D01*

+X460132Y116286D01*

+X460021Y116324D01*

+X459904Y116345D01*

+X459786Y116347D01*

+X459670Y116330D01*

+X459668Y116330D01*

+Y141666D01*

+X459669Y141666D01*

+X459786Y141650D01*

+X459905Y141652D01*

+X460022Y141673D01*

+X460134Y141711D01*

+X460238Y141767D01*

+X460333Y141838D01*

+X460415Y141924D01*

+X460483Y142021D01*

+X460535Y142127D01*

+X460570Y142241D01*

+X460586Y142358D01*

+X460584Y142477D01*

+X460564Y142594D01*

+X460523Y142705D01*

+X460414Y142980D01*

+X460334Y143265D01*

+X460280Y143557D01*

+X460253Y143852D01*

+Y144148D01*

+X460280Y144443D01*

+X460334Y144735D01*

+X460414Y145020D01*

+X460520Y145297D01*

+X460560Y145407D01*

+X460581Y145524D01*

+X460583Y145642D01*

+X460567Y145759D01*

+X460532Y145871D01*

+X460480Y145978D01*

+X460413Y146074D01*

+X460331Y146159D01*

+X460237Y146230D01*

+X460132Y146286D01*

+X460021Y146324D01*

+X459904Y146345D01*

+X459786Y146347D01*

+X459670Y146330D01*

+X459668Y146330D01*

+Y161478D01*

+X459716Y161497D01*

+X460092Y161728D01*

+X460427Y162014D01*

+X460713Y162349D01*

+X460944Y162725D01*

+X461112Y163132D01*

+X461215Y163561D01*

+X461241Y164000D01*

+X461215Y164439D01*

+X461112Y164868D01*

+X460944Y165275D01*

+X460713Y165651D01*

+X460427Y165986D01*

+X460092Y166272D01*

+X459716Y166503D01*

+X459668Y166522D01*

+Y171666D01*

+X459669Y171666D01*

+X459786Y171650D01*

+X459905Y171652D01*

+X460022Y171673D01*

+X460134Y171711D01*

+X460238Y171767D01*

+X460333Y171838D01*

+X460415Y171924D01*

+X460483Y172021D01*

+X460535Y172127D01*

+X460570Y172241D01*

+X460586Y172358D01*

+X460584Y172477D01*

+X460564Y172594D01*

+X460523Y172705D01*

+X460414Y172980D01*

+X460334Y173265D01*

+X460280Y173557D01*

+X460253Y173852D01*

+Y174148D01*

+X460280Y174443D01*

+X460334Y174735D01*

+X460414Y175020D01*

+X460520Y175297D01*

+X460560Y175407D01*

+X460581Y175524D01*

+X460583Y175642D01*

+X460567Y175759D01*

+X460532Y175871D01*

+X460480Y175978D01*

+X460413Y176074D01*

+X460331Y176159D01*

+X460237Y176230D01*

+X460132Y176286D01*

+X460021Y176324D01*

+X459904Y176345D01*

+X459786Y176347D01*

+X459670Y176330D01*

+X459668Y176330D01*

+Y192478D01*

+X459716Y192497D01*

+X460092Y192728D01*

+X460427Y193014D01*

+X460713Y193349D01*

+X460944Y193725D01*

+X461112Y194132D01*

+X461215Y194561D01*

+X461241Y195000D01*

+X461215Y195439D01*

+X461112Y195868D01*

+X460944Y196275D01*

+X460713Y196651D01*

+X460427Y196986D01*

+X460092Y197272D01*

+X459716Y197503D01*

+X459668Y197522D01*

+Y201666D01*

+X459669Y201666D01*

+X459786Y201650D01*

+X459905Y201652D01*

+X460022Y201673D01*

+X460134Y201711D01*

+X460238Y201767D01*

+X460333Y201838D01*

+X460415Y201924D01*

+X460483Y202021D01*

+X460535Y202127D01*

+X460570Y202241D01*

+X460586Y202358D01*

+X460584Y202477D01*

+X460564Y202594D01*

+X460523Y202705D01*

+X460414Y202980D01*

+X460334Y203265D01*

+X460280Y203557D01*

+X460253Y203852D01*

+Y204148D01*

+X460280Y204443D01*

+X460334Y204735D01*

+X460414Y205020D01*

+X460520Y205297D01*

+X460560Y205407D01*

+X460581Y205524D01*

+X460583Y205642D01*

+X460567Y205759D01*

+X460532Y205871D01*

+X460480Y205978D01*

+X460413Y206074D01*

+X460331Y206159D01*

+X460237Y206230D01*

+X460132Y206286D01*

+X460021Y206324D01*

+X459904Y206345D01*

+X459786Y206347D01*

+X459670Y206330D01*

+X459668Y206330D01*

+Y222478D01*

+X459716Y222497D01*

+X460092Y222728D01*

+X460427Y223014D01*

+X460713Y223349D01*

+X460944Y223725D01*

+X461112Y224132D01*

+X461215Y224561D01*

+X461241Y225000D01*

+X461215Y225439D01*

+X461112Y225868D01*

+X460944Y226275D01*

+X460713Y226651D01*

+X460427Y226986D01*

+X460092Y227272D01*

+X459716Y227503D01*

+X459668Y227522D01*

+Y231666D01*

+X459669Y231666D01*

+X459786Y231650D01*

+X459905Y231652D01*

+X460022Y231673D01*

+X460134Y231711D01*

+X460238Y231767D01*

+X460333Y231838D01*

+X460415Y231924D01*

+X460483Y232021D01*

+X460535Y232127D01*

+X460570Y232241D01*

+X460586Y232358D01*

+X460584Y232477D01*

+X460564Y232594D01*

+X460523Y232705D01*

+X460414Y232980D01*

+X460334Y233265D01*

+X460280Y233557D01*

+X460253Y233852D01*

+Y234148D01*

+X460280Y234443D01*

+X460334Y234735D01*

+X460414Y235020D01*

+X460520Y235297D01*

+X460560Y235407D01*

+X460581Y235524D01*

+X460583Y235642D01*

+X460567Y235759D01*

+X460532Y235871D01*

+X460480Y235978D01*

+X460413Y236074D01*

+X460331Y236159D01*

+X460237Y236230D01*

+X460132Y236286D01*

+X460021Y236324D01*

+X459904Y236345D01*

+X459786Y236347D01*

+X459670Y236330D01*

+X459668Y236330D01*

+Y251478D01*

+X459716Y251497D01*

+X460092Y251728D01*

+X460427Y252014D01*

+X460713Y252349D01*

+X460944Y252725D01*

+X461112Y253132D01*

+X461215Y253561D01*

+X461241Y254000D01*

+X461215Y254439D01*

+X461112Y254868D01*

+X460944Y255275D01*

+X460713Y255651D01*

+X460427Y255986D01*

+X460092Y256272D01*

+X459716Y256503D01*

+X459668Y256522D01*

+Y261666D01*

+X459669Y261666D01*

+X459786Y261650D01*

+X459905Y261652D01*

+X460022Y261673D01*

+X460134Y261711D01*

+X460238Y261767D01*

+X460333Y261838D01*

+X460415Y261924D01*

+X460483Y262021D01*

+X460535Y262127D01*

+X460570Y262241D01*

+X460586Y262358D01*

+X460584Y262477D01*

+X460564Y262594D01*

+X460523Y262705D01*

+X460414Y262980D01*

+X460334Y263265D01*

+X460280Y263557D01*

+X460253Y263852D01*

+Y264148D01*

+X460280Y264443D01*

+X460334Y264735D01*

+X460414Y265020D01*

+X460520Y265297D01*

+X460560Y265407D01*

+X460581Y265524D01*

+X460583Y265642D01*

+X460567Y265759D01*

+X460532Y265871D01*

+X460480Y265978D01*

+X460413Y266074D01*

+X460331Y266159D01*

+X460237Y266230D01*

+X460132Y266286D01*

+X460021Y266324D01*

+X459904Y266345D01*

+X459786Y266347D01*

+X459670Y266330D01*

+X459668Y266330D01*

+Y282478D01*

+X459716Y282497D01*

+X460092Y282728D01*

+X460427Y283014D01*

+X460713Y283349D01*

+X460944Y283725D01*

+X461112Y284132D01*

+X461215Y284561D01*

+X461241Y285000D01*

+X461215Y285439D01*

+X461112Y285868D01*

+X460944Y286275D01*

+X460713Y286651D01*

+X460427Y286986D01*

+X460092Y287272D01*

+X459716Y287503D01*

+X459668Y287522D01*

+Y291666D01*

+X459669Y291666D01*

+X459786Y291650D01*

+X459905Y291652D01*

+X460022Y291673D01*

+X460134Y291711D01*

+X460238Y291767D01*

+X460333Y291838D01*

+X460415Y291924D01*

+X460483Y292021D01*

+X460535Y292127D01*

+X460570Y292241D01*

+X460586Y292358D01*

+X460584Y292477D01*

+X460564Y292594D01*

+X460523Y292705D01*

+X460414Y292980D01*

+X460334Y293265D01*

+X460280Y293557D01*

+X460253Y293852D01*

+Y294148D01*

+X460280Y294443D01*

+X460334Y294735D01*

+X460414Y295020D01*

+X460520Y295297D01*

+X460560Y295407D01*

+X460581Y295524D01*

+X460583Y295642D01*

+X460567Y295759D01*

+X460532Y295871D01*

+X460480Y295978D01*

+X460413Y296074D01*

+X460331Y296159D01*

+X460237Y296230D01*

+X460132Y296286D01*

+X460021Y296324D01*

+X459904Y296345D01*

+X459786Y296347D01*

+X459670Y296330D01*

+X459668Y296330D01*

+Y312478D01*

+X459716Y312497D01*

+X460092Y312728D01*

+X460427Y313014D01*

+X460713Y313349D01*

+X460944Y313725D01*

+X461112Y314132D01*

+X461215Y314561D01*

+X461241Y315000D01*

+X461215Y315439D01*

+X461112Y315868D01*

+X460944Y316275D01*

+X460713Y316651D01*

+X460427Y316986D01*

+X460092Y317272D01*

+X459716Y317503D01*

+X459668Y317522D01*

+Y321666D01*

+X459669Y321666D01*

+X459786Y321650D01*

+X459905Y321652D01*

+X460022Y321673D01*

+X460134Y321711D01*

+X460238Y321767D01*

+X460333Y321838D01*

+X460415Y321924D01*

+X460483Y322021D01*

+X460535Y322127D01*

+X460570Y322241D01*

+X460586Y322358D01*

+X460584Y322477D01*

+X460564Y322594D01*

+X460523Y322705D01*

+X460414Y322980D01*

+X460334Y323265D01*

+X460280Y323557D01*

+X460253Y323852D01*

+Y324148D01*

+X460280Y324443D01*

+X460334Y324735D01*

+X460414Y325020D01*

+X460520Y325297D01*

+X460560Y325407D01*

+X460581Y325524D01*

+X460583Y325642D01*

+X460567Y325759D01*

+X460532Y325871D01*

+X460480Y325978D01*

+X460413Y326074D01*

+X460331Y326159D01*

+X460237Y326230D01*

+X460132Y326286D01*

+X460021Y326324D01*

+X459904Y326345D01*

+X459786Y326347D01*

+X459670Y326330D01*

+X459668Y326330D01*

+Y342478D01*

+X459716Y342497D01*

+X460092Y342728D01*

+X460427Y343014D01*

+X460713Y343349D01*

+X460944Y343725D01*

+X461112Y344132D01*

+X461215Y344561D01*

+X461241Y345000D01*

+X461215Y345439D01*

+X461112Y345868D01*

+X460944Y346275D01*

+X460713Y346651D01*

+X460427Y346986D01*

+X460092Y347272D01*

+X459716Y347503D01*

+X459668Y347522D01*

+Y351666D01*

+X459669Y351666D01*

+X459786Y351650D01*

+X459905Y351652D01*

+X460022Y351673D01*

+X460134Y351711D01*

+X460238Y351767D01*

+X460333Y351838D01*

+X460415Y351924D01*

+X460483Y352021D01*

+X460535Y352127D01*

+X460570Y352241D01*

+X460586Y352358D01*

+X460584Y352477D01*

+X460564Y352594D01*

+X460523Y352705D01*

+X460414Y352980D01*

+X460334Y353265D01*

+X460280Y353557D01*

+X460253Y353852D01*

+Y354148D01*

+X460280Y354443D01*

+X460334Y354735D01*

+X460414Y355020D01*

+X460520Y355297D01*

+X460560Y355407D01*

+X460581Y355524D01*

+X460583Y355642D01*

+X460567Y355759D01*

+X460532Y355871D01*

+X460480Y355978D01*

+X460413Y356074D01*

+X460331Y356159D01*

+X460237Y356230D01*

+X460132Y356286D01*

+X460021Y356324D01*

+X459904Y356345D01*

+X459786Y356347D01*

+X459670Y356330D01*

+X459668Y356330D01*

+Y372478D01*

+X459716Y372497D01*

+X460092Y372728D01*

+X460427Y373014D01*

+X460713Y373349D01*

+X460944Y373725D01*

+X461112Y374132D01*

+X461215Y374561D01*

+X461241Y375000D01*

+X461215Y375439D01*

+X461112Y375868D01*

+X460944Y376275D01*

+X460713Y376651D01*

+X460427Y376986D01*

+X460092Y377272D01*

+X459716Y377503D01*

+X459668Y377522D01*

+Y381666D01*

+X459669Y381666D01*

+X459786Y381650D01*

+X459905Y381652D01*

+X460022Y381673D01*

+X460134Y381711D01*

+X460238Y381767D01*

+X460333Y381838D01*

+X460415Y381924D01*

+X460483Y382021D01*

+X460535Y382127D01*

+X460570Y382241D01*

+X460586Y382358D01*

+X460584Y382477D01*

+X460564Y382594D01*

+X460523Y382705D01*

+X460414Y382980D01*

+X460334Y383265D01*

+X460280Y383557D01*

+X460253Y383852D01*

+Y384148D01*

+X460280Y384443D01*

+X460334Y384735D01*

+X460414Y385020D01*

+X460520Y385297D01*

+X460560Y385407D01*

+X460581Y385524D01*

+X460583Y385642D01*

+X460567Y385759D01*

+X460532Y385871D01*

+X460480Y385978D01*

+X460413Y386074D01*

+X460331Y386159D01*

+X460237Y386230D01*

+X460132Y386286D01*

+X460021Y386324D01*

+X459904Y386345D01*

+X459786Y386347D01*

+X459670Y386330D01*

+X459668Y386330D01*

+Y397000D01*

+X463502D01*

+Y388750D01*

+X463283D01*

+X462852Y388711D01*

+X462425Y388632D01*

+X462008Y388515D01*

+X461603Y388360D01*

+X461498Y388305D01*

+X461403Y388234D01*

+X461321Y388148D01*

+X461253Y388051D01*

+X461201Y387945D01*

+X461166Y387831D01*

+X461150Y387714D01*

+X461152Y387595D01*

+X461173Y387478D01*

+X461211Y387366D01*

+X461267Y387262D01*

+X461338Y387167D01*

+X461424Y387085D01*

+X461521Y387017D01*

+X461627Y386965D01*

+X461741Y386930D01*

+X461858Y386914D01*

+X461977Y386916D01*

+X462093Y386936D01*

+X462205Y386977D01*

+X462480Y387086D01*

+X462765Y387166D01*

+X463057Y387220D01*

+X463352Y387247D01*

+X463502D01*

+Y380753D01*

+X463352D01*

+X463057Y380780D01*

+X462765Y380834D01*

+X462480Y380914D01*

+X462203Y381020D01*

+X462093Y381060D01*

+X461976Y381081D01*

+X461858Y381083D01*

+X461741Y381067D01*

+X461629Y381032D01*

+X461522Y380980D01*

+X461426Y380913D01*

+X461341Y380831D01*

+X461270Y380737D01*

+X461214Y380632D01*

+X461176Y380521D01*

+X461155Y380404D01*

+X461153Y380286D01*

+X461170Y380170D01*

+X461204Y380057D01*

+X461256Y379950D01*

+X461323Y379854D01*

+X461405Y379769D01*

+X461500Y379698D01*

+X461605Y379644D01*

+X462008Y379485D01*

+X462425Y379368D01*

+X462852Y379289D01*

+X463283Y379250D01*

+X463502D01*

+Y358750D01*

+X463283D01*

+X462852Y358711D01*

+X462425Y358632D01*

+X462008Y358515D01*

+X461603Y358360D01*

+X461498Y358305D01*

+X461403Y358234D01*

+X461321Y358148D01*

+X461253Y358051D01*

+X461201Y357945D01*

+X461166Y357831D01*

+X461150Y357714D01*

+X461152Y357595D01*

+X461173Y357478D01*

+X461211Y357366D01*

+X461267Y357262D01*

+X461338Y357167D01*

+X461424Y357085D01*

+X461521Y357017D01*

+X461627Y356965D01*

+X461741Y356930D01*

+X461858Y356914D01*

+X461977Y356916D01*

+X462093Y356936D01*

+X462205Y356977D01*

+X462480Y357086D01*

+X462765Y357166D01*

+X463057Y357220D01*

+X463352Y357247D01*

+X463502D01*

+Y350753D01*

+X463352D01*

+X463057Y350780D01*

+X462765Y350834D01*

+X462480Y350914D01*

+X462203Y351020D01*

+X462093Y351060D01*

+X461976Y351081D01*

+X461858Y351083D01*

+X461741Y351067D01*

+X461629Y351032D01*

+X461522Y350980D01*

+X461426Y350913D01*

+X461341Y350831D01*

+X461270Y350737D01*

+X461214Y350632D01*

+X461176Y350521D01*

+X461155Y350404D01*

+X461153Y350286D01*

+X461170Y350170D01*

+X461204Y350057D01*

+X461256Y349950D01*

+X461323Y349854D01*

+X461405Y349769D01*

+X461500Y349698D01*

+X461605Y349644D01*

+X462008Y349485D01*

+X462425Y349368D01*

+X462852Y349289D01*

+X463283Y349250D01*

+X463502D01*

+Y328750D01*

+X463283D01*

+X462852Y328711D01*

+X462425Y328632D01*

+X462008Y328515D01*

+X461603Y328360D01*

+X461498Y328305D01*

+X461403Y328234D01*

+X461321Y328148D01*

+X461253Y328051D01*

+X461201Y327945D01*

+X461166Y327831D01*

+X461150Y327714D01*

+X461152Y327595D01*

+X461173Y327478D01*

+X461211Y327366D01*

+X461267Y327262D01*

+X461338Y327167D01*

+X461424Y327085D01*

+X461521Y327017D01*

+X461627Y326965D01*

+X461741Y326930D01*

+X461858Y326914D01*

+X461977Y326916D01*

+X462093Y326936D01*

+X462205Y326977D01*

+X462480Y327086D01*

+X462765Y327166D01*

+X463057Y327220D01*

+X463352Y327247D01*

+X463502D01*

+Y320753D01*

+X463352D01*

+X463057Y320780D01*

+X462765Y320834D01*

+X462480Y320914D01*

+X462203Y321020D01*

+X462093Y321060D01*

+X461976Y321081D01*

+X461858Y321083D01*

+X461741Y321067D01*

+X461629Y321032D01*

+X461522Y320980D01*

+X461426Y320913D01*

+X461341Y320831D01*

+X461270Y320737D01*

+X461214Y320632D01*

+X461176Y320521D01*

+X461155Y320404D01*

+X461153Y320286D01*

+X461170Y320170D01*

+X461204Y320057D01*

+X461256Y319950D01*

+X461323Y319854D01*

+X461405Y319769D01*

+X461500Y319698D01*

+X461605Y319644D01*

+X462008Y319485D01*

+X462425Y319368D01*

+X462852Y319289D01*

+X463283Y319250D01*

+X463502D01*

+Y298750D01*

+X463283D01*

+X462852Y298711D01*

+X462425Y298632D01*

+X462008Y298515D01*

+X461603Y298360D01*

+X461498Y298305D01*

+X461403Y298234D01*

+X461321Y298148D01*

+X461253Y298051D01*

+X461201Y297945D01*

+X461166Y297831D01*

+X461150Y297714D01*

+X461152Y297595D01*

+X461173Y297478D01*

+X461211Y297366D01*

+X461267Y297262D01*

+X461338Y297167D01*

+X461424Y297085D01*

+X461521Y297017D01*

+X461627Y296965D01*

+X461741Y296930D01*

+X461858Y296914D01*

+X461977Y296916D01*

+X462093Y296936D01*

+X462205Y296977D01*

+X462480Y297086D01*

+X462765Y297166D01*

+X463057Y297220D01*

+X463352Y297247D01*

+X463502D01*

+Y290753D01*

+X463352D01*

+X463057Y290780D01*

+X462765Y290834D01*

+X462480Y290914D01*

+X462203Y291020D01*

+X462093Y291060D01*

+X461976Y291081D01*

+X461858Y291083D01*

+X461741Y291067D01*

+X461629Y291032D01*

+X461522Y290980D01*

+X461426Y290913D01*

+X461341Y290831D01*

+X461270Y290737D01*

+X461214Y290632D01*

+X461176Y290521D01*

+X461155Y290404D01*

+X461153Y290286D01*

+X461170Y290170D01*

+X461204Y290057D01*

+X461256Y289950D01*

+X461323Y289854D01*

+X461405Y289769D01*

+X461500Y289698D01*

+X461605Y289644D01*

+X462008Y289485D01*

+X462425Y289368D01*

+X462852Y289289D01*

+X463283Y289250D01*

+X463502D01*

+Y268750D01*

+X463283D01*

+X462852Y268711D01*

+X462425Y268632D01*

+X462008Y268515D01*

+X461603Y268360D01*

+X461498Y268305D01*

+X461403Y268234D01*

+X461321Y268148D01*

+X461253Y268051D01*

+X461201Y267945D01*

+X461166Y267831D01*

+X461150Y267714D01*

+X461152Y267595D01*

+X461173Y267478D01*

+X461211Y267366D01*

+X461267Y267262D01*

+X461338Y267167D01*

+X461424Y267085D01*

+X461521Y267017D01*

+X461627Y266965D01*

+X461741Y266930D01*

+X461858Y266914D01*

+X461977Y266916D01*

+X462093Y266936D01*

+X462205Y266977D01*

+X462480Y267086D01*

+X462765Y267166D01*

+X463057Y267220D01*

+X463352Y267247D01*

+X463502D01*

+Y260753D01*

+X463352D01*

+X463057Y260780D01*

+X462765Y260834D01*

+X462480Y260914D01*

+X462203Y261020D01*

+X462093Y261060D01*

+X461976Y261081D01*

+X461858Y261083D01*

+X461741Y261067D01*

+X461629Y261032D01*

+X461522Y260980D01*

+X461426Y260913D01*

+X461341Y260831D01*

+X461270Y260737D01*

+X461214Y260632D01*

+X461176Y260521D01*

+X461155Y260404D01*

+X461153Y260286D01*

+X461170Y260170D01*

+X461204Y260057D01*

+X461256Y259950D01*

+X461323Y259854D01*

+X461405Y259769D01*

+X461500Y259698D01*

+X461605Y259644D01*

+X462008Y259485D01*

+X462425Y259368D01*

+X462852Y259289D01*

+X463283Y259250D01*

+X463502D01*

+Y238750D01*

+X463283D01*

+X462852Y238711D01*

+X462425Y238632D01*

+X462008Y238515D01*

+X461603Y238360D01*

+X461498Y238305D01*

+X461403Y238234D01*

+X461321Y238148D01*

+X461253Y238051D01*

+X461201Y237945D01*

+X461166Y237831D01*

+X461150Y237714D01*

+X461152Y237595D01*

+X461173Y237478D01*

+X461211Y237366D01*

+X461267Y237262D01*

+X461338Y237167D01*

+X461424Y237085D01*

+X461521Y237017D01*

+X461627Y236965D01*

+X461741Y236930D01*

+X461858Y236914D01*

+X461977Y236916D01*

+X462093Y236936D01*

+X462205Y236977D01*

+X462480Y237086D01*

+X462765Y237166D01*

+X463057Y237220D01*

+X463352Y237247D01*

+X463502D01*

+Y230753D01*

+X463352D01*

+X463057Y230780D01*

+X462765Y230834D01*

+X462480Y230914D01*

+X462203Y231020D01*

+X462093Y231060D01*

+X461976Y231081D01*

+X461858Y231083D01*

+X461741Y231067D01*

+X461629Y231032D01*

+X461522Y230980D01*

+X461426Y230913D01*

+X461341Y230831D01*

+X461270Y230737D01*

+X461214Y230632D01*

+X461176Y230521D01*

+X461155Y230404D01*

+X461153Y230286D01*

+X461170Y230170D01*

+X461204Y230057D01*

+X461256Y229950D01*

+X461323Y229854D01*

+X461405Y229769D01*

+X461500Y229698D01*

+X461605Y229644D01*

+X462008Y229485D01*

+X462425Y229368D01*

+X462852Y229289D01*

+X463283Y229250D01*

+X463502D01*

+Y208750D01*

+X463283D01*

+X462852Y208711D01*

+X462425Y208632D01*

+X462008Y208515D01*

+X461603Y208360D01*

+X461498Y208305D01*

+X461403Y208234D01*

+X461321Y208148D01*

+X461253Y208051D01*

+X461201Y207945D01*

+X461166Y207831D01*

+X461150Y207714D01*

+X461152Y207595D01*

+X461173Y207478D01*

+X461211Y207366D01*

+X461267Y207262D01*

+X461338Y207167D01*

+X461424Y207085D01*

+X461521Y207017D01*

+X461627Y206965D01*

+X461741Y206930D01*

+X461858Y206914D01*

+X461977Y206916D01*

+X462093Y206936D01*

+X462205Y206977D01*

+X462480Y207086D01*

+X462765Y207166D01*

+X463057Y207220D01*

+X463352Y207247D01*

+X463502D01*

+Y200753D01*

+X463352D01*

+X463057Y200780D01*

+X462765Y200834D01*

+X462480Y200914D01*

+X462203Y201020D01*

+X462093Y201060D01*

+X461976Y201081D01*

+X461858Y201083D01*

+X461741Y201067D01*

+X461629Y201032D01*

+X461522Y200980D01*

+X461426Y200913D01*

+X461341Y200831D01*

+X461270Y200737D01*

+X461214Y200632D01*

+X461176Y200521D01*

+X461155Y200404D01*

+X461153Y200286D01*

+X461170Y200170D01*

+X461204Y200057D01*

+X461256Y199950D01*

+X461323Y199854D01*

+X461405Y199769D01*

+X461500Y199698D01*

+X461605Y199644D01*

+X462008Y199485D01*

+X462425Y199368D01*

+X462852Y199289D01*

+X463283Y199250D01*

+X463502D01*

+Y178750D01*

+X463283D01*

+X462852Y178711D01*

+X462425Y178632D01*

+X462008Y178515D01*

+X461603Y178360D01*

+X461498Y178305D01*

+X461403Y178234D01*

+X461321Y178148D01*

+X461253Y178051D01*

+X461201Y177945D01*

+X461166Y177831D01*

+X461150Y177714D01*

+X461152Y177595D01*

+X461173Y177478D01*

+X461211Y177366D01*

+X461267Y177262D01*

+X461338Y177167D01*

+X461424Y177085D01*

+X461521Y177017D01*

+X461627Y176965D01*

+X461741Y176930D01*

+X461858Y176914D01*

+X461977Y176916D01*

+X462093Y176936D01*

+X462205Y176977D01*

+X462480Y177086D01*

+X462765Y177166D01*

+X463057Y177220D01*

+X463352Y177247D01*

+X463502D01*

+Y170753D01*

+X463352D01*

+X463057Y170780D01*

+X462765Y170834D01*

+X462480Y170914D01*

+X462203Y171020D01*

+X462093Y171060D01*

+X461976Y171081D01*

+X461858Y171083D01*

+X461741Y171067D01*

+X461629Y171032D01*

+X461522Y170980D01*

+X461426Y170913D01*

+X461341Y170831D01*

+X461270Y170737D01*

+X461214Y170632D01*

+X461176Y170521D01*

+X461155Y170404D01*

+X461153Y170286D01*

+X461170Y170170D01*

+X461204Y170057D01*

+X461256Y169950D01*

+X461323Y169854D01*

+X461405Y169769D01*

+X461500Y169698D01*

+X461605Y169644D01*

+X462008Y169485D01*

+X462425Y169368D01*

+X462852Y169289D01*

+X463283Y169250D01*

+X463502D01*

+Y148750D01*

+X463283D01*

+X462852Y148711D01*

+X462425Y148632D01*

+X462008Y148515D01*

+X461603Y148360D01*

+X461498Y148305D01*

+X461403Y148234D01*

+X461321Y148148D01*

+X461253Y148051D01*

+X461201Y147945D01*

+X461166Y147831D01*

+X461150Y147714D01*

+X461152Y147595D01*

+X461173Y147478D01*

+X461211Y147366D01*

+X461267Y147262D01*

+X461338Y147167D01*

+X461424Y147085D01*

+X461521Y147017D01*

+X461627Y146965D01*

+X461741Y146930D01*

+X461858Y146914D01*

+X461977Y146916D01*

+X462093Y146936D01*

+X462205Y146977D01*

+X462480Y147086D01*

+X462765Y147166D01*

+X463057Y147220D01*

+X463352Y147247D01*

+X463502D01*

+Y140753D01*

+X463352D01*

+X463057Y140780D01*

+X462765Y140834D01*

+X462480Y140914D01*

+X462203Y141020D01*

+X462093Y141060D01*

+X461976Y141081D01*

+X461858Y141083D01*

+X461741Y141067D01*

+X461629Y141032D01*

+X461522Y140980D01*

+X461426Y140913D01*

+X461341Y140831D01*

+X461270Y140737D01*

+X461214Y140632D01*

+X461176Y140521D01*

+X461155Y140404D01*

+X461153Y140286D01*

+X461170Y140170D01*

+X461204Y140057D01*

+X461256Y139950D01*

+X461323Y139854D01*

+X461405Y139769D01*

+X461500Y139698D01*

+X461605Y139644D01*

+X462008Y139485D01*

+X462425Y139368D01*

+X462852Y139289D01*

+X463283Y139250D01*

+X463502D01*

+Y118750D01*

+X463283D01*

+X462852Y118711D01*

+X462425Y118632D01*

+X462008Y118515D01*

+X461603Y118360D01*

+X461498Y118305D01*

+X461403Y118234D01*

+X461321Y118148D01*

+X461253Y118051D01*

+X461201Y117945D01*

+X461166Y117831D01*

+X461150Y117714D01*

+X461152Y117595D01*

+X461173Y117478D01*

+X461211Y117366D01*

+X461267Y117262D01*

+X461338Y117167D01*

+X461424Y117085D01*

+X461521Y117017D01*

+X461627Y116965D01*

+X461741Y116930D01*

+X461858Y116914D01*

+X461977Y116916D01*

+X462093Y116936D01*

+X462205Y116977D01*

+X462480Y117086D01*

+X462765Y117166D01*

+X463057Y117220D01*

+X463352Y117247D01*

+X463502D01*

+Y110753D01*

+X463352D01*

+X463057Y110780D01*

+X462765Y110834D01*

+X462480Y110914D01*

+X462203Y111020D01*

+X462093Y111060D01*

+X461976Y111081D01*

+X461858Y111083D01*

+X461741Y111067D01*

+X461629Y111032D01*

+X461522Y110980D01*

+X461426Y110913D01*

+X461341Y110831D01*

+X461270Y110737D01*

+X461214Y110632D01*

+X461176Y110521D01*

+X461155Y110404D01*

+X461153Y110286D01*

+X461170Y110170D01*

+X461204Y110057D01*

+X461256Y109950D01*

+X461323Y109854D01*

+X461405Y109769D01*

+X461500Y109698D01*

+X461605Y109644D01*

+X462008Y109485D01*

+X462425Y109368D01*

+X462852Y109289D01*

+X463283Y109250D01*

+X463502D01*

+Y88750D01*

+X463283D01*

+X462852Y88711D01*

+X462425Y88632D01*

+X462008Y88515D01*

+X461603Y88360D01*

+X461498Y88305D01*

+X461403Y88234D01*

+X461321Y88148D01*

+X461253Y88051D01*

+X461201Y87945D01*

+X461166Y87831D01*

+X461150Y87714D01*

+X461152Y87595D01*

+X461173Y87478D01*

+X461211Y87366D01*

+X461267Y87262D01*

+X461338Y87167D01*

+X461424Y87085D01*

+X461521Y87017D01*

+X461627Y86965D01*

+X461741Y86930D01*

+X461858Y86914D01*

+X461977Y86916D01*

+X462093Y86936D01*

+X462205Y86977D01*

+X462480Y87086D01*

+X462765Y87166D01*

+X463057Y87220D01*

+X463352Y87247D01*

+X463502D01*

+Y80753D01*

+X463352D01*

+X463057Y80780D01*

+X462765Y80834D01*

+X462480Y80914D01*

+X462203Y81020D01*

+X462093Y81060D01*

+X461976Y81081D01*

+X461858Y81083D01*

+X461741Y81067D01*

+X461629Y81032D01*

+X461522Y80980D01*

+X461426Y80913D01*

+X461341Y80831D01*

+X461270Y80737D01*

+X461214Y80632D01*

+X461176Y80521D01*

+X461155Y80404D01*

+X461153Y80286D01*

+X461170Y80170D01*

+X461204Y80057D01*

+X461256Y79950D01*

+X461323Y79854D01*

+X461405Y79769D01*

+X461500Y79698D01*

+X461605Y79644D01*

+X462008Y79485D01*

+X462425Y79368D01*

+X462852Y79289D01*

+X463283Y79250D01*

+X463502D01*

+Y58750D01*

+X463283D01*

+X462852Y58711D01*

+X462425Y58632D01*

+X462008Y58515D01*

+X461603Y58360D01*

+X461498Y58305D01*

+X461403Y58234D01*

+X461321Y58148D01*

+X461253Y58051D01*

+X461201Y57945D01*

+X461166Y57831D01*

+X461150Y57714D01*

+X461152Y57595D01*

+X461173Y57478D01*

+X461211Y57366D01*

+X461267Y57262D01*

+X461338Y57167D01*

+X461424Y57085D01*

+X461521Y57017D01*

+X461627Y56965D01*

+X461741Y56930D01*

+X461858Y56914D01*

+X461977Y56916D01*

+X462093Y56936D01*

+X462205Y56977D01*

+X462480Y57086D01*

+X462765Y57166D01*

+X463057Y57220D01*

+X463352Y57247D01*

+X463502D01*

+Y50753D01*

+X463352D01*

+X463057Y50780D01*

+X462765Y50834D01*

+X462480Y50914D01*

+X462203Y51020D01*

+X462093Y51060D01*

+X461976Y51081D01*

+X461858Y51083D01*

+X461741Y51067D01*

+X461629Y51032D01*

+X461522Y50980D01*

+X461426Y50913D01*

+X461341Y50831D01*

+X461270Y50737D01*

+X461214Y50632D01*

+X461176Y50521D01*

+X461155Y50404D01*

+X461153Y50286D01*

+X461170Y50170D01*

+X461204Y50057D01*

+X461256Y49950D01*

+X461323Y49854D01*

+X461405Y49769D01*

+X461500Y49698D01*

+X461605Y49644D01*

+X462008Y49485D01*

+X462425Y49368D01*

+X462852Y49289D01*

+X463283Y49250D01*

+X463502D01*

+Y39000D01*

+G37*

+G36*

+X459668Y377522D02*X459309Y377671D01*

+X458880Y377774D01*

+X458441Y377809D01*

+X458437Y377808D01*

+Y397000D01*

+X459668D01*

+Y386330D01*

+X459557Y386296D01*

+X459450Y386244D01*

+X459354Y386177D01*

+X459269Y386095D01*

+X459198Y386000D01*

+X459144Y385895D01*

+X458985Y385492D01*

+X458868Y385075D01*

+X458789Y384648D01*

+X458750Y384217D01*

+Y383783D01*

+X458789Y383352D01*

+X458868Y382925D01*

+X458985Y382508D01*

+X459140Y382103D01*

+X459195Y381998D01*

+X459266Y381903D01*

+X459352Y381821D01*

+X459449Y381753D01*

+X459555Y381701D01*

+X459668Y381666D01*

+Y377522D01*

+G37*

+G36*

+Y347522D02*X459309Y347671D01*

+X458880Y347774D01*

+X458441Y347809D01*

+X458437Y347808D01*

+Y372192D01*

+X458441Y372191D01*

+X458880Y372226D01*

+X459309Y372329D01*

+X459668Y372478D01*

+Y356330D01*

+X459557Y356296D01*

+X459450Y356244D01*

+X459354Y356177D01*

+X459269Y356095D01*

+X459198Y356000D01*

+X459144Y355895D01*

+X458985Y355492D01*

+X458868Y355075D01*

+X458789Y354648D01*

+X458750Y354217D01*

+Y353783D01*

+X458789Y353352D01*

+X458868Y352925D01*

+X458985Y352508D01*

+X459140Y352103D01*

+X459195Y351998D01*

+X459266Y351903D01*

+X459352Y351821D01*

+X459449Y351753D01*

+X459555Y351701D01*

+X459668Y351666D01*

+Y347522D01*

+G37*

+G36*

+Y317522D02*X459309Y317671D01*

+X458880Y317774D01*

+X458441Y317809D01*

+X458437Y317808D01*

+Y342192D01*

+X458441Y342191D01*

+X458880Y342226D01*

+X459309Y342329D01*

+X459668Y342478D01*

+Y326330D01*

+X459557Y326296D01*

+X459450Y326244D01*

+X459354Y326177D01*

+X459269Y326095D01*

+X459198Y326000D01*

+X459144Y325895D01*

+X458985Y325492D01*

+X458868Y325075D01*

+X458789Y324648D01*

+X458750Y324217D01*

+Y323783D01*

+X458789Y323352D01*

+X458868Y322925D01*

+X458985Y322508D01*

+X459140Y322103D01*

+X459195Y321998D01*

+X459266Y321903D01*

+X459352Y321821D01*

+X459449Y321753D01*

+X459555Y321701D01*

+X459668Y321666D01*

+Y317522D01*

+G37*

+G36*

+Y287522D02*X459309Y287671D01*

+X458880Y287774D01*

+X458441Y287809D01*

+X458437Y287808D01*

+Y312192D01*

+X458441Y312191D01*

+X458880Y312226D01*

+X459309Y312329D01*

+X459668Y312478D01*

+Y296330D01*

+X459557Y296296D01*

+X459450Y296244D01*

+X459354Y296177D01*

+X459269Y296095D01*

+X459198Y296000D01*

+X459144Y295895D01*

+X458985Y295492D01*

+X458868Y295075D01*

+X458789Y294648D01*

+X458750Y294217D01*

+Y293783D01*

+X458789Y293352D01*

+X458868Y292925D01*

+X458985Y292508D01*

+X459140Y292103D01*

+X459195Y291998D01*

+X459266Y291903D01*

+X459352Y291821D01*

+X459449Y291753D01*

+X459555Y291701D01*

+X459668Y291666D01*

+Y287522D01*

+G37*

+G36*

+Y256522D02*X459309Y256671D01*

+X458880Y256774D01*

+X458441Y256809D01*

+X458437Y256808D01*

+Y282192D01*

+X458441Y282191D01*

+X458880Y282226D01*

+X459309Y282329D01*

+X459668Y282478D01*

+Y266330D01*

+X459557Y266296D01*

+X459450Y266244D01*

+X459354Y266177D01*

+X459269Y266095D01*

+X459198Y266000D01*

+X459144Y265895D01*

+X458985Y265492D01*

+X458868Y265075D01*

+X458789Y264648D01*

+X458750Y264217D01*

+Y263783D01*

+X458789Y263352D01*

+X458868Y262925D01*

+X458985Y262508D01*

+X459140Y262103D01*

+X459195Y261998D01*

+X459266Y261903D01*

+X459352Y261821D01*

+X459449Y261753D01*

+X459555Y261701D01*

+X459668Y261666D01*

+Y256522D01*

+G37*

+G36*

+Y227522D02*X459309Y227671D01*

+X458880Y227774D01*

+X458441Y227809D01*

+X458437Y227808D01*

+Y251192D01*

+X458441Y251191D01*

+X458880Y251226D01*

+X459309Y251329D01*

+X459668Y251478D01*

+Y236330D01*

+X459557Y236296D01*

+X459450Y236244D01*

+X459354Y236177D01*

+X459269Y236095D01*

+X459198Y236000D01*

+X459144Y235895D01*

+X458985Y235492D01*

+X458868Y235075D01*

+X458789Y234648D01*

+X458750Y234217D01*

+Y233783D01*

+X458789Y233352D01*

+X458868Y232925D01*

+X458985Y232508D01*

+X459140Y232103D01*

+X459195Y231998D01*

+X459266Y231903D01*

+X459352Y231821D01*

+X459449Y231753D01*

+X459555Y231701D01*

+X459668Y231666D01*

+Y227522D01*

+G37*

+G36*

+Y197522D02*X459309Y197671D01*

+X458880Y197774D01*

+X458441Y197809D01*

+X458437Y197808D01*

+Y222192D01*

+X458441Y222191D01*

+X458880Y222226D01*

+X459309Y222329D01*

+X459668Y222478D01*

+Y206330D01*

+X459557Y206296D01*

+X459450Y206244D01*

+X459354Y206177D01*

+X459269Y206095D01*

+X459198Y206000D01*

+X459144Y205895D01*

+X458985Y205492D01*

+X458868Y205075D01*

+X458789Y204648D01*

+X458750Y204217D01*

+Y203783D01*

+X458789Y203352D01*

+X458868Y202925D01*

+X458985Y202508D01*

+X459140Y202103D01*

+X459195Y201998D01*

+X459266Y201903D01*

+X459352Y201821D01*

+X459449Y201753D01*

+X459555Y201701D01*

+X459668Y201666D01*

+Y197522D01*

+G37*

+G36*

+Y166522D02*X459309Y166671D01*

+X458880Y166774D01*

+X458441Y166809D01*

+X458437Y166808D01*

+Y192192D01*

+X458441Y192191D01*

+X458880Y192226D01*

+X459309Y192329D01*

+X459668Y192478D01*

+Y176330D01*

+X459557Y176296D01*

+X459450Y176244D01*

+X459354Y176177D01*

+X459269Y176095D01*

+X459198Y176000D01*

+X459144Y175895D01*

+X458985Y175492D01*

+X458868Y175075D01*

+X458789Y174648D01*

+X458750Y174217D01*

+Y173783D01*

+X458789Y173352D01*

+X458868Y172925D01*

+X458985Y172508D01*

+X459140Y172103D01*

+X459195Y171998D01*

+X459266Y171903D01*

+X459352Y171821D01*

+X459449Y171753D01*

+X459555Y171701D01*

+X459668Y171666D01*

+Y166522D01*

+G37*

+G36*

+Y39000D02*X458437D01*

+Y161192D01*

+X458441Y161191D01*

+X458880Y161226D01*

+X459309Y161329D01*

+X459668Y161478D01*

+Y146330D01*

+X459557Y146296D01*

+X459450Y146244D01*

+X459354Y146177D01*

+X459269Y146095D01*

+X459198Y146000D01*

+X459144Y145895D01*

+X458985Y145492D01*

+X458868Y145075D01*

+X458789Y144648D01*

+X458750Y144217D01*

+Y143783D01*

+X458789Y143352D01*

+X458868Y142925D01*

+X458985Y142508D01*

+X459140Y142103D01*

+X459195Y141998D01*

+X459266Y141903D01*

+X459352Y141821D01*

+X459449Y141753D01*

+X459555Y141701D01*

+X459668Y141666D01*

+Y116330D01*

+X459557Y116296D01*

+X459450Y116244D01*

+X459354Y116177D01*

+X459269Y116095D01*

+X459198Y116000D01*

+X459144Y115895D01*

+X458985Y115492D01*

+X458868Y115075D01*

+X458789Y114648D01*

+X458750Y114217D01*

+Y113783D01*

+X458789Y113352D01*

+X458868Y112925D01*

+X458985Y112508D01*

+X459140Y112103D01*

+X459195Y111998D01*

+X459266Y111903D01*

+X459352Y111821D01*

+X459449Y111753D01*

+X459555Y111701D01*

+X459668Y111666D01*

+Y86330D01*

+X459557Y86296D01*

+X459450Y86244D01*

+X459354Y86177D01*

+X459269Y86095D01*

+X459198Y86000D01*

+X459144Y85895D01*

+X458985Y85492D01*

+X458868Y85075D01*

+X458789Y84648D01*

+X458750Y84217D01*

+Y83783D01*

+X458789Y83352D01*

+X458868Y82925D01*

+X458985Y82508D01*

+X459140Y82103D01*

+X459195Y81998D01*

+X459266Y81903D01*

+X459352Y81821D01*

+X459449Y81753D01*

+X459555Y81701D01*

+X459668Y81666D01*

+Y56330D01*

+X459557Y56296D01*

+X459450Y56244D01*

+X459354Y56177D01*

+X459269Y56095D01*

+X459198Y56000D01*

+X459144Y55895D01*

+X458985Y55492D01*

+X458868Y55075D01*

+X458789Y54648D01*

+X458750Y54217D01*

+Y53783D01*

+X458789Y53352D01*

+X458868Y52925D01*

+X458985Y52508D01*

+X459140Y52103D01*

+X459195Y51998D01*

+X459266Y51903D01*

+X459352Y51821D01*

+X459449Y51753D01*

+X459555Y51701D01*

+X459668Y51666D01*

+Y39000D01*

+G37*

+G36*

+X458437D02*X453500D01*

+Y49257D01*

+X456985Y49264D01*

+X457215Y49319D01*

+X457433Y49409D01*

+X457634Y49533D01*

+X457814Y49686D01*

+X457967Y49866D01*

+X458091Y50067D01*

+X458181Y50285D01*

+X458236Y50515D01*

+X458250Y50750D01*

+X458236Y57485D01*

+X458181Y57715D01*

+X458091Y57933D01*

+X457967Y58134D01*

+X457814Y58314D01*

+X457634Y58467D01*

+X457433Y58591D01*

+X457215Y58681D01*

+X456985Y58736D01*

+X456750Y58750D01*

+X453500Y58743D01*

+Y79257D01*

+X456985Y79264D01*

+X457215Y79319D01*

+X457433Y79409D01*

+X457634Y79533D01*

+X457814Y79686D01*

+X457967Y79866D01*

+X458091Y80067D01*

+X458181Y80285D01*

+X458236Y80515D01*

+X458250Y80750D01*

+X458236Y87485D01*

+X458181Y87715D01*

+X458091Y87933D01*

+X457967Y88134D01*

+X457814Y88314D01*

+X457634Y88467D01*

+X457433Y88591D01*

+X457215Y88681D01*

+X456985Y88736D01*

+X456750Y88750D01*

+X453500Y88743D01*

+Y109257D01*

+X456985Y109264D01*

+X457215Y109319D01*

+X457433Y109409D01*

+X457634Y109533D01*

+X457814Y109686D01*

+X457967Y109866D01*

+X458091Y110067D01*

+X458181Y110285D01*

+X458236Y110515D01*

+X458250Y110750D01*

+X458236Y117485D01*

+X458181Y117715D01*

+X458091Y117933D01*

+X457967Y118134D01*

+X457814Y118314D01*

+X457634Y118467D01*

+X457433Y118591D01*

+X457215Y118681D01*

+X456985Y118736D01*

+X456750Y118750D01*

+X453500Y118743D01*

+Y139257D01*

+X456985Y139264D01*

+X457215Y139319D01*

+X457433Y139409D01*

+X457634Y139533D01*

+X457814Y139686D01*

+X457967Y139866D01*

+X458091Y140067D01*

+X458181Y140285D01*

+X458236Y140515D01*

+X458250Y140750D01*

+X458236Y147485D01*

+X458181Y147715D01*

+X458091Y147933D01*

+X457967Y148134D01*

+X457814Y148314D01*

+X457634Y148467D01*

+X457433Y148591D01*

+X457215Y148681D01*

+X456985Y148736D01*

+X456750Y148750D01*

+X453500Y148743D01*

+Y169257D01*

+X456985Y169264D01*

+X457215Y169319D01*

+X457433Y169409D01*

+X457634Y169533D01*

+X457814Y169686D01*

+X457967Y169866D01*

+X458091Y170067D01*

+X458181Y170285D01*

+X458236Y170515D01*

+X458250Y170750D01*

+X458236Y177485D01*

+X458181Y177715D01*

+X458091Y177933D01*

+X457967Y178134D01*

+X457814Y178314D01*

+X457634Y178467D01*

+X457433Y178591D01*

+X457215Y178681D01*

+X456985Y178736D01*

+X456750Y178750D01*

+X453500Y178743D01*

+Y199257D01*

+X456985Y199264D01*

+X457215Y199319D01*

+X457433Y199409D01*

+X457634Y199533D01*

+X457814Y199686D01*

+X457967Y199866D01*

+X458091Y200067D01*

+X458181Y200285D01*

+X458236Y200515D01*

+X458250Y200750D01*

+X458236Y207485D01*

+X458181Y207715D01*

+X458091Y207933D01*

+X457967Y208134D01*

+X457814Y208314D01*

+X457634Y208467D01*

+X457433Y208591D01*

+X457215Y208681D01*

+X456985Y208736D01*

+X456750Y208750D01*

+X453500Y208743D01*

+Y229257D01*

+X456985Y229264D01*

+X457215Y229319D01*

+X457433Y229409D01*

+X457634Y229533D01*

+X457814Y229686D01*

+X457967Y229866D01*

+X458091Y230067D01*

+X458181Y230285D01*

+X458236Y230515D01*

+X458250Y230750D01*

+X458236Y237485D01*

+X458181Y237715D01*

+X458091Y237933D01*

+X457967Y238134D01*

+X457814Y238314D01*

+X457634Y238467D01*

+X457433Y238591D01*

+X457215Y238681D01*

+X456985Y238736D01*

+X456750Y238750D01*

+X453500Y238743D01*

+Y259257D01*

+X456985Y259264D01*

+X457215Y259319D01*

+X457433Y259409D01*

+X457634Y259533D01*

+X457814Y259686D01*

+X457967Y259866D01*

+X458091Y260067D01*

+X458181Y260285D01*

+X458236Y260515D01*

+X458250Y260750D01*

+X458236Y267485D01*

+X458181Y267715D01*

+X458091Y267933D01*

+X457967Y268134D01*

+X457814Y268314D01*

+X457634Y268467D01*

+X457433Y268591D01*

+X457215Y268681D01*

+X456985Y268736D01*

+X456750Y268750D01*

+X453500Y268743D01*

+Y289257D01*

+X456985Y289264D01*

+X457215Y289319D01*

+X457433Y289409D01*

+X457634Y289533D01*

+X457814Y289686D01*

+X457967Y289866D01*

+X458091Y290067D01*

+X458181Y290285D01*

+X458236Y290515D01*

+X458250Y290750D01*

+X458236Y297485D01*

+X458181Y297715D01*

+X458091Y297933D01*

+X457967Y298134D01*

+X457814Y298314D01*

+X457634Y298467D01*

+X457433Y298591D01*

+X457215Y298681D01*

+X456985Y298736D01*

+X456750Y298750D01*

+X453500Y298743D01*

+Y319257D01*

+X456985Y319264D01*

+X457215Y319319D01*

+X457433Y319409D01*

+X457634Y319533D01*

+X457814Y319686D01*

+X457967Y319866D01*

+X458091Y320067D01*

+X458181Y320285D01*

+X458236Y320515D01*

+X458250Y320750D01*

+X458236Y327485D01*

+X458181Y327715D01*

+X458091Y327933D01*

+X457967Y328134D01*

+X457814Y328314D01*

+X457634Y328467D01*

+X457433Y328591D01*

+X457215Y328681D01*

+X456985Y328736D01*

+X456750Y328750D01*

+X453500Y328743D01*

+Y349257D01*

+X456985Y349264D01*

+X457215Y349319D01*

+X457433Y349409D01*

+X457634Y349533D01*

+X457814Y349686D01*

+X457967Y349866D01*

+X458091Y350067D01*

+X458181Y350285D01*

+X458236Y350515D01*

+X458250Y350750D01*

+X458236Y357485D01*

+X458181Y357715D01*

+X458091Y357933D01*

+X457967Y358134D01*

+X457814Y358314D01*

+X457634Y358467D01*

+X457433Y358591D01*

+X457215Y358681D01*

+X456985Y358736D01*

+X456750Y358750D01*

+X453500Y358743D01*

+Y379257D01*

+X456985Y379264D01*

+X457215Y379319D01*

+X457433Y379409D01*

+X457634Y379533D01*

+X457814Y379686D01*

+X457967Y379866D01*

+X458091Y380067D01*

+X458181Y380285D01*

+X458236Y380515D01*

+X458250Y380750D01*

+X458236Y387485D01*

+X458181Y387715D01*

+X458091Y387933D01*

+X457967Y388134D01*

+X457814Y388314D01*

+X457634Y388467D01*

+X457433Y388591D01*

+X457215Y388681D01*

+X456985Y388736D01*

+X456750Y388750D01*

+X453500Y388743D01*

+Y397000D01*

+X458437D01*

+Y377808D01*

+X458002Y377774D01*

+X457573Y377671D01*

+X457166Y377503D01*

+X456790Y377272D01*

+X456455Y376986D01*

+X456169Y376651D01*

+X455938Y376275D01*

+X455770Y375868D01*

+X455667Y375439D01*

+X455632Y375000D01*

+X455667Y374561D01*

+X455770Y374132D01*

+X455938Y373725D01*

+X456169Y373349D01*

+X456455Y373014D01*

+X456790Y372728D01*

+X457166Y372497D01*

+X457573Y372329D01*

+X458002Y372226D01*

+X458437Y372192D01*

+Y347808D01*

+X458002Y347774D01*

+X457573Y347671D01*

+X457166Y347503D01*

+X456790Y347272D01*

+X456455Y346986D01*

+X456169Y346651D01*

+X455938Y346275D01*

+X455770Y345868D01*

+X455667Y345439D01*

+X455632Y345000D01*

+X455667Y344561D01*

+X455770Y344132D01*

+X455938Y343725D01*

+X456169Y343349D01*

+X456455Y343014D01*

+X456790Y342728D01*

+X457166Y342497D01*

+X457573Y342329D01*

+X458002Y342226D01*

+X458437Y342192D01*

+Y317808D01*

+X458002Y317774D01*

+X457573Y317671D01*

+X457166Y317503D01*

+X456790Y317272D01*

+X456455Y316986D01*

+X456169Y316651D01*

+X455938Y316275D01*

+X455770Y315868D01*

+X455667Y315439D01*

+X455632Y315000D01*

+X455667Y314561D01*

+X455770Y314132D01*

+X455938Y313725D01*

+X456169Y313349D01*

+X456455Y313014D01*

+X456790Y312728D01*

+X457166Y312497D01*

+X457573Y312329D01*

+X458002Y312226D01*

+X458437Y312192D01*

+Y287808D01*

+X458002Y287774D01*

+X457573Y287671D01*

+X457166Y287503D01*

+X456790Y287272D01*

+X456455Y286986D01*

+X456169Y286651D01*

+X455938Y286275D01*

+X455770Y285868D01*

+X455667Y285439D01*

+X455632Y285000D01*

+X455667Y284561D01*

+X455770Y284132D01*

+X455938Y283725D01*

+X456169Y283349D01*

+X456455Y283014D01*

+X456790Y282728D01*

+X457166Y282497D01*

+X457573Y282329D01*

+X458002Y282226D01*

+X458437Y282192D01*

+Y256808D01*

+X458002Y256774D01*

+X457573Y256671D01*

+X457166Y256503D01*

+X456790Y256272D01*

+X456455Y255986D01*

+X456169Y255651D01*

+X455938Y255275D01*

+X455770Y254868D01*

+X455667Y254439D01*

+X455632Y254000D01*

+X455667Y253561D01*

+X455770Y253132D01*

+X455938Y252725D01*

+X456169Y252349D01*

+X456455Y252014D01*

+X456790Y251728D01*

+X457166Y251497D01*

+X457573Y251329D01*

+X458002Y251226D01*

+X458437Y251192D01*

+Y227808D01*

+X458002Y227774D01*

+X457573Y227671D01*

+X457166Y227503D01*

+X456790Y227272D01*

+X456455Y226986D01*

+X456169Y226651D01*

+X455938Y226275D01*

+X455770Y225868D01*

+X455667Y225439D01*

+X455632Y225000D01*

+X455667Y224561D01*

+X455770Y224132D01*

+X455938Y223725D01*

+X456169Y223349D01*

+X456455Y223014D01*

+X456790Y222728D01*

+X457166Y222497D01*

+X457573Y222329D01*

+X458002Y222226D01*

+X458437Y222192D01*

+Y197808D01*

+X458002Y197774D01*

+X457573Y197671D01*

+X457166Y197503D01*

+X456790Y197272D01*

+X456455Y196986D01*

+X456169Y196651D01*

+X455938Y196275D01*

+X455770Y195868D01*

+X455667Y195439D01*

+X455632Y195000D01*

+X455667Y194561D01*

+X455770Y194132D01*

+X455938Y193725D01*

+X456169Y193349D01*

+X456455Y193014D01*

+X456790Y192728D01*

+X457166Y192497D01*

+X457573Y192329D01*

+X458002Y192226D01*

+X458437Y192192D01*

+Y166808D01*

+X458002Y166774D01*

+X457573Y166671D01*

+X457166Y166503D01*

+X456790Y166272D01*

+X456455Y165986D01*

+X456169Y165651D01*

+X455938Y165275D01*

+X455770Y164868D01*

+X455667Y164439D01*

+X455632Y164000D01*

+X455667Y163561D01*

+X455770Y163132D01*

+X455938Y162725D01*

+X456169Y162349D01*

+X456455Y162014D01*

+X456790Y161728D01*

+X457166Y161497D01*

+X457573Y161329D01*

+X458002Y161226D01*

+X458437Y161192D01*

+Y39000D01*

+G37*

+G36*

+X453500Y148743D02*X453441Y148743D01*

+Y154000D01*

+X440446D01*

+Y170721D01*

+X440855Y171199D01*

+X441245Y171837D01*

+X441531Y172528D01*

+X441706Y173255D01*

+X441750Y174000D01*

+X441706Y174745D01*

+X441531Y175472D01*

+X441245Y176163D01*

+X440855Y176801D01*

+X440446Y177279D01*

+Y200721D01*

+X440855Y201199D01*

+X441245Y201837D01*

+X441531Y202528D01*

+X441706Y203255D01*

+X441750Y204000D01*

+X441706Y204745D01*

+X441531Y205472D01*

+X441245Y206163D01*

+X440855Y206801D01*

+X440446Y207279D01*

+Y230721D01*

+X440855Y231199D01*

+X441245Y231837D01*

+X441531Y232528D01*

+X441706Y233255D01*

+X441750Y234000D01*

+X441706Y234745D01*

+X441531Y235472D01*

+X441245Y236163D01*

+X440855Y236801D01*

+X440446Y237279D01*

+Y260721D01*

+X440855Y261199D01*

+X441245Y261837D01*

+X441531Y262528D01*

+X441706Y263255D01*

+X441750Y264000D01*

+X441706Y264745D01*

+X441531Y265472D01*

+X441245Y266163D01*

+X440855Y266801D01*

+X440446Y267279D01*

+Y290721D01*

+X440855Y291199D01*

+X441245Y291837D01*

+X441531Y292528D01*

+X441706Y293255D01*

+X441750Y294000D01*

+X441706Y294745D01*

+X441531Y295472D01*

+X441245Y296163D01*

+X440855Y296801D01*

+X440446Y297279D01*

+Y320721D01*

+X440855Y321199D01*

+X441245Y321837D01*

+X441531Y322528D01*

+X441706Y323255D01*

+X441750Y324000D01*

+X441706Y324745D01*

+X441531Y325472D01*

+X441245Y326163D01*

+X440855Y326801D01*

+X440446Y327279D01*

+Y350721D01*

+X440855Y351199D01*

+X441245Y351837D01*

+X441531Y352528D01*

+X441706Y353255D01*

+X441750Y354000D01*

+X441706Y354745D01*

+X441531Y355472D01*

+X441245Y356163D01*

+X440855Y356801D01*

+X440446Y357279D01*

+Y380721D01*

+X440855Y381199D01*

+X441245Y381837D01*

+X441531Y382528D01*

+X441706Y383255D01*

+X441750Y384000D01*

+X441706Y384745D01*

+X441531Y385472D01*

+X441245Y386163D01*

+X440855Y386801D01*

+X440446Y387279D01*

+Y397000D01*

+X453500D01*

+Y388743D01*

+X450015Y388736D01*

+X449785Y388681D01*

+X449567Y388591D01*

+X449366Y388467D01*

+X449186Y388314D01*

+X449033Y388134D01*

+X448909Y387933D01*

+X448819Y387715D01*

+X448764Y387485D01*

+X448750Y387250D01*

+X448764Y380515D01*

+X448819Y380285D01*

+X448909Y380067D01*

+X449033Y379866D01*

+X449186Y379686D01*

+X449366Y379533D01*

+X449567Y379409D01*

+X449785Y379319D01*

+X450015Y379264D01*

+X450250Y379250D01*

+X453500Y379257D01*

+Y358743D01*

+X450015Y358736D01*

+X449785Y358681D01*

+X449567Y358591D01*

+X449366Y358467D01*

+X449186Y358314D01*

+X449033Y358134D01*

+X448909Y357933D01*

+X448819Y357715D01*

+X448764Y357485D01*

+X448750Y357250D01*

+X448764Y350515D01*

+X448819Y350285D01*

+X448909Y350067D01*

+X449033Y349866D01*

+X449186Y349686D01*

+X449366Y349533D01*

+X449567Y349409D01*

+X449785Y349319D01*

+X450015Y349264D01*

+X450250Y349250D01*

+X453500Y349257D01*

+Y328743D01*

+X450015Y328736D01*

+X449785Y328681D01*

+X449567Y328591D01*

+X449366Y328467D01*

+X449186Y328314D01*

+X449033Y328134D01*

+X448909Y327933D01*

+X448819Y327715D01*

+X448764Y327485D01*

+X448750Y327250D01*

+X448764Y320515D01*

+X448819Y320285D01*

+X448909Y320067D01*

+X449033Y319866D01*

+X449186Y319686D01*

+X449366Y319533D01*

+X449567Y319409D01*

+X449785Y319319D01*

+X450015Y319264D01*

+X450250Y319250D01*

+X453500Y319257D01*

+Y298743D01*

+X450015Y298736D01*

+X449785Y298681D01*

+X449567Y298591D01*

+X449366Y298467D01*

+X449186Y298314D01*

+X449033Y298134D01*

+X448909Y297933D01*

+X448819Y297715D01*

+X448764Y297485D01*

+X448750Y297250D01*

+X448764Y290515D01*

+X448819Y290285D01*

+X448909Y290067D01*

+X449033Y289866D01*

+X449186Y289686D01*

+X449366Y289533D01*

+X449567Y289409D01*

+X449785Y289319D01*

+X450015Y289264D01*

+X450250Y289250D01*

+X453500Y289257D01*

+Y268743D01*

+X450015Y268736D01*

+X449785Y268681D01*

+X449567Y268591D01*

+X449366Y268467D01*

+X449186Y268314D01*

+X449033Y268134D01*

+X448909Y267933D01*

+X448819Y267715D01*

+X448764Y267485D01*

+X448750Y267250D01*

+X448764Y260515D01*

+X448819Y260285D01*

+X448909Y260067D01*

+X449033Y259866D01*

+X449186Y259686D01*

+X449366Y259533D01*

+X449567Y259409D01*

+X449785Y259319D01*

+X450015Y259264D01*

+X450250Y259250D01*

+X453500Y259257D01*

+Y238743D01*

+X450015Y238736D01*

+X449785Y238681D01*

+X449567Y238591D01*

+X449366Y238467D01*

+X449186Y238314D01*

+X449033Y238134D01*

+X448909Y237933D01*

+X448819Y237715D01*

+X448764Y237485D01*

+X448750Y237250D01*

+X448764Y230515D01*

+X448819Y230285D01*

+X448909Y230067D01*

+X449033Y229866D01*

+X449186Y229686D01*

+X449366Y229533D01*

+X449567Y229409D01*

+X449785Y229319D01*

+X450015Y229264D01*

+X450250Y229250D01*

+X453500Y229257D01*

+Y208743D01*

+X450015Y208736D01*

+X449785Y208681D01*

+X449567Y208591D01*

+X449366Y208467D01*

+X449186Y208314D01*

+X449033Y208134D01*

+X448909Y207933D01*

+X448819Y207715D01*

+X448764Y207485D01*

+X448750Y207250D01*

+X448764Y200515D01*

+X448819Y200285D01*

+X448909Y200067D01*

+X449033Y199866D01*

+X449186Y199686D01*

+X449366Y199533D01*

+X449567Y199409D01*

+X449785Y199319D01*

+X450015Y199264D01*

+X450250Y199250D01*

+X453500Y199257D01*

+Y178743D01*

+X450015Y178736D01*

+X449785Y178681D01*

+X449567Y178591D01*

+X449366Y178467D01*

+X449186Y178314D01*

+X449033Y178134D01*

+X448909Y177933D01*

+X448819Y177715D01*

+X448764Y177485D01*

+X448750Y177250D01*

+X448764Y170515D01*

+X448819Y170285D01*

+X448909Y170067D01*

+X449033Y169866D01*

+X449186Y169686D01*

+X449366Y169533D01*

+X449567Y169409D01*

+X449785Y169319D01*

+X450015Y169264D01*

+X450250Y169250D01*

+X453500Y169257D01*

+Y148743D01*

+G37*

+G36*

+Y118743D02*X453441Y118743D01*

+Y139257D01*

+X453500Y139257D01*

+Y118743D01*

+G37*

+G36*

+Y88743D02*X453441Y88743D01*

+Y109257D01*

+X453500Y109257D01*

+Y88743D01*

+G37*

+G36*

+Y39000D02*X440446D01*

+Y54695D01*

+X440449Y54694D01*

+X440731Y54717D01*

+X441007Y54783D01*

+X441269Y54891D01*

+X441510Y55039D01*

+X441726Y55223D01*

+X441910Y55439D01*

+X442058Y55680D01*

+X442166Y55942D01*

+X442232Y56218D01*

+X442249Y56500D01*

+X442232Y56782D01*

+X442166Y57058D01*

+X442058Y57320D01*

+X441910Y57561D01*

+X441726Y57777D01*

+X441510Y57961D01*

+X441269Y58109D01*

+X441007Y58217D01*

+X440731Y58283D01*

+X440449Y58306D01*

+X440446Y58305D01*

+Y67000D01*

+X453441D01*

+Y79257D01*

+X453500Y79257D01*

+Y58743D01*

+X450015Y58736D01*

+X449785Y58681D01*

+X449567Y58591D01*

+X449366Y58467D01*

+X449186Y58314D01*

+X449033Y58134D01*

+X448909Y57933D01*

+X448819Y57715D01*

+X448764Y57485D01*

+X448750Y57250D01*

+X448764Y50515D01*

+X448819Y50285D01*

+X448909Y50067D01*

+X449033Y49866D01*

+X449186Y49686D01*

+X449366Y49533D01*

+X449567Y49409D01*

+X449785Y49319D01*

+X450015Y49264D01*

+X450250Y49250D01*

+X453500Y49257D01*

+Y39000D01*

+G37*

+G36*

+X440446Y387279D02*X440369Y387369D01*

+X439801Y387855D01*

+X439163Y388245D01*

+X438472Y388531D01*

+X437745Y388706D01*

+X437000Y388765D01*

+X436255Y388706D01*

+X435528Y388531D01*

+X434837Y388245D01*

+X434446Y388006D01*

+Y397000D01*

+X440446D01*

+Y387279D01*

+G37*

+G36*

+Y357279D02*X440369Y357369D01*

+X439801Y357855D01*

+X439163Y358245D01*

+X438472Y358531D01*

+X437745Y358706D01*

+X437000Y358765D01*

+X436255Y358706D01*

+X435528Y358531D01*

+X434837Y358245D01*

+X434446Y358006D01*

+Y379994D01*

+X434837Y379755D01*

+X435528Y379469D01*

+X436255Y379294D01*

+X437000Y379235D01*

+X437745Y379294D01*

+X438472Y379469D01*

+X439163Y379755D01*

+X439801Y380145D01*

+X440369Y380631D01*

+X440446Y380721D01*

+Y357279D01*

+G37*

+G36*

+Y327279D02*X440369Y327369D01*

+X439801Y327855D01*

+X439163Y328245D01*

+X438472Y328531D01*

+X437745Y328706D01*

+X437000Y328765D01*

+X436255Y328706D01*

+X435528Y328531D01*

+X434837Y328245D01*

+X434446Y328006D01*

+Y349994D01*

+X434837Y349755D01*

+X435528Y349469D01*

+X436255Y349294D01*

+X437000Y349235D01*

+X437745Y349294D01*

+X438472Y349469D01*

+X439163Y349755D01*

+X439801Y350145D01*

+X440369Y350631D01*

+X440446Y350721D01*

+Y327279D01*

+G37*

+G36*

+Y297279D02*X440369Y297369D01*

+X439801Y297855D01*

+X439163Y298245D01*

+X438472Y298531D01*

+X437745Y298706D01*

+X437000Y298765D01*

+X436255Y298706D01*

+X435528Y298531D01*

+X434837Y298245D01*

+X434446Y298006D01*

+Y319994D01*

+X434837Y319755D01*

+X435528Y319469D01*

+X436255Y319294D01*

+X437000Y319235D01*

+X437745Y319294D01*

+X438472Y319469D01*

+X439163Y319755D01*

+X439801Y320145D01*

+X440369Y320631D01*

+X440446Y320721D01*

+Y297279D01*

+G37*

+G36*

+Y267279D02*X440369Y267369D01*

+X439801Y267855D01*

+X439163Y268245D01*

+X438472Y268531D01*

+X437745Y268706D01*

+X437000Y268765D01*

+X436255Y268706D01*

+X435528Y268531D01*

+X434837Y268245D01*

+X434446Y268006D01*

+Y289994D01*

+X434837Y289755D01*

+X435528Y289469D01*

+X436255Y289294D01*

+X437000Y289235D01*

+X437745Y289294D01*

+X438472Y289469D01*

+X439163Y289755D01*

+X439801Y290145D01*

+X440369Y290631D01*

+X440446Y290721D01*

+Y267279D01*

+G37*

+G36*

+Y237279D02*X440369Y237369D01*

+X439801Y237855D01*

+X439163Y238245D01*

+X438472Y238531D01*

+X437745Y238706D01*

+X437000Y238765D01*

+X436255Y238706D01*

+X435528Y238531D01*

+X434837Y238245D01*

+X434446Y238006D01*

+Y259994D01*

+X434837Y259755D01*

+X435528Y259469D01*

+X436255Y259294D01*

+X437000Y259235D01*

+X437745Y259294D01*

+X438472Y259469D01*

+X439163Y259755D01*

+X439801Y260145D01*

+X440369Y260631D01*

+X440446Y260721D01*

+Y237279D01*

+G37*

+G36*

+Y207279D02*X440369Y207369D01*

+X439801Y207855D01*

+X439163Y208245D01*

+X438472Y208531D01*

+X437745Y208706D01*

+X437000Y208765D01*

+X436255Y208706D01*

+X435528Y208531D01*

+X434837Y208245D01*

+X434446Y208006D01*

+Y229994D01*

+X434837Y229755D01*

+X435528Y229469D01*

+X436255Y229294D01*

+X437000Y229235D01*

+X437745Y229294D01*

+X438472Y229469D01*

+X439163Y229755D01*

+X439801Y230145D01*

+X440369Y230631D01*

+X440446Y230721D01*

+Y207279D01*

+G37*

+G36*

+Y177279D02*X440369Y177369D01*

+X439801Y177855D01*

+X439163Y178245D01*

+X438472Y178531D01*

+X437745Y178706D01*

+X437000Y178765D01*

+X436255Y178706D01*

+X435528Y178531D01*

+X434837Y178245D01*

+X434446Y178006D01*

+Y199994D01*

+X434837Y199755D01*

+X435528Y199469D01*

+X436255Y199294D01*

+X437000Y199235D01*

+X437745Y199294D01*

+X438472Y199469D01*

+X439163Y199755D01*

+X439801Y200145D01*

+X440369Y200631D01*

+X440446Y200721D01*

+Y177279D01*

+G37*

+G36*

+Y154000D02*X434446D01*

+Y169994D01*

+X434837Y169755D01*

+X435528Y169469D01*

+X436255Y169294D01*

+X437000Y169235D01*

+X437745Y169294D01*

+X438472Y169469D01*

+X439163Y169755D01*

+X439801Y170145D01*

+X440369Y170631D01*

+X440446Y170721D01*

+Y154000D01*

+G37*

+G36*

+Y39000D02*X434446D01*

+Y54695D01*

+X434449Y54694D01*

+X434731Y54717D01*

+X435007Y54783D01*

+X435269Y54891D01*

+X435510Y55039D01*

+X435726Y55223D01*

+X435910Y55439D01*

+X436058Y55680D01*

+X436166Y55942D01*

+X436232Y56218D01*

+X436249Y56500D01*

+X436232Y56782D01*

+X436166Y57058D01*

+X436058Y57320D01*

+X435910Y57561D01*

+X435726Y57777D01*

+X435510Y57961D01*

+X435269Y58109D01*

+X435007Y58217D01*

+X434731Y58283D01*

+X434449Y58306D01*

+X434446Y58305D01*

+Y67000D01*

+X440446D01*

+Y58305D01*

+X440167Y58283D01*

+X439891Y58217D01*

+X439629Y58109D01*

+X439388Y57961D01*

+X439172Y57777D01*

+X438988Y57561D01*

+X438840Y57320D01*

+X438732Y57058D01*

+X438666Y56782D01*

+X438643Y56500D01*

+X438666Y56218D01*

+X438732Y55942D01*

+X438840Y55680D01*

+X438988Y55439D01*

+X439172Y55223D01*

+X439388Y55039D01*

+X439629Y54891D01*

+X439891Y54783D01*

+X440167Y54717D01*

+X440446Y54695D01*

+Y39000D01*

+G37*

+G36*

+X434446Y154000D02*X426993D01*

+Y169236D01*

+X427000Y169235D01*

+X427745Y169294D01*

+X428472Y169469D01*

+X429163Y169755D01*

+X429801Y170145D01*

+X430369Y170631D01*

+X430855Y171199D01*

+X431245Y171837D01*

+X431531Y172528D01*

+X431706Y173255D01*

+X431750Y174000D01*

+X431706Y174745D01*

+X431531Y175472D01*

+X431245Y176163D01*

+X430855Y176801D01*

+X430369Y177369D01*

+X429801Y177855D01*

+X429163Y178245D01*

+X428472Y178531D01*

+X427745Y178706D01*

+X427000Y178765D01*

+X426993Y178764D01*

+Y199236D01*

+X427000Y199235D01*

+X427745Y199294D01*

+X428472Y199469D01*

+X429163Y199755D01*

+X429801Y200145D01*

+X430369Y200631D01*

+X430855Y201199D01*

+X431245Y201837D01*

+X431531Y202528D01*

+X431706Y203255D01*

+X431750Y204000D01*

+X431706Y204745D01*

+X431531Y205472D01*

+X431245Y206163D01*

+X430855Y206801D01*

+X430369Y207369D01*

+X429801Y207855D01*

+X429163Y208245D01*

+X428472Y208531D01*

+X427745Y208706D01*

+X427000Y208765D01*

+X426993Y208764D01*

+Y229236D01*

+X427000Y229235D01*

+X427745Y229294D01*

+X428472Y229469D01*

+X429163Y229755D01*

+X429801Y230145D01*

+X430369Y230631D01*

+X430855Y231199D01*

+X431245Y231837D01*

+X431531Y232528D01*

+X431706Y233255D01*

+X431750Y234000D01*

+X431706Y234745D01*

+X431531Y235472D01*

+X431245Y236163D01*

+X430855Y236801D01*

+X430369Y237369D01*

+X429801Y237855D01*

+X429163Y238245D01*

+X428472Y238531D01*

+X427745Y238706D01*

+X427000Y238765D01*

+X426993Y238764D01*

+Y259236D01*

+X427000Y259235D01*

+X427745Y259294D01*

+X428472Y259469D01*

+X429163Y259755D01*

+X429801Y260145D01*

+X430369Y260631D01*

+X430855Y261199D01*

+X431245Y261837D01*

+X431531Y262528D01*

+X431706Y263255D01*

+X431750Y264000D01*

+X431706Y264745D01*

+X431531Y265472D01*

+X431245Y266163D01*

+X430855Y266801D01*

+X430369Y267369D01*

+X429801Y267855D01*

+X429163Y268245D01*

+X428472Y268531D01*

+X427745Y268706D01*

+X427000Y268765D01*

+X426993Y268764D01*

+Y289236D01*

+X427000Y289235D01*

+X427745Y289294D01*

+X428472Y289469D01*

+X429163Y289755D01*

+X429801Y290145D01*

+X430369Y290631D01*

+X430855Y291199D01*

+X431245Y291837D01*

+X431531Y292528D01*

+X431706Y293255D01*

+X431750Y294000D01*

+X431706Y294745D01*

+X431531Y295472D01*

+X431245Y296163D01*

+X430855Y296801D01*

+X430369Y297369D01*

+X429801Y297855D01*

+X429163Y298245D01*

+X428472Y298531D01*

+X427745Y298706D01*

+X427000Y298765D01*

+X426993Y298764D01*

+Y319236D01*

+X427000Y319235D01*

+X427745Y319294D01*

+X428472Y319469D01*

+X429163Y319755D01*

+X429801Y320145D01*

+X430369Y320631D01*

+X430855Y321199D01*

+X431245Y321837D01*

+X431531Y322528D01*

+X431706Y323255D01*

+X431750Y324000D01*

+X431706Y324745D01*

+X431531Y325472D01*

+X431245Y326163D01*

+X430855Y326801D01*

+X430369Y327369D01*

+X429801Y327855D01*

+X429163Y328245D01*

+X428472Y328531D01*

+X427745Y328706D01*

+X427000Y328765D01*

+X426993Y328764D01*

+Y349236D01*

+X427000Y349235D01*

+X427745Y349294D01*

+X428472Y349469D01*

+X429163Y349755D01*

+X429801Y350145D01*

+X430369Y350631D01*

+X430855Y351199D01*

+X431245Y351837D01*

+X431531Y352528D01*

+X431706Y353255D01*

+X431750Y354000D01*

+X431706Y354745D01*

+X431531Y355472D01*

+X431245Y356163D01*

+X430855Y356801D01*

+X430369Y357369D01*

+X429801Y357855D01*

+X429163Y358245D01*

+X428472Y358531D01*

+X427745Y358706D01*

+X427000Y358765D01*

+X426993Y358764D01*

+Y379236D01*

+X427000Y379235D01*

+X427745Y379294D01*

+X428472Y379469D01*

+X429163Y379755D01*

+X429801Y380145D01*

+X430369Y380631D01*

+X430855Y381199D01*

+X431245Y381837D01*

+X431531Y382528D01*

+X431706Y383255D01*

+X431750Y384000D01*

+X431706Y384745D01*

+X431531Y385472D01*

+X431245Y386163D01*

+X430855Y386801D01*

+X430369Y387369D01*

+X429801Y387855D01*

+X429163Y388245D01*

+X428472Y388531D01*

+X427745Y388706D01*

+X427000Y388765D01*

+X426993Y388764D01*

+Y397000D01*

+X434446D01*

+Y388006D01*

+X434199Y387855D01*

+X433631Y387369D01*

+X433145Y386801D01*

+X432755Y386163D01*

+X432469Y385472D01*

+X432294Y384745D01*

+X432235Y384000D01*

+X432294Y383255D01*

+X432469Y382528D01*

+X432755Y381837D01*

+X433145Y381199D01*

+X433631Y380631D01*

+X434199Y380145D01*

+X434446Y379994D01*

+Y358006D01*

+X434199Y357855D01*

+X433631Y357369D01*

+X433145Y356801D01*

+X432755Y356163D01*

+X432469Y355472D01*

+X432294Y354745D01*

+X432235Y354000D01*

+X432294Y353255D01*

+X432469Y352528D01*

+X432755Y351837D01*

+X433145Y351199D01*

+X433631Y350631D01*

+X434199Y350145D01*

+X434446Y349994D01*

+Y328006D01*

+X434199Y327855D01*

+X433631Y327369D01*

+X433145Y326801D01*

+X432755Y326163D01*

+X432469Y325472D01*

+X432294Y324745D01*

+X432235Y324000D01*

+X432294Y323255D01*

+X432469Y322528D01*

+X432755Y321837D01*

+X433145Y321199D01*

+X433631Y320631D01*

+X434199Y320145D01*

+X434446Y319994D01*

+Y298006D01*

+X434199Y297855D01*

+X433631Y297369D01*

+X433145Y296801D01*

+X432755Y296163D01*

+X432469Y295472D01*

+X432294Y294745D01*

+X432235Y294000D01*

+X432294Y293255D01*

+X432469Y292528D01*

+X432755Y291837D01*

+X433145Y291199D01*

+X433631Y290631D01*

+X434199Y290145D01*

+X434446Y289994D01*

+Y268006D01*

+X434199Y267855D01*

+X433631Y267369D01*

+X433145Y266801D01*

+X432755Y266163D01*

+X432469Y265472D01*

+X432294Y264745D01*

+X432235Y264000D01*

+X432294Y263255D01*

+X432469Y262528D01*

+X432755Y261837D01*

+X433145Y261199D01*

+X433631Y260631D01*

+X434199Y260145D01*

+X434446Y259994D01*

+Y238006D01*

+X434199Y237855D01*

+X433631Y237369D01*

+X433145Y236801D01*

+X432755Y236163D01*

+X432469Y235472D01*

+X432294Y234745D01*

+X432235Y234000D01*

+X432294Y233255D01*

+X432469Y232528D01*

+X432755Y231837D01*

+X433145Y231199D01*

+X433631Y230631D01*

+X434199Y230145D01*

+X434446Y229994D01*

+Y208006D01*

+X434199Y207855D01*

+X433631Y207369D01*

+X433145Y206801D01*

+X432755Y206163D01*

+X432469Y205472D01*

+X432294Y204745D01*

+X432235Y204000D01*

+X432294Y203255D01*

+X432469Y202528D01*

+X432755Y201837D01*

+X433145Y201199D01*

+X433631Y200631D01*

+X434199Y200145D01*

+X434446Y199994D01*

+Y178006D01*

+X434199Y177855D01*

+X433631Y177369D01*

+X433145Y176801D01*

+X432755Y176163D01*

+X432469Y175472D01*

+X432294Y174745D01*

+X432235Y174000D01*

+X432294Y173255D01*

+X432469Y172528D01*

+X432755Y171837D01*

+X433145Y171199D01*

+X433631Y170631D01*

+X434199Y170145D01*

+X434446Y169994D01*

+Y154000D01*

+G37*

+G36*

+X426993D02*X420832D01*

+Y171670D01*

+X420943Y171704D01*

+X421050Y171756D01*

+X421146Y171823D01*

+X421231Y171905D01*

+X421302Y172000D01*

+X421356Y172105D01*

+X421515Y172508D01*

+X421632Y172925D01*

+X421711Y173352D01*

+X421750Y173783D01*

+Y174217D01*

+X421711Y174648D01*

+X421632Y175075D01*

+X421515Y175492D01*

+X421360Y175897D01*

+X421305Y176002D01*

+X421234Y176097D01*

+X421148Y176179D01*

+X421051Y176247D01*

+X420945Y176299D01*

+X420832Y176334D01*

+Y201670D01*

+X420943Y201704D01*

+X421050Y201756D01*

+X421146Y201823D01*

+X421231Y201905D01*

+X421302Y202000D01*

+X421356Y202105D01*

+X421515Y202508D01*

+X421632Y202925D01*

+X421711Y203352D01*

+X421750Y203783D01*

+Y204217D01*

+X421711Y204648D01*

+X421632Y205075D01*

+X421515Y205492D01*

+X421360Y205897D01*

+X421305Y206002D01*

+X421234Y206097D01*

+X421148Y206179D01*

+X421051Y206247D01*

+X420945Y206299D01*

+X420832Y206334D01*

+Y231670D01*

+X420943Y231704D01*

+X421050Y231756D01*

+X421146Y231823D01*

+X421231Y231905D01*

+X421302Y232000D01*

+X421356Y232105D01*

+X421515Y232508D01*

+X421632Y232925D01*

+X421711Y233352D01*

+X421750Y233783D01*

+Y234217D01*

+X421711Y234648D01*

+X421632Y235075D01*

+X421515Y235492D01*

+X421360Y235897D01*

+X421305Y236002D01*

+X421234Y236097D01*

+X421148Y236179D01*

+X421051Y236247D01*

+X420945Y236299D01*

+X420832Y236334D01*

+Y261670D01*

+X420943Y261704D01*

+X421050Y261756D01*

+X421146Y261823D01*

+X421231Y261905D01*

+X421302Y262000D01*

+X421356Y262105D01*

+X421515Y262508D01*

+X421632Y262925D01*

+X421711Y263352D01*

+X421750Y263783D01*

+Y264217D01*

+X421711Y264648D01*

+X421632Y265075D01*

+X421515Y265492D01*

+X421360Y265897D01*

+X421305Y266002D01*

+X421234Y266097D01*

+X421148Y266179D01*

+X421051Y266247D01*

+X420945Y266299D01*

+X420832Y266334D01*

+Y291670D01*

+X420943Y291704D01*

+X421050Y291756D01*

+X421146Y291823D01*

+X421231Y291905D01*

+X421302Y292000D01*

+X421356Y292105D01*

+X421515Y292508D01*

+X421632Y292925D01*

+X421711Y293352D01*

+X421750Y293783D01*

+Y294217D01*

+X421711Y294648D01*

+X421632Y295075D01*

+X421515Y295492D01*

+X421360Y295897D01*

+X421305Y296002D01*

+X421234Y296097D01*

+X421148Y296179D01*

+X421051Y296247D01*

+X420945Y296299D01*

+X420832Y296334D01*

+Y321670D01*

+X420943Y321704D01*

+X421050Y321756D01*

+X421146Y321823D01*

+X421231Y321905D01*

+X421302Y322000D01*

+X421356Y322105D01*

+X421515Y322508D01*

+X421632Y322925D01*

+X421711Y323352D01*

+X421750Y323783D01*

+Y324217D01*

+X421711Y324648D01*

+X421632Y325075D01*

+X421515Y325492D01*

+X421360Y325897D01*

+X421305Y326002D01*

+X421234Y326097D01*

+X421148Y326179D01*

+X421051Y326247D01*

+X420945Y326299D01*

+X420832Y326334D01*

+Y351670D01*

+X420943Y351704D01*

+X421050Y351756D01*

+X421146Y351823D01*

+X421231Y351905D01*

+X421302Y352000D01*

+X421356Y352105D01*

+X421515Y352508D01*

+X421632Y352925D01*

+X421711Y353352D01*

+X421750Y353783D01*

+Y354217D01*

+X421711Y354648D01*

+X421632Y355075D01*

+X421515Y355492D01*

+X421360Y355897D01*

+X421305Y356002D01*

+X421234Y356097D01*

+X421148Y356179D01*

+X421051Y356247D01*

+X420945Y356299D01*

+X420832Y356334D01*

+Y381670D01*

+X420943Y381704D01*

+X421050Y381756D01*

+X421146Y381823D01*

+X421231Y381905D01*

+X421302Y382000D01*

+X421356Y382105D01*

+X421515Y382508D01*

+X421632Y382925D01*

+X421711Y383352D01*

+X421750Y383783D01*

+Y384217D01*

+X421711Y384648D01*

+X421632Y385075D01*

+X421515Y385492D01*

+X421360Y385897D01*

+X421305Y386002D01*

+X421234Y386097D01*

+X421148Y386179D01*

+X421051Y386247D01*

+X420945Y386299D01*

+X420832Y386334D01*

+Y397000D01*

+X426993D01*

+Y388764D01*

+X426255Y388706D01*

+X425528Y388531D01*

+X424837Y388245D01*

+X424199Y387855D01*

+X423631Y387369D01*

+X423145Y386801D01*

+X422755Y386163D01*

+X422469Y385472D01*

+X422294Y384745D01*

+X422235Y384000D01*

+X422294Y383255D01*

+X422469Y382528D01*

+X422755Y381837D01*

+X423145Y381199D01*

+X423631Y380631D01*

+X424199Y380145D01*

+X424837Y379755D01*

+X425528Y379469D01*

+X426255Y379294D01*

+X426993Y379236D01*

+Y358764D01*

+X426255Y358706D01*

+X425528Y358531D01*

+X424837Y358245D01*

+X424199Y357855D01*

+X423631Y357369D01*

+X423145Y356801D01*

+X422755Y356163D01*

+X422469Y355472D01*

+X422294Y354745D01*

+X422235Y354000D01*

+X422294Y353255D01*

+X422469Y352528D01*

+X422755Y351837D01*

+X423145Y351199D01*

+X423631Y350631D01*

+X424199Y350145D01*

+X424837Y349755D01*

+X425528Y349469D01*

+X426255Y349294D01*

+X426993Y349236D01*

+Y328764D01*

+X426255Y328706D01*

+X425528Y328531D01*

+X424837Y328245D01*

+X424199Y327855D01*

+X423631Y327369D01*

+X423145Y326801D01*

+X422755Y326163D01*

+X422469Y325472D01*

+X422294Y324745D01*

+X422235Y324000D01*

+X422294Y323255D01*

+X422469Y322528D01*

+X422755Y321837D01*

+X423145Y321199D01*

+X423631Y320631D01*

+X424199Y320145D01*

+X424837Y319755D01*

+X425528Y319469D01*

+X426255Y319294D01*

+X426993Y319236D01*

+Y298764D01*

+X426255Y298706D01*

+X425528Y298531D01*

+X424837Y298245D01*

+X424199Y297855D01*

+X423631Y297369D01*

+X423145Y296801D01*

+X422755Y296163D01*

+X422469Y295472D01*

+X422294Y294745D01*

+X422235Y294000D01*

+X422294Y293255D01*

+X422469Y292528D01*

+X422755Y291837D01*

+X423145Y291199D01*

+X423631Y290631D01*

+X424199Y290145D01*

+X424837Y289755D01*

+X425528Y289469D01*

+X426255Y289294D01*

+X426993Y289236D01*

+Y268764D01*

+X426255Y268706D01*

+X425528Y268531D01*

+X424837Y268245D01*

+X424199Y267855D01*

+X423631Y267369D01*

+X423145Y266801D01*

+X422755Y266163D01*

+X422469Y265472D01*

+X422294Y264745D01*

+X422235Y264000D01*

+X422294Y263255D01*

+X422469Y262528D01*

+X422755Y261837D01*

+X423145Y261199D01*

+X423631Y260631D01*

+X424199Y260145D01*

+X424837Y259755D01*

+X425528Y259469D01*

+X426255Y259294D01*

+X426993Y259236D01*

+Y238764D01*

+X426255Y238706D01*

+X425528Y238531D01*

+X424837Y238245D01*

+X424199Y237855D01*

+X423631Y237369D01*

+X423145Y236801D01*

+X422755Y236163D01*

+X422469Y235472D01*

+X422294Y234745D01*

+X422235Y234000D01*

+X422294Y233255D01*

+X422469Y232528D01*

+X422755Y231837D01*

+X423145Y231199D01*

+X423631Y230631D01*

+X424199Y230145D01*

+X424837Y229755D01*

+X425528Y229469D01*

+X426255Y229294D01*

+X426993Y229236D01*

+Y208764D01*

+X426255Y208706D01*

+X425528Y208531D01*

+X424837Y208245D01*

+X424199Y207855D01*

+X423631Y207369D01*

+X423145Y206801D01*

+X422755Y206163D01*

+X422469Y205472D01*

+X422294Y204745D01*

+X422235Y204000D01*

+X422294Y203255D01*

+X422469Y202528D01*

+X422755Y201837D01*

+X423145Y201199D01*

+X423631Y200631D01*

+X424199Y200145D01*

+X424837Y199755D01*

+X425528Y199469D01*

+X426255Y199294D01*

+X426993Y199236D01*

+Y178764D01*

+X426255Y178706D01*

+X425528Y178531D01*

+X424837Y178245D01*

+X424199Y177855D01*

+X423631Y177369D01*

+X423145Y176801D01*

+X422755Y176163D01*

+X422469Y175472D01*

+X422294Y174745D01*

+X422235Y174000D01*

+X422294Y173255D01*

+X422469Y172528D01*

+X422755Y171837D01*

+X423145Y171199D01*

+X423631Y170631D01*

+X424199Y170145D01*

+X424837Y169755D01*

+X425528Y169469D01*

+X426255Y169294D01*

+X426993Y169236D01*

+Y154000D01*

+G37*

+G36*

+X420832D02*X417002D01*

+Y169250D01*

+X417217D01*

+X417648Y169289D01*

+X418075Y169368D01*

+X418492Y169485D01*

+X418897Y169640D01*

+X419002Y169695D01*

+X419097Y169766D01*

+X419179Y169852D01*

+X419247Y169949D01*

+X419299Y170055D01*

+X419334Y170169D01*

+X419350Y170286D01*

+X419348Y170405D01*

+X419327Y170522D01*

+X419289Y170634D01*

+X419233Y170738D01*

+X419162Y170833D01*

+X419076Y170915D01*

+X418979Y170983D01*

+X418873Y171035D01*

+X418759Y171070D01*

+X418642Y171086D01*

+X418523Y171084D01*

+X418406Y171064D01*

+X418295Y171023D01*

+X418020Y170914D01*

+X417735Y170834D01*

+X417443Y170780D01*

+X417148Y170753D01*

+X417002D01*

+Y177247D01*

+X417148D01*

+X417443Y177220D01*

+X417735Y177166D01*

+X418020Y177086D01*

+X418297Y176980D01*

+X418407Y176940D01*

+X418524Y176919D01*

+X418642Y176917D01*

+X418759Y176933D01*

+X418871Y176968D01*

+X418978Y177020D01*

+X419074Y177087D01*

+X419159Y177169D01*

+X419230Y177263D01*

+X419286Y177368D01*

+X419324Y177479D01*

+X419345Y177596D01*

+X419347Y177714D01*

+X419330Y177830D01*

+X419296Y177943D01*

+X419244Y178050D01*

+X419177Y178146D01*

+X419095Y178231D01*

+X419000Y178302D01*

+X418895Y178356D01*

+X418492Y178515D01*

+X418075Y178632D01*

+X417648Y178711D01*

+X417217Y178750D01*

+X417002D01*

+Y199250D01*

+X417217D01*

+X417648Y199289D01*

+X418075Y199368D01*

+X418492Y199485D01*

+X418897Y199640D01*

+X419002Y199695D01*

+X419097Y199766D01*

+X419179Y199852D01*

+X419247Y199949D01*

+X419299Y200055D01*

+X419334Y200169D01*

+X419350Y200286D01*

+X419348Y200405D01*

+X419327Y200522D01*

+X419289Y200634D01*

+X419233Y200738D01*

+X419162Y200833D01*

+X419076Y200915D01*

+X418979Y200983D01*

+X418873Y201035D01*

+X418759Y201070D01*

+X418642Y201086D01*

+X418523Y201084D01*

+X418406Y201064D01*

+X418295Y201023D01*

+X418020Y200914D01*

+X417735Y200834D01*

+X417443Y200780D01*

+X417148Y200753D01*

+X417002D01*

+Y207247D01*

+X417148D01*

+X417443Y207220D01*

+X417735Y207166D01*

+X418020Y207086D01*

+X418297Y206980D01*

+X418407Y206940D01*

+X418524Y206919D01*

+X418642Y206917D01*

+X418759Y206933D01*

+X418871Y206968D01*

+X418978Y207020D01*

+X419074Y207087D01*

+X419159Y207169D01*

+X419230Y207263D01*

+X419286Y207368D01*

+X419324Y207479D01*

+X419345Y207596D01*

+X419347Y207714D01*

+X419330Y207830D01*

+X419296Y207943D01*

+X419244Y208050D01*

+X419177Y208146D01*

+X419095Y208231D01*

+X419000Y208302D01*

+X418895Y208356D01*

+X418492Y208515D01*

+X418075Y208632D01*

+X417648Y208711D01*

+X417217Y208750D01*

+X417002D01*

+Y229250D01*

+X417217D01*

+X417648Y229289D01*

+X418075Y229368D01*

+X418492Y229485D01*

+X418897Y229640D01*

+X419002Y229695D01*

+X419097Y229766D01*

+X419179Y229852D01*

+X419247Y229949D01*

+X419299Y230055D01*

+X419334Y230169D01*

+X419350Y230286D01*

+X419348Y230405D01*

+X419327Y230522D01*

+X419289Y230634D01*

+X419233Y230738D01*

+X419162Y230833D01*

+X419076Y230915D01*

+X418979Y230983D01*

+X418873Y231035D01*

+X418759Y231070D01*

+X418642Y231086D01*

+X418523Y231084D01*

+X418406Y231064D01*

+X418295Y231023D01*

+X418020Y230914D01*

+X417735Y230834D01*

+X417443Y230780D01*

+X417148Y230753D01*

+X417002D01*

+Y237247D01*

+X417148D01*

+X417443Y237220D01*

+X417735Y237166D01*

+X418020Y237086D01*

+X418297Y236980D01*

+X418407Y236940D01*

+X418524Y236919D01*

+X418642Y236917D01*

+X418759Y236933D01*

+X418871Y236968D01*

+X418978Y237020D01*

+X419074Y237087D01*

+X419159Y237169D01*

+X419230Y237263D01*

+X419286Y237368D01*

+X419324Y237479D01*

+X419345Y237596D01*

+X419347Y237714D01*

+X419330Y237830D01*

+X419296Y237943D01*

+X419244Y238050D01*

+X419177Y238146D01*

+X419095Y238231D01*

+X419000Y238302D01*

+X418895Y238356D01*

+X418492Y238515D01*

+X418075Y238632D01*

+X417648Y238711D01*

+X417217Y238750D01*

+X417002D01*

+Y259250D01*

+X417217D01*

+X417648Y259289D01*

+X418075Y259368D01*

+X418492Y259485D01*

+X418897Y259640D01*

+X419002Y259695D01*

+X419097Y259766D01*

+X419179Y259852D01*

+X419247Y259949D01*

+X419299Y260055D01*

+X419334Y260169D01*

+X419350Y260286D01*

+X419348Y260405D01*

+X419327Y260522D01*

+X419289Y260634D01*

+X419233Y260738D01*

+X419162Y260833D01*

+X419076Y260915D01*

+X418979Y260983D01*

+X418873Y261035D01*

+X418759Y261070D01*

+X418642Y261086D01*

+X418523Y261084D01*

+X418406Y261064D01*

+X418295Y261023D01*

+X418020Y260914D01*

+X417735Y260834D01*

+X417443Y260780D01*

+X417148Y260753D01*

+X417002D01*

+Y267247D01*

+X417148D01*

+X417443Y267220D01*

+X417735Y267166D01*

+X418020Y267086D01*

+X418297Y266980D01*

+X418407Y266940D01*

+X418524Y266919D01*

+X418642Y266917D01*

+X418759Y266933D01*

+X418871Y266968D01*

+X418978Y267020D01*

+X419074Y267087D01*

+X419159Y267169D01*

+X419230Y267263D01*

+X419286Y267368D01*

+X419324Y267479D01*

+X419345Y267596D01*

+X419347Y267714D01*

+X419330Y267830D01*

+X419296Y267943D01*

+X419244Y268050D01*

+X419177Y268146D01*

+X419095Y268231D01*

+X419000Y268302D01*

+X418895Y268356D01*

+X418492Y268515D01*

+X418075Y268632D01*

+X417648Y268711D01*

+X417217Y268750D01*

+X417002D01*

+Y289250D01*

+X417217D01*

+X417648Y289289D01*

+X418075Y289368D01*

+X418492Y289485D01*

+X418897Y289640D01*

+X419002Y289695D01*

+X419097Y289766D01*

+X419179Y289852D01*

+X419247Y289949D01*

+X419299Y290055D01*

+X419334Y290169D01*

+X419350Y290286D01*

+X419348Y290405D01*

+X419327Y290522D01*

+X419289Y290634D01*

+X419233Y290738D01*

+X419162Y290833D01*

+X419076Y290915D01*

+X418979Y290983D01*

+X418873Y291035D01*

+X418759Y291070D01*

+X418642Y291086D01*

+X418523Y291084D01*

+X418406Y291064D01*

+X418295Y291023D01*

+X418020Y290914D01*

+X417735Y290834D01*

+X417443Y290780D01*

+X417148Y290753D01*

+X417002D01*

+Y297247D01*

+X417148D01*

+X417443Y297220D01*

+X417735Y297166D01*

+X418020Y297086D01*

+X418297Y296980D01*

+X418407Y296940D01*

+X418524Y296919D01*

+X418642Y296917D01*

+X418759Y296933D01*

+X418871Y296968D01*

+X418978Y297020D01*

+X419074Y297087D01*

+X419159Y297169D01*

+X419230Y297263D01*

+X419286Y297368D01*

+X419324Y297479D01*

+X419345Y297596D01*

+X419347Y297714D01*

+X419330Y297830D01*

+X419296Y297943D01*

+X419244Y298050D01*

+X419177Y298146D01*

+X419095Y298231D01*

+X419000Y298302D01*

+X418895Y298356D01*

+X418492Y298515D01*

+X418075Y298632D01*

+X417648Y298711D01*

+X417217Y298750D01*

+X417002D01*

+Y319250D01*

+X417217D01*

+X417648Y319289D01*

+X418075Y319368D01*

+X418492Y319485D01*

+X418897Y319640D01*

+X419002Y319695D01*

+X419097Y319766D01*

+X419179Y319852D01*

+X419247Y319949D01*

+X419299Y320055D01*

+X419334Y320169D01*

+X419350Y320286D01*

+X419348Y320405D01*

+X419327Y320522D01*

+X419289Y320634D01*

+X419233Y320738D01*

+X419162Y320833D01*

+X419076Y320915D01*

+X418979Y320983D01*

+X418873Y321035D01*

+X418759Y321070D01*

+X418642Y321086D01*

+X418523Y321084D01*

+X418406Y321064D01*

+X418295Y321023D01*

+X418020Y320914D01*

+X417735Y320834D01*

+X417443Y320780D01*

+X417148Y320753D01*

+X417002D01*

+Y327247D01*

+X417148D01*

+X417443Y327220D01*

+X417735Y327166D01*

+X418020Y327086D01*

+X418297Y326980D01*

+X418407Y326940D01*

+X418524Y326919D01*

+X418642Y326917D01*

+X418759Y326933D01*

+X418871Y326968D01*

+X418978Y327020D01*

+X419074Y327087D01*

+X419159Y327169D01*

+X419230Y327263D01*

+X419286Y327368D01*

+X419324Y327479D01*

+X419345Y327596D01*

+X419347Y327714D01*

+X419330Y327830D01*

+X419296Y327943D01*

+X419244Y328050D01*

+X419177Y328146D01*

+X419095Y328231D01*

+X419000Y328302D01*

+X418895Y328356D01*

+X418492Y328515D01*

+X418075Y328632D01*

+X417648Y328711D01*

+X417217Y328750D01*

+X417002D01*

+Y349250D01*

+X417217D01*

+X417648Y349289D01*

+X418075Y349368D01*

+X418492Y349485D01*

+X418897Y349640D01*

+X419002Y349695D01*

+X419097Y349766D01*

+X419179Y349852D01*

+X419247Y349949D01*

+X419299Y350055D01*

+X419334Y350169D01*

+X419350Y350286D01*

+X419348Y350405D01*

+X419327Y350522D01*

+X419289Y350634D01*

+X419233Y350738D01*

+X419162Y350833D01*

+X419076Y350915D01*

+X418979Y350983D01*

+X418873Y351035D01*

+X418759Y351070D01*

+X418642Y351086D01*

+X418523Y351084D01*

+X418406Y351064D01*

+X418295Y351023D01*

+X418020Y350914D01*

+X417735Y350834D01*

+X417443Y350780D01*

+X417148Y350753D01*

+X417002D01*

+Y357247D01*

+X417148D01*

+X417443Y357220D01*

+X417735Y357166D01*

+X418020Y357086D01*

+X418297Y356980D01*

+X418407Y356940D01*

+X418524Y356919D01*

+X418642Y356917D01*

+X418759Y356933D01*

+X418871Y356968D01*

+X418978Y357020D01*

+X419074Y357087D01*

+X419159Y357169D01*

+X419230Y357263D01*

+X419286Y357368D01*

+X419324Y357479D01*

+X419345Y357596D01*

+X419347Y357714D01*

+X419330Y357830D01*

+X419296Y357943D01*

+X419244Y358050D01*

+X419177Y358146D01*

+X419095Y358231D01*

+X419000Y358302D01*

+X418895Y358356D01*

+X418492Y358515D01*

+X418075Y358632D01*

+X417648Y358711D01*

+X417217Y358750D01*

+X417002D01*

+Y379250D01*

+X417217D01*

+X417648Y379289D01*

+X418075Y379368D01*

+X418492Y379485D01*

+X418897Y379640D01*

+X419002Y379695D01*

+X419097Y379766D01*

+X419179Y379852D01*

+X419247Y379949D01*

+X419299Y380055D01*

+X419334Y380169D01*

+X419350Y380286D01*

+X419348Y380405D01*

+X419327Y380522D01*

+X419289Y380634D01*

+X419233Y380738D01*

+X419162Y380833D01*

+X419076Y380915D01*

+X418979Y380983D01*

+X418873Y381035D01*

+X418759Y381070D01*

+X418642Y381086D01*

+X418523Y381084D01*

+X418406Y381064D01*

+X418295Y381023D01*

+X418020Y380914D01*

+X417735Y380834D01*

+X417443Y380780D01*

+X417148Y380753D01*

+X417002D01*

+Y387247D01*

+X417148D01*

+X417443Y387220D01*

+X417735Y387166D01*

+X418020Y387086D01*

+X418297Y386980D01*

+X418407Y386940D01*

+X418524Y386919D01*

+X418642Y386917D01*

+X418759Y386933D01*

+X418871Y386968D01*

+X418978Y387020D01*

+X419074Y387087D01*

+X419159Y387169D01*

+X419230Y387263D01*

+X419286Y387368D01*

+X419324Y387479D01*

+X419345Y387596D01*

+X419347Y387714D01*

+X419330Y387830D01*

+X419296Y387943D01*

+X419244Y388050D01*

+X419177Y388146D01*

+X419095Y388231D01*

+X419000Y388302D01*

+X418895Y388356D01*

+X418492Y388515D01*

+X418075Y388632D01*

+X417648Y388711D01*

+X417217Y388750D01*

+X417002D01*

+Y397000D01*

+X420832D01*

+Y386334D01*

+X420831Y386334D01*

+X420714Y386350D01*

+X420595Y386348D01*

+X420478Y386327D01*

+X420366Y386289D01*

+X420262Y386233D01*

+X420167Y386162D01*

+X420085Y386076D01*

+X420017Y385979D01*

+X419965Y385873D01*

+X419930Y385759D01*

+X419914Y385642D01*

+X419916Y385523D01*

+X419936Y385407D01*

+X419977Y385295D01*

+X420086Y385020D01*

+X420166Y384735D01*

+X420220Y384443D01*

+X420247Y384148D01*

+Y383852D01*

+X420220Y383557D01*

+X420166Y383265D01*

+X420086Y382980D01*

+X419980Y382703D01*

+X419940Y382593D01*

+X419919Y382476D01*

+X419917Y382358D01*

+X419933Y382241D01*

+X419968Y382129D01*

+X420020Y382022D01*

+X420087Y381926D01*

+X420169Y381841D01*

+X420263Y381770D01*

+X420368Y381714D01*

+X420479Y381676D01*

+X420596Y381655D01*

+X420714Y381653D01*

+X420830Y381670D01*

+X420832Y381670D01*

+Y356334D01*

+X420831Y356334D01*

+X420714Y356350D01*

+X420595Y356348D01*

+X420478Y356327D01*

+X420366Y356289D01*

+X420262Y356233D01*

+X420167Y356162D01*

+X420085Y356076D01*

+X420017Y355979D01*

+X419965Y355873D01*

+X419930Y355759D01*

+X419914Y355642D01*

+X419916Y355523D01*

+X419936Y355407D01*

+X419977Y355295D01*

+X420086Y355020D01*

+X420166Y354735D01*

+X420220Y354443D01*

+X420247Y354148D01*

+Y353852D01*

+X420220Y353557D01*

+X420166Y353265D01*

+X420086Y352980D01*

+X419980Y352703D01*

+X419940Y352593D01*

+X419919Y352476D01*

+X419917Y352358D01*

+X419933Y352241D01*

+X419968Y352129D01*

+X420020Y352022D01*

+X420087Y351926D01*

+X420169Y351841D01*

+X420263Y351770D01*

+X420368Y351714D01*

+X420479Y351676D01*

+X420596Y351655D01*

+X420714Y351653D01*

+X420830Y351670D01*

+X420832Y351670D01*

+Y326334D01*

+X420831Y326334D01*

+X420714Y326350D01*

+X420595Y326348D01*

+X420478Y326327D01*

+X420366Y326289D01*

+X420262Y326233D01*

+X420167Y326162D01*

+X420085Y326076D01*

+X420017Y325979D01*

+X419965Y325873D01*

+X419930Y325759D01*

+X419914Y325642D01*

+X419916Y325523D01*

+X419936Y325407D01*

+X419977Y325295D01*

+X420086Y325020D01*

+X420166Y324735D01*

+X420220Y324443D01*

+X420247Y324148D01*

+Y323852D01*

+X420220Y323557D01*

+X420166Y323265D01*

+X420086Y322980D01*

+X419980Y322703D01*

+X419940Y322593D01*

+X419919Y322476D01*

+X419917Y322358D01*

+X419933Y322241D01*

+X419968Y322129D01*

+X420020Y322022D01*

+X420087Y321926D01*

+X420169Y321841D01*

+X420263Y321770D01*

+X420368Y321714D01*

+X420479Y321676D01*

+X420596Y321655D01*

+X420714Y321653D01*

+X420830Y321670D01*

+X420832Y321670D01*

+Y296334D01*

+X420831Y296334D01*

+X420714Y296350D01*

+X420595Y296348D01*

+X420478Y296327D01*

+X420366Y296289D01*

+X420262Y296233D01*

+X420167Y296162D01*

+X420085Y296076D01*

+X420017Y295979D01*

+X419965Y295873D01*

+X419930Y295759D01*

+X419914Y295642D01*

+X419916Y295523D01*

+X419936Y295407D01*

+X419977Y295295D01*

+X420086Y295020D01*

+X420166Y294735D01*

+X420220Y294443D01*

+X420247Y294148D01*

+Y293852D01*

+X420220Y293557D01*

+X420166Y293265D01*

+X420086Y292980D01*

+X419980Y292703D01*

+X419940Y292593D01*

+X419919Y292476D01*

+X419917Y292358D01*

+X419933Y292241D01*

+X419968Y292129D01*

+X420020Y292022D01*

+X420087Y291926D01*

+X420169Y291841D01*

+X420263Y291770D01*

+X420368Y291714D01*

+X420479Y291676D01*

+X420596Y291655D01*

+X420714Y291653D01*

+X420830Y291670D01*

+X420832Y291670D01*

+Y266334D01*

+X420831Y266334D01*

+X420714Y266350D01*

+X420595Y266348D01*

+X420478Y266327D01*

+X420366Y266289D01*

+X420262Y266233D01*

+X420167Y266162D01*

+X420085Y266076D01*

+X420017Y265979D01*

+X419965Y265873D01*

+X419930Y265759D01*

+X419914Y265642D01*

+X419916Y265523D01*

+X419936Y265407D01*

+X419977Y265295D01*

+X420086Y265020D01*

+X420166Y264735D01*

+X420220Y264443D01*

+X420247Y264148D01*

+Y263852D01*

+X420220Y263557D01*

+X420166Y263265D01*

+X420086Y262980D01*

+X419980Y262703D01*

+X419940Y262593D01*

+X419919Y262476D01*

+X419917Y262358D01*

+X419933Y262241D01*

+X419968Y262129D01*

+X420020Y262022D01*

+X420087Y261926D01*

+X420169Y261841D01*

+X420263Y261770D01*

+X420368Y261714D01*

+X420479Y261676D01*

+X420596Y261655D01*

+X420714Y261653D01*

+X420830Y261670D01*

+X420832Y261670D01*

+Y236334D01*

+X420831Y236334D01*

+X420714Y236350D01*

+X420595Y236348D01*

+X420478Y236327D01*

+X420366Y236289D01*

+X420262Y236233D01*

+X420167Y236162D01*

+X420085Y236076D01*

+X420017Y235979D01*

+X419965Y235873D01*

+X419930Y235759D01*

+X419914Y235642D01*

+X419916Y235523D01*

+X419936Y235407D01*

+X419977Y235295D01*

+X420086Y235020D01*

+X420166Y234735D01*

+X420220Y234443D01*

+X420247Y234148D01*

+Y233852D01*

+X420220Y233557D01*

+X420166Y233265D01*

+X420086Y232980D01*

+X419980Y232703D01*

+X419940Y232593D01*

+X419919Y232476D01*

+X419917Y232358D01*

+X419933Y232241D01*

+X419968Y232129D01*

+X420020Y232022D01*

+X420087Y231926D01*

+X420169Y231841D01*

+X420263Y231770D01*

+X420368Y231714D01*

+X420479Y231676D01*

+X420596Y231655D01*

+X420714Y231653D01*

+X420830Y231670D01*

+X420832Y231670D01*

+Y206334D01*

+X420831Y206334D01*

+X420714Y206350D01*

+X420595Y206348D01*

+X420478Y206327D01*

+X420366Y206289D01*

+X420262Y206233D01*

+X420167Y206162D01*

+X420085Y206076D01*

+X420017Y205979D01*

+X419965Y205873D01*

+X419930Y205759D01*

+X419914Y205642D01*

+X419916Y205523D01*

+X419936Y205407D01*

+X419977Y205295D01*

+X420086Y205020D01*

+X420166Y204735D01*

+X420220Y204443D01*

+X420247Y204148D01*

+Y203852D01*

+X420220Y203557D01*

+X420166Y203265D01*

+X420086Y202980D01*

+X419980Y202703D01*

+X419940Y202593D01*

+X419919Y202476D01*

+X419917Y202358D01*

+X419933Y202241D01*

+X419968Y202129D01*

+X420020Y202022D01*

+X420087Y201926D01*

+X420169Y201841D01*

+X420263Y201770D01*

+X420368Y201714D01*

+X420479Y201676D01*

+X420596Y201655D01*

+X420714Y201653D01*

+X420830Y201670D01*

+X420832Y201670D01*

+Y176334D01*

+X420831Y176334D01*

+X420714Y176350D01*

+X420595Y176348D01*

+X420478Y176327D01*

+X420366Y176289D01*

+X420262Y176233D01*

+X420167Y176162D01*

+X420085Y176076D01*

+X420017Y175979D01*

+X419965Y175873D01*

+X419930Y175759D01*

+X419914Y175642D01*

+X419916Y175523D01*

+X419936Y175407D01*

+X419977Y175295D01*

+X420086Y175020D01*

+X420166Y174735D01*

+X420220Y174443D01*

+X420247Y174148D01*

+Y173852D01*

+X420220Y173557D01*

+X420166Y173265D01*

+X420086Y172980D01*

+X419980Y172703D01*

+X419940Y172593D01*

+X419919Y172476D01*

+X419917Y172358D01*

+X419933Y172241D01*

+X419968Y172129D01*

+X420020Y172022D01*

+X420087Y171926D01*

+X420169Y171841D01*

+X420263Y171770D01*

+X420368Y171714D01*

+X420479Y171676D01*

+X420596Y171655D01*

+X420714Y171653D01*

+X420830Y171670D01*

+X420832Y171670D01*

+Y154000D01*

+G37*

+G36*

+X417002D02*X413168D01*

+Y171666D01*

+X413169Y171666D01*

+X413286Y171650D01*

+X413405Y171652D01*

+X413522Y171673D01*

+X413634Y171711D01*

+X413738Y171767D01*

+X413833Y171838D01*

+X413915Y171924D01*

+X413983Y172021D01*

+X414035Y172127D01*

+X414070Y172241D01*

+X414086Y172358D01*

+X414084Y172477D01*

+X414064Y172594D01*

+X414023Y172705D01*

+X413914Y172980D01*

+X413834Y173265D01*

+X413780Y173557D01*

+X413753Y173852D01*

+Y174148D01*

+X413780Y174443D01*

+X413834Y174735D01*

+X413914Y175020D01*

+X414020Y175297D01*

+X414060Y175407D01*

+X414081Y175524D01*

+X414083Y175642D01*

+X414067Y175759D01*

+X414032Y175871D01*

+X413980Y175978D01*

+X413913Y176074D01*

+X413831Y176159D01*

+X413737Y176230D01*

+X413632Y176286D01*

+X413521Y176324D01*

+X413404Y176345D01*

+X413286Y176347D01*

+X413170Y176330D01*

+X413168Y176330D01*

+Y201666D01*

+X413169Y201666D01*

+X413286Y201650D01*

+X413405Y201652D01*

+X413522Y201673D01*

+X413634Y201711D01*

+X413738Y201767D01*

+X413833Y201838D01*

+X413915Y201924D01*

+X413983Y202021D01*

+X414035Y202127D01*

+X414070Y202241D01*

+X414086Y202358D01*

+X414084Y202477D01*

+X414064Y202594D01*

+X414023Y202705D01*

+X413914Y202980D01*

+X413834Y203265D01*

+X413780Y203557D01*

+X413753Y203852D01*

+Y204148D01*

+X413780Y204443D01*

+X413834Y204735D01*

+X413914Y205020D01*

+X414020Y205297D01*

+X414060Y205407D01*

+X414081Y205524D01*

+X414083Y205642D01*

+X414067Y205759D01*

+X414032Y205871D01*

+X413980Y205978D01*

+X413913Y206074D01*

+X413831Y206159D01*

+X413737Y206230D01*

+X413632Y206286D01*

+X413521Y206324D01*

+X413404Y206345D01*

+X413286Y206347D01*

+X413170Y206330D01*

+X413168Y206330D01*

+Y231666D01*

+X413169Y231666D01*

+X413286Y231650D01*

+X413405Y231652D01*

+X413522Y231673D01*

+X413634Y231711D01*

+X413738Y231767D01*

+X413833Y231838D01*

+X413915Y231924D01*

+X413983Y232021D01*

+X414035Y232127D01*

+X414070Y232241D01*

+X414086Y232358D01*

+X414084Y232477D01*

+X414064Y232594D01*

+X414023Y232705D01*

+X413914Y232980D01*

+X413834Y233265D01*

+X413780Y233557D01*

+X413753Y233852D01*

+Y234148D01*

+X413780Y234443D01*

+X413834Y234735D01*

+X413914Y235020D01*

+X414020Y235297D01*

+X414060Y235407D01*

+X414081Y235524D01*

+X414083Y235642D01*

+X414067Y235759D01*

+X414032Y235871D01*

+X413980Y235978D01*

+X413913Y236074D01*

+X413831Y236159D01*

+X413737Y236230D01*

+X413632Y236286D01*

+X413521Y236324D01*

+X413404Y236345D01*

+X413286Y236347D01*

+X413170Y236330D01*

+X413168Y236330D01*

+Y261666D01*

+X413169Y261666D01*

+X413286Y261650D01*

+X413405Y261652D01*

+X413522Y261673D01*

+X413634Y261711D01*

+X413738Y261767D01*

+X413833Y261838D01*

+X413915Y261924D01*

+X413983Y262021D01*

+X414035Y262127D01*

+X414070Y262241D01*

+X414086Y262358D01*

+X414084Y262477D01*

+X414064Y262594D01*

+X414023Y262705D01*

+X413914Y262980D01*

+X413834Y263265D01*

+X413780Y263557D01*

+X413753Y263852D01*

+Y264148D01*

+X413780Y264443D01*

+X413834Y264735D01*

+X413914Y265020D01*

+X414020Y265297D01*

+X414060Y265407D01*

+X414081Y265524D01*

+X414083Y265642D01*

+X414067Y265759D01*

+X414032Y265871D01*

+X413980Y265978D01*

+X413913Y266074D01*

+X413831Y266159D01*

+X413737Y266230D01*

+X413632Y266286D01*

+X413521Y266324D01*

+X413404Y266345D01*

+X413286Y266347D01*

+X413170Y266330D01*

+X413168Y266330D01*

+Y291666D01*

+X413169Y291666D01*

+X413286Y291650D01*

+X413405Y291652D01*

+X413522Y291673D01*

+X413634Y291711D01*

+X413738Y291767D01*

+X413833Y291838D01*

+X413915Y291924D01*

+X413983Y292021D01*

+X414035Y292127D01*

+X414070Y292241D01*

+X414086Y292358D01*

+X414084Y292477D01*

+X414064Y292594D01*

+X414023Y292705D01*

+X413914Y292980D01*

+X413834Y293265D01*

+X413780Y293557D01*

+X413753Y293852D01*

+Y294148D01*

+X413780Y294443D01*

+X413834Y294735D01*

+X413914Y295020D01*

+X414020Y295297D01*

+X414060Y295407D01*

+X414081Y295524D01*

+X414083Y295642D01*

+X414067Y295759D01*

+X414032Y295871D01*

+X413980Y295978D01*

+X413913Y296074D01*

+X413831Y296159D01*

+X413737Y296230D01*

+X413632Y296286D01*

+X413521Y296324D01*

+X413404Y296345D01*

+X413286Y296347D01*

+X413170Y296330D01*

+X413168Y296330D01*

+Y321666D01*

+X413169Y321666D01*

+X413286Y321650D01*

+X413405Y321652D01*

+X413522Y321673D01*

+X413634Y321711D01*

+X413738Y321767D01*

+X413833Y321838D01*

+X413915Y321924D01*

+X413983Y322021D01*

+X414035Y322127D01*

+X414070Y322241D01*

+X414086Y322358D01*

+X414084Y322477D01*

+X414064Y322594D01*

+X414023Y322705D01*

+X413914Y322980D01*

+X413834Y323265D01*

+X413780Y323557D01*

+X413753Y323852D01*

+Y324148D01*

+X413780Y324443D01*

+X413834Y324735D01*

+X413914Y325020D01*

+X414020Y325297D01*

+X414060Y325407D01*

+X414081Y325524D01*

+X414083Y325642D01*

+X414067Y325759D01*

+X414032Y325871D01*

+X413980Y325978D01*

+X413913Y326074D01*

+X413831Y326159D01*

+X413737Y326230D01*

+X413632Y326286D01*

+X413521Y326324D01*

+X413404Y326345D01*

+X413286Y326347D01*

+X413170Y326330D01*

+X413168Y326330D01*

+Y351666D01*

+X413169Y351666D01*

+X413286Y351650D01*

+X413405Y351652D01*

+X413522Y351673D01*

+X413634Y351711D01*

+X413738Y351767D01*

+X413833Y351838D01*

+X413915Y351924D01*

+X413983Y352021D01*

+X414035Y352127D01*

+X414070Y352241D01*

+X414086Y352358D01*

+X414084Y352477D01*

+X414064Y352594D01*

+X414023Y352705D01*

+X413914Y352980D01*

+X413834Y353265D01*

+X413780Y353557D01*

+X413753Y353852D01*

+Y354148D01*

+X413780Y354443D01*

+X413834Y354735D01*

+X413914Y355020D01*

+X414020Y355297D01*

+X414060Y355407D01*

+X414081Y355524D01*

+X414083Y355642D01*

+X414067Y355759D01*

+X414032Y355871D01*

+X413980Y355978D01*

+X413913Y356074D01*

+X413831Y356159D01*

+X413737Y356230D01*

+X413632Y356286D01*

+X413521Y356324D01*

+X413404Y356345D01*

+X413286Y356347D01*

+X413170Y356330D01*

+X413168Y356330D01*

+Y381666D01*

+X413169Y381666D01*

+X413286Y381650D01*

+X413405Y381652D01*

+X413522Y381673D01*

+X413634Y381711D01*

+X413738Y381767D01*

+X413833Y381838D01*

+X413915Y381924D01*

+X413983Y382021D01*

+X414035Y382127D01*

+X414070Y382241D01*

+X414086Y382358D01*

+X414084Y382477D01*

+X414064Y382594D01*

+X414023Y382705D01*

+X413914Y382980D01*

+X413834Y383265D01*

+X413780Y383557D01*

+X413753Y383852D01*

+Y384148D01*

+X413780Y384443D01*

+X413834Y384735D01*

+X413914Y385020D01*

+X414020Y385297D01*

+X414060Y385407D01*

+X414081Y385524D01*

+X414083Y385642D01*

+X414067Y385759D01*

+X414032Y385871D01*

+X413980Y385978D01*

+X413913Y386074D01*

+X413831Y386159D01*

+X413737Y386230D01*

+X413632Y386286D01*

+X413521Y386324D01*

+X413404Y386345D01*

+X413286Y386347D01*

+X413170Y386330D01*

+X413168Y386330D01*

+Y397000D01*

+X417002D01*

+Y388750D01*

+X416783D01*

+X416352Y388711D01*

+X415925Y388632D01*

+X415508Y388515D01*

+X415103Y388360D01*

+X414998Y388305D01*

+X414903Y388234D01*

+X414821Y388148D01*

+X414753Y388051D01*

+X414701Y387945D01*

+X414666Y387831D01*

+X414650Y387714D01*

+X414652Y387595D01*

+X414673Y387478D01*

+X414711Y387366D01*

+X414767Y387262D01*

+X414838Y387167D01*

+X414924Y387085D01*

+X415021Y387017D01*

+X415127Y386965D01*

+X415241Y386930D01*

+X415358Y386914D01*

+X415477Y386916D01*

+X415593Y386936D01*

+X415705Y386977D01*

+X415980Y387086D01*

+X416265Y387166D01*

+X416557Y387220D01*

+X416852Y387247D01*

+X417002D01*

+Y380753D01*

+X416852D01*

+X416557Y380780D01*

+X416265Y380834D01*

+X415980Y380914D01*

+X415703Y381020D01*

+X415593Y381060D01*

+X415476Y381081D01*

+X415358Y381083D01*

+X415241Y381067D01*

+X415129Y381032D01*

+X415022Y380980D01*

+X414926Y380913D01*

+X414841Y380831D01*

+X414770Y380737D01*

+X414714Y380632D01*

+X414676Y380521D01*

+X414655Y380404D01*

+X414653Y380286D01*

+X414670Y380170D01*

+X414704Y380057D01*

+X414756Y379950D01*

+X414823Y379854D01*

+X414905Y379769D01*

+X415000Y379698D01*

+X415105Y379644D01*

+X415508Y379485D01*

+X415925Y379368D01*

+X416352Y379289D01*

+X416783Y379250D01*

+X417002D01*

+Y358750D01*

+X416783D01*

+X416352Y358711D01*

+X415925Y358632D01*

+X415508Y358515D01*

+X415103Y358360D01*

+X414998Y358305D01*

+X414903Y358234D01*

+X414821Y358148D01*

+X414753Y358051D01*

+X414701Y357945D01*

+X414666Y357831D01*

+X414650Y357714D01*

+X414652Y357595D01*

+X414673Y357478D01*

+X414711Y357366D01*

+X414767Y357262D01*

+X414838Y357167D01*

+X414924Y357085D01*

+X415021Y357017D01*

+X415127Y356965D01*

+X415241Y356930D01*

+X415358Y356914D01*

+X415477Y356916D01*

+X415593Y356936D01*

+X415705Y356977D01*

+X415980Y357086D01*

+X416265Y357166D01*

+X416557Y357220D01*

+X416852Y357247D01*

+X417002D01*

+Y350753D01*

+X416852D01*

+X416557Y350780D01*

+X416265Y350834D01*

+X415980Y350914D01*

+X415703Y351020D01*

+X415593Y351060D01*

+X415476Y351081D01*

+X415358Y351083D01*

+X415241Y351067D01*

+X415129Y351032D01*

+X415022Y350980D01*

+X414926Y350913D01*

+X414841Y350831D01*

+X414770Y350737D01*

+X414714Y350632D01*

+X414676Y350521D01*

+X414655Y350404D01*

+X414653Y350286D01*

+X414670Y350170D01*

+X414704Y350057D01*

+X414756Y349950D01*

+X414823Y349854D01*

+X414905Y349769D01*

+X415000Y349698D01*

+X415105Y349644D01*

+X415508Y349485D01*

+X415925Y349368D01*

+X416352Y349289D01*

+X416783Y349250D01*

+X417002D01*

+Y328750D01*

+X416783D01*

+X416352Y328711D01*

+X415925Y328632D01*

+X415508Y328515D01*

+X415103Y328360D01*

+X414998Y328305D01*

+X414903Y328234D01*

+X414821Y328148D01*

+X414753Y328051D01*

+X414701Y327945D01*

+X414666Y327831D01*

+X414650Y327714D01*

+X414652Y327595D01*

+X414673Y327478D01*

+X414711Y327366D01*

+X414767Y327262D01*

+X414838Y327167D01*

+X414924Y327085D01*

+X415021Y327017D01*

+X415127Y326965D01*

+X415241Y326930D01*

+X415358Y326914D01*

+X415477Y326916D01*

+X415593Y326936D01*

+X415705Y326977D01*

+X415980Y327086D01*

+X416265Y327166D01*

+X416557Y327220D01*

+X416852Y327247D01*

+X417002D01*

+Y320753D01*

+X416852D01*

+X416557Y320780D01*

+X416265Y320834D01*

+X415980Y320914D01*

+X415703Y321020D01*

+X415593Y321060D01*

+X415476Y321081D01*

+X415358Y321083D01*

+X415241Y321067D01*

+X415129Y321032D01*

+X415022Y320980D01*

+X414926Y320913D01*

+X414841Y320831D01*

+X414770Y320737D01*

+X414714Y320632D01*

+X414676Y320521D01*

+X414655Y320404D01*

+X414653Y320286D01*

+X414670Y320170D01*

+X414704Y320057D01*

+X414756Y319950D01*

+X414823Y319854D01*

+X414905Y319769D01*

+X415000Y319698D01*

+X415105Y319644D01*

+X415508Y319485D01*

+X415925Y319368D01*

+X416352Y319289D01*

+X416783Y319250D01*

+X417002D01*

+Y298750D01*

+X416783D01*

+X416352Y298711D01*

+X415925Y298632D01*

+X415508Y298515D01*

+X415103Y298360D01*

+X414998Y298305D01*

+X414903Y298234D01*

+X414821Y298148D01*

+X414753Y298051D01*

+X414701Y297945D01*

+X414666Y297831D01*

+X414650Y297714D01*

+X414652Y297595D01*

+X414673Y297478D01*

+X414711Y297366D01*

+X414767Y297262D01*

+X414838Y297167D01*

+X414924Y297085D01*

+X415021Y297017D01*

+X415127Y296965D01*

+X415241Y296930D01*

+X415358Y296914D01*

+X415477Y296916D01*

+X415593Y296936D01*

+X415705Y296977D01*

+X415980Y297086D01*

+X416265Y297166D01*

+X416557Y297220D01*

+X416852Y297247D01*

+X417002D01*

+Y290753D01*

+X416852D01*

+X416557Y290780D01*

+X416265Y290834D01*

+X415980Y290914D01*

+X415703Y291020D01*

+X415593Y291060D01*

+X415476Y291081D01*

+X415358Y291083D01*

+X415241Y291067D01*

+X415129Y291032D01*

+X415022Y290980D01*

+X414926Y290913D01*

+X414841Y290831D01*

+X414770Y290737D01*

+X414714Y290632D01*

+X414676Y290521D01*

+X414655Y290404D01*

+X414653Y290286D01*

+X414670Y290170D01*

+X414704Y290057D01*

+X414756Y289950D01*

+X414823Y289854D01*

+X414905Y289769D01*

+X415000Y289698D01*

+X415105Y289644D01*

+X415508Y289485D01*

+X415925Y289368D01*

+X416352Y289289D01*

+X416783Y289250D01*

+X417002D01*

+Y268750D01*

+X416783D01*

+X416352Y268711D01*

+X415925Y268632D01*

+X415508Y268515D01*

+X415103Y268360D01*

+X414998Y268305D01*

+X414903Y268234D01*

+X414821Y268148D01*

+X414753Y268051D01*

+X414701Y267945D01*

+X414666Y267831D01*

+X414650Y267714D01*

+X414652Y267595D01*

+X414673Y267478D01*

+X414711Y267366D01*

+X414767Y267262D01*

+X414838Y267167D01*

+X414924Y267085D01*

+X415021Y267017D01*

+X415127Y266965D01*

+X415241Y266930D01*

+X415358Y266914D01*

+X415477Y266916D01*

+X415593Y266936D01*

+X415705Y266977D01*

+X415980Y267086D01*

+X416265Y267166D01*

+X416557Y267220D01*

+X416852Y267247D01*

+X417002D01*

+Y260753D01*

+X416852D01*

+X416557Y260780D01*

+X416265Y260834D01*

+X415980Y260914D01*

+X415703Y261020D01*

+X415593Y261060D01*

+X415476Y261081D01*

+X415358Y261083D01*

+X415241Y261067D01*

+X415129Y261032D01*

+X415022Y260980D01*

+X414926Y260913D01*

+X414841Y260831D01*

+X414770Y260737D01*

+X414714Y260632D01*

+X414676Y260521D01*

+X414655Y260404D01*

+X414653Y260286D01*

+X414670Y260170D01*

+X414704Y260057D01*

+X414756Y259950D01*

+X414823Y259854D01*

+X414905Y259769D01*

+X415000Y259698D01*

+X415105Y259644D01*

+X415508Y259485D01*

+X415925Y259368D01*

+X416352Y259289D01*

+X416783Y259250D01*

+X417002D01*

+Y238750D01*

+X416783D01*

+X416352Y238711D01*

+X415925Y238632D01*

+X415508Y238515D01*

+X415103Y238360D01*

+X414998Y238305D01*

+X414903Y238234D01*

+X414821Y238148D01*

+X414753Y238051D01*

+X414701Y237945D01*

+X414666Y237831D01*

+X414650Y237714D01*

+X414652Y237595D01*

+X414673Y237478D01*

+X414711Y237366D01*

+X414767Y237262D01*

+X414838Y237167D01*

+X414924Y237085D01*

+X415021Y237017D01*

+X415127Y236965D01*

+X415241Y236930D01*

+X415358Y236914D01*

+X415477Y236916D01*

+X415593Y236936D01*

+X415705Y236977D01*

+X415980Y237086D01*

+X416265Y237166D01*

+X416557Y237220D01*

+X416852Y237247D01*

+X417002D01*

+Y230753D01*

+X416852D01*

+X416557Y230780D01*

+X416265Y230834D01*

+X415980Y230914D01*

+X415703Y231020D01*

+X415593Y231060D01*

+X415476Y231081D01*

+X415358Y231083D01*

+X415241Y231067D01*

+X415129Y231032D01*

+X415022Y230980D01*

+X414926Y230913D01*

+X414841Y230831D01*

+X414770Y230737D01*

+X414714Y230632D01*

+X414676Y230521D01*

+X414655Y230404D01*

+X414653Y230286D01*

+X414670Y230170D01*

+X414704Y230057D01*

+X414756Y229950D01*

+X414823Y229854D01*

+X414905Y229769D01*

+X415000Y229698D01*

+X415105Y229644D01*

+X415508Y229485D01*

+X415925Y229368D01*

+X416352Y229289D01*

+X416783Y229250D01*

+X417002D01*

+Y208750D01*

+X416783D01*

+X416352Y208711D01*

+X415925Y208632D01*

+X415508Y208515D01*

+X415103Y208360D01*

+X414998Y208305D01*

+X414903Y208234D01*

+X414821Y208148D01*

+X414753Y208051D01*

+X414701Y207945D01*

+X414666Y207831D01*

+X414650Y207714D01*

+X414652Y207595D01*

+X414673Y207478D01*

+X414711Y207366D01*

+X414767Y207262D01*

+X414838Y207167D01*

+X414924Y207085D01*

+X415021Y207017D01*

+X415127Y206965D01*

+X415241Y206930D01*

+X415358Y206914D01*

+X415477Y206916D01*

+X415593Y206936D01*

+X415705Y206977D01*

+X415980Y207086D01*

+X416265Y207166D01*

+X416557Y207220D01*

+X416852Y207247D01*

+X417002D01*

+Y200753D01*

+X416852D01*

+X416557Y200780D01*

+X416265Y200834D01*

+X415980Y200914D01*

+X415703Y201020D01*

+X415593Y201060D01*

+X415476Y201081D01*

+X415358Y201083D01*

+X415241Y201067D01*

+X415129Y201032D01*

+X415022Y200980D01*

+X414926Y200913D01*

+X414841Y200831D01*

+X414770Y200737D01*

+X414714Y200632D01*

+X414676Y200521D01*

+X414655Y200404D01*

+X414653Y200286D01*

+X414670Y200170D01*

+X414704Y200057D01*

+X414756Y199950D01*

+X414823Y199854D01*

+X414905Y199769D01*

+X415000Y199698D01*

+X415105Y199644D01*

+X415508Y199485D01*

+X415925Y199368D01*

+X416352Y199289D01*

+X416783Y199250D01*

+X417002D01*

+Y178750D01*

+X416783D01*

+X416352Y178711D01*

+X415925Y178632D01*

+X415508Y178515D01*

+X415103Y178360D01*

+X414998Y178305D01*

+X414903Y178234D01*

+X414821Y178148D01*

+X414753Y178051D01*

+X414701Y177945D01*

+X414666Y177831D01*

+X414650Y177714D01*

+X414652Y177595D01*

+X414673Y177478D01*

+X414711Y177366D01*

+X414767Y177262D01*

+X414838Y177167D01*

+X414924Y177085D01*

+X415021Y177017D01*

+X415127Y176965D01*

+X415241Y176930D01*

+X415358Y176914D01*

+X415477Y176916D01*

+X415593Y176936D01*

+X415705Y176977D01*

+X415980Y177086D01*

+X416265Y177166D01*

+X416557Y177220D01*

+X416852Y177247D01*

+X417002D01*

+Y170753D01*

+X416852D01*

+X416557Y170780D01*

+X416265Y170834D01*

+X415980Y170914D01*

+X415703Y171020D01*

+X415593Y171060D01*

+X415476Y171081D01*

+X415358Y171083D01*

+X415241Y171067D01*

+X415129Y171032D01*

+X415022Y170980D01*

+X414926Y170913D01*

+X414841Y170831D01*

+X414770Y170737D01*

+X414714Y170632D01*

+X414676Y170521D01*

+X414655Y170404D01*

+X414653Y170286D01*

+X414670Y170170D01*

+X414704Y170057D01*

+X414756Y169950D01*

+X414823Y169854D01*

+X414905Y169769D01*

+X415000Y169698D01*

+X415105Y169644D01*

+X415508Y169485D01*

+X415925Y169368D01*

+X416352Y169289D01*

+X416783Y169250D01*

+X417002D01*

+Y154000D01*

+G37*

+G36*

+X413168D02*X406441D01*

+X406504Y169256D01*

+X410485Y169264D01*

+X410715Y169319D01*

+X410933Y169409D01*

+X411134Y169533D01*

+X411314Y169686D01*

+X411467Y169866D01*

+X411591Y170067D01*

+X411681Y170285D01*

+X411736Y170515D01*

+X411750Y170750D01*

+X411736Y177485D01*

+X411681Y177715D01*

+X411591Y177933D01*

+X411467Y178134D01*

+X411314Y178314D01*

+X411134Y178467D01*

+X410933Y178591D01*

+X410715Y178681D01*

+X410485Y178736D01*

+X410250Y178750D01*

+X406543Y178742D01*

+X406627Y199256D01*

+X410485Y199264D01*

+X410715Y199319D01*

+X410933Y199409D01*

+X411134Y199533D01*

+X411314Y199686D01*

+X411467Y199866D01*

+X411591Y200067D01*

+X411681Y200285D01*

+X411736Y200515D01*

+X411750Y200750D01*

+X411736Y207485D01*

+X411681Y207715D01*

+X411591Y207933D01*

+X411467Y208134D01*

+X411314Y208314D01*

+X411134Y208467D01*

+X410933Y208591D01*

+X410715Y208681D01*

+X410485Y208736D01*

+X410250Y208750D01*

+X406666Y208743D01*

+X406751Y229256D01*

+X410485Y229264D01*

+X410715Y229319D01*

+X410933Y229409D01*

+X411134Y229533D01*

+X411314Y229686D01*

+X411467Y229866D01*

+X411591Y230067D01*

+X411681Y230285D01*

+X411736Y230515D01*

+X411750Y230750D01*

+X411736Y237485D01*

+X411681Y237715D01*

+X411591Y237933D01*

+X411467Y238134D01*

+X411314Y238314D01*

+X411134Y238467D01*

+X410933Y238591D01*

+X410715Y238681D01*

+X410485Y238736D01*

+X410250Y238750D01*

+X406790Y238743D01*

+X406874Y259256D01*

+X410485Y259264D01*

+X410715Y259319D01*

+X410933Y259409D01*

+X411134Y259533D01*

+X411314Y259686D01*

+X411467Y259866D01*

+X411591Y260067D01*

+X411681Y260285D01*

+X411736Y260515D01*

+X411750Y260750D01*

+X411736Y267485D01*

+X411681Y267715D01*

+X411591Y267933D01*

+X411467Y268134D01*

+X411314Y268314D01*

+X411134Y268467D01*

+X410933Y268591D01*

+X410715Y268681D01*

+X410485Y268736D01*

+X410250Y268750D01*

+X406913Y268743D01*

+X406998Y289257D01*

+X410485Y289264D01*

+X410715Y289319D01*

+X410933Y289409D01*

+X411134Y289533D01*

+X411314Y289686D01*

+X411467Y289866D01*

+X411591Y290067D01*

+X411681Y290285D01*

+X411736Y290515D01*

+X411750Y290750D01*

+X411736Y297485D01*

+X411681Y297715D01*

+X411591Y297933D01*

+X411467Y298134D01*

+X411314Y298314D01*

+X411134Y298467D01*

+X410933Y298591D01*

+X410715Y298681D01*

+X410485Y298736D01*

+X410250Y298750D01*

+X407037Y298743D01*

+X407121Y319257D01*

+X410485Y319264D01*

+X410715Y319319D01*

+X410933Y319409D01*

+X411134Y319533D01*

+X411314Y319686D01*

+X411467Y319866D01*

+X411591Y320067D01*

+X411681Y320285D01*

+X411736Y320515D01*

+X411750Y320750D01*

+X411736Y327485D01*

+X411681Y327715D01*

+X411591Y327933D01*

+X411467Y328134D01*

+X411314Y328314D01*

+X411134Y328467D01*

+X410933Y328591D01*

+X410715Y328681D01*

+X410485Y328736D01*

+X410250Y328750D01*

+X407160Y328744D01*

+X407245Y349257D01*

+X410485Y349264D01*

+X410715Y349319D01*

+X410933Y349409D01*

+X411134Y349533D01*

+X411314Y349686D01*

+X411467Y349866D01*

+X411591Y350067D01*

+X411681Y350285D01*

+X411736Y350515D01*

+X411750Y350750D01*

+X411736Y357485D01*

+X411681Y357715D01*

+X411591Y357933D01*

+X411467Y358134D01*

+X411314Y358314D01*

+X411134Y358467D01*

+X410933Y358591D01*

+X410715Y358681D01*

+X410485Y358736D01*

+X410250Y358750D01*

+X407284Y358744D01*

+X407368Y379257D01*

+X410485Y379264D01*

+X410715Y379319D01*

+X410933Y379409D01*

+X411134Y379533D01*

+X411314Y379686D01*

+X411467Y379866D01*

+X411591Y380067D01*

+X411681Y380285D01*

+X411736Y380515D01*

+X411750Y380750D01*

+X411736Y387485D01*

+X411681Y387715D01*

+X411591Y387933D01*

+X411467Y388134D01*

+X411314Y388314D01*

+X411134Y388467D01*

+X410933Y388591D01*

+X410715Y388681D01*

+X410485Y388736D01*

+X410250Y388750D01*

+X407407Y388744D01*

+X407441Y397000D01*

+X413168D01*

+Y386330D01*

+X413057Y386296D01*

+X412950Y386244D01*

+X412854Y386177D01*

+X412769Y386095D01*

+X412698Y386000D01*

+X412644Y385895D01*

+X412485Y385492D01*

+X412368Y385075D01*

+X412289Y384648D01*

+X412250Y384217D01*

+Y383783D01*

+X412289Y383352D01*

+X412368Y382925D01*

+X412485Y382508D01*

+X412640Y382103D01*

+X412695Y381998D01*

+X412766Y381903D01*

+X412852Y381821D01*

+X412949Y381753D01*

+X413055Y381701D01*

+X413168Y381666D01*

+Y356330D01*

+X413057Y356296D01*

+X412950Y356244D01*

+X412854Y356177D01*

+X412769Y356095D01*

+X412698Y356000D01*

+X412644Y355895D01*

+X412485Y355492D01*

+X412368Y355075D01*

+X412289Y354648D01*

+X412250Y354217D01*

+Y353783D01*

+X412289Y353352D01*

+X412368Y352925D01*

+X412485Y352508D01*

+X412640Y352103D01*

+X412695Y351998D01*

+X412766Y351903D01*

+X412852Y351821D01*

+X412949Y351753D01*

+X413055Y351701D01*

+X413168Y351666D01*

+Y326330D01*

+X413057Y326296D01*

+X412950Y326244D01*

+X412854Y326177D01*

+X412769Y326095D01*

+X412698Y326000D01*

+X412644Y325895D01*

+X412485Y325492D01*

+X412368Y325075D01*

+X412289Y324648D01*

+X412250Y324217D01*

+Y323783D01*

+X412289Y323352D01*

+X412368Y322925D01*

+X412485Y322508D01*

+X412640Y322103D01*

+X412695Y321998D01*

+X412766Y321903D01*

+X412852Y321821D01*

+X412949Y321753D01*

+X413055Y321701D01*

+X413168Y321666D01*

+Y296330D01*

+X413057Y296296D01*

+X412950Y296244D01*

+X412854Y296177D01*

+X412769Y296095D01*

+X412698Y296000D01*

+X412644Y295895D01*

+X412485Y295492D01*

+X412368Y295075D01*

+X412289Y294648D01*

+X412250Y294217D01*

+Y293783D01*

+X412289Y293352D01*

+X412368Y292925D01*

+X412485Y292508D01*

+X412640Y292103D01*

+X412695Y291998D01*

+X412766Y291903D01*

+X412852Y291821D01*

+X412949Y291753D01*

+X413055Y291701D01*

+X413168Y291666D01*

+Y266330D01*

+X413057Y266296D01*

+X412950Y266244D01*

+X412854Y266177D01*

+X412769Y266095D01*

+X412698Y266000D01*

+X412644Y265895D01*

+X412485Y265492D01*

+X412368Y265075D01*

+X412289Y264648D01*

+X412250Y264217D01*

+Y263783D01*

+X412289Y263352D01*

+X412368Y262925D01*

+X412485Y262508D01*

+X412640Y262103D01*

+X412695Y261998D01*

+X412766Y261903D01*

+X412852Y261821D01*

+X412949Y261753D01*

+X413055Y261701D01*

+X413168Y261666D01*

+Y236330D01*

+X413057Y236296D01*

+X412950Y236244D01*

+X412854Y236177D01*

+X412769Y236095D01*

+X412698Y236000D01*

+X412644Y235895D01*

+X412485Y235492D01*

+X412368Y235075D01*

+X412289Y234648D01*

+X412250Y234217D01*

+Y233783D01*

+X412289Y233352D01*

+X412368Y232925D01*

+X412485Y232508D01*

+X412640Y232103D01*

+X412695Y231998D01*

+X412766Y231903D01*

+X412852Y231821D01*

+X412949Y231753D01*

+X413055Y231701D01*

+X413168Y231666D01*

+Y206330D01*

+X413057Y206296D01*

+X412950Y206244D01*

+X412854Y206177D01*

+X412769Y206095D01*

+X412698Y206000D01*

+X412644Y205895D01*

+X412485Y205492D01*

+X412368Y205075D01*

+X412289Y204648D01*

+X412250Y204217D01*

+Y203783D01*

+X412289Y203352D01*

+X412368Y202925D01*

+X412485Y202508D01*

+X412640Y202103D01*

+X412695Y201998D01*

+X412766Y201903D01*

+X412852Y201821D01*

+X412949Y201753D01*

+X413055Y201701D01*

+X413168Y201666D01*

+Y176330D01*

+X413057Y176296D01*

+X412950Y176244D01*

+X412854Y176177D01*

+X412769Y176095D01*

+X412698Y176000D01*

+X412644Y175895D01*

+X412485Y175492D01*

+X412368Y175075D01*

+X412289Y174648D01*

+X412250Y174217D01*

+Y173783D01*

+X412289Y173352D01*

+X412368Y172925D01*

+X412485Y172508D01*

+X412640Y172103D01*

+X412695Y171998D01*

+X412766Y171903D01*

+X412852Y171821D01*

+X412949Y171753D01*

+X413055Y171701D01*

+X413168Y171666D01*

+Y154000D01*

+G37*

+G36*

+X434446Y39000D02*X394938D01*

+Y50000D01*

+X395002Y50039D01*

+X395218Y50223D01*

+X395402Y50439D01*

+X395550Y50680D01*

+X395658Y50942D01*

+X395724Y51218D01*

+X395741Y51500D01*

+X395724Y51782D01*

+X395658Y52058D01*

+X395550Y52320D01*

+X395402Y52561D01*

+X395218Y52777D01*

+X395002Y52961D01*

+X394938Y53000D01*

+Y56695D01*

+X394941Y56694D01*

+X395223Y56717D01*

+X395499Y56783D01*

+X395761Y56891D01*

+X396002Y57039D01*

+X396218Y57223D01*

+X396402Y57439D01*

+X396550Y57680D01*

+X396658Y57942D01*

+X396724Y58218D01*

+X396741Y58500D01*

+X396724Y58782D01*

+X396658Y59058D01*

+X396550Y59320D01*

+X396402Y59561D01*

+X396218Y59777D01*

+X396002Y59961D01*

+X395761Y60109D01*

+X395499Y60217D01*

+X395223Y60283D01*

+X394941Y60306D01*

+X394938Y60305D01*

+Y132000D01*

+X408941D01*

+Y67000D01*

+X434446D01*

+Y58305D01*

+X434167Y58283D01*

+X433891Y58217D01*

+X433629Y58109D01*

+X433388Y57961D01*

+X433172Y57777D01*

+X432988Y57561D01*

+X432840Y57320D01*

+X432732Y57058D01*

+X432666Y56782D01*

+X432643Y56500D01*

+X432666Y56218D01*

+X432732Y55942D01*

+X432840Y55680D01*

+X432988Y55439D01*

+X433172Y55223D01*

+X433388Y55039D01*

+X433629Y54891D01*

+X433891Y54783D01*

+X434167Y54717D01*

+X434446Y54695D01*

+Y39000D01*

+G37*

+G36*

+X394938D02*X390938D01*

+Y44007D01*

+X390980Y43939D01*

+X391164Y43723D01*

+X391380Y43539D01*

+X391621Y43391D01*

+X391883Y43283D01*

+X392159Y43217D01*

+X392441Y43194D01*

+X392723Y43217D01*

+X392999Y43283D01*

+X393261Y43391D01*

+X393502Y43539D01*

+X393718Y43723D01*

+X393902Y43939D01*

+X394050Y44180D01*

+X394158Y44442D01*

+X394224Y44718D01*

+X394241Y45000D01*

+X394224Y45282D01*

+X394158Y45558D01*

+X394050Y45820D01*

+X393902Y46061D01*

+X393718Y46277D01*

+X393502Y46461D01*

+X393261Y46609D01*

+X392999Y46717D01*

+X392723Y46783D01*

+X392441Y46806D01*

+X392159Y46783D01*

+X391883Y46717D01*

+X391621Y46609D01*

+X391380Y46461D01*

+X391164Y46277D01*

+X390980Y46061D01*

+X390938Y45993D01*

+Y64270D01*

+X391159Y64217D01*

+X391441Y64194D01*

+X391723Y64217D01*

+X391999Y64283D01*

+X392261Y64391D01*

+X392502Y64539D01*

+X392718Y64723D01*

+X392902Y64939D01*

+X393050Y65180D01*

+X393158Y65442D01*

+X393224Y65718D01*

+X393241Y66000D01*

+X393224Y66282D01*

+X393158Y66558D01*

+X393050Y66820D01*

+X392902Y67061D01*

+X392718Y67277D01*

+X392502Y67461D01*

+X392261Y67609D01*

+X391999Y67717D01*

+X391723Y67783D01*

+X391441Y67806D01*

+X391159Y67783D01*

+X390938Y67730D01*

+Y69695D01*

+X390941Y69694D01*

+X391223Y69717D01*

+X391499Y69783D01*

+X391761Y69891D01*

+X392002Y70039D01*

+X392218Y70223D01*

+X392402Y70439D01*

+X392550Y70680D01*

+X392658Y70942D01*

+X392724Y71218D01*

+X392741Y71500D01*

+X392724Y71782D01*

+X392658Y72058D01*

+X392550Y72320D01*

+X392402Y72561D01*

+X392218Y72777D01*

+X392002Y72961D01*

+X391761Y73109D01*

+X391499Y73217D01*

+X391223Y73283D01*

+X390941Y73306D01*

+X390938Y73305D01*

+Y74195D01*

+X390941Y74194D01*

+X391223Y74217D01*

+X391499Y74283D01*

+X391761Y74391D01*

+X392002Y74539D01*

+X392218Y74723D01*

+X392402Y74939D01*

+X392550Y75180D01*

+X392658Y75442D01*

+X392724Y75718D01*

+X392741Y76000D01*

+X392724Y76282D01*

+X392658Y76558D01*

+X392550Y76820D01*

+X392402Y77061D01*

+X392218Y77277D01*

+X392002Y77461D01*

+X391761Y77609D01*

+X391499Y77717D01*

+X391223Y77783D01*

+X390941Y77806D01*

+X390938Y77805D01*

+Y132000D01*

+X394938D01*

+Y60305D01*

+X394659Y60283D01*

+X394383Y60217D01*

+X394121Y60109D01*

+X393880Y59961D01*

+X393664Y59777D01*

+X393480Y59561D01*

+X393332Y59320D01*

+X393224Y59058D01*

+X393158Y58782D01*

+X393135Y58500D01*

+X393158Y58218D01*

+X393224Y57942D01*

+X393332Y57680D01*

+X393480Y57439D01*

+X393664Y57223D01*

+X393880Y57039D01*

+X394121Y56891D01*

+X394383Y56783D01*

+X394659Y56717D01*

+X394938Y56695D01*

+Y53000D01*

+X394761Y53109D01*

+X394499Y53217D01*

+X394223Y53283D01*

+X393941Y53306D01*

+X393659Y53283D01*

+X393383Y53217D01*

+X393121Y53109D01*

+X392880Y52961D01*

+X392664Y52777D01*

+X392480Y52561D01*

+X392332Y52320D01*

+X392224Y52058D01*

+X392158Y51782D01*

+X392135Y51500D01*

+X392158Y51218D01*

+X392224Y50942D01*

+X392332Y50680D01*

+X392480Y50439D01*

+X392664Y50223D01*

+X392880Y50039D01*

+X393121Y49891D01*

+X393383Y49783D01*

+X393659Y49717D01*

+X393941Y49694D01*

+X394223Y49717D01*

+X394499Y49783D01*

+X394761Y49891D01*

+X394938Y50000D01*

+Y39000D01*

+G37*

+G36*

+X390938D02*X387438D01*

+Y83195D01*

+X387441Y83194D01*

+X387723Y83217D01*

+X387999Y83283D01*

+X388261Y83391D01*

+X388502Y83539D01*

+X388718Y83723D01*

+X388902Y83939D01*

+X389050Y84180D01*

+X389158Y84442D01*

+X389224Y84718D01*

+X389241Y85000D01*

+X389224Y85282D01*

+X389158Y85558D01*

+X389050Y85820D01*

+X388902Y86061D01*

+X388718Y86277D01*

+X388502Y86461D01*

+X388261Y86609D01*

+X387999Y86717D01*

+X387723Y86783D01*

+X387441Y86806D01*

+X387438Y86805D01*

+Y87695D01*

+X387441Y87694D01*

+X387723Y87717D01*

+X387999Y87783D01*

+X388261Y87891D01*

+X388502Y88039D01*

+X388718Y88223D01*

+X388902Y88439D01*

+X389050Y88680D01*

+X389158Y88942D01*

+X389224Y89218D01*

+X389241Y89500D01*

+X389224Y89782D01*

+X389158Y90058D01*

+X389050Y90320D01*

+X388902Y90561D01*

+X388718Y90777D01*

+X388502Y90961D01*

+X388261Y91109D01*

+X387999Y91217D01*

+X387723Y91283D01*

+X387441Y91306D01*

+X387438Y91305D01*

+Y93695D01*

+X387441Y93694D01*

+X387723Y93717D01*

+X387999Y93783D01*

+X388261Y93891D01*

+X388502Y94039D01*

+X388718Y94223D01*

+X388902Y94439D01*

+X389050Y94680D01*

+X389158Y94942D01*

+X389224Y95218D01*

+X389241Y95500D01*

+X389224Y95782D01*

+X389158Y96058D01*

+X389050Y96320D01*

+X388902Y96561D01*

+X388718Y96777D01*

+X388502Y96961D01*

+X388261Y97109D01*

+X387999Y97217D01*

+X387723Y97283D01*

+X387441Y97306D01*

+X387438Y97305D01*

+Y99695D01*

+X387441Y99694D01*

+X387723Y99717D01*

+X387999Y99783D01*

+X388261Y99891D01*

+X388502Y100039D01*

+X388718Y100223D01*

+X388902Y100439D01*

+X389050Y100680D01*

+X389158Y100942D01*

+X389224Y101218D01*

+X389241Y101500D01*

+X389224Y101782D01*

+X389158Y102058D01*

+X389050Y102320D01*

+X388902Y102561D01*

+X388718Y102777D01*

+X388502Y102961D01*

+X388261Y103109D01*

+X387999Y103217D01*

+X387723Y103283D01*

+X387441Y103306D01*

+X387438Y103305D01*

+Y105695D01*

+X387441Y105694D01*

+X387723Y105717D01*

+X387999Y105783D01*

+X388261Y105891D01*

+X388502Y106039D01*

+X388718Y106223D01*

+X388902Y106439D01*

+X389050Y106680D01*

+X389158Y106942D01*

+X389224Y107218D01*

+X389241Y107500D01*

+X389224Y107782D01*

+X389158Y108058D01*

+X389050Y108320D01*

+X388902Y108561D01*

+X388718Y108777D01*

+X388502Y108961D01*

+X388261Y109109D01*

+X387999Y109217D01*

+X387723Y109283D01*

+X387441Y109306D01*

+X387438Y109305D01*

+Y111695D01*

+X387441Y111694D01*

+X387723Y111717D01*

+X387999Y111783D01*

+X388261Y111891D01*

+X388502Y112039D01*

+X388718Y112223D01*

+X388902Y112439D01*

+X389050Y112680D01*

+X389158Y112942D01*

+X389224Y113218D01*

+X389241Y113500D01*

+X389224Y113782D01*

+X389158Y114058D01*

+X389050Y114320D01*

+X388902Y114561D01*

+X388718Y114777D01*

+X388502Y114961D01*

+X388261Y115109D01*

+X387999Y115217D01*

+X387723Y115283D01*

+X387441Y115306D01*

+X387438Y115305D01*

+Y117695D01*

+X387441Y117694D01*

+X387723Y117717D01*

+X387999Y117783D01*

+X388261Y117891D01*

+X388502Y118039D01*

+X388718Y118223D01*

+X388902Y118439D01*

+X389050Y118680D01*

+X389158Y118942D01*

+X389224Y119218D01*

+X389241Y119500D01*

+X389224Y119782D01*

+X389158Y120058D01*

+X389050Y120320D01*

+X388902Y120561D01*

+X388718Y120777D01*

+X388502Y120961D01*

+X388261Y121109D01*

+X387999Y121217D01*

+X387723Y121283D01*

+X387441Y121306D01*

+X387438Y121305D01*

+Y132000D01*

+X390938D01*

+Y77805D01*

+X390659Y77783D01*

+X390383Y77717D01*

+X390121Y77609D01*

+X389880Y77461D01*

+X389664Y77277D01*

+X389480Y77061D01*

+X389332Y76820D01*

+X389224Y76558D01*

+X389158Y76282D01*

+X389135Y76000D01*

+X389158Y75718D01*

+X389224Y75442D01*

+X389332Y75180D01*

+X389480Y74939D01*

+X389664Y74723D01*

+X389880Y74539D01*

+X390121Y74391D01*

+X390383Y74283D01*

+X390659Y74217D01*

+X390938Y74195D01*

+Y73305D01*

+X390659Y73283D01*

+X390383Y73217D01*

+X390121Y73109D01*

+X389880Y72961D01*

+X389664Y72777D01*

+X389480Y72561D01*

+X389332Y72320D01*

+X389224Y72058D01*

+X389158Y71782D01*

+X389135Y71500D01*

+X389158Y71218D01*

+X389224Y70942D01*

+X389332Y70680D01*

+X389480Y70439D01*

+X389664Y70223D01*

+X389880Y70039D01*

+X390121Y69891D01*

+X390383Y69783D01*

+X390659Y69717D01*

+X390938Y69695D01*

+Y67730D01*

+X390883Y67717D01*

+X390621Y67609D01*

+X390380Y67461D01*

+X390164Y67277D01*

+X389980Y67061D01*

+X389832Y66820D01*

+X389724Y66558D01*

+X389658Y66282D01*

+X389635Y66000D01*

+X389658Y65718D01*

+X389724Y65442D01*

+X389832Y65180D01*

+X389980Y64939D01*

+X390164Y64723D01*

+X390380Y64539D01*

+X390621Y64391D01*

+X390883Y64283D01*

+X390938Y64270D01*

+Y45993D01*

+X390832Y45820D01*

+X390724Y45558D01*

+X390658Y45282D01*

+X390635Y45000D01*

+X390658Y44718D01*

+X390724Y44442D01*

+X390832Y44180D01*

+X390938Y44007D01*

+Y39000D01*

+G37*

+G36*

+X387438D02*X354438D01*

+Y83195D01*

+X354441Y83194D01*

+X354723Y83217D01*

+X354999Y83283D01*

+X355261Y83391D01*

+X355502Y83539D01*

+X355718Y83723D01*

+X355902Y83939D01*

+X356050Y84180D01*

+X356158Y84442D01*

+X356224Y84718D01*

+X356241Y85000D01*

+X356224Y85282D01*

+X356158Y85558D01*

+X356050Y85820D01*

+X355902Y86061D01*

+X355718Y86277D01*

+X355502Y86461D01*

+X355261Y86609D01*

+X354999Y86717D01*

+X354723Y86783D01*

+X354441Y86806D01*

+X354438Y86805D01*

+Y87695D01*

+X354441Y87694D01*

+X354723Y87717D01*

+X354999Y87783D01*

+X355261Y87891D01*

+X355502Y88039D01*

+X355718Y88223D01*

+X355902Y88439D01*

+X356050Y88680D01*

+X356158Y88942D01*

+X356224Y89218D01*

+X356241Y89500D01*

+X356224Y89782D01*

+X356158Y90058D01*

+X356050Y90320D01*

+X355902Y90561D01*

+X355718Y90777D01*

+X355502Y90961D01*

+X355261Y91109D01*

+X354999Y91217D01*

+X354723Y91283D01*

+X354441Y91306D01*

+X354438Y91305D01*

+Y93695D01*

+X354441Y93694D01*

+X354723Y93717D01*

+X354999Y93783D01*

+X355261Y93891D01*

+X355502Y94039D01*

+X355718Y94223D01*

+X355902Y94439D01*

+X356050Y94680D01*

+X356158Y94942D01*

+X356224Y95218D01*

+X356241Y95500D01*

+X356224Y95782D01*

+X356158Y96058D01*

+X356050Y96320D01*

+X355902Y96561D01*

+X355718Y96777D01*

+X355502Y96961D01*

+X355261Y97109D01*

+X354999Y97217D01*

+X354723Y97283D01*

+X354441Y97306D01*

+X354438Y97305D01*

+Y99695D01*

+X354441Y99694D01*

+X354723Y99717D01*

+X354999Y99783D01*

+X355261Y99891D01*

+X355502Y100039D01*

+X355718Y100223D01*

+X355902Y100439D01*

+X356050Y100680D01*

+X356158Y100942D01*

+X356224Y101218D01*

+X356241Y101500D01*

+X356224Y101782D01*

+X356158Y102058D01*

+X356050Y102320D01*

+X355902Y102561D01*

+X355718Y102777D01*

+X355502Y102961D01*

+X355261Y103109D01*

+X354999Y103217D01*

+X354723Y103283D01*

+X354441Y103306D01*

+X354438Y103305D01*

+Y105695D01*

+X354441Y105694D01*

+X354723Y105717D01*

+X354999Y105783D01*

+X355261Y105891D01*

+X355502Y106039D01*

+X355718Y106223D01*

+X355902Y106439D01*

+X356050Y106680D01*

+X356158Y106942D01*

+X356224Y107218D01*

+X356241Y107500D01*

+X356224Y107782D01*

+X356158Y108058D01*

+X356050Y108320D01*

+X355902Y108561D01*

+X355718Y108777D01*

+X355502Y108961D01*

+X355261Y109109D01*

+X354999Y109217D01*

+X354723Y109283D01*

+X354441Y109306D01*

+X354438Y109305D01*

+Y111695D01*

+X354441Y111694D01*

+X354723Y111717D01*

+X354999Y111783D01*

+X355261Y111891D01*

+X355502Y112039D01*

+X355718Y112223D01*

+X355902Y112439D01*

+X356050Y112680D01*

+X356158Y112942D01*

+X356224Y113218D01*

+X356241Y113500D01*

+X356224Y113782D01*

+X356158Y114058D01*

+X356050Y114320D01*

+X355902Y114561D01*

+X355718Y114777D01*

+X355502Y114961D01*

+X355261Y115109D01*

+X354999Y115217D01*

+X354723Y115283D01*

+X354441Y115306D01*

+X354438Y115305D01*

+Y117695D01*

+X354441Y117694D01*

+X354723Y117717D01*

+X354999Y117783D01*

+X355261Y117891D01*

+X355502Y118039D01*

+X355718Y118223D01*

+X355902Y118439D01*

+X356050Y118680D01*

+X356158Y118942D01*

+X356224Y119218D01*

+X356241Y119500D01*

+X356224Y119782D01*

+X356158Y120058D01*

+X356050Y120320D01*

+X355902Y120561D01*

+X355718Y120777D01*

+X355502Y120961D01*

+X355261Y121109D01*

+X354999Y121217D01*

+X354723Y121283D01*

+X354441Y121306D01*

+X354438Y121305D01*

+Y132000D01*

+X387438D01*

+Y121305D01*

+X387159Y121283D01*

+X386883Y121217D01*

+X386621Y121109D01*

+X386380Y120961D01*

+X386164Y120777D01*

+X385980Y120561D01*

+X385832Y120320D01*

+X385724Y120058D01*

+X385658Y119782D01*

+X385635Y119500D01*

+X385658Y119218D01*

+X385724Y118942D01*

+X385832Y118680D01*

+X385980Y118439D01*

+X386164Y118223D01*

+X386380Y118039D01*

+X386621Y117891D01*

+X386883Y117783D01*

+X387159Y117717D01*

+X387438Y117695D01*

+Y115305D01*

+X387159Y115283D01*

+X386883Y115217D01*

+X386621Y115109D01*

+X386380Y114961D01*

+X386164Y114777D01*

+X385980Y114561D01*

+X385832Y114320D01*

+X385724Y114058D01*

+X385658Y113782D01*

+X385635Y113500D01*

+X385658Y113218D01*

+X385724Y112942D01*

+X385832Y112680D01*

+X385980Y112439D01*

+X386164Y112223D01*

+X386380Y112039D01*

+X386621Y111891D01*

+X386883Y111783D01*

+X387159Y111717D01*

+X387438Y111695D01*

+Y109305D01*

+X387159Y109283D01*

+X386883Y109217D01*

+X386621Y109109D01*

+X386380Y108961D01*

+X386164Y108777D01*

+X385980Y108561D01*

+X385832Y108320D01*

+X385724Y108058D01*

+X385658Y107782D01*

+X385635Y107500D01*

+X385658Y107218D01*

+X385724Y106942D01*

+X385832Y106680D01*

+X385980Y106439D01*

+X386164Y106223D01*

+X386380Y106039D01*

+X386621Y105891D01*

+X386883Y105783D01*

+X387159Y105717D01*

+X387438Y105695D01*

+Y103305D01*

+X387159Y103283D01*

+X386883Y103217D01*

+X386621Y103109D01*

+X386380Y102961D01*

+X386164Y102777D01*

+X385980Y102561D01*

+X385832Y102320D01*

+X385724Y102058D01*

+X385658Y101782D01*

+X385635Y101500D01*

+X385658Y101218D01*

+X385724Y100942D01*

+X385832Y100680D01*

+X385980Y100439D01*

+X386164Y100223D01*

+X386380Y100039D01*

+X386621Y99891D01*

+X386883Y99783D01*

+X387159Y99717D01*

+X387438Y99695D01*

+Y97305D01*

+X387159Y97283D01*

+X386883Y97217D01*

+X386621Y97109D01*

+X386380Y96961D01*

+X386164Y96777D01*

+X385980Y96561D01*

+X385832Y96320D01*

+X385724Y96058D01*

+X385658Y95782D01*

+X385635Y95500D01*

+X385658Y95218D01*

+X385724Y94942D01*

+X385832Y94680D01*

+X385980Y94439D01*

+X386164Y94223D01*

+X386380Y94039D01*

+X386621Y93891D01*

+X386883Y93783D01*

+X387159Y93717D01*

+X387438Y93695D01*

+Y91305D01*

+X387159Y91283D01*

+X386883Y91217D01*

+X386621Y91109D01*

+X386380Y90961D01*

+X386164Y90777D01*

+X385980Y90561D01*

+X385832Y90320D01*

+X385724Y90058D01*

+X385658Y89782D01*

+X385635Y89500D01*

+X385658Y89218D01*

+X385724Y88942D01*

+X385832Y88680D01*

+X385980Y88439D01*

+X386164Y88223D01*

+X386380Y88039D01*

+X386621Y87891D01*

+X386883Y87783D01*

+X387159Y87717D01*

+X387438Y87695D01*

+Y86805D01*

+X387159Y86783D01*

+X386883Y86717D01*

+X386621Y86609D01*

+X386380Y86461D01*

+X386164Y86277D01*

+X385980Y86061D01*

+X385832Y85820D01*

+X385724Y85558D01*

+X385658Y85282D01*

+X385635Y85000D01*

+X385658Y84718D01*

+X385724Y84442D01*

+X385832Y84180D01*

+X385980Y83939D01*

+X386164Y83723D01*

+X386380Y83539D01*

+X386621Y83391D01*

+X386883Y83283D01*

+X387159Y83217D01*

+X387438Y83195D01*

+Y39000D01*

+G37*

+G36*

+X354438D02*X299273D01*

+Y42867D01*

+X299374Y42909D01*

+X299575Y43033D01*

+X299755Y43186D01*

+X299908Y43366D01*

+X300032Y43567D01*

+X300122Y43785D01*

+X300177Y44015D01*

+X300191Y44250D01*

+X300177Y50985D01*

+X300122Y51215D01*

+X300032Y51433D01*

+X299908Y51634D01*

+X299755Y51814D01*

+X299575Y51967D01*

+X299374Y52091D01*

+X299273Y52133D01*

+Y55170D01*

+X299384Y55204D01*

+X299491Y55256D01*

+X299587Y55323D01*

+X299672Y55405D01*

+X299743Y55500D01*

+X299797Y55605D01*

+X299956Y56008D01*

+X300073Y56425D01*

+X300152Y56852D01*

+X300191Y57283D01*

+Y57717D01*

+X300152Y58148D01*

+X300073Y58575D01*

+X299956Y58992D01*

+X299801Y59397D01*

+X299746Y59502D01*

+X299675Y59597D01*

+X299589Y59679D01*

+X299492Y59747D01*

+X299386Y59799D01*

+X299273Y59834D01*

+Y64673D01*

+X299296Y64699D01*

+X299686Y65337D01*

+X299972Y66028D01*

+X300147Y66755D01*

+X300191Y67500D01*

+X300147Y68245D01*

+X299972Y68972D01*

+X299686Y69663D01*

+X299296Y70301D01*

+X299273Y70327D01*

+Y72500D01*

+X328441D01*

+Y132000D01*

+X354438D01*

+Y121305D01*

+X354159Y121283D01*

+X353883Y121217D01*

+X353621Y121109D01*

+X353380Y120961D01*

+X353164Y120777D01*

+X352980Y120561D01*

+X352832Y120320D01*

+X352724Y120058D01*

+X352658Y119782D01*

+X352635Y119500D01*

+X352658Y119218D01*

+X352724Y118942D01*

+X352832Y118680D01*

+X352980Y118439D01*

+X353164Y118223D01*

+X353380Y118039D01*

+X353621Y117891D01*

+X353883Y117783D01*

+X354159Y117717D01*

+X354438Y117695D01*

+Y115305D01*

+X354159Y115283D01*

+X353883Y115217D01*

+X353621Y115109D01*

+X353380Y114961D01*

+X353164Y114777D01*

+X352980Y114561D01*

+X352832Y114320D01*

+X352724Y114058D01*

+X352658Y113782D01*

+X352635Y113500D01*

+X352658Y113218D01*

+X352724Y112942D01*

+X352832Y112680D01*

+X352980Y112439D01*

+X353164Y112223D01*

+X353380Y112039D01*

+X353621Y111891D01*

+X353883Y111783D01*

+X354159Y111717D01*

+X354438Y111695D01*

+Y109305D01*

+X354159Y109283D01*

+X353883Y109217D01*

+X353621Y109109D01*

+X353380Y108961D01*

+X353164Y108777D01*

+X352980Y108561D01*

+X352832Y108320D01*

+X352724Y108058D01*

+X352658Y107782D01*

+X352635Y107500D01*

+X352658Y107218D01*

+X352724Y106942D01*

+X352832Y106680D01*

+X352980Y106439D01*

+X353164Y106223D01*

+X353380Y106039D01*

+X353621Y105891D01*

+X353883Y105783D01*

+X354159Y105717D01*

+X354438Y105695D01*

+Y103305D01*

+X354159Y103283D01*

+X353883Y103217D01*

+X353621Y103109D01*

+X353380Y102961D01*

+X353164Y102777D01*

+X352980Y102561D01*

+X352832Y102320D01*

+X352724Y102058D01*

+X352658Y101782D01*

+X352635Y101500D01*

+X352658Y101218D01*

+X352724Y100942D01*

+X352832Y100680D01*

+X352980Y100439D01*

+X353164Y100223D01*

+X353380Y100039D01*

+X353621Y99891D01*

+X353883Y99783D01*

+X354159Y99717D01*

+X354438Y99695D01*

+Y97305D01*

+X354159Y97283D01*

+X353883Y97217D01*

+X353621Y97109D01*

+X353380Y96961D01*

+X353164Y96777D01*

+X352980Y96561D01*

+X352832Y96320D01*

+X352724Y96058D01*

+X352658Y95782D01*

+X352635Y95500D01*

+X352658Y95218D01*

+X352724Y94942D01*

+X352832Y94680D01*

+X352980Y94439D01*

+X353164Y94223D01*

+X353380Y94039D01*

+X353621Y93891D01*

+X353883Y93783D01*

+X354159Y93717D01*

+X354438Y93695D01*

+Y91305D01*

+X354159Y91283D01*

+X353883Y91217D01*

+X353621Y91109D01*

+X353380Y90961D01*

+X353164Y90777D01*

+X352980Y90561D01*

+X352832Y90320D01*

+X352724Y90058D01*

+X352658Y89782D01*

+X352635Y89500D01*

+X352658Y89218D01*

+X352724Y88942D01*

+X352832Y88680D01*

+X352980Y88439D01*

+X353164Y88223D01*

+X353380Y88039D01*

+X353621Y87891D01*

+X353883Y87783D01*

+X354159Y87717D01*

+X354438Y87695D01*

+Y86805D01*

+X354159Y86783D01*

+X353883Y86717D01*

+X353621Y86609D01*

+X353380Y86461D01*

+X353164Y86277D01*

+X352980Y86061D01*

+X352832Y85820D01*

+X352724Y85558D01*

+X352658Y85282D01*

+X352635Y85000D01*

+X352658Y84718D01*

+X352724Y84442D01*

+X352832Y84180D01*

+X352980Y83939D01*

+X353164Y83723D01*

+X353380Y83539D01*

+X353621Y83391D01*

+X353883Y83283D01*

+X354159Y83217D01*

+X354438Y83195D01*

+Y39000D01*

+G37*

+G36*

+X299273Y70327D02*X298810Y70869D01*

+X298242Y71355D01*

+X297604Y71745D01*

+X296913Y72031D01*

+X296186Y72206D01*

+X295441Y72265D01*

+Y72500D01*

+X299273D01*

+Y70327D01*

+G37*

+G36*

+Y52133D02*X299156Y52181D01*

+X298926Y52236D01*

+X298691Y52250D01*

+X295441Y52243D01*

+Y52750D01*

+X295658D01*

+X296089Y52789D01*

+X296516Y52868D01*

+X296933Y52985D01*

+X297338Y53140D01*

+X297443Y53195D01*

+X297538Y53266D01*

+X297620Y53352D01*

+X297688Y53449D01*

+X297740Y53555D01*

+X297775Y53669D01*

+X297791Y53786D01*

+X297789Y53905D01*

+X297768Y54022D01*

+X297730Y54134D01*

+X297674Y54238D01*

+X297603Y54333D01*

+X297517Y54415D01*

+X297420Y54483D01*

+X297314Y54535D01*

+X297200Y54570D01*

+X297083Y54586D01*

+X296964Y54584D01*

+X296848Y54564D01*

+X296736Y54523D01*

+X296461Y54414D01*

+X296176Y54334D01*

+X295884Y54280D01*

+X295589Y54253D01*

+X295441D01*

+Y60747D01*

+X295589D01*

+X295884Y60720D01*

+X296176Y60666D01*

+X296461Y60586D01*

+X296738Y60480D01*

+X296848Y60440D01*

+X296965Y60419D01*

+X297083Y60417D01*

+X297200Y60433D01*

+X297312Y60468D01*

+X297419Y60520D01*

+X297515Y60587D01*

+X297600Y60669D01*

+X297671Y60763D01*

+X297727Y60868D01*

+X297765Y60979D01*

+X297786Y61096D01*

+X297788Y61214D01*

+X297771Y61330D01*

+X297737Y61443D01*

+X297685Y61550D01*

+X297618Y61646D01*

+X297536Y61731D01*

+X297441Y61802D01*

+X297336Y61856D01*

+X296933Y62015D01*

+X296516Y62132D01*

+X296089Y62211D01*

+X295658Y62250D01*

+X295441D01*

+Y62735D01*

+X296186Y62794D01*

+X296913Y62969D01*

+X297604Y63255D01*

+X298242Y63645D01*

+X298810Y64131D01*

+X299273Y64673D01*

+Y59834D01*

+X299272Y59834D01*

+X299155Y59850D01*

+X299036Y59848D01*

+X298919Y59827D01*

+X298807Y59789D01*

+X298703Y59733D01*

+X298608Y59662D01*

+X298526Y59576D01*

+X298458Y59479D01*

+X298406Y59373D01*

+X298371Y59259D01*

+X298355Y59142D01*

+X298357Y59023D01*

+X298377Y58907D01*

+X298418Y58795D01*

+X298527Y58520D01*

+X298607Y58235D01*

+X298661Y57943D01*

+X298688Y57648D01*

+Y57352D01*

+X298661Y57057D01*

+X298607Y56765D01*

+X298527Y56480D01*

+X298421Y56203D01*

+X298381Y56093D01*

+X298360Y55976D01*

+X298358Y55858D01*

+X298374Y55741D01*

+X298409Y55629D01*

+X298461Y55522D01*

+X298528Y55426D01*

+X298610Y55341D01*

+X298704Y55270D01*

+X298809Y55214D01*

+X298920Y55176D01*

+X299037Y55155D01*

+X299155Y55153D01*

+X299271Y55170D01*

+X299273Y55170D01*

+Y52133D01*

+G37*

+G36*

+Y39000D02*X295441D01*

+Y42757D01*

+X298926Y42764D01*

+X299156Y42819D01*

+X299273Y42867D01*

+Y39000D01*

+G37*

+G36*

+X291609Y64673D02*X292072Y64131D01*

+X292640Y63645D01*

+X293278Y63255D01*

+X293969Y62969D01*

+X294696Y62794D01*

+X295441Y62735D01*

+Y62250D01*

+X295224D01*

+X294793Y62211D01*

+X294366Y62132D01*

+X293949Y62015D01*

+X293544Y61860D01*

+X293439Y61805D01*

+X293344Y61734D01*

+X293262Y61648D01*

+X293194Y61551D01*

+X293142Y61445D01*

+X293107Y61331D01*

+X293091Y61214D01*

+X293093Y61095D01*

+X293114Y60978D01*

+X293152Y60866D01*

+X293208Y60762D01*

+X293279Y60667D01*

+X293365Y60585D01*

+X293462Y60517D01*

+X293568Y60465D01*

+X293682Y60430D01*

+X293799Y60414D01*

+X293918Y60416D01*

+X294034Y60436D01*

+X294146Y60477D01*

+X294421Y60586D01*

+X294706Y60666D01*

+X294998Y60720D01*

+X295293Y60747D01*

+X295441D01*

+Y54253D01*

+X295293D01*

+X294998Y54280D01*

+X294706Y54334D01*

+X294421Y54414D01*

+X294144Y54520D01*

+X294034Y54560D01*

+X293917Y54581D01*

+X293799Y54583D01*

+X293682Y54567D01*

+X293570Y54532D01*

+X293463Y54480D01*

+X293367Y54413D01*

+X293282Y54331D01*

+X293211Y54237D01*

+X293155Y54132D01*

+X293117Y54021D01*

+X293096Y53904D01*

+X293094Y53786D01*

+X293111Y53670D01*

+X293145Y53557D01*

+X293197Y53450D01*

+X293264Y53354D01*

+X293346Y53269D01*

+X293441Y53198D01*

+X293546Y53144D01*

+X293949Y52985D01*

+X294366Y52868D01*

+X294793Y52789D01*

+X295224Y52750D01*

+X295441D01*

+Y52243D01*

+X291956Y52236D01*

+X291726Y52181D01*

+X291609Y52133D01*

+Y55166D01*

+X291610Y55166D01*

+X291727Y55150D01*

+X291846Y55152D01*

+X291963Y55173D01*

+X292075Y55211D01*

+X292179Y55267D01*

+X292274Y55338D01*

+X292356Y55424D01*

+X292424Y55521D01*

+X292476Y55627D01*

+X292511Y55741D01*

+X292527Y55858D01*

+X292525Y55977D01*

+X292505Y56093D01*

+X292464Y56205D01*

+X292355Y56480D01*

+X292275Y56765D01*

+X292221Y57057D01*

+X292194Y57352D01*

+Y57648D01*

+X292221Y57943D01*

+X292275Y58235D01*

+X292355Y58520D01*

+X292461Y58797D01*

+X292501Y58907D01*

+X292522Y59024D01*

+X292524Y59142D01*

+X292508Y59259D01*

+X292473Y59371D01*

+X292421Y59478D01*

+X292354Y59574D01*

+X292272Y59659D01*

+X292178Y59730D01*

+X292073Y59786D01*

+X291962Y59824D01*

+X291845Y59845D01*

+X291727Y59847D01*

+X291610Y59830D01*

+X291609Y59830D01*

+Y64673D01*

+G37*

+G36*

+Y72500D02*X295441D01*

+Y72265D01*

+X294696Y72206D01*

+X293969Y72031D01*

+X293278Y71745D01*

+X292640Y71355D01*

+X292072Y70869D01*

+X291609Y70327D01*

+Y72500D01*

+G37*

+G36*

+X295441Y39000D02*X291609D01*

+Y42867D01*

+X291726Y42819D01*

+X291956Y42764D01*

+X292191Y42750D01*

+X295441Y42757D01*

+Y39000D01*

+G37*

+G36*

+X291609D02*X269273D01*

+Y42867D01*

+X269374Y42909D01*

+X269575Y43033D01*

+X269755Y43186D01*

+X269908Y43366D01*

+X270032Y43567D01*

+X270122Y43785D01*

+X270177Y44015D01*

+X270191Y44250D01*

+X270177Y50985D01*

+X270122Y51215D01*

+X270032Y51433D01*

+X269908Y51634D01*

+X269755Y51814D01*

+X269575Y51967D01*

+X269374Y52091D01*

+X269273Y52133D01*

+Y55170D01*

+X269384Y55204D01*

+X269491Y55256D01*

+X269587Y55323D01*

+X269672Y55405D01*

+X269743Y55500D01*

+X269797Y55605D01*

+X269956Y56008D01*

+X270073Y56425D01*

+X270152Y56852D01*

+X270191Y57283D01*

+Y57717D01*

+X270152Y58148D01*

+X270073Y58575D01*

+X269956Y58992D01*

+X269801Y59397D01*

+X269746Y59502D01*

+X269675Y59597D01*

+X269589Y59679D01*

+X269492Y59747D01*

+X269386Y59799D01*

+X269273Y59834D01*

+Y64673D01*

+X269296Y64699D01*

+X269686Y65337D01*

+X269972Y66028D01*

+X270147Y66755D01*

+X270191Y67500D01*

+X270147Y68245D01*

+X269972Y68972D01*

+X269686Y69663D01*

+X269296Y70301D01*

+X269273Y70327D01*

+Y72500D01*

+X291609D01*

+Y70327D01*

+X291586Y70301D01*

+X291196Y69663D01*

+X290910Y68972D01*

+X290735Y68245D01*

+X290676Y67500D01*

+X290735Y66755D01*

+X290910Y66028D01*

+X291196Y65337D01*

+X291586Y64699D01*

+X291609Y64673D01*

+Y59830D01*

+X291498Y59796D01*

+X291391Y59744D01*

+X291295Y59677D01*

+X291210Y59595D01*

+X291139Y59500D01*

+X291085Y59395D01*

+X290926Y58992D01*

+X290809Y58575D01*

+X290730Y58148D01*

+X290691Y57717D01*

+Y57283D01*

+X290730Y56852D01*

+X290809Y56425D01*

+X290926Y56008D01*

+X291081Y55603D01*

+X291136Y55498D01*

+X291207Y55403D01*

+X291293Y55321D01*

+X291390Y55253D01*

+X291496Y55201D01*

+X291609Y55166D01*

+Y52133D01*

+X291508Y52091D01*

+X291307Y51967D01*

+X291127Y51814D01*

+X290974Y51634D01*

+X290850Y51433D01*

+X290760Y51215D01*

+X290705Y50985D01*

+X290691Y50750D01*

+X290705Y44015D01*

+X290760Y43785D01*

+X290850Y43567D01*

+X290974Y43366D01*

+X291127Y43186D01*

+X291307Y43033D01*

+X291508Y42909D01*

+X291609Y42867D01*

+Y39000D01*

+G37*

+G36*

+X269273Y70327D02*X268810Y70869D01*

+X268242Y71355D01*

+X267604Y71745D01*

+X266913Y72031D01*

+X266186Y72206D01*

+X265441Y72265D01*

+Y72500D01*

+X269273D01*

+Y70327D01*

+G37*

+G36*

+Y52133D02*X269156Y52181D01*

+X268926Y52236D01*

+X268691Y52250D01*

+X265441Y52243D01*

+Y52750D01*

+X265658D01*

+X266089Y52789D01*

+X266516Y52868D01*

+X266933Y52985D01*

+X267338Y53140D01*

+X267443Y53195D01*

+X267538Y53266D01*

+X267620Y53352D01*

+X267688Y53449D01*

+X267740Y53555D01*

+X267775Y53669D01*

+X267791Y53786D01*

+X267789Y53905D01*

+X267768Y54022D01*

+X267730Y54134D01*

+X267674Y54238D01*

+X267603Y54333D01*

+X267517Y54415D01*

+X267420Y54483D01*

+X267314Y54535D01*

+X267200Y54570D01*

+X267083Y54586D01*

+X266964Y54584D01*

+X266848Y54564D01*

+X266736Y54523D01*

+X266461Y54414D01*

+X266176Y54334D01*

+X265884Y54280D01*

+X265589Y54253D01*

+X265441D01*

+Y60747D01*

+X265589D01*

+X265884Y60720D01*

+X266176Y60666D01*

+X266461Y60586D01*

+X266738Y60480D01*

+X266848Y60440D01*

+X266965Y60419D01*

+X267083Y60417D01*

+X267200Y60433D01*

+X267312Y60468D01*

+X267419Y60520D01*

+X267515Y60587D01*

+X267600Y60669D01*

+X267671Y60763D01*

+X267727Y60868D01*

+X267765Y60979D01*

+X267786Y61096D01*

+X267788Y61214D01*

+X267771Y61330D01*

+X267737Y61443D01*

+X267685Y61550D01*

+X267618Y61646D01*

+X267536Y61731D01*

+X267441Y61802D01*

+X267336Y61856D01*

+X266933Y62015D01*

+X266516Y62132D01*

+X266089Y62211D01*

+X265658Y62250D01*

+X265441D01*

+Y62735D01*

+X266186Y62794D01*

+X266913Y62969D01*

+X267604Y63255D01*

+X268242Y63645D01*

+X268810Y64131D01*

+X269273Y64673D01*

+Y59834D01*

+X269272Y59834D01*

+X269155Y59850D01*

+X269036Y59848D01*

+X268919Y59827D01*

+X268807Y59789D01*

+X268703Y59733D01*

+X268608Y59662D01*

+X268526Y59576D01*

+X268458Y59479D01*

+X268406Y59373D01*

+X268371Y59259D01*

+X268355Y59142D01*

+X268357Y59023D01*

+X268377Y58907D01*

+X268418Y58795D01*

+X268527Y58520D01*

+X268607Y58235D01*

+X268661Y57943D01*

+X268688Y57648D01*

+Y57352D01*

+X268661Y57057D01*

+X268607Y56765D01*

+X268527Y56480D01*

+X268421Y56203D01*

+X268381Y56093D01*

+X268360Y55976D01*

+X268358Y55858D01*

+X268374Y55741D01*

+X268409Y55629D01*

+X268461Y55522D01*

+X268528Y55426D01*

+X268610Y55341D01*

+X268704Y55270D01*

+X268809Y55214D01*

+X268920Y55176D01*

+X269037Y55155D01*

+X269155Y55153D01*

+X269271Y55170D01*

+X269273Y55170D01*

+Y52133D01*

+G37*

+G36*

+Y39000D02*X265441D01*

+Y42757D01*

+X268926Y42764D01*

+X269156Y42819D01*

+X269273Y42867D01*

+Y39000D01*

+G37*

+G36*

+X261609Y64673D02*X262072Y64131D01*

+X262640Y63645D01*

+X263278Y63255D01*

+X263969Y62969D01*

+X264696Y62794D01*

+X265441Y62735D01*

+Y62250D01*

+X265224D01*

+X264793Y62211D01*

+X264366Y62132D01*

+X263949Y62015D01*

+X263544Y61860D01*

+X263439Y61805D01*

+X263344Y61734D01*

+X263262Y61648D01*

+X263194Y61551D01*

+X263142Y61445D01*

+X263107Y61331D01*

+X263091Y61214D01*

+X263093Y61095D01*

+X263114Y60978D01*

+X263152Y60866D01*

+X263208Y60762D01*

+X263279Y60667D01*

+X263365Y60585D01*

+X263462Y60517D01*

+X263568Y60465D01*

+X263682Y60430D01*

+X263799Y60414D01*

+X263918Y60416D01*

+X264034Y60436D01*

+X264146Y60477D01*

+X264421Y60586D01*

+X264706Y60666D01*

+X264998Y60720D01*

+X265293Y60747D01*

+X265441D01*

+Y54253D01*

+X265293D01*

+X264998Y54280D01*

+X264706Y54334D01*

+X264421Y54414D01*

+X264144Y54520D01*

+X264034Y54560D01*

+X263917Y54581D01*

+X263799Y54583D01*

+X263682Y54567D01*

+X263570Y54532D01*

+X263463Y54480D01*

+X263367Y54413D01*

+X263282Y54331D01*

+X263211Y54237D01*

+X263155Y54132D01*

+X263117Y54021D01*

+X263096Y53904D01*

+X263094Y53786D01*

+X263111Y53670D01*

+X263145Y53557D01*

+X263197Y53450D01*

+X263264Y53354D01*

+X263346Y53269D01*

+X263441Y53198D01*

+X263546Y53144D01*

+X263949Y52985D01*

+X264366Y52868D01*

+X264793Y52789D01*

+X265224Y52750D01*

+X265441D01*

+Y52243D01*

+X261956Y52236D01*

+X261726Y52181D01*

+X261609Y52133D01*

+Y55166D01*

+X261610Y55166D01*

+X261727Y55150D01*

+X261846Y55152D01*

+X261963Y55173D01*

+X262075Y55211D01*

+X262179Y55267D01*

+X262274Y55338D01*

+X262356Y55424D01*

+X262424Y55521D01*

+X262476Y55627D01*

+X262511Y55741D01*

+X262527Y55858D01*

+X262525Y55977D01*

+X262505Y56093D01*

+X262464Y56205D01*

+X262355Y56480D01*

+X262275Y56765D01*

+X262221Y57057D01*

+X262194Y57352D01*

+Y57648D01*

+X262221Y57943D01*

+X262275Y58235D01*

+X262355Y58520D01*

+X262461Y58797D01*

+X262501Y58907D01*

+X262522Y59024D01*

+X262524Y59142D01*

+X262508Y59259D01*

+X262473Y59371D01*

+X262421Y59478D01*

+X262354Y59574D01*

+X262272Y59659D01*

+X262178Y59730D01*

+X262073Y59786D01*

+X261962Y59824D01*

+X261845Y59845D01*

+X261727Y59847D01*

+X261610Y59830D01*

+X261609Y59830D01*

+Y64673D01*

+G37*

+G36*

+Y72500D02*X265441D01*

+Y72265D01*

+X264696Y72206D01*

+X263969Y72031D01*

+X263278Y71745D01*

+X262640Y71355D01*

+X262072Y70869D01*

+X261609Y70327D01*

+Y72500D01*

+G37*

+G36*

+X265441Y39000D02*X261609D01*

+Y42867D01*

+X261726Y42819D01*

+X261956Y42764D01*

+X262191Y42750D01*

+X265441Y42757D01*

+Y39000D01*

+G37*

+G36*

+X261609D02*X239273D01*

+Y42867D01*

+X239374Y42909D01*

+X239575Y43033D01*

+X239755Y43186D01*

+X239908Y43366D01*

+X240032Y43567D01*

+X240122Y43785D01*

+X240177Y44015D01*

+X240191Y44250D01*

+X240177Y50985D01*

+X240122Y51215D01*

+X240032Y51433D01*

+X239908Y51634D01*

+X239755Y51814D01*

+X239575Y51967D01*

+X239374Y52091D01*

+X239273Y52133D01*

+Y55170D01*

+X239384Y55204D01*

+X239491Y55256D01*

+X239587Y55323D01*

+X239672Y55405D01*

+X239743Y55500D01*

+X239797Y55605D01*

+X239956Y56008D01*

+X240073Y56425D01*

+X240152Y56852D01*

+X240191Y57283D01*

+Y57717D01*

+X240152Y58148D01*

+X240073Y58575D01*

+X239956Y58992D01*

+X239801Y59397D01*

+X239746Y59502D01*

+X239675Y59597D01*

+X239589Y59679D01*

+X239492Y59747D01*

+X239386Y59799D01*

+X239273Y59834D01*

+Y64673D01*

+X239296Y64699D01*

+X239686Y65337D01*

+X239972Y66028D01*

+X240147Y66755D01*

+X240191Y67500D01*

+X240147Y68245D01*

+X239972Y68972D01*

+X239686Y69663D01*

+X239296Y70301D01*

+X239273Y70327D01*

+Y72500D01*

+X261609D01*

+Y70327D01*

+X261586Y70301D01*

+X261196Y69663D01*

+X260910Y68972D01*

+X260735Y68245D01*

+X260676Y67500D01*

+X260735Y66755D01*

+X260910Y66028D01*

+X261196Y65337D01*

+X261586Y64699D01*

+X261609Y64673D01*

+Y59830D01*

+X261498Y59796D01*

+X261391Y59744D01*

+X261295Y59677D01*

+X261210Y59595D01*

+X261139Y59500D01*

+X261085Y59395D01*

+X260926Y58992D01*

+X260809Y58575D01*

+X260730Y58148D01*

+X260691Y57717D01*

+Y57283D01*

+X260730Y56852D01*

+X260809Y56425D01*

+X260926Y56008D01*

+X261081Y55603D01*

+X261136Y55498D01*

+X261207Y55403D01*

+X261293Y55321D01*

+X261390Y55253D01*

+X261496Y55201D01*

+X261609Y55166D01*

+Y52133D01*

+X261508Y52091D01*

+X261307Y51967D01*

+X261127Y51814D01*

+X260974Y51634D01*

+X260850Y51433D01*

+X260760Y51215D01*

+X260705Y50985D01*

+X260691Y50750D01*

+X260705Y44015D01*

+X260760Y43785D01*

+X260850Y43567D01*

+X260974Y43366D01*

+X261127Y43186D01*

+X261307Y43033D01*

+X261508Y42909D01*

+X261609Y42867D01*

+Y39000D01*

+G37*

+G36*

+X239273Y70327D02*X238810Y70869D01*

+X238242Y71355D01*

+X237604Y71745D01*

+X236913Y72031D01*

+X236186Y72206D01*

+X235441Y72265D01*

+Y72500D01*

+X239273D01*

+Y70327D01*

+G37*

+G36*

+Y52133D02*X239156Y52181D01*

+X238926Y52236D01*

+X238691Y52250D01*

+X235441Y52243D01*

+Y52750D01*

+X235658D01*

+X236089Y52789D01*

+X236516Y52868D01*

+X236933Y52985D01*

+X237338Y53140D01*

+X237443Y53195D01*

+X237538Y53266D01*

+X237620Y53352D01*

+X237688Y53449D01*

+X237740Y53555D01*

+X237775Y53669D01*

+X237791Y53786D01*

+X237789Y53905D01*

+X237768Y54022D01*

+X237730Y54134D01*

+X237674Y54238D01*

+X237603Y54333D01*

+X237517Y54415D01*

+X237420Y54483D01*

+X237314Y54535D01*

+X237200Y54570D01*

+X237083Y54586D01*

+X236964Y54584D01*

+X236848Y54564D01*

+X236736Y54523D01*

+X236461Y54414D01*

+X236176Y54334D01*

+X235884Y54280D01*

+X235589Y54253D01*

+X235441D01*

+Y60747D01*

+X235589D01*

+X235884Y60720D01*

+X236176Y60666D01*

+X236461Y60586D01*

+X236738Y60480D01*

+X236848Y60440D01*

+X236965Y60419D01*

+X237083Y60417D01*

+X237200Y60433D01*

+X237312Y60468D01*

+X237419Y60520D01*

+X237515Y60587D01*

+X237600Y60669D01*

+X237671Y60763D01*

+X237727Y60868D01*

+X237765Y60979D01*

+X237786Y61096D01*

+X237788Y61214D01*

+X237771Y61330D01*

+X237737Y61443D01*

+X237685Y61550D01*

+X237618Y61646D01*

+X237536Y61731D01*

+X237441Y61802D01*

+X237336Y61856D01*

+X236933Y62015D01*

+X236516Y62132D01*

+X236089Y62211D01*

+X235658Y62250D01*

+X235441D01*

+Y62735D01*

+X236186Y62794D01*

+X236913Y62969D01*

+X237604Y63255D01*

+X238242Y63645D01*

+X238810Y64131D01*

+X239273Y64673D01*

+Y59834D01*

+X239272Y59834D01*

+X239155Y59850D01*

+X239036Y59848D01*

+X238919Y59827D01*

+X238807Y59789D01*

+X238703Y59733D01*

+X238608Y59662D01*

+X238526Y59576D01*

+X238458Y59479D01*

+X238406Y59373D01*

+X238371Y59259D01*

+X238355Y59142D01*

+X238357Y59023D01*

+X238377Y58907D01*

+X238418Y58795D01*

+X238527Y58520D01*

+X238607Y58235D01*

+X238661Y57943D01*

+X238688Y57648D01*

+Y57352D01*

+X238661Y57057D01*

+X238607Y56765D01*

+X238527Y56480D01*

+X238421Y56203D01*

+X238381Y56093D01*

+X238360Y55976D01*

+X238358Y55858D01*

+X238374Y55741D01*

+X238409Y55629D01*

+X238461Y55522D01*

+X238528Y55426D01*

+X238610Y55341D01*

+X238704Y55270D01*

+X238809Y55214D01*

+X238920Y55176D01*

+X239037Y55155D01*

+X239155Y55153D01*

+X239271Y55170D01*

+X239273Y55170D01*

+Y52133D01*

+G37*

+G36*

+Y39000D02*X235441D01*

+Y42757D01*

+X238926Y42764D01*

+X239156Y42819D01*

+X239273Y42867D01*

+Y39000D01*

+G37*

+G36*

+X231609Y64673D02*X232072Y64131D01*

+X232640Y63645D01*

+X233278Y63255D01*

+X233969Y62969D01*

+X234696Y62794D01*

+X235441Y62735D01*

+Y62250D01*

+X235224D01*

+X234793Y62211D01*

+X234366Y62132D01*

+X233949Y62015D01*

+X233544Y61860D01*

+X233439Y61805D01*

+X233344Y61734D01*

+X233262Y61648D01*

+X233194Y61551D01*

+X233142Y61445D01*

+X233107Y61331D01*

+X233091Y61214D01*

+X233093Y61095D01*

+X233114Y60978D01*

+X233152Y60866D01*

+X233208Y60762D01*

+X233279Y60667D01*

+X233365Y60585D01*

+X233462Y60517D01*

+X233568Y60465D01*

+X233682Y60430D01*

+X233799Y60414D01*

+X233918Y60416D01*

+X234034Y60436D01*

+X234146Y60477D01*

+X234421Y60586D01*

+X234706Y60666D01*

+X234998Y60720D01*

+X235293Y60747D01*

+X235441D01*

+Y54253D01*

+X235293D01*

+X234998Y54280D01*

+X234706Y54334D01*

+X234421Y54414D01*

+X234144Y54520D01*

+X234034Y54560D01*

+X233917Y54581D01*

+X233799Y54583D01*

+X233682Y54567D01*

+X233570Y54532D01*

+X233463Y54480D01*

+X233367Y54413D01*

+X233282Y54331D01*

+X233211Y54237D01*

+X233155Y54132D01*

+X233117Y54021D01*

+X233096Y53904D01*

+X233094Y53786D01*

+X233111Y53670D01*

+X233145Y53557D01*

+X233197Y53450D01*

+X233264Y53354D01*

+X233346Y53269D01*

+X233441Y53198D01*

+X233546Y53144D01*

+X233949Y52985D01*

+X234366Y52868D01*

+X234793Y52789D01*

+X235224Y52750D01*

+X235441D01*

+Y52243D01*

+X231956Y52236D01*

+X231726Y52181D01*

+X231609Y52133D01*

+Y55166D01*

+X231610Y55166D01*

+X231727Y55150D01*

+X231846Y55152D01*

+X231963Y55173D01*

+X232075Y55211D01*

+X232179Y55267D01*

+X232274Y55338D01*

+X232356Y55424D01*

+X232424Y55521D01*

+X232476Y55627D01*

+X232511Y55741D01*

+X232527Y55858D01*

+X232525Y55977D01*

+X232505Y56093D01*

+X232464Y56205D01*

+X232355Y56480D01*

+X232275Y56765D01*

+X232221Y57057D01*

+X232194Y57352D01*

+Y57648D01*

+X232221Y57943D01*

+X232275Y58235D01*

+X232355Y58520D01*

+X232461Y58797D01*

+X232501Y58907D01*

+X232522Y59024D01*

+X232524Y59142D01*

+X232508Y59259D01*

+X232473Y59371D01*

+X232421Y59478D01*

+X232354Y59574D01*

+X232272Y59659D01*

+X232178Y59730D01*

+X232073Y59786D01*

+X231962Y59824D01*

+X231845Y59845D01*

+X231727Y59847D01*

+X231610Y59830D01*

+X231609Y59830D01*

+Y64673D01*

+G37*

+G36*

+Y72500D02*X235441D01*

+Y72265D01*

+X234696Y72206D01*

+X233969Y72031D01*

+X233278Y71745D01*

+X232640Y71355D01*

+X232072Y70869D01*

+X231609Y70327D01*

+Y72500D01*

+G37*

+G36*

+X235441Y39000D02*X231609D01*

+Y42867D01*

+X231726Y42819D01*

+X231956Y42764D01*

+X232191Y42750D01*

+X235441Y42757D01*

+Y39000D01*

+G37*

+G36*

+X231609D02*X209273D01*

+Y42867D01*

+X209374Y42909D01*

+X209575Y43033D01*

+X209755Y43186D01*

+X209908Y43366D01*

+X210032Y43567D01*

+X210122Y43785D01*

+X210177Y44015D01*

+X210191Y44250D01*

+X210177Y50985D01*

+X210122Y51215D01*

+X210032Y51433D01*

+X209908Y51634D01*

+X209755Y51814D01*

+X209575Y51967D01*

+X209374Y52091D01*

+X209273Y52133D01*

+Y55170D01*

+X209384Y55204D01*

+X209491Y55256D01*

+X209587Y55323D01*

+X209672Y55405D01*

+X209743Y55500D01*

+X209797Y55605D01*

+X209956Y56008D01*

+X210073Y56425D01*

+X210152Y56852D01*

+X210191Y57283D01*

+Y57717D01*

+X210152Y58148D01*

+X210073Y58575D01*

+X209956Y58992D01*

+X209801Y59397D01*

+X209746Y59502D01*

+X209675Y59597D01*

+X209589Y59679D01*

+X209492Y59747D01*

+X209386Y59799D01*

+X209273Y59834D01*

+Y64673D01*

+X209296Y64699D01*

+X209686Y65337D01*

+X209972Y66028D01*

+X210147Y66755D01*

+X210191Y67500D01*

+X210147Y68245D01*

+X209972Y68972D01*

+X209686Y69663D01*

+X209296Y70301D01*

+X209273Y70327D01*

+Y72500D01*

+X231609D01*

+Y70327D01*

+X231586Y70301D01*

+X231196Y69663D01*

+X230910Y68972D01*

+X230735Y68245D01*

+X230676Y67500D01*

+X230735Y66755D01*

+X230910Y66028D01*

+X231196Y65337D01*

+X231586Y64699D01*

+X231609Y64673D01*

+Y59830D01*

+X231498Y59796D01*

+X231391Y59744D01*

+X231295Y59677D01*

+X231210Y59595D01*

+X231139Y59500D01*

+X231085Y59395D01*

+X230926Y58992D01*

+X230809Y58575D01*

+X230730Y58148D01*

+X230691Y57717D01*

+Y57283D01*

+X230730Y56852D01*

+X230809Y56425D01*

+X230926Y56008D01*

+X231081Y55603D01*

+X231136Y55498D01*

+X231207Y55403D01*

+X231293Y55321D01*

+X231390Y55253D01*

+X231496Y55201D01*

+X231609Y55166D01*

+Y52133D01*

+X231508Y52091D01*

+X231307Y51967D01*

+X231127Y51814D01*

+X230974Y51634D01*

+X230850Y51433D01*

+X230760Y51215D01*

+X230705Y50985D01*

+X230691Y50750D01*

+X230705Y44015D01*

+X230760Y43785D01*

+X230850Y43567D01*

+X230974Y43366D01*

+X231127Y43186D01*

+X231307Y43033D01*

+X231508Y42909D01*

+X231609Y42867D01*

+Y39000D01*

+G37*

+G36*

+X209273Y70327D02*X208810Y70869D01*

+X208242Y71355D01*

+X207604Y71745D01*

+X206913Y72031D01*

+X206186Y72206D01*

+X205441Y72265D01*

+Y72500D01*

+X209273D01*

+Y70327D01*

+G37*

+G36*

+Y52133D02*X209156Y52181D01*

+X208926Y52236D01*

+X208691Y52250D01*

+X205441Y52243D01*

+Y52750D01*

+X205658D01*

+X206089Y52789D01*

+X206516Y52868D01*

+X206933Y52985D01*

+X207338Y53140D01*

+X207443Y53195D01*

+X207538Y53266D01*

+X207620Y53352D01*

+X207688Y53449D01*

+X207740Y53555D01*

+X207775Y53669D01*

+X207791Y53786D01*

+X207789Y53905D01*

+X207768Y54022D01*

+X207730Y54134D01*

+X207674Y54238D01*

+X207603Y54333D01*

+X207517Y54415D01*

+X207420Y54483D01*

+X207314Y54535D01*

+X207200Y54570D01*

+X207083Y54586D01*

+X206964Y54584D01*

+X206848Y54564D01*

+X206736Y54523D01*

+X206461Y54414D01*

+X206176Y54334D01*

+X205884Y54280D01*

+X205589Y54253D01*

+X205441D01*

+Y60747D01*

+X205589D01*

+X205884Y60720D01*

+X206176Y60666D01*

+X206461Y60586D01*

+X206738Y60480D01*

+X206848Y60440D01*

+X206965Y60419D01*

+X207083Y60417D01*

+X207200Y60433D01*

+X207312Y60468D01*

+X207419Y60520D01*

+X207515Y60587D01*

+X207600Y60669D01*

+X207671Y60763D01*

+X207727Y60868D01*

+X207765Y60979D01*

+X207786Y61096D01*

+X207788Y61214D01*

+X207771Y61330D01*

+X207737Y61443D01*

+X207685Y61550D01*

+X207618Y61646D01*

+X207536Y61731D01*

+X207441Y61802D01*

+X207336Y61856D01*

+X206933Y62015D01*

+X206516Y62132D01*

+X206089Y62211D01*

+X205658Y62250D01*

+X205441D01*

+Y62735D01*

+X206186Y62794D01*

+X206913Y62969D01*

+X207604Y63255D01*

+X208242Y63645D01*

+X208810Y64131D01*

+X209273Y64673D01*

+Y59834D01*

+X209272Y59834D01*

+X209155Y59850D01*

+X209036Y59848D01*

+X208919Y59827D01*

+X208807Y59789D01*

+X208703Y59733D01*

+X208608Y59662D01*

+X208526Y59576D01*

+X208458Y59479D01*

+X208406Y59373D01*

+X208371Y59259D01*

+X208355Y59142D01*

+X208357Y59023D01*

+X208377Y58907D01*

+X208418Y58795D01*

+X208527Y58520D01*

+X208607Y58235D01*

+X208661Y57943D01*

+X208688Y57648D01*

+Y57352D01*

+X208661Y57057D01*

+X208607Y56765D01*

+X208527Y56480D01*

+X208421Y56203D01*

+X208381Y56093D01*

+X208360Y55976D01*

+X208358Y55858D01*

+X208374Y55741D01*

+X208409Y55629D01*

+X208461Y55522D01*

+X208528Y55426D01*

+X208610Y55341D01*

+X208704Y55270D01*

+X208809Y55214D01*

+X208920Y55176D01*

+X209037Y55155D01*

+X209155Y55153D01*

+X209271Y55170D01*

+X209273Y55170D01*

+Y52133D01*

+G37*

+G36*

+Y39000D02*X205441D01*

+Y42757D01*

+X208926Y42764D01*

+X209156Y42819D01*

+X209273Y42867D01*

+Y39000D01*

+G37*

+G36*

+X201609Y64673D02*X202072Y64131D01*

+X202640Y63645D01*

+X203278Y63255D01*

+X203969Y62969D01*

+X204696Y62794D01*

+X205441Y62735D01*

+Y62250D01*

+X205224D01*

+X204793Y62211D01*

+X204366Y62132D01*

+X203949Y62015D01*

+X203544Y61860D01*

+X203439Y61805D01*

+X203344Y61734D01*

+X203262Y61648D01*

+X203194Y61551D01*

+X203142Y61445D01*

+X203107Y61331D01*

+X203091Y61214D01*

+X203093Y61095D01*

+X203114Y60978D01*

+X203152Y60866D01*

+X203208Y60762D01*

+X203279Y60667D01*

+X203365Y60585D01*

+X203462Y60517D01*

+X203568Y60465D01*

+X203682Y60430D01*

+X203799Y60414D01*

+X203918Y60416D01*

+X204034Y60436D01*

+X204146Y60477D01*

+X204421Y60586D01*

+X204706Y60666D01*

+X204998Y60720D01*

+X205293Y60747D01*

+X205441D01*

+Y54253D01*

+X205293D01*

+X204998Y54280D01*

+X204706Y54334D01*

+X204421Y54414D01*

+X204144Y54520D01*

+X204034Y54560D01*

+X203917Y54581D01*

+X203799Y54583D01*

+X203682Y54567D01*

+X203570Y54532D01*

+X203463Y54480D01*

+X203367Y54413D01*

+X203282Y54331D01*

+X203211Y54237D01*

+X203155Y54132D01*

+X203117Y54021D01*

+X203096Y53904D01*

+X203094Y53786D01*

+X203111Y53670D01*

+X203145Y53557D01*

+X203197Y53450D01*

+X203264Y53354D01*

+X203346Y53269D01*

+X203441Y53198D01*

+X203546Y53144D01*

+X203949Y52985D01*

+X204366Y52868D01*

+X204793Y52789D01*

+X205224Y52750D01*

+X205441D01*

+Y52243D01*

+X201956Y52236D01*

+X201726Y52181D01*

+X201609Y52133D01*

+Y55166D01*

+X201610Y55166D01*

+X201727Y55150D01*

+X201846Y55152D01*

+X201963Y55173D01*

+X202075Y55211D01*

+X202179Y55267D01*

+X202274Y55338D01*

+X202356Y55424D01*

+X202424Y55521D01*

+X202476Y55627D01*

+X202511Y55741D01*

+X202527Y55858D01*

+X202525Y55977D01*

+X202505Y56093D01*

+X202464Y56205D01*

+X202355Y56480D01*

+X202275Y56765D01*

+X202221Y57057D01*

+X202194Y57352D01*

+Y57648D01*

+X202221Y57943D01*

+X202275Y58235D01*

+X202355Y58520D01*

+X202461Y58797D01*

+X202501Y58907D01*

+X202522Y59024D01*

+X202524Y59142D01*

+X202508Y59259D01*

+X202473Y59371D01*

+X202421Y59478D01*

+X202354Y59574D01*

+X202272Y59659D01*

+X202178Y59730D01*

+X202073Y59786D01*

+X201962Y59824D01*

+X201845Y59845D01*

+X201727Y59847D01*

+X201610Y59830D01*

+X201609Y59830D01*

+Y64673D01*

+G37*

+G36*

+Y72500D02*X205441D01*

+Y72265D01*

+X204696Y72206D01*

+X203969Y72031D01*

+X203278Y71745D01*

+X202640Y71355D01*

+X202072Y70869D01*

+X201609Y70327D01*

+Y72500D01*

+G37*

+G36*

+X205441Y39000D02*X201609D01*

+Y42867D01*

+X201726Y42819D01*

+X201956Y42764D01*

+X202191Y42750D01*

+X205441Y42757D01*

+Y39000D01*

+G37*

+G36*

+X201609D02*X179273D01*

+Y42867D01*

+X179374Y42909D01*

+X179575Y43033D01*

+X179755Y43186D01*

+X179908Y43366D01*

+X180032Y43567D01*

+X180122Y43785D01*

+X180177Y44015D01*

+X180191Y44250D01*

+X180177Y50985D01*

+X180122Y51215D01*

+X180032Y51433D01*

+X179908Y51634D01*

+X179755Y51814D01*

+X179575Y51967D01*

+X179374Y52091D01*

+X179273Y52133D01*

+Y55170D01*

+X179384Y55204D01*

+X179491Y55256D01*

+X179587Y55323D01*

+X179672Y55405D01*

+X179743Y55500D01*

+X179797Y55605D01*

+X179956Y56008D01*

+X180073Y56425D01*

+X180152Y56852D01*

+X180191Y57283D01*

+Y57717D01*

+X180152Y58148D01*

+X180073Y58575D01*

+X179956Y58992D01*

+X179801Y59397D01*

+X179746Y59502D01*

+X179675Y59597D01*

+X179589Y59679D01*

+X179492Y59747D01*

+X179386Y59799D01*

+X179273Y59834D01*

+Y64673D01*

+X179296Y64699D01*

+X179686Y65337D01*

+X179972Y66028D01*

+X180147Y66755D01*

+X180191Y67500D01*

+X180147Y68245D01*

+X179972Y68972D01*

+X179686Y69663D01*

+X179296Y70301D01*

+X179273Y70327D01*

+Y72500D01*

+X201609D01*

+Y70327D01*

+X201586Y70301D01*

+X201196Y69663D01*

+X200910Y68972D01*

+X200735Y68245D01*

+X200676Y67500D01*

+X200735Y66755D01*

+X200910Y66028D01*

+X201196Y65337D01*

+X201586Y64699D01*

+X201609Y64673D01*

+Y59830D01*

+X201498Y59796D01*

+X201391Y59744D01*

+X201295Y59677D01*

+X201210Y59595D01*

+X201139Y59500D01*

+X201085Y59395D01*

+X200926Y58992D01*

+X200809Y58575D01*

+X200730Y58148D01*

+X200691Y57717D01*

+Y57283D01*

+X200730Y56852D01*

+X200809Y56425D01*

+X200926Y56008D01*

+X201081Y55603D01*

+X201136Y55498D01*

+X201207Y55403D01*

+X201293Y55321D01*

+X201390Y55253D01*

+X201496Y55201D01*

+X201609Y55166D01*

+Y52133D01*

+X201508Y52091D01*

+X201307Y51967D01*

+X201127Y51814D01*

+X200974Y51634D01*

+X200850Y51433D01*

+X200760Y51215D01*

+X200705Y50985D01*

+X200691Y50750D01*

+X200705Y44015D01*

+X200760Y43785D01*

+X200850Y43567D01*

+X200974Y43366D01*

+X201127Y43186D01*

+X201307Y43033D01*

+X201508Y42909D01*

+X201609Y42867D01*

+Y39000D01*

+G37*

+G36*

+X179273Y70327D02*X178810Y70869D01*

+X178242Y71355D01*

+X177604Y71745D01*

+X176913Y72031D01*

+X176186Y72206D01*

+X175441Y72265D01*

+Y72500D01*

+X179273D01*

+Y70327D01*

+G37*

+G36*

+Y52133D02*X179156Y52181D01*

+X178926Y52236D01*

+X178691Y52250D01*

+X175441Y52243D01*

+Y52750D01*

+X175658D01*

+X176089Y52789D01*

+X176516Y52868D01*

+X176933Y52985D01*

+X177338Y53140D01*

+X177443Y53195D01*

+X177538Y53266D01*

+X177620Y53352D01*

+X177688Y53449D01*

+X177740Y53555D01*

+X177775Y53669D01*

+X177791Y53786D01*

+X177789Y53905D01*

+X177768Y54022D01*

+X177730Y54134D01*

+X177674Y54238D01*

+X177603Y54333D01*

+X177517Y54415D01*

+X177420Y54483D01*

+X177314Y54535D01*

+X177200Y54570D01*

+X177083Y54586D01*

+X176964Y54584D01*

+X176848Y54564D01*

+X176736Y54523D01*

+X176461Y54414D01*

+X176176Y54334D01*

+X175884Y54280D01*

+X175589Y54253D01*

+X175441D01*

+Y60747D01*

+X175589D01*

+X175884Y60720D01*

+X176176Y60666D01*

+X176461Y60586D01*

+X176738Y60480D01*

+X176848Y60440D01*

+X176965Y60419D01*

+X177083Y60417D01*

+X177200Y60433D01*

+X177312Y60468D01*

+X177419Y60520D01*

+X177515Y60587D01*

+X177600Y60669D01*

+X177671Y60763D01*

+X177727Y60868D01*

+X177765Y60979D01*

+X177786Y61096D01*

+X177788Y61214D01*

+X177771Y61330D01*

+X177737Y61443D01*

+X177685Y61550D01*

+X177618Y61646D01*

+X177536Y61731D01*

+X177441Y61802D01*

+X177336Y61856D01*

+X176933Y62015D01*

+X176516Y62132D01*

+X176089Y62211D01*

+X175658Y62250D01*

+X175441D01*

+Y62735D01*

+X176186Y62794D01*

+X176913Y62969D01*

+X177604Y63255D01*

+X178242Y63645D01*

+X178810Y64131D01*

+X179273Y64673D01*

+Y59834D01*

+X179272Y59834D01*

+X179155Y59850D01*

+X179036Y59848D01*

+X178919Y59827D01*

+X178807Y59789D01*

+X178703Y59733D01*

+X178608Y59662D01*

+X178526Y59576D01*

+X178458Y59479D01*

+X178406Y59373D01*

+X178371Y59259D01*

+X178355Y59142D01*

+X178357Y59023D01*

+X178377Y58907D01*

+X178418Y58795D01*

+X178527Y58520D01*

+X178607Y58235D01*

+X178661Y57943D01*

+X178688Y57648D01*

+Y57352D01*

+X178661Y57057D01*

+X178607Y56765D01*

+X178527Y56480D01*

+X178421Y56203D01*

+X178381Y56093D01*

+X178360Y55976D01*

+X178358Y55858D01*

+X178374Y55741D01*

+X178409Y55629D01*

+X178461Y55522D01*

+X178528Y55426D01*

+X178610Y55341D01*

+X178704Y55270D01*

+X178809Y55214D01*

+X178920Y55176D01*

+X179037Y55155D01*

+X179155Y55153D01*

+X179271Y55170D01*

+X179273Y55170D01*

+Y52133D01*

+G37*

+G36*

+Y39000D02*X175441D01*

+Y42757D01*

+X178926Y42764D01*

+X179156Y42819D01*

+X179273Y42867D01*

+Y39000D01*

+G37*

+G36*

+X171609Y64673D02*X172072Y64131D01*

+X172640Y63645D01*

+X173278Y63255D01*

+X173969Y62969D01*

+X174696Y62794D01*

+X175441Y62735D01*

+Y62250D01*

+X175224D01*

+X174793Y62211D01*

+X174366Y62132D01*

+X173949Y62015D01*

+X173544Y61860D01*

+X173439Y61805D01*

+X173344Y61734D01*

+X173262Y61648D01*

+X173194Y61551D01*

+X173142Y61445D01*

+X173107Y61331D01*

+X173091Y61214D01*

+X173093Y61095D01*

+X173114Y60978D01*

+X173152Y60866D01*

+X173208Y60762D01*

+X173279Y60667D01*

+X173365Y60585D01*

+X173462Y60517D01*

+X173568Y60465D01*

+X173682Y60430D01*

+X173799Y60414D01*

+X173918Y60416D01*

+X174034Y60436D01*

+X174146Y60477D01*

+X174421Y60586D01*

+X174706Y60666D01*

+X174998Y60720D01*

+X175293Y60747D01*

+X175441D01*

+Y54253D01*

+X175293D01*

+X174998Y54280D01*

+X174706Y54334D01*

+X174421Y54414D01*

+X174144Y54520D01*

+X174034Y54560D01*

+X173917Y54581D01*

+X173799Y54583D01*

+X173682Y54567D01*

+X173570Y54532D01*

+X173463Y54480D01*

+X173367Y54413D01*

+X173282Y54331D01*

+X173211Y54237D01*

+X173155Y54132D01*

+X173117Y54021D01*

+X173096Y53904D01*

+X173094Y53786D01*

+X173111Y53670D01*

+X173145Y53557D01*

+X173197Y53450D01*

+X173264Y53354D01*

+X173346Y53269D01*

+X173441Y53198D01*

+X173546Y53144D01*

+X173949Y52985D01*

+X174366Y52868D01*

+X174793Y52789D01*

+X175224Y52750D01*

+X175441D01*

+Y52243D01*

+X171956Y52236D01*

+X171726Y52181D01*

+X171609Y52133D01*

+Y55166D01*

+X171610Y55166D01*

+X171727Y55150D01*

+X171846Y55152D01*

+X171963Y55173D01*

+X172075Y55211D01*

+X172179Y55267D01*

+X172274Y55338D01*

+X172356Y55424D01*

+X172424Y55521D01*

+X172476Y55627D01*

+X172511Y55741D01*

+X172527Y55858D01*

+X172525Y55977D01*

+X172505Y56093D01*

+X172464Y56205D01*

+X172355Y56480D01*

+X172275Y56765D01*

+X172221Y57057D01*

+X172194Y57352D01*

+Y57648D01*

+X172221Y57943D01*

+X172275Y58235D01*

+X172355Y58520D01*

+X172461Y58797D01*

+X172501Y58907D01*

+X172522Y59024D01*

+X172524Y59142D01*

+X172508Y59259D01*

+X172473Y59371D01*

+X172421Y59478D01*

+X172354Y59574D01*

+X172272Y59659D01*

+X172178Y59730D01*

+X172073Y59786D01*

+X171962Y59824D01*

+X171845Y59845D01*

+X171727Y59847D01*

+X171610Y59830D01*

+X171609Y59830D01*

+Y64673D01*

+G37*

+G36*

+Y72500D02*X175441D01*

+Y72265D01*

+X174696Y72206D01*

+X173969Y72031D01*

+X173278Y71745D01*

+X172640Y71355D01*

+X172072Y70869D01*

+X171609Y70327D01*

+Y72500D01*

+G37*

+G36*

+X175441Y39000D02*X171609D01*

+Y42867D01*

+X171726Y42819D01*

+X171956Y42764D01*

+X172191Y42750D01*

+X175441Y42757D01*

+Y39000D01*

+G37*

+G36*

+X171609D02*X149273D01*

+Y42867D01*

+X149374Y42909D01*

+X149575Y43033D01*

+X149755Y43186D01*

+X149908Y43366D01*

+X150032Y43567D01*

+X150122Y43785D01*

+X150177Y44015D01*

+X150191Y44250D01*

+X150177Y50985D01*

+X150122Y51215D01*

+X150032Y51433D01*

+X149908Y51634D01*

+X149755Y51814D01*

+X149575Y51967D01*

+X149374Y52091D01*

+X149273Y52133D01*

+Y55170D01*

+X149384Y55204D01*

+X149491Y55256D01*

+X149587Y55323D01*

+X149672Y55405D01*

+X149743Y55500D01*

+X149797Y55605D01*

+X149956Y56008D01*

+X150073Y56425D01*

+X150152Y56852D01*

+X150191Y57283D01*

+Y57717D01*

+X150152Y58148D01*

+X150073Y58575D01*

+X149956Y58992D01*

+X149801Y59397D01*

+X149746Y59502D01*

+X149675Y59597D01*

+X149589Y59679D01*

+X149492Y59747D01*

+X149386Y59799D01*

+X149273Y59834D01*

+Y64673D01*

+X149296Y64699D01*

+X149686Y65337D01*

+X149972Y66028D01*

+X150147Y66755D01*

+X150191Y67500D01*

+X150147Y68245D01*

+X149972Y68972D01*

+X149686Y69663D01*

+X149296Y70301D01*

+X149273Y70327D01*

+Y72500D01*

+X171609D01*

+Y70327D01*

+X171586Y70301D01*

+X171196Y69663D01*

+X170910Y68972D01*

+X170735Y68245D01*

+X170676Y67500D01*

+X170735Y66755D01*

+X170910Y66028D01*

+X171196Y65337D01*

+X171586Y64699D01*

+X171609Y64673D01*

+Y59830D01*

+X171498Y59796D01*

+X171391Y59744D01*

+X171295Y59677D01*

+X171210Y59595D01*

+X171139Y59500D01*

+X171085Y59395D01*

+X170926Y58992D01*

+X170809Y58575D01*

+X170730Y58148D01*

+X170691Y57717D01*

+Y57283D01*

+X170730Y56852D01*

+X170809Y56425D01*

+X170926Y56008D01*

+X171081Y55603D01*

+X171136Y55498D01*

+X171207Y55403D01*

+X171293Y55321D01*

+X171390Y55253D01*

+X171496Y55201D01*

+X171609Y55166D01*

+Y52133D01*

+X171508Y52091D01*

+X171307Y51967D01*

+X171127Y51814D01*

+X170974Y51634D01*

+X170850Y51433D01*

+X170760Y51215D01*

+X170705Y50985D01*

+X170691Y50750D01*

+X170705Y44015D01*

+X170760Y43785D01*

+X170850Y43567D01*

+X170974Y43366D01*

+X171127Y43186D01*

+X171307Y43033D01*

+X171508Y42909D01*

+X171609Y42867D01*

+Y39000D01*

+G37*

+G36*

+X149273Y70327D02*X148810Y70869D01*

+X148242Y71355D01*

+X147604Y71745D01*

+X146913Y72031D01*

+X146186Y72206D01*

+X145441Y72265D01*

+Y72500D01*

+X149273D01*

+Y70327D01*

+G37*

+G36*

+Y52133D02*X149156Y52181D01*

+X148926Y52236D01*

+X148691Y52250D01*

+X145441Y52243D01*

+Y52750D01*

+X145658D01*

+X146089Y52789D01*

+X146516Y52868D01*

+X146933Y52985D01*

+X147338Y53140D01*

+X147443Y53195D01*

+X147538Y53266D01*

+X147620Y53352D01*

+X147688Y53449D01*

+X147740Y53555D01*

+X147775Y53669D01*

+X147791Y53786D01*

+X147789Y53905D01*

+X147768Y54022D01*

+X147730Y54134D01*

+X147674Y54238D01*

+X147603Y54333D01*

+X147517Y54415D01*

+X147420Y54483D01*

+X147314Y54535D01*

+X147200Y54570D01*

+X147083Y54586D01*

+X146964Y54584D01*

+X146848Y54564D01*

+X146736Y54523D01*

+X146461Y54414D01*

+X146176Y54334D01*

+X145884Y54280D01*

+X145589Y54253D01*

+X145441D01*

+Y60747D01*

+X145589D01*

+X145884Y60720D01*

+X146176Y60666D01*

+X146461Y60586D01*

+X146738Y60480D01*

+X146848Y60440D01*

+X146965Y60419D01*

+X147083Y60417D01*

+X147200Y60433D01*

+X147312Y60468D01*

+X147419Y60520D01*

+X147515Y60587D01*

+X147600Y60669D01*

+X147671Y60763D01*

+X147727Y60868D01*

+X147765Y60979D01*

+X147786Y61096D01*

+X147788Y61214D01*

+X147771Y61330D01*

+X147737Y61443D01*

+X147685Y61550D01*

+X147618Y61646D01*

+X147536Y61731D01*

+X147441Y61802D01*

+X147336Y61856D01*

+X146933Y62015D01*

+X146516Y62132D01*

+X146089Y62211D01*

+X145658Y62250D01*

+X145441D01*

+Y62735D01*

+X146186Y62794D01*

+X146913Y62969D01*

+X147604Y63255D01*

+X148242Y63645D01*

+X148810Y64131D01*

+X149273Y64673D01*

+Y59834D01*

+X149272Y59834D01*

+X149155Y59850D01*

+X149036Y59848D01*

+X148919Y59827D01*

+X148807Y59789D01*

+X148703Y59733D01*

+X148608Y59662D01*

+X148526Y59576D01*

+X148458Y59479D01*

+X148406Y59373D01*

+X148371Y59259D01*

+X148355Y59142D01*

+X148357Y59023D01*

+X148377Y58907D01*

+X148418Y58795D01*

+X148527Y58520D01*

+X148607Y58235D01*

+X148661Y57943D01*

+X148688Y57648D01*

+Y57352D01*

+X148661Y57057D01*

+X148607Y56765D01*

+X148527Y56480D01*

+X148421Y56203D01*

+X148381Y56093D01*

+X148360Y55976D01*

+X148358Y55858D01*

+X148374Y55741D01*

+X148409Y55629D01*

+X148461Y55522D01*

+X148528Y55426D01*

+X148610Y55341D01*

+X148704Y55270D01*

+X148809Y55214D01*

+X148920Y55176D01*

+X149037Y55155D01*

+X149155Y55153D01*

+X149271Y55170D01*

+X149273Y55170D01*

+Y52133D01*

+G37*

+G36*

+Y39000D02*X145441D01*

+Y42757D01*

+X148926Y42764D01*

+X149156Y42819D01*

+X149273Y42867D01*

+Y39000D01*

+G37*

+G36*

+X141609Y64673D02*X142072Y64131D01*

+X142640Y63645D01*

+X143278Y63255D01*

+X143969Y62969D01*

+X144696Y62794D01*

+X145441Y62735D01*

+Y62250D01*

+X145224D01*

+X144793Y62211D01*

+X144366Y62132D01*

+X143949Y62015D01*

+X143544Y61860D01*

+X143439Y61805D01*

+X143344Y61734D01*

+X143262Y61648D01*

+X143194Y61551D01*

+X143142Y61445D01*

+X143107Y61331D01*

+X143091Y61214D01*

+X143093Y61095D01*

+X143114Y60978D01*

+X143152Y60866D01*

+X143208Y60762D01*

+X143279Y60667D01*

+X143365Y60585D01*

+X143462Y60517D01*

+X143568Y60465D01*

+X143682Y60430D01*

+X143799Y60414D01*

+X143918Y60416D01*

+X144034Y60436D01*

+X144146Y60477D01*

+X144421Y60586D01*

+X144706Y60666D01*

+X144998Y60720D01*

+X145293Y60747D01*

+X145441D01*

+Y54253D01*

+X145293D01*

+X144998Y54280D01*

+X144706Y54334D01*

+X144421Y54414D01*

+X144144Y54520D01*

+X144034Y54560D01*

+X143917Y54581D01*

+X143799Y54583D01*

+X143682Y54567D01*

+X143570Y54532D01*

+X143463Y54480D01*

+X143367Y54413D01*

+X143282Y54331D01*

+X143211Y54237D01*

+X143155Y54132D01*

+X143117Y54021D01*

+X143096Y53904D01*

+X143094Y53786D01*

+X143111Y53670D01*

+X143145Y53557D01*

+X143197Y53450D01*

+X143264Y53354D01*

+X143346Y53269D01*

+X143441Y53198D01*

+X143546Y53144D01*

+X143949Y52985D01*

+X144366Y52868D01*

+X144793Y52789D01*

+X145224Y52750D01*

+X145441D01*

+Y52243D01*

+X141956Y52236D01*

+X141726Y52181D01*

+X141609Y52133D01*

+Y55166D01*

+X141610Y55166D01*

+X141727Y55150D01*

+X141846Y55152D01*

+X141963Y55173D01*

+X142075Y55211D01*

+X142179Y55267D01*

+X142274Y55338D01*

+X142356Y55424D01*

+X142424Y55521D01*

+X142476Y55627D01*

+X142511Y55741D01*

+X142527Y55858D01*

+X142525Y55977D01*

+X142505Y56093D01*

+X142464Y56205D01*

+X142355Y56480D01*

+X142275Y56765D01*

+X142221Y57057D01*

+X142194Y57352D01*

+Y57648D01*

+X142221Y57943D01*

+X142275Y58235D01*

+X142355Y58520D01*

+X142461Y58797D01*

+X142501Y58907D01*

+X142522Y59024D01*

+X142524Y59142D01*

+X142508Y59259D01*

+X142473Y59371D01*

+X142421Y59478D01*

+X142354Y59574D01*

+X142272Y59659D01*

+X142178Y59730D01*

+X142073Y59786D01*

+X141962Y59824D01*

+X141845Y59845D01*

+X141727Y59847D01*

+X141610Y59830D01*

+X141609Y59830D01*

+Y64673D01*

+G37*

+G36*

+Y72500D02*X145441D01*

+Y72265D01*

+X144696Y72206D01*

+X143969Y72031D01*

+X143278Y71745D01*

+X142640Y71355D01*

+X142072Y70869D01*

+X141609Y70327D01*

+Y72500D01*

+G37*

+G36*

+X145441Y39000D02*X141609D01*

+Y42867D01*

+X141726Y42819D01*

+X141956Y42764D01*

+X142191Y42750D01*

+X145441Y42757D01*

+Y39000D01*

+G37*

+G36*

+X141609D02*X119273D01*

+Y42867D01*

+X119374Y42909D01*

+X119575Y43033D01*

+X119755Y43186D01*

+X119908Y43366D01*

+X120032Y43567D01*

+X120122Y43785D01*

+X120177Y44015D01*

+X120191Y44250D01*

+X120177Y50985D01*

+X120122Y51215D01*

+X120032Y51433D01*

+X119908Y51634D01*

+X119755Y51814D01*

+X119575Y51967D01*

+X119374Y52091D01*

+X119273Y52133D01*

+Y55170D01*

+X119384Y55204D01*

+X119491Y55256D01*

+X119587Y55323D01*

+X119672Y55405D01*

+X119743Y55500D01*

+X119797Y55605D01*

+X119956Y56008D01*

+X120073Y56425D01*

+X120152Y56852D01*

+X120191Y57283D01*

+Y57717D01*

+X120152Y58148D01*

+X120073Y58575D01*

+X119956Y58992D01*

+X119801Y59397D01*

+X119746Y59502D01*

+X119675Y59597D01*

+X119589Y59679D01*

+X119492Y59747D01*

+X119386Y59799D01*

+X119273Y59834D01*

+Y64673D01*

+X119296Y64699D01*

+X119686Y65337D01*

+X119972Y66028D01*

+X120147Y66755D01*

+X120191Y67500D01*

+X120147Y68245D01*

+X119972Y68972D01*

+X119686Y69663D01*

+X119296Y70301D01*

+X119273Y70327D01*

+Y72500D01*

+X141609D01*

+Y70327D01*

+X141586Y70301D01*

+X141196Y69663D01*

+X140910Y68972D01*

+X140735Y68245D01*

+X140676Y67500D01*

+X140735Y66755D01*

+X140910Y66028D01*

+X141196Y65337D01*

+X141586Y64699D01*

+X141609Y64673D01*

+Y59830D01*

+X141498Y59796D01*

+X141391Y59744D01*

+X141295Y59677D01*

+X141210Y59595D01*

+X141139Y59500D01*

+X141085Y59395D01*

+X140926Y58992D01*

+X140809Y58575D01*

+X140730Y58148D01*

+X140691Y57717D01*

+Y57283D01*

+X140730Y56852D01*

+X140809Y56425D01*

+X140926Y56008D01*

+X141081Y55603D01*

+X141136Y55498D01*

+X141207Y55403D01*

+X141293Y55321D01*

+X141390Y55253D01*

+X141496Y55201D01*

+X141609Y55166D01*

+Y52133D01*

+X141508Y52091D01*

+X141307Y51967D01*

+X141127Y51814D01*

+X140974Y51634D01*

+X140850Y51433D01*

+X140760Y51215D01*

+X140705Y50985D01*

+X140691Y50750D01*

+X140705Y44015D01*

+X140760Y43785D01*

+X140850Y43567D01*

+X140974Y43366D01*

+X141127Y43186D01*

+X141307Y43033D01*

+X141508Y42909D01*

+X141609Y42867D01*

+Y39000D01*

+G37*

+G36*

+X119273Y70327D02*X118810Y70869D01*

+X118242Y71355D01*

+X117604Y71745D01*

+X116913Y72031D01*

+X116186Y72206D01*

+X115441Y72265D01*

+Y72500D01*

+X119273D01*

+Y70327D01*

+G37*

+G36*

+Y52133D02*X119156Y52181D01*

+X118926Y52236D01*

+X118691Y52250D01*

+X115441Y52243D01*

+Y52750D01*

+X115658D01*

+X116089Y52789D01*

+X116516Y52868D01*

+X116933Y52985D01*

+X117338Y53140D01*

+X117443Y53195D01*

+X117538Y53266D01*

+X117620Y53352D01*

+X117688Y53449D01*

+X117740Y53555D01*

+X117775Y53669D01*

+X117791Y53786D01*

+X117789Y53905D01*

+X117768Y54022D01*

+X117730Y54134D01*

+X117674Y54238D01*

+X117603Y54333D01*

+X117517Y54415D01*

+X117420Y54483D01*

+X117314Y54535D01*

+X117200Y54570D01*

+X117083Y54586D01*

+X116964Y54584D01*

+X116847Y54564D01*

+X116736Y54523D01*

+X116461Y54414D01*

+X116176Y54334D01*

+X115884Y54280D01*

+X115589Y54253D01*

+X115441D01*

+Y60747D01*

+X115589D01*

+X115884Y60720D01*

+X116176Y60666D01*

+X116461Y60586D01*

+X116738Y60480D01*

+X116848Y60440D01*

+X116965Y60419D01*

+X117083Y60417D01*

+X117200Y60433D01*

+X117312Y60468D01*

+X117419Y60520D01*

+X117515Y60587D01*

+X117600Y60669D01*

+X117671Y60763D01*

+X117727Y60868D01*

+X117765Y60979D01*

+X117786Y61096D01*

+X117788Y61214D01*

+X117771Y61330D01*

+X117737Y61443D01*

+X117685Y61550D01*

+X117618Y61646D01*

+X117536Y61731D01*

+X117441Y61802D01*

+X117336Y61856D01*

+X116933Y62015D01*

+X116516Y62132D01*

+X116089Y62211D01*

+X115658Y62250D01*

+X115441D01*

+Y62735D01*

+X116186Y62794D01*

+X116913Y62969D01*

+X117604Y63255D01*

+X118242Y63645D01*

+X118810Y64131D01*

+X119273Y64673D01*

+Y59834D01*

+X119272Y59834D01*

+X119155Y59850D01*

+X119036Y59848D01*

+X118919Y59827D01*

+X118807Y59789D01*

+X118703Y59733D01*

+X118608Y59662D01*

+X118526Y59576D01*

+X118458Y59479D01*

+X118406Y59373D01*

+X118371Y59259D01*

+X118355Y59142D01*

+X118357Y59023D01*

+X118377Y58907D01*

+X118418Y58795D01*

+X118527Y58520D01*

+X118607Y58235D01*

+X118661Y57943D01*

+X118688Y57648D01*

+Y57352D01*

+X118661Y57057D01*

+X118607Y56765D01*

+X118527Y56480D01*

+X118421Y56203D01*

+X118381Y56093D01*

+X118360Y55976D01*

+X118358Y55858D01*

+X118374Y55741D01*

+X118409Y55629D01*

+X118461Y55522D01*

+X118528Y55426D01*

+X118610Y55341D01*

+X118704Y55270D01*

+X118809Y55214D01*

+X118920Y55176D01*

+X119037Y55155D01*

+X119155Y55153D01*

+X119271Y55170D01*

+X119273Y55170D01*

+Y52133D01*

+G37*

+G36*

+Y39000D02*X115441D01*

+Y42757D01*

+X118926Y42764D01*

+X119156Y42819D01*

+X119273Y42867D01*

+Y39000D01*

+G37*

+G36*

+X111609Y64673D02*X112072Y64131D01*

+X112640Y63645D01*

+X113278Y63255D01*

+X113969Y62969D01*

+X114696Y62794D01*

+X115441Y62735D01*

+Y62250D01*

+X115224D01*

+X114793Y62211D01*

+X114366Y62132D01*

+X113949Y62015D01*

+X113544Y61860D01*

+X113439Y61805D01*

+X113344Y61734D01*

+X113262Y61648D01*

+X113194Y61551D01*

+X113142Y61445D01*

+X113107Y61331D01*

+X113091Y61214D01*

+X113093Y61095D01*

+X113114Y60978D01*

+X113152Y60866D01*

+X113208Y60762D01*

+X113279Y60667D01*

+X113365Y60585D01*

+X113462Y60517D01*

+X113568Y60465D01*

+X113682Y60430D01*

+X113799Y60414D01*

+X113918Y60416D01*

+X114034Y60436D01*

+X114146Y60477D01*

+X114421Y60586D01*

+X114706Y60666D01*

+X114998Y60720D01*

+X115293Y60747D01*

+X115441D01*

+Y54253D01*

+X115293D01*

+X114998Y54280D01*

+X114706Y54334D01*

+X114421Y54414D01*

+X114144Y54520D01*

+X114034Y54560D01*

+X113917Y54581D01*

+X113799Y54583D01*

+X113682Y54567D01*

+X113570Y54532D01*

+X113463Y54480D01*

+X113367Y54413D01*

+X113282Y54331D01*

+X113211Y54237D01*

+X113155Y54132D01*

+X113117Y54021D01*

+X113096Y53904D01*

+X113094Y53786D01*

+X113111Y53670D01*

+X113145Y53557D01*

+X113197Y53450D01*

+X113264Y53354D01*

+X113346Y53269D01*

+X113441Y53198D01*

+X113546Y53144D01*

+X113949Y52985D01*

+X114366Y52868D01*

+X114793Y52789D01*

+X115224Y52750D01*

+X115441D01*

+Y52243D01*

+X111956Y52236D01*

+X111726Y52181D01*

+X111609Y52133D01*

+Y55166D01*

+X111610Y55166D01*

+X111727Y55150D01*

+X111846Y55152D01*

+X111963Y55173D01*

+X112075Y55211D01*

+X112179Y55267D01*

+X112274Y55338D01*

+X112356Y55424D01*

+X112424Y55521D01*

+X112476Y55627D01*

+X112511Y55741D01*

+X112527Y55858D01*

+X112525Y55977D01*

+X112505Y56093D01*

+X112464Y56205D01*

+X112355Y56480D01*

+X112275Y56765D01*

+X112221Y57057D01*

+X112194Y57352D01*

+Y57648D01*

+X112221Y57943D01*

+X112275Y58235D01*

+X112355Y58520D01*

+X112461Y58797D01*

+X112501Y58907D01*

+X112522Y59024D01*

+X112524Y59142D01*

+X112508Y59259D01*

+X112473Y59371D01*

+X112421Y59478D01*

+X112354Y59574D01*

+X112272Y59659D01*

+X112178Y59730D01*

+X112073Y59786D01*

+X111962Y59824D01*

+X111845Y59845D01*

+X111727Y59847D01*

+X111610Y59830D01*

+X111609Y59830D01*

+Y64673D01*

+G37*

+G36*

+Y72500D02*X115441D01*

+Y72265D01*

+X114696Y72206D01*

+X113969Y72031D01*

+X113278Y71745D01*

+X112640Y71355D01*

+X112072Y70869D01*

+X111609Y70327D01*

+Y72500D01*

+G37*

+G36*

+X115441Y39000D02*X111609D01*

+Y42867D01*

+X111726Y42819D01*

+X111956Y42764D01*

+X112191Y42750D01*

+X115441Y42757D01*

+Y39000D01*

+G37*

+G36*

+X111609D02*X89273D01*

+Y42867D01*

+X89374Y42909D01*

+X89575Y43033D01*

+X89755Y43186D01*

+X89908Y43366D01*

+X90032Y43567D01*

+X90122Y43785D01*

+X90177Y44015D01*

+X90191Y44250D01*

+X90177Y50985D01*

+X90122Y51215D01*

+X90032Y51433D01*

+X89908Y51634D01*

+X89755Y51814D01*

+X89575Y51967D01*

+X89374Y52091D01*

+X89273Y52133D01*

+Y55170D01*

+X89384Y55204D01*

+X89491Y55256D01*

+X89587Y55323D01*

+X89672Y55405D01*

+X89743Y55500D01*

+X89797Y55605D01*

+X89956Y56008D01*

+X90073Y56425D01*

+X90152Y56852D01*

+X90191Y57283D01*

+Y57717D01*

+X90152Y58148D01*

+X90073Y58575D01*

+X89956Y58992D01*

+X89801Y59397D01*

+X89746Y59502D01*

+X89675Y59597D01*

+X89589Y59679D01*

+X89492Y59747D01*

+X89386Y59799D01*

+X89273Y59834D01*

+Y64673D01*

+X89296Y64699D01*

+X89686Y65337D01*

+X89972Y66028D01*

+X90147Y66755D01*

+X90191Y67500D01*

+X90147Y68245D01*

+X89972Y68972D01*

+X89686Y69663D01*

+X89296Y70301D01*

+X89273Y70327D01*

+Y72500D01*

+X111609D01*

+Y70327D01*

+X111586Y70301D01*

+X111196Y69663D01*

+X110910Y68972D01*

+X110735Y68245D01*

+X110676Y67500D01*

+X110735Y66755D01*

+X110910Y66028D01*

+X111196Y65337D01*

+X111586Y64699D01*

+X111609Y64673D01*

+Y59830D01*

+X111498Y59796D01*

+X111391Y59744D01*

+X111295Y59677D01*

+X111210Y59595D01*

+X111139Y59500D01*

+X111085Y59395D01*

+X110926Y58992D01*

+X110809Y58575D01*

+X110730Y58148D01*

+X110691Y57717D01*

+Y57283D01*

+X110730Y56852D01*

+X110809Y56425D01*

+X110926Y56008D01*

+X111081Y55603D01*

+X111136Y55498D01*

+X111207Y55403D01*

+X111293Y55321D01*

+X111390Y55253D01*

+X111496Y55201D01*

+X111609Y55166D01*

+Y52133D01*

+X111508Y52091D01*

+X111307Y51967D01*

+X111127Y51814D01*

+X110974Y51634D01*

+X110850Y51433D01*

+X110760Y51215D01*

+X110705Y50985D01*

+X110691Y50750D01*

+X110705Y44015D01*

+X110760Y43785D01*

+X110850Y43567D01*

+X110974Y43366D01*

+X111127Y43186D01*

+X111307Y43033D01*

+X111508Y42909D01*

+X111609Y42867D01*

+Y39000D01*

+G37*

+G36*

+X89273Y70327D02*X88810Y70869D01*

+X88242Y71355D01*

+X87604Y71745D01*

+X86913Y72031D01*

+X86186Y72206D01*

+X85441Y72265D01*

+Y72500D01*

+X89273D01*

+Y70327D01*

+G37*

+G36*

+Y52133D02*X89156Y52181D01*

+X88926Y52236D01*

+X88691Y52250D01*

+X85441Y52243D01*

+Y52750D01*

+X85658D01*

+X86089Y52789D01*

+X86516Y52868D01*

+X86933Y52985D01*

+X87338Y53140D01*

+X87443Y53195D01*

+X87538Y53266D01*

+X87620Y53352D01*

+X87688Y53449D01*

+X87740Y53555D01*

+X87775Y53669D01*

+X87791Y53786D01*

+X87789Y53905D01*

+X87768Y54022D01*

+X87730Y54134D01*

+X87674Y54238D01*

+X87603Y54333D01*

+X87517Y54415D01*

+X87420Y54483D01*

+X87314Y54535D01*

+X87200Y54570D01*

+X87083Y54586D01*

+X86964Y54584D01*

+X86848Y54564D01*

+X86736Y54523D01*

+X86461Y54414D01*

+X86176Y54334D01*

+X85884Y54280D01*

+X85589Y54253D01*

+X85441D01*

+Y60747D01*

+X85589D01*

+X85884Y60720D01*

+X86176Y60666D01*

+X86461Y60586D01*

+X86738Y60480D01*

+X86848Y60440D01*

+X86965Y60419D01*

+X87083Y60417D01*

+X87200Y60433D01*

+X87312Y60468D01*

+X87419Y60520D01*

+X87515Y60587D01*

+X87600Y60669D01*

+X87671Y60763D01*

+X87727Y60868D01*

+X87765Y60979D01*

+X87786Y61096D01*

+X87788Y61214D01*

+X87771Y61330D01*

+X87737Y61443D01*

+X87685Y61550D01*

+X87618Y61646D01*

+X87536Y61731D01*

+X87441Y61802D01*

+X87336Y61856D01*

+X86933Y62015D01*

+X86516Y62132D01*

+X86089Y62211D01*

+X85658Y62250D01*

+X85441D01*

+Y62735D01*

+X86186Y62794D01*

+X86913Y62969D01*

+X87604Y63255D01*

+X88242Y63645D01*

+X88810Y64131D01*

+X89273Y64673D01*

+Y59834D01*

+X89272Y59834D01*

+X89155Y59850D01*

+X89036Y59848D01*

+X88919Y59827D01*

+X88807Y59789D01*

+X88703Y59733D01*

+X88608Y59662D01*

+X88526Y59576D01*

+X88458Y59479D01*

+X88406Y59373D01*

+X88371Y59259D01*

+X88355Y59142D01*

+X88357Y59023D01*

+X88377Y58907D01*

+X88418Y58795D01*

+X88527Y58520D01*

+X88607Y58235D01*

+X88661Y57943D01*

+X88688Y57648D01*

+Y57352D01*

+X88661Y57057D01*

+X88607Y56765D01*

+X88527Y56480D01*

+X88421Y56203D01*

+X88381Y56093D01*

+X88360Y55976D01*

+X88358Y55858D01*

+X88374Y55741D01*

+X88409Y55629D01*

+X88461Y55522D01*

+X88528Y55426D01*

+X88610Y55341D01*

+X88704Y55270D01*

+X88809Y55214D01*

+X88920Y55176D01*

+X89037Y55155D01*

+X89155Y55153D01*

+X89271Y55170D01*

+X89273Y55170D01*

+Y52133D01*

+G37*

+G36*

+Y39000D02*X85441D01*

+Y42757D01*

+X88926Y42764D01*

+X89156Y42819D01*

+X89273Y42867D01*

+Y39000D01*

+G37*

+G36*

+X81609Y64673D02*X82072Y64131D01*

+X82640Y63645D01*

+X83278Y63255D01*

+X83969Y62969D01*

+X84696Y62794D01*

+X85441Y62735D01*

+Y62250D01*

+X85224D01*

+X84793Y62211D01*

+X84366Y62132D01*

+X83949Y62015D01*

+X83544Y61860D01*

+X83439Y61805D01*

+X83344Y61734D01*

+X83262Y61648D01*

+X83194Y61551D01*

+X83142Y61445D01*

+X83107Y61331D01*

+X83091Y61214D01*

+X83093Y61095D01*

+X83114Y60978D01*

+X83152Y60866D01*

+X83208Y60762D01*

+X83279Y60667D01*

+X83365Y60585D01*

+X83462Y60517D01*

+X83568Y60465D01*

+X83682Y60430D01*

+X83799Y60414D01*

+X83918Y60416D01*

+X84034Y60436D01*

+X84146Y60477D01*

+X84421Y60586D01*

+X84706Y60666D01*

+X84998Y60720D01*

+X85293Y60747D01*

+X85441D01*

+Y54253D01*

+X85293D01*

+X84998Y54280D01*

+X84706Y54334D01*

+X84421Y54414D01*

+X84144Y54520D01*

+X84034Y54560D01*

+X83917Y54581D01*

+X83799Y54583D01*

+X83682Y54567D01*

+X83570Y54532D01*

+X83463Y54480D01*

+X83367Y54413D01*

+X83282Y54331D01*

+X83211Y54237D01*

+X83155Y54132D01*

+X83117Y54021D01*

+X83096Y53904D01*

+X83094Y53786D01*

+X83111Y53670D01*

+X83145Y53557D01*

+X83197Y53450D01*

+X83264Y53354D01*

+X83346Y53269D01*

+X83441Y53198D01*

+X83546Y53144D01*

+X83949Y52985D01*

+X84366Y52868D01*

+X84793Y52789D01*

+X85224Y52750D01*

+X85441D01*

+Y52243D01*

+X81956Y52236D01*

+X81726Y52181D01*

+X81609Y52133D01*

+Y55166D01*

+X81610Y55166D01*

+X81727Y55150D01*

+X81846Y55152D01*

+X81963Y55173D01*

+X82075Y55211D01*

+X82179Y55267D01*

+X82274Y55338D01*

+X82356Y55424D01*

+X82424Y55521D01*

+X82476Y55627D01*

+X82511Y55741D01*

+X82527Y55858D01*

+X82525Y55977D01*

+X82505Y56093D01*

+X82464Y56205D01*

+X82355Y56480D01*

+X82275Y56765D01*

+X82221Y57057D01*

+X82194Y57352D01*

+Y57648D01*

+X82221Y57943D01*

+X82275Y58235D01*

+X82355Y58520D01*

+X82461Y58797D01*

+X82501Y58907D01*

+X82522Y59024D01*

+X82524Y59142D01*

+X82508Y59259D01*

+X82473Y59371D01*

+X82421Y59478D01*

+X82354Y59574D01*

+X82272Y59659D01*

+X82178Y59730D01*

+X82073Y59786D01*

+X81962Y59824D01*

+X81845Y59845D01*

+X81727Y59847D01*

+X81610Y59830D01*

+X81609Y59830D01*

+Y64673D01*

+G37*

+G36*

+Y72500D02*X85441D01*

+Y72265D01*

+X84696Y72206D01*

+X83969Y72031D01*

+X83278Y71745D01*

+X82640Y71355D01*

+X82072Y70869D01*

+X81609Y70327D01*

+Y72500D01*

+G37*

+G36*

+X85441Y39000D02*X81609D01*

+Y42867D01*

+X81726Y42819D01*

+X81956Y42764D01*

+X82191Y42750D01*

+X85441Y42757D01*

+Y39000D01*

+G37*

+G36*

+X81609D02*X75441D01*

+X72941Y41500D01*

+Y72500D01*

+X81609D01*

+Y70327D01*

+X81586Y70301D01*

+X81196Y69663D01*

+X80910Y68972D01*

+X80735Y68245D01*

+X80676Y67500D01*

+X80735Y66755D01*

+X80910Y66028D01*

+X81196Y65337D01*

+X81586Y64699D01*

+X81609Y64673D01*

+Y59830D01*

+X81498Y59796D01*

+X81391Y59744D01*

+X81295Y59677D01*

+X81210Y59595D01*

+X81139Y59500D01*

+X81085Y59395D01*

+X80926Y58992D01*

+X80809Y58575D01*

+X80730Y58148D01*

+X80691Y57717D01*

+Y57283D01*

+X80730Y56852D01*

+X80809Y56425D01*

+X80926Y56008D01*

+X81081Y55603D01*

+X81136Y55498D01*

+X81207Y55403D01*

+X81293Y55321D01*

+X81390Y55253D01*

+X81496Y55201D01*

+X81609Y55166D01*

+Y52133D01*

+X81508Y52091D01*

+X81307Y51967D01*

+X81127Y51814D01*

+X80974Y51634D01*

+X80850Y51433D01*

+X80760Y51215D01*

+X80705Y50985D01*

+X80691Y50750D01*

+X80705Y44015D01*

+X80760Y43785D01*

+X80850Y43567D01*

+X80974Y43366D01*

+X81127Y43186D01*

+X81307Y43033D01*

+X81508Y42909D01*

+X81609Y42867D01*

+Y39000D01*

+G37*

+G36*

+X308441Y113440D02*Y118440D01*

+X313941D01*

+Y113440D01*

+X308441D01*

+G37*

+G36*

+X267941Y333500D02*Y338500D01*

+X273441D01*

+Y333500D01*

+X267941D01*

+G37*

+G36*

+X214941Y258500D02*Y263500D01*

+X220441D01*

+Y258500D01*

+X214941D01*

+G37*

+G36*

+X218441Y257000D02*Y262000D01*

+X223941D01*

+Y257000D01*

+X218441D01*

+G37*

+G36*

+X437412Y53875D02*Y58875D01*

+X442912D01*

+Y53875D01*

+X437412D01*

+G37*

+G36*

+X221441Y145500D02*Y150500D01*

+X226941D01*

+Y145500D01*

+X221441D01*

+G37*

+G36*

+X306941Y139068D02*Y144068D01*

+X312441D01*

+Y139068D01*

+X306941D01*

+G37*

+G36*

+X383441Y160000D02*Y168000D01*

+X389941D01*

+Y160000D01*

+X383441D01*

+G37*

+G36*

+X428941Y106500D02*Y114500D01*

+X435441D01*

+Y106500D01*

+X428941D01*

+G37*

+G36*

+X419441Y72000D02*Y78000D01*

+X426441D01*

+Y72000D01*

+X419441D01*

+G37*

+G36*

+X238701Y288207D02*Y296207D01*

+X245201D01*

+Y288207D01*

+X238701D01*

+G37*

+G36*

+X386941Y83000D02*X397941D01*

+X397441Y41500D01*

+X386941D01*

+Y83000D01*

+G37*

+G36*

+X309438Y167500D02*X320941D01*

+Y76500D01*

+X309438D01*

+Y114947D01*

+X309480Y114879D01*

+X309664Y114663D01*

+X309880Y114479D01*

+X310121Y114331D01*

+X310383Y114223D01*

+X310659Y114157D01*

+X310941Y114134D01*

+X311223Y114157D01*

+X311499Y114223D01*

+X311761Y114331D01*

+X312002Y114479D01*

+X312218Y114663D01*

+X312402Y114879D01*

+X312550Y115120D01*

+X312658Y115382D01*

+X312724Y115658D01*

+X312741Y115940D01*

+X312724Y116222D01*

+X312658Y116498D01*

+X312550Y116760D01*

+X312402Y117001D01*

+X312218Y117217D01*

+X312002Y117401D01*

+X311761Y117549D01*

+X311499Y117657D01*

+X311223Y117723D01*

+X310941Y117746D01*

+X310659Y117723D01*

+X310383Y117657D01*

+X310121Y117549D01*

+X309880Y117401D01*

+X309664Y117217D01*

+X309480Y117001D01*

+X309438Y116933D01*

+Y134645D01*

+X309441Y134644D01*

+X309723Y134667D01*

+X309999Y134733D01*

+X310261Y134841D01*

+X310502Y134989D01*

+X310718Y135173D01*

+X310902Y135389D01*

+X311050Y135630D01*

+X311158Y135892D01*

+X311224Y136168D01*

+X311241Y136450D01*

+X311224Y136732D01*

+X311158Y137008D01*

+X311050Y137270D01*

+X310902Y137511D01*

+X310718Y137727D01*

+X310502Y137911D01*

+X310261Y138059D01*

+X309999Y138167D01*

+X309723Y138233D01*

+X309441Y138256D01*

+X309438Y138255D01*

+Y139763D01*

+X309441Y139762D01*

+X309723Y139785D01*

+X309999Y139851D01*

+X310261Y139959D01*

+X310502Y140107D01*

+X310718Y140291D01*

+X310902Y140507D01*

+X311050Y140748D01*

+X311158Y141010D01*

+X311224Y141286D01*

+X311241Y141568D01*

+X311224Y141850D01*

+X311158Y142126D01*

+X311050Y142388D01*

+X310902Y142629D01*

+X310718Y142845D01*

+X310502Y143029D01*

+X310261Y143177D01*

+X309999Y143285D01*

+X309723Y143351D01*

+X309441Y143374D01*

+X309438Y143373D01*

+Y167500D01*

+G37*

+G36*

+X305693D02*X309438D01*

+Y143373D01*

+X309159Y143351D01*

+X308883Y143285D01*

+X308621Y143177D01*

+X308380Y143029D01*

+X308164Y142845D01*

+X307980Y142629D01*

+X307832Y142388D01*

+X307724Y142126D01*

+X307658Y141850D01*

+X307635Y141568D01*

+X307658Y141286D01*

+X307724Y141010D01*

+X307832Y140748D01*

+X307980Y140507D01*

+X308164Y140291D01*

+X308380Y140107D01*

+X308621Y139959D01*

+X308883Y139851D01*

+X309159Y139785D01*

+X309438Y139763D01*

+Y138255D01*

+X309159Y138233D01*

+X308883Y138167D01*

+X308621Y138059D01*

+X308380Y137911D01*

+X308164Y137727D01*

+X307980Y137511D01*

+X307832Y137270D01*

+X307724Y137008D01*

+X307658Y136732D01*

+X307635Y136450D01*

+X307658Y136168D01*

+X307724Y135892D01*

+X307832Y135630D01*

+X307980Y135389D01*

+X308164Y135173D01*

+X308380Y134989D01*

+X308621Y134841D01*

+X308883Y134733D01*

+X309159Y134667D01*

+X309438Y134645D01*

+Y116933D01*

+X309332Y116760D01*

+X309224Y116498D01*

+X309158Y116222D01*

+X309135Y115940D01*

+X309158Y115658D01*

+X309224Y115382D01*

+X309332Y115120D01*

+X309438Y114947D01*

+Y76500D01*

+X305693D01*

+Y105695D01*

+X305696Y105694D01*

+X305978Y105717D01*

+X306254Y105783D01*

+X306516Y105891D01*

+X306757Y106039D01*

+X306973Y106223D01*

+X307157Y106439D01*

+X307305Y106680D01*

+X307413Y106942D01*

+X307479Y107218D01*

+X307496Y107500D01*

+X307479Y107782D01*

+X307413Y108058D01*

+X307305Y108320D01*

+X307157Y108561D01*

+X306973Y108777D01*

+X306757Y108961D01*

+X306516Y109109D01*

+X306254Y109217D01*

+X305978Y109283D01*

+X305696Y109306D01*

+X305693Y109305D01*

+Y167500D01*

+G37*

+G36*

+X245438D02*X305693D01*

+Y109305D01*

+X305414Y109283D01*

+X305138Y109217D01*

+X304876Y109109D01*

+X304635Y108961D01*

+X304419Y108777D01*

+X304235Y108561D01*

+X304087Y108320D01*

+X303979Y108058D01*

+X303913Y107782D01*

+X303890Y107500D01*

+X303913Y107218D01*

+X303979Y106942D01*

+X304087Y106680D01*

+X304235Y106439D01*

+X304419Y106223D01*

+X304635Y106039D01*

+X304876Y105891D01*

+X305138Y105783D01*

+X305414Y105717D01*

+X305693Y105695D01*

+Y76500D01*

+X245438D01*

+Y125695D01*

+X245441Y125694D01*

+X245723Y125717D01*

+X245999Y125783D01*

+X246261Y125891D01*

+X246502Y126039D01*

+X246718Y126223D01*

+X246902Y126439D01*

+X247050Y126680D01*

+X247158Y126942D01*

+X247224Y127218D01*

+X247241Y127500D01*

+X247224Y127782D01*

+X247158Y128058D01*

+X247050Y128320D01*

+X246902Y128561D01*

+X246718Y128777D01*

+X246502Y128961D01*

+X246261Y129109D01*

+X245999Y129217D01*

+X245723Y129283D01*

+X245441Y129306D01*

+X245438Y129305D01*

+Y167500D01*

+G37*

+G36*

+X234438D02*X245438D01*

+Y129305D01*

+X245159Y129283D01*

+X244883Y129217D01*

+X244621Y129109D01*

+X244380Y128961D01*

+X244164Y128777D01*

+X243980Y128561D01*

+X243832Y128320D01*

+X243724Y128058D01*

+X243658Y127782D01*

+X243635Y127500D01*

+X243658Y127218D01*

+X243724Y126942D01*

+X243832Y126680D01*

+X243980Y126439D01*

+X244164Y126223D01*

+X244380Y126039D01*

+X244621Y125891D01*

+X244883Y125783D01*

+X245159Y125717D01*

+X245438Y125695D01*

+Y76500D01*

+X234438D01*

+Y120695D01*

+X234441Y120694D01*

+X234723Y120717D01*

+X234999Y120783D01*

+X235261Y120891D01*

+X235502Y121039D01*

+X235718Y121223D01*

+X235902Y121439D01*

+X236050Y121680D01*

+X236158Y121942D01*

+X236224Y122218D01*

+X236241Y122500D01*

+X236224Y122782D01*

+X236158Y123058D01*

+X236050Y123320D01*

+X235902Y123561D01*

+X235718Y123777D01*

+X235502Y123961D01*

+X235261Y124109D01*

+X234999Y124217D01*

+X234723Y124283D01*

+X234441Y124306D01*

+X234438Y124305D01*

+Y132007D01*

+X234480Y131939D01*

+X234664Y131723D01*

+X234880Y131539D01*

+X235121Y131391D01*

+X235383Y131283D01*

+X235659Y131217D01*

+X235941Y131194D01*

+X236223Y131217D01*

+X236499Y131283D01*

+X236761Y131391D01*

+X237002Y131539D01*

+X237218Y131723D01*

+X237402Y131939D01*

+X237550Y132180D01*

+X237658Y132442D01*

+X237724Y132718D01*

+X237741Y133000D01*

+X237724Y133282D01*

+X237658Y133558D01*

+X237550Y133820D01*

+X237402Y134061D01*

+X237218Y134277D01*

+X237002Y134461D01*

+X236761Y134609D01*

+X236499Y134717D01*

+X236223Y134783D01*

+X235941Y134806D01*

+X235659Y134783D01*

+X235383Y134717D01*

+X235121Y134609D01*

+X234880Y134461D01*

+X234664Y134277D01*

+X234480Y134061D01*

+X234438Y133993D01*

+Y167500D01*

+G37*

+G36*

+X223938D02*X234438D01*

+Y133993D01*

+X234332Y133820D01*

+X234224Y133558D01*

+X234158Y133282D01*

+X234135Y133000D01*

+X234158Y132718D01*

+X234224Y132442D01*

+X234332Y132180D01*

+X234438Y132007D01*

+Y124305D01*

+X234159Y124283D01*

+X233883Y124217D01*

+X233621Y124109D01*

+X233380Y123961D01*

+X233164Y123777D01*

+X232980Y123561D01*

+X232832Y123320D01*

+X232724Y123058D01*

+X232658Y122782D01*

+X232635Y122500D01*

+X232658Y122218D01*

+X232724Y121942D01*

+X232832Y121680D01*

+X232980Y121439D01*

+X233164Y121223D01*

+X233380Y121039D01*

+X233621Y120891D01*

+X233883Y120783D01*

+X234159Y120717D01*

+X234438Y120695D01*

+Y76500D01*

+X223938D01*

+Y146195D01*

+X223941Y146194D01*

+X224223Y146217D01*

+X224499Y146283D01*

+X224761Y146391D01*

+X225002Y146539D01*

+X225218Y146723D01*

+X225402Y146939D01*

+X225550Y147180D01*

+X225658Y147442D01*

+X225724Y147718D01*

+X225741Y148000D01*

+X225724Y148282D01*

+X225658Y148558D01*

+X225550Y148820D01*

+X225402Y149061D01*

+X225218Y149277D01*

+X225002Y149461D01*

+X224761Y149609D01*

+X224499Y149717D01*

+X224223Y149783D01*

+X223941Y149806D01*

+X223938Y149805D01*

+Y167500D01*

+G37*

+G36*

+X208938D02*X223938D01*

+Y149805D01*

+X223659Y149783D01*

+X223383Y149717D01*

+X223121Y149609D01*

+X222880Y149461D01*

+X222664Y149277D01*

+X222480Y149061D01*

+X222332Y148820D01*

+X222224Y148558D01*

+X222158Y148282D01*

+X222135Y148000D01*

+X222158Y147718D01*

+X222224Y147442D01*

+X222332Y147180D01*

+X222480Y146939D01*

+X222664Y146723D01*

+X222880Y146539D01*

+X223121Y146391D01*

+X223383Y146283D01*

+X223659Y146217D01*

+X223938Y146195D01*

+Y76500D01*

+X208938D01*

+Y146195D01*

+X208941Y146194D01*

+X209223Y146217D01*

+X209499Y146283D01*

+X209761Y146391D01*

+X210002Y146539D01*

+X210218Y146723D01*

+X210402Y146939D01*

+X210550Y147180D01*

+X210658Y147442D01*

+X210724Y147718D01*

+X210741Y148000D01*

+X210724Y148282D01*

+X210658Y148558D01*

+X210550Y148820D01*

+X210402Y149061D01*

+X210218Y149277D01*

+X210002Y149461D01*

+X209761Y149609D01*

+X209499Y149717D01*

+X209223Y149783D01*

+X208941Y149806D01*

+X208938Y149805D01*

+Y167500D01*

+G37*

+G36*

+X198438D02*X208938D01*

+Y149805D01*

+X208659Y149783D01*

+X208383Y149717D01*

+X208121Y149609D01*

+X207880Y149461D01*

+X207664Y149277D01*

+X207480Y149061D01*

+X207332Y148820D01*

+X207224Y148558D01*

+X207158Y148282D01*

+X207135Y148000D01*

+X207158Y147718D01*

+X207224Y147442D01*

+X207332Y147180D01*

+X207480Y146939D01*

+X207664Y146723D01*

+X207880Y146539D01*

+X208121Y146391D01*

+X208383Y146283D01*

+X208659Y146217D01*

+X208938Y146195D01*

+Y76500D01*

+X198438D01*

+Y120695D01*

+X198441Y120694D01*

+X198723Y120717D01*

+X198999Y120783D01*

+X199261Y120891D01*

+X199502Y121039D01*

+X199718Y121223D01*

+X199902Y121439D01*

+X200050Y121680D01*

+X200158Y121942D01*

+X200224Y122218D01*

+X200241Y122500D01*

+X200224Y122782D01*

+X200158Y123058D01*

+X200050Y123320D01*

+X199902Y123561D01*

+X199718Y123777D01*

+X199502Y123961D01*

+X199261Y124109D01*

+X198999Y124217D01*

+X198723Y124283D01*

+X198441Y124306D01*

+X198438Y124305D01*

+Y167500D01*

+G37*

+G36*

+X195438D02*X198438D01*

+Y124305D01*

+X198159Y124283D01*

+X197883Y124217D01*

+X197621Y124109D01*

+X197380Y123961D01*

+X197164Y123777D01*

+X196980Y123561D01*

+X196832Y123320D01*

+X196724Y123058D01*

+X196658Y122782D01*

+X196635Y122500D01*

+X196658Y122218D01*

+X196724Y121942D01*

+X196832Y121680D01*

+X196980Y121439D01*

+X197164Y121223D01*

+X197380Y121039D01*

+X197621Y120891D01*

+X197883Y120783D01*

+X198159Y120717D01*

+X198438Y120695D01*

+Y76500D01*

+X195438D01*

+Y131195D01*

+X195441Y131194D01*

+X195723Y131217D01*

+X195999Y131283D01*

+X196261Y131391D01*

+X196502Y131539D01*

+X196718Y131723D01*

+X196902Y131939D01*

+X197050Y132180D01*

+X197158Y132442D01*

+X197224Y132718D01*

+X197241Y133000D01*

+X197224Y133282D01*

+X197158Y133558D01*

+X197050Y133820D01*

+X196902Y134061D01*

+X196718Y134277D01*

+X196502Y134461D01*

+X196261Y134609D01*

+X195999Y134717D01*

+X195723Y134783D01*

+X195441Y134806D01*

+X195438Y134805D01*

+Y167500D01*

+G37*

+G36*

+X193387D02*X195438D01*

+Y134805D01*

+X195159Y134783D01*

+X194883Y134717D01*

+X194621Y134609D01*

+X194380Y134461D01*

+X194164Y134277D01*

+X193980Y134061D01*

+X193832Y133820D01*

+X193724Y133558D01*

+X193658Y133282D01*

+X193635Y133000D01*

+X193658Y132718D01*

+X193724Y132442D01*

+X193832Y132180D01*

+X193980Y131939D01*

+X194164Y131723D01*

+X194380Y131539D01*

+X194621Y131391D01*

+X194883Y131283D01*

+X195159Y131217D01*

+X195438Y131195D01*

+Y76500D01*

+X193387D01*

+Y125695D01*

+X193390Y125694D01*

+X193672Y125717D01*

+X193948Y125783D01*

+X194210Y125891D01*

+X194451Y126039D01*

+X194667Y126223D01*

+X194851Y126439D01*

+X194999Y126680D01*

+X195107Y126942D01*

+X195173Y127218D01*

+X195190Y127500D01*

+X195173Y127782D01*

+X195107Y128058D01*

+X194999Y128320D01*

+X194851Y128561D01*

+X194667Y128777D01*

+X194451Y128961D01*

+X194210Y129109D01*

+X193948Y129217D01*

+X193672Y129283D01*

+X193390Y129306D01*

+X193387Y129305D01*

+Y167500D01*

+G37*

+G36*

+X169438Y216500D02*X173441D01*

+Y188427D01*

+X173264Y188319D01*

+X172749Y187879D01*

+X172309Y187364D01*

+X171956Y186787D01*

+X171697Y186162D01*

+X171539Y185504D01*

+X171486Y184829D01*

+X171539Y184154D01*

+X171697Y183496D01*

+X171956Y182871D01*

+X172309Y182294D01*

+X172749Y181779D01*

+X173264Y181339D01*

+X173441Y181231D01*

+Y178427D01*

+X173264Y178319D01*

+X172749Y177879D01*

+X172309Y177364D01*

+X171956Y176787D01*

+X171697Y176162D01*

+X171539Y175504D01*

+X171486Y174829D01*

+X171539Y174154D01*

+X171697Y173496D01*

+X171956Y172871D01*

+X172309Y172294D01*

+X172749Y171779D01*

+X173264Y171339D01*

+X173441Y171231D01*

+Y167500D01*

+X193387D01*

+Y129305D01*

+X193108Y129283D01*

+X192832Y129217D01*

+X192570Y129109D01*

+X192329Y128961D01*

+X192113Y128777D01*

+X191929Y128561D01*

+X191781Y128320D01*

+X191673Y128058D01*

+X191607Y127782D01*

+X191584Y127500D01*

+X191607Y127218D01*

+X191673Y126942D01*

+X191781Y126680D01*

+X191929Y126439D01*

+X192113Y126223D01*

+X192329Y126039D01*

+X192570Y125891D01*

+X192832Y125783D01*

+X193108Y125717D01*

+X193387Y125695D01*

+Y76500D01*

+X169438D01*

+Y172538D01*

+X169642Y172871D01*

+X169901Y173496D01*

+X170059Y174154D01*

+X170099Y174829D01*

+X170059Y175504D01*

+X169901Y176162D01*

+X169642Y176787D01*

+X169438Y177120D01*

+Y182538D01*

+X169642Y182871D01*

+X169901Y183496D01*

+X170059Y184154D01*

+X170099Y184829D01*

+X170059Y185504D01*

+X169901Y186162D01*

+X169642Y186787D01*

+X169438Y187120D01*

+Y199695D01*

+X169441Y199694D01*

+X169723Y199717D01*

+X169999Y199783D01*

+X170261Y199891D01*

+X170502Y200039D01*

+X170718Y200223D01*

+X170902Y200439D01*

+X171050Y200680D01*

+X171158Y200942D01*

+X171224Y201218D01*

+X171241Y201500D01*

+X171224Y201782D01*

+X171158Y202058D01*

+X171050Y202320D01*

+X170902Y202561D01*

+X170718Y202777D01*

+X170502Y202961D01*

+X170261Y203109D01*

+X169999Y203217D01*

+X169723Y203283D01*

+X169441Y203306D01*

+X169438Y203305D01*

+Y206695D01*

+X169441Y206694D01*

+X169723Y206717D01*

+X169999Y206783D01*

+X170261Y206891D01*

+X170502Y207039D01*

+X170718Y207223D01*

+X170902Y207439D01*

+X171050Y207680D01*

+X171158Y207942D01*

+X171224Y208218D01*

+X171241Y208500D01*

+X171224Y208782D01*

+X171158Y209058D01*

+X171050Y209320D01*

+X170902Y209561D01*

+X170718Y209777D01*

+X170502Y209961D01*

+X170261Y210109D01*

+X169999Y210217D01*

+X169723Y210283D01*

+X169441Y210306D01*

+X169438Y210305D01*

+Y212195D01*

+X169441Y212194D01*

+X169723Y212217D01*

+X169999Y212283D01*

+X170261Y212391D01*

+X170502Y212539D01*

+X170718Y212723D01*

+X170902Y212939D01*

+X171050Y213180D01*

+X171158Y213442D01*

+X171224Y213718D01*

+X171241Y214000D01*

+X171224Y214282D01*

+X171158Y214558D01*

+X171050Y214820D01*

+X170902Y215061D01*

+X170718Y215277D01*

+X170502Y215461D01*

+X170261Y215609D01*

+X169999Y215717D01*

+X169723Y215783D01*

+X169441Y215806D01*

+X169438Y215805D01*

+Y216500D01*

+G37*

+G36*

+Y177120D02*X169289Y177364D01*

+X168849Y177879D01*

+X168334Y178319D01*

+X167757Y178672D01*

+X167132Y178931D01*

+X166474Y179089D01*

+X165938Y179131D01*

+Y180527D01*

+X166474Y180569D01*

+X167132Y180727D01*

+X167757Y180986D01*

+X168334Y181339D01*

+X168849Y181779D01*

+X169289Y182294D01*

+X169438Y182538D01*

+Y177120D01*

+G37*

+G36*

+Y76500D02*X165938D01*

+Y170527D01*

+X166474Y170569D01*

+X167132Y170727D01*

+X167757Y170986D01*

+X168334Y171339D01*

+X168849Y171779D01*

+X169289Y172294D01*

+X169438Y172538D01*

+Y76500D01*

+G37*

+G36*

+X165938Y278500D02*X168441D01*

+Y216500D01*

+X169438D01*

+Y215805D01*

+X169159Y215783D01*

+X168883Y215717D01*

+X168621Y215609D01*

+X168380Y215461D01*

+X168164Y215277D01*

+X167980Y215061D01*

+X167832Y214820D01*

+X167724Y214558D01*

+X167658Y214282D01*

+X167635Y214000D01*

+X167658Y213718D01*

+X167724Y213442D01*

+X167832Y213180D01*

+X167980Y212939D01*

+X168164Y212723D01*

+X168380Y212539D01*

+X168621Y212391D01*

+X168883Y212283D01*

+X169159Y212217D01*

+X169438Y212195D01*

+Y210305D01*

+X169159Y210283D01*

+X168883Y210217D01*

+X168621Y210109D01*

+X168380Y209961D01*

+X168164Y209777D01*

+X167980Y209561D01*

+X167832Y209320D01*

+X167724Y209058D01*

+X167658Y208782D01*

+X167635Y208500D01*

+X167658Y208218D01*

+X167724Y207942D01*

+X167832Y207680D01*

+X167980Y207439D01*

+X168164Y207223D01*

+X168380Y207039D01*

+X168621Y206891D01*

+X168883Y206783D01*

+X169159Y206717D01*

+X169438Y206695D01*

+Y203305D01*

+X169159Y203283D01*

+X168883Y203217D01*

+X168621Y203109D01*

+X168380Y202961D01*

+X168164Y202777D01*

+X167980Y202561D01*

+X167832Y202320D01*

+X167724Y202058D01*

+X167658Y201782D01*

+X167635Y201500D01*

+X167658Y201218D01*

+X167724Y200942D01*

+X167832Y200680D01*

+X167980Y200439D01*

+X168164Y200223D01*

+X168380Y200039D01*

+X168621Y199891D01*

+X168883Y199783D01*

+X169159Y199717D01*

+X169438Y199695D01*

+Y187120D01*

+X169289Y187364D01*

+X168849Y187879D01*

+X168334Y188319D01*

+X167757Y188672D01*

+X167132Y188931D01*

+X166474Y189089D01*

+X165938Y189131D01*

+Y218695D01*

+X165941Y218694D01*

+X166223Y218717D01*

+X166499Y218783D01*

+X166761Y218891D01*

+X167002Y219039D01*

+X167218Y219223D01*

+X167402Y219439D01*

+X167550Y219680D01*

+X167658Y219942D01*

+X167724Y220218D01*

+X167741Y220500D01*

+X167724Y220782D01*

+X167658Y221058D01*

+X167550Y221320D01*

+X167402Y221561D01*

+X167218Y221777D01*

+X167002Y221961D01*

+X166761Y222109D01*

+X166499Y222217D01*

+X166223Y222283D01*

+X165941Y222306D01*

+X165938Y222305D01*

+Y224695D01*

+X165941Y224694D01*

+X166223Y224717D01*

+X166499Y224783D01*

+X166761Y224891D01*

+X167002Y225039D01*

+X167218Y225223D01*

+X167402Y225439D01*

+X167550Y225680D01*

+X167658Y225942D01*

+X167724Y226218D01*

+X167741Y226500D01*

+X167724Y226782D01*

+X167658Y227058D01*

+X167550Y227320D01*

+X167402Y227561D01*

+X167218Y227777D01*

+X167002Y227961D01*

+X166761Y228109D01*

+X166499Y228217D01*

+X166223Y228283D01*

+X165941Y228306D01*

+X165938Y228305D01*

+Y229195D01*

+X165941Y229194D01*

+X166223Y229217D01*

+X166499Y229283D01*

+X166761Y229391D01*

+X167002Y229539D01*

+X167218Y229723D01*

+X167402Y229939D01*

+X167550Y230180D01*

+X167658Y230442D01*

+X167724Y230718D01*

+X167741Y231000D01*

+X167724Y231282D01*

+X167658Y231558D01*

+X167550Y231820D01*

+X167402Y232061D01*

+X167218Y232277D01*

+X167002Y232461D01*

+X166761Y232609D01*

+X166499Y232717D01*

+X166223Y232783D01*

+X165941Y232806D01*

+X165938Y232805D01*

+Y278500D01*

+G37*

+G36*

+Y179131D02*X165799Y179142D01*

+X165124Y179089D01*

+X164466Y178931D01*

+X163938Y178712D01*

+Y180946D01*

+X164466Y180727D01*

+X165124Y180569D01*

+X165799Y180516D01*

+X165938Y180527D01*

+Y179131D01*

+G37*

+G36*

+Y76500D02*X163938D01*

+Y125695D01*

+X163941Y125694D01*

+X164223Y125717D01*

+X164499Y125783D01*

+X164761Y125891D01*

+X165002Y126039D01*

+X165218Y126223D01*

+X165402Y126439D01*

+X165550Y126680D01*

+X165658Y126942D01*

+X165724Y127218D01*

+X165741Y127500D01*

+X165724Y127782D01*

+X165658Y128058D01*

+X165550Y128320D01*

+X165402Y128561D01*

+X165218Y128777D01*

+X165002Y128961D01*

+X164761Y129109D01*

+X164499Y129217D01*

+X164223Y129283D01*

+X163941Y129306D01*

+X163938Y129305D01*

+Y170946D01*

+X164466Y170727D01*

+X165124Y170569D01*

+X165799Y170516D01*

+X165938Y170527D01*

+Y76500D01*

+G37*

+G36*

+X163938Y278500D02*X165938D01*

+Y232805D01*

+X165659Y232783D01*

+X165383Y232717D01*

+X165121Y232609D01*

+X164880Y232461D01*

+X164664Y232277D01*

+X164480Y232061D01*

+X164332Y231820D01*

+X164224Y231558D01*

+X164158Y231282D01*

+X164135Y231000D01*

+X164158Y230718D01*

+X164224Y230442D01*

+X164332Y230180D01*

+X164480Y229939D01*

+X164664Y229723D01*

+X164880Y229539D01*

+X165121Y229391D01*

+X165383Y229283D01*

+X165659Y229217D01*

+X165938Y229195D01*

+Y228305D01*

+X165659Y228283D01*

+X165383Y228217D01*

+X165121Y228109D01*

+X164880Y227961D01*

+X164664Y227777D01*

+X164480Y227561D01*

+X164332Y227320D01*

+X164224Y227058D01*

+X164158Y226782D01*

+X164135Y226500D01*

+X164158Y226218D01*

+X164224Y225942D01*

+X164332Y225680D01*

+X164480Y225439D01*

+X164664Y225223D01*

+X164880Y225039D01*

+X165121Y224891D01*

+X165383Y224783D01*

+X165659Y224717D01*

+X165938Y224695D01*

+Y222305D01*

+X165659Y222283D01*

+X165383Y222217D01*

+X165121Y222109D01*

+X164880Y221961D01*

+X164664Y221777D01*

+X164480Y221561D01*

+X164332Y221320D01*

+X164224Y221058D01*

+X164158Y220782D01*

+X164135Y220500D01*

+X164158Y220218D01*

+X164224Y219942D01*

+X164332Y219680D01*

+X164480Y219439D01*

+X164664Y219223D01*

+X164880Y219039D01*

+X165121Y218891D01*

+X165383Y218783D01*

+X165659Y218717D01*

+X165938Y218695D01*

+Y189131D01*

+X165799Y189142D01*

+X165124Y189089D01*

+X164466Y188931D01*

+X163938Y188712D01*

+Y241498D01*

+X164050Y241680D01*

+X164158Y241942D01*

+X164224Y242218D01*

+X164241Y242500D01*

+X164224Y242782D01*

+X164158Y243058D01*

+X164050Y243320D01*

+X163938Y243502D01*

+Y247498D01*

+X164050Y247680D01*

+X164158Y247942D01*

+X164224Y248218D01*

+X164241Y248500D01*

+X164224Y248782D01*

+X164158Y249058D01*

+X164050Y249320D01*

+X163938Y249502D01*

+Y261498D01*

+X164050Y261680D01*

+X164158Y261942D01*

+X164224Y262218D01*

+X164241Y262500D01*

+X164224Y262782D01*

+X164158Y263058D01*

+X164050Y263320D01*

+X163938Y263502D01*

+Y267000D01*

+X164002Y267039D01*

+X164218Y267223D01*

+X164402Y267439D01*

+X164550Y267680D01*

+X164658Y267942D01*

+X164724Y268218D01*

+X164741Y268500D01*

+X164724Y268782D01*

+X164658Y269058D01*

+X164550Y269320D01*

+X164402Y269561D01*

+X164218Y269777D01*

+X164002Y269961D01*

+X163938Y270000D01*

+Y273000D01*

+X164002Y273039D01*

+X164218Y273223D01*

+X164402Y273439D01*

+X164550Y273680D01*

+X164658Y273942D01*

+X164724Y274218D01*

+X164741Y274500D01*

+X164724Y274782D01*

+X164658Y275058D01*

+X164550Y275320D01*

+X164402Y275561D01*

+X164218Y275777D01*

+X164002Y275961D01*

+X163938Y276000D01*

+Y278500D01*

+G37*

+G36*

+X161938Y172913D02*X161956Y172871D01*

+X162309Y172294D01*

+X162749Y171779D01*

+X163264Y171339D01*

+X163841Y170986D01*

+X163938Y170946D01*

+Y129305D01*

+X163659Y129283D01*

+X163383Y129217D01*

+X163121Y129109D01*

+X162880Y128961D01*

+X162664Y128777D01*

+X162480Y128561D01*

+X162332Y128320D01*

+X162224Y128058D01*

+X162158Y127782D01*

+X162135Y127500D01*

+X162158Y127218D01*

+X162224Y126942D01*

+X162332Y126680D01*

+X162480Y126439D01*

+X162664Y126223D01*

+X162880Y126039D01*

+X163121Y125891D01*

+X163383Y125783D01*

+X163659Y125717D01*

+X163938Y125695D01*

+Y76500D01*

+X161938D01*

+Y172913D01*

+G37*

+G36*

+Y182913D02*X161956Y182871D01*

+X162309Y182294D01*

+X162749Y181779D01*

+X163264Y181339D01*

+X163841Y180986D01*

+X163938Y180946D01*

+Y178712D01*

+X163841Y178672D01*

+X163264Y178319D01*

+X162749Y177879D01*

+X162309Y177364D01*

+X161956Y176787D01*

+X161938Y176745D01*

+Y182913D01*

+G37*

+G36*

+Y240770D02*X162159Y240717D01*

+X162441Y240694D01*

+X162723Y240717D01*

+X162999Y240783D01*

+X163261Y240891D01*

+X163502Y241039D01*

+X163718Y241223D01*

+X163902Y241439D01*

+X163938Y241498D01*

+Y188712D01*

+X163841Y188672D01*

+X163264Y188319D01*

+X162749Y187879D01*

+X162309Y187364D01*

+X161956Y186787D01*

+X161938Y186745D01*

+Y240770D01*

+G37*

+G36*

+Y246770D02*X162159Y246717D01*

+X162441Y246694D01*

+X162723Y246717D01*

+X162999Y246783D01*

+X163261Y246891D01*

+X163502Y247039D01*

+X163718Y247223D01*

+X163902Y247439D01*

+X163938Y247498D01*

+Y243502D01*

+X163902Y243561D01*

+X163718Y243777D01*

+X163502Y243961D01*

+X163261Y244109D01*

+X162999Y244217D01*

+X162723Y244283D01*

+X162441Y244306D01*

+X162159Y244283D01*

+X161938Y244230D01*

+Y246770D01*

+G37*

+G36*

+Y260770D02*X162159Y260717D01*

+X162441Y260694D01*

+X162723Y260717D01*

+X162999Y260783D01*

+X163261Y260891D01*

+X163502Y261039D01*

+X163718Y261223D01*

+X163902Y261439D01*

+X163938Y261498D01*

+Y249502D01*

+X163902Y249561D01*

+X163718Y249777D01*

+X163502Y249961D01*

+X163261Y250109D01*

+X162999Y250217D01*

+X162723Y250283D01*

+X162441Y250306D01*

+X162159Y250283D01*

+X161938Y250230D01*

+Y253195D01*

+X161941Y253194D01*

+X162223Y253217D01*

+X162499Y253283D01*

+X162761Y253391D01*

+X163002Y253539D01*

+X163218Y253723D01*

+X163402Y253939D01*

+X163550Y254180D01*

+X163658Y254442D01*

+X163724Y254718D01*

+X163741Y255000D01*

+X163724Y255282D01*

+X163658Y255558D01*

+X163550Y255820D01*

+X163402Y256061D01*

+X163218Y256277D01*

+X163002Y256461D01*

+X162761Y256609D01*

+X162499Y256717D01*

+X162223Y256783D01*

+X161941Y256806D01*

+X161938Y256805D01*

+Y260770D01*

+G37*

+G36*

+Y267003D02*X162121Y266891D01*

+X162383Y266783D01*

+X162659Y266717D01*

+X162941Y266694D01*

+X163223Y266717D01*

+X163499Y266783D01*

+X163761Y266891D01*

+X163938Y267000D01*

+Y263502D01*

+X163902Y263561D01*

+X163718Y263777D01*

+X163502Y263961D01*

+X163261Y264109D01*

+X162999Y264217D01*

+X162723Y264283D01*

+X162441Y264306D01*

+X162159Y264283D01*

+X161938Y264230D01*

+Y267003D01*

+G37*

+G36*

+Y273003D02*X162121Y272891D01*

+X162383Y272783D01*

+X162659Y272717D01*

+X162941Y272694D01*

+X163223Y272717D01*

+X163499Y272783D01*

+X163761Y272891D01*

+X163938Y273000D01*

+Y270000D01*

+X163761Y270109D01*

+X163499Y270217D01*

+X163223Y270283D01*

+X162941Y270306D01*

+X162659Y270283D01*

+X162383Y270217D01*

+X162121Y270109D01*

+X161938Y269997D01*

+Y273003D01*

+G37*

+G36*

+Y278500D02*X163938D01*

+Y276000D01*

+X163761Y276109D01*

+X163499Y276217D01*

+X163223Y276283D01*

+X162941Y276306D01*

+X162659Y276283D01*

+X162383Y276217D01*

+X162121Y276109D01*

+X161938Y275997D01*

+Y278500D01*

+G37*

+G36*

+X152438Y342500D02*X156941D01*

+Y329826D01*

+X156832Y329649D01*

+X156724Y329387D01*

+X156658Y329111D01*

+X156635Y328829D01*

+X156658Y328547D01*

+X156724Y328271D01*

+X156832Y328009D01*

+X156941Y327832D01*

+Y327497D01*

+X156832Y327320D01*

+X156724Y327058D01*

+X156658Y326782D01*

+X156635Y326500D01*

+X156658Y326218D01*

+X156724Y325942D01*

+X156832Y325680D01*

+X156941Y325503D01*

+Y324826D01*

+X156832Y324649D01*

+X156724Y324387D01*

+X156658Y324111D01*

+X156635Y323829D01*

+X156658Y323547D01*

+X156724Y323271D01*

+X156832Y323009D01*

+X156941Y322832D01*

+Y278500D01*

+X161938D01*

+Y275997D01*

+X161880Y275961D01*

+X161664Y275777D01*

+X161480Y275561D01*

+X161332Y275320D01*

+X161224Y275058D01*

+X161158Y274782D01*

+X161135Y274500D01*

+X161158Y274218D01*

+X161224Y273942D01*

+X161332Y273680D01*

+X161480Y273439D01*

+X161664Y273223D01*

+X161880Y273039D01*

+X161938Y273003D01*

+Y269997D01*

+X161880Y269961D01*

+X161664Y269777D01*

+X161480Y269561D01*

+X161332Y269320D01*

+X161224Y269058D01*

+X161158Y268782D01*

+X161135Y268500D01*

+X161158Y268218D01*

+X161224Y267942D01*

+X161332Y267680D01*

+X161480Y267439D01*

+X161664Y267223D01*

+X161880Y267039D01*

+X161938Y267003D01*

+Y264230D01*

+X161883Y264217D01*

+X161621Y264109D01*

+X161380Y263961D01*

+X161164Y263777D01*

+X160980Y263561D01*

+X160832Y263320D01*

+X160724Y263058D01*

+X160658Y262782D01*

+X160635Y262500D01*

+X160658Y262218D01*

+X160724Y261942D01*

+X160832Y261680D01*

+X160980Y261439D01*

+X161164Y261223D01*

+X161380Y261039D01*

+X161621Y260891D01*

+X161883Y260783D01*

+X161938Y260770D01*

+Y256805D01*

+X161659Y256783D01*

+X161383Y256717D01*

+X161121Y256609D01*

+X160880Y256461D01*

+X160664Y256277D01*

+X160480Y256061D01*

+X160332Y255820D01*

+X160224Y255558D01*

+X160158Y255282D01*

+X160135Y255000D01*

+X160158Y254718D01*

+X160224Y254442D01*

+X160332Y254180D01*

+X160480Y253939D01*

+X160664Y253723D01*

+X160880Y253539D01*

+X161121Y253391D01*

+X161383Y253283D01*

+X161659Y253217D01*

+X161938Y253195D01*

+Y250230D01*

+X161883Y250217D01*

+X161621Y250109D01*

+X161380Y249961D01*

+X161164Y249777D01*

+X160980Y249561D01*

+X160832Y249320D01*

+X160724Y249058D01*

+X160658Y248782D01*

+X160635Y248500D01*

+X160658Y248218D01*

+X160724Y247942D01*

+X160832Y247680D01*

+X160980Y247439D01*

+X161164Y247223D01*

+X161380Y247039D01*

+X161621Y246891D01*

+X161883Y246783D01*

+X161938Y246770D01*

+Y244230D01*

+X161883Y244217D01*

+X161621Y244109D01*

+X161380Y243961D01*

+X161164Y243777D01*

+X160980Y243561D01*

+X160832Y243320D01*

+X160724Y243058D01*

+X160658Y242782D01*

+X160635Y242500D01*

+X160658Y242218D01*

+X160724Y241942D01*

+X160832Y241680D01*

+X160980Y241439D01*

+X161164Y241223D01*

+X161380Y241039D01*

+X161621Y240891D01*

+X161883Y240783D01*

+X161938Y240770D01*

+Y186745D01*

+X161697Y186162D01*

+X161539Y185504D01*

+X161486Y184829D01*

+X161539Y184154D01*

+X161697Y183496D01*

+X161938Y182913D01*

+Y176745D01*

+X161697Y176162D01*

+X161539Y175504D01*

+X161486Y174829D01*

+X161539Y174154D01*

+X161697Y173496D01*

+X161938Y172913D01*

+Y76500D01*

+X152438D01*

+Y119695D01*

+X152441Y119694D01*

+X152723Y119717D01*

+X152999Y119783D01*

+X153261Y119891D01*

+X153502Y120039D01*

+X153718Y120223D01*

+X153902Y120439D01*

+X154050Y120680D01*

+X154158Y120942D01*

+X154224Y121218D01*

+X154241Y121500D01*

+X154224Y121782D01*

+X154158Y122058D01*

+X154050Y122320D01*

+X153902Y122561D01*

+X153718Y122777D01*

+X153502Y122961D01*

+X153261Y123109D01*

+X152999Y123217D01*

+X152723Y123283D01*

+X152441Y123306D01*

+X152438Y123305D01*

+Y130268D01*

+X152499Y130283D01*

+X152761Y130391D01*

+X153002Y130539D01*

+X153218Y130723D01*

+X153402Y130939D01*

+X153550Y131180D01*

+X153658Y131442D01*

+X153724Y131718D01*

+X153741Y132000D01*

+X153724Y132282D01*

+X153658Y132558D01*

+X153550Y132820D01*

+X153402Y133061D01*

+X153218Y133277D01*

+X153002Y133461D01*

+X152761Y133609D01*

+X152499Y133717D01*

+X152438Y133732D01*

+Y172143D01*

+X152749Y171779D01*

+X153264Y171339D01*

+X153841Y170986D01*

+X154466Y170727D01*

+X155124Y170569D01*

+X155799Y170516D01*

+X156474Y170569D01*

+X157132Y170727D01*

+X157757Y170986D01*

+X158334Y171339D01*

+X158849Y171779D01*

+X159289Y172294D01*

+X159642Y172871D01*

+X159901Y173496D01*

+X160059Y174154D01*

+X160099Y174829D01*

+X160059Y175504D01*

+X159901Y176162D01*

+X159642Y176787D01*

+X159289Y177364D01*

+X158849Y177879D01*

+X158334Y178319D01*

+X157757Y178672D01*

+X157132Y178931D01*

+X156474Y179089D01*

+X155799Y179142D01*

+X155124Y179089D01*

+X154466Y178931D01*

+X153841Y178672D01*

+X153264Y178319D01*

+X152749Y177879D01*

+X152438Y177515D01*

+Y182143D01*

+X152749Y181779D01*

+X153264Y181339D01*

+X153841Y180986D01*

+X154466Y180727D01*

+X155124Y180569D01*

+X155799Y180516D01*

+X156474Y180569D01*

+X157132Y180727D01*

+X157757Y180986D01*

+X158334Y181339D01*

+X158849Y181779D01*

+X159289Y182294D01*

+X159642Y182871D01*

+X159901Y183496D01*

+X160059Y184154D01*

+X160099Y184829D01*

+X160059Y185504D01*

+X159901Y186162D01*

+X159642Y186787D01*

+X159289Y187364D01*

+X158849Y187879D01*

+X158334Y188319D01*

+X157757Y188672D01*

+X157132Y188931D01*

+X156474Y189089D01*

+X155799Y189142D01*

+X155124Y189089D01*

+X154466Y188931D01*

+X153841Y188672D01*

+X153264Y188319D01*

+X152749Y187879D01*

+X152438Y187515D01*

+Y337007D01*

+X152480Y336939D01*

+X152664Y336723D01*

+X152880Y336539D01*

+X153121Y336391D01*

+X153383Y336283D01*

+X153659Y336217D01*

+X153941Y336194D01*

+X154223Y336217D01*

+X154499Y336283D01*

+X154761Y336391D01*

+X155002Y336539D01*

+X155218Y336723D01*

+X155402Y336939D01*

+X155550Y337180D01*

+X155658Y337442D01*

+X155724Y337718D01*

+X155741Y338000D01*

+X155724Y338282D01*

+X155658Y338558D01*

+X155550Y338820D01*

+X155402Y339061D01*

+X155218Y339277D01*

+X155002Y339461D01*

+X154761Y339609D01*

+X154499Y339717D01*

+X154223Y339783D01*

+X153941Y339806D01*

+X153659Y339783D01*

+X153383Y339717D01*

+X153121Y339609D01*

+X152880Y339461D01*

+X152664Y339277D01*

+X152480Y339061D01*

+X152438Y338993D01*

+Y342500D01*

+G37*

+G36*

+X145792D02*X152438D01*

+Y338993D01*

+X152332Y338820D01*

+X152224Y338558D01*

+X152158Y338282D01*

+X152135Y338000D01*

+X152158Y337718D01*

+X152224Y337442D01*

+X152332Y337180D01*

+X152438Y337007D01*

+Y187515D01*

+X152309Y187364D01*

+X151956Y186787D01*

+X151697Y186162D01*

+X151539Y185504D01*

+X151486Y184829D01*

+X151539Y184154D01*

+X151697Y183496D01*

+X151956Y182871D01*

+X152309Y182294D01*

+X152438Y182143D01*

+Y177515D01*

+X152309Y177364D01*

+X151956Y176787D01*

+X151697Y176162D01*

+X151539Y175504D01*

+X151486Y174829D01*

+X151539Y174154D01*

+X151697Y173496D01*

+X151956Y172871D01*

+X152309Y172294D01*

+X152438Y172143D01*

+Y133732D01*

+X152223Y133783D01*

+X151941Y133806D01*

+X151659Y133783D01*

+X151383Y133717D01*

+X151121Y133609D01*

+X150880Y133461D01*

+X150664Y133277D01*

+X150480Y133061D01*

+X150332Y132820D01*

+X150224Y132558D01*

+X150158Y132282D01*

+X150135Y132000D01*

+X150158Y131718D01*

+X150224Y131442D01*

+X150332Y131180D01*

+X150480Y130939D01*

+X150664Y130723D01*

+X150880Y130539D01*

+X151121Y130391D01*

+X151383Y130283D01*

+X151659Y130217D01*

+X151941Y130194D01*

+X152223Y130217D01*

+X152438Y130268D01*

+Y123305D01*

+X152159Y123283D01*

+X151883Y123217D01*

+X151621Y123109D01*

+X151380Y122961D01*

+X151164Y122777D01*

+X150980Y122561D01*

+X150832Y122320D01*

+X150724Y122058D01*

+X150658Y121782D01*

+X150635Y121500D01*

+X150658Y121218D01*

+X150724Y120942D01*

+X150832Y120680D01*

+X150980Y120439D01*

+X151164Y120223D01*

+X151380Y120039D01*

+X151621Y119891D01*

+X151883Y119783D01*

+X152159Y119717D01*

+X152438Y119695D01*

+Y76500D01*

+X145792D01*

+Y170516D01*

+X145799Y170516D01*

+X146474Y170569D01*

+X147132Y170727D01*

+X147757Y170986D01*

+X148334Y171339D01*

+X148849Y171779D01*

+X149289Y172294D01*

+X149642Y172871D01*

+X149901Y173496D01*

+X150059Y174154D01*

+X150099Y174829D01*

+X150059Y175504D01*

+X149901Y176162D01*

+X149642Y176787D01*

+X149289Y177364D01*

+X148849Y177879D01*

+X148334Y178319D01*

+X147757Y178672D01*

+X147132Y178931D01*

+X146474Y179089D01*

+X145799Y179142D01*

+X145792Y179142D01*

+Y180516D01*

+X145799Y180516D01*

+X146474Y180569D01*

+X147132Y180727D01*

+X147757Y180986D01*

+X148334Y181339D01*

+X148849Y181779D01*

+X149289Y182294D01*

+X149642Y182871D01*

+X149901Y183496D01*

+X150059Y184154D01*

+X150099Y184829D01*

+X150059Y185504D01*

+X149901Y186162D01*

+X149642Y186787D01*

+X149289Y187364D01*

+X148849Y187879D01*

+X148334Y188319D01*

+X147757Y188672D01*

+X147132Y188931D01*

+X146474Y189089D01*

+X145799Y189142D01*

+X145792Y189142D01*

+Y342500D01*

+G37*

+G36*

+X141438D02*X145792D01*

+Y189142D01*

+X145124Y189089D01*

+X144466Y188931D01*

+X143841Y188672D01*

+X143264Y188319D01*

+X142749Y187879D01*

+X142309Y187364D01*

+X141956Y186787D01*

+X141697Y186162D01*

+X141539Y185504D01*

+X141486Y184829D01*

+X141539Y184154D01*

+X141697Y183496D01*

+X141956Y182871D01*

+X142309Y182294D01*

+X142749Y181779D01*

+X143264Y181339D01*

+X143841Y180986D01*

+X144466Y180727D01*

+X145124Y180569D01*

+X145792Y180516D01*

+Y179142D01*

+X145124Y179089D01*

+X144466Y178931D01*

+X143841Y178672D01*

+X143264Y178319D01*

+X142749Y177879D01*

+X142309Y177364D01*

+X141956Y176787D01*

+X141697Y176162D01*

+X141539Y175504D01*

+X141486Y174829D01*

+X141539Y174154D01*

+X141697Y173496D01*

+X141956Y172871D01*

+X142309Y172294D01*

+X142749Y171779D01*

+X143264Y171339D01*

+X143841Y170986D01*

+X144466Y170727D01*

+X145124Y170569D01*

+X145792Y170516D01*

+Y76500D01*

+X141438D01*

+Y146195D01*

+X141441Y146194D01*

+X141723Y146217D01*

+X141999Y146283D01*

+X142261Y146391D01*

+X142502Y146539D01*

+X142718Y146723D01*

+X142902Y146939D01*

+X143050Y147180D01*

+X143158Y147442D01*

+X143224Y147718D01*

+X143241Y148000D01*

+X143224Y148282D01*

+X143158Y148558D01*

+X143050Y148820D01*

+X142902Y149061D01*

+X142718Y149277D01*

+X142502Y149461D01*

+X142261Y149609D01*

+X141999Y149717D01*

+X141723Y149783D01*

+X141441Y149806D01*

+X141438Y149805D01*

+Y299088D01*

+X141589Y299100D01*

+X141865Y299166D01*

+X142127Y299274D01*

+X142368Y299422D01*

+X142584Y299606D01*

+X142768Y299822D01*

+X142916Y300063D01*

+X143024Y300325D01*

+X143090Y300601D01*

+X143107Y300883D01*

+X143090Y301165D01*

+X143024Y301441D01*

+X142916Y301703D01*

+X142768Y301944D01*

+X142584Y302160D01*

+X142368Y302344D01*

+X142127Y302492D01*

+X141865Y302600D01*

+X141589Y302666D01*

+X141438Y302678D01*

+Y336998D01*

+X141550Y337180D01*

+X141658Y337442D01*

+X141724Y337718D01*

+X141741Y338000D01*

+X141724Y338282D01*

+X141658Y338558D01*

+X141550Y338820D01*

+X141438Y339002D01*

+Y342500D01*

+G37*

+G36*

+X135438D02*X141438D01*

+Y339002D01*

+X141402Y339061D01*

+X141218Y339277D01*

+X141002Y339461D01*

+X140761Y339609D01*

+X140499Y339717D01*

+X140223Y339783D01*

+X139941Y339806D01*

+X139659Y339783D01*

+X139383Y339717D01*

+X139121Y339609D01*

+X138880Y339461D01*

+X138664Y339277D01*

+X138480Y339061D01*

+X138332Y338820D01*

+X138224Y338558D01*

+X138158Y338282D01*

+X138135Y338000D01*

+X138158Y337718D01*

+X138224Y337442D01*

+X138332Y337180D01*

+X138480Y336939D01*

+X138664Y336723D01*

+X138880Y336539D01*

+X139121Y336391D01*

+X139383Y336283D01*

+X139659Y336217D01*

+X139941Y336194D01*

+X140223Y336217D01*

+X140499Y336283D01*

+X140761Y336391D01*

+X141002Y336539D01*

+X141218Y336723D01*

+X141402Y336939D01*

+X141438Y336998D01*

+Y302678D01*

+X141307Y302689D01*

+X141025Y302666D01*

+X140749Y302600D01*

+X140487Y302492D01*

+X140246Y302344D01*

+X140030Y302160D01*

+X139846Y301944D01*

+X139698Y301703D01*

+X139590Y301441D01*

+X139524Y301165D01*

+X139501Y300883D01*

+X139524Y300601D01*

+X139590Y300325D01*

+X139698Y300063D01*

+X139846Y299822D01*

+X140030Y299606D01*

+X140246Y299422D01*

+X140487Y299274D01*

+X140749Y299166D01*

+X141025Y299100D01*

+X141307Y299077D01*

+X141438Y299088D01*

+Y149805D01*

+X141159Y149783D01*

+X140883Y149717D01*

+X140621Y149609D01*

+X140380Y149461D01*

+X140164Y149277D01*

+X139980Y149061D01*

+X139832Y148820D01*

+X139724Y148558D01*

+X139658Y148282D01*

+X139635Y148000D01*

+X139658Y147718D01*

+X139724Y147442D01*

+X139832Y147180D01*

+X139980Y146939D01*

+X140164Y146723D01*

+X140380Y146539D01*

+X140621Y146391D01*

+X140883Y146283D01*

+X141159Y146217D01*

+X141438Y146195D01*

+Y76500D01*

+X135438D01*

+Y170544D01*

+X135799Y170516D01*

+X136474Y170569D01*

+X137132Y170727D01*

+X137757Y170986D01*

+X138334Y171339D01*

+X138849Y171779D01*

+X139289Y172294D01*

+X139642Y172871D01*

+X139901Y173496D01*

+X140059Y174154D01*

+X140099Y174829D01*

+X140059Y175504D01*

+X139901Y176162D01*

+X139642Y176787D01*

+X139289Y177364D01*

+X138849Y177879D01*

+X138334Y178319D01*

+X137757Y178672D01*

+X137132Y178931D01*

+X136474Y179089D01*

+X135799Y179142D01*

+X135438Y179114D01*

+Y180544D01*

+X135799Y180516D01*

+X136474Y180569D01*

+X137132Y180727D01*

+X137757Y180986D01*

+X138334Y181339D01*

+X138849Y181779D01*

+X139289Y182294D01*

+X139642Y182871D01*

+X139901Y183496D01*

+X140059Y184154D01*

+X140099Y184829D01*

+X140059Y185504D01*

+X139901Y186162D01*

+X139642Y186787D01*

+X139289Y187364D01*

+X138849Y187879D01*

+X138334Y188319D01*

+X137757Y188672D01*

+X137132Y188931D01*

+X136474Y189089D01*

+X135799Y189142D01*

+X135438Y189114D01*

+Y333195D01*

+X135441Y333194D01*

+X135723Y333217D01*

+X135999Y333283D01*

+X136261Y333391D01*

+X136502Y333539D01*

+X136718Y333723D01*

+X136902Y333939D01*

+X137050Y334180D01*

+X137158Y334442D01*

+X137224Y334718D01*

+X137241Y335000D01*

+X137224Y335282D01*

+X137158Y335558D01*

+X137050Y335820D01*

+X136902Y336061D01*

+X136718Y336277D01*

+X136502Y336461D01*

+X136261Y336609D01*

+X135999Y336717D01*

+X135862Y336750D01*

+X135999Y336783D01*

+X136261Y336891D01*

+X136502Y337039D01*

+X136718Y337223D01*

+X136902Y337439D01*

+X137050Y337680D01*

+X137158Y337942D01*

+X137224Y338218D01*

+X137241Y338500D01*

+X137224Y338782D01*

+X137158Y339058D01*

+X137050Y339320D01*

+X136902Y339561D01*

+X136718Y339777D01*

+X136502Y339961D01*

+X136261Y340109D01*

+X135999Y340217D01*

+X135723Y340283D01*

+X135441Y340306D01*

+X135438Y340305D01*

+Y342500D01*

+G37*

+G36*

+X129343Y278500D02*X130941D01*

+Y342500D01*

+X135438D01*

+Y340305D01*

+X135159Y340283D01*

+X134883Y340217D01*

+X134621Y340109D01*

+X134380Y339961D01*

+X134164Y339777D01*

+X133980Y339561D01*

+X133832Y339320D01*

+X133724Y339058D01*

+X133658Y338782D01*

+X133635Y338500D01*

+X133658Y338218D01*

+X133724Y337942D01*

+X133832Y337680D01*

+X133980Y337439D01*

+X134164Y337223D01*

+X134380Y337039D01*

+X134621Y336891D01*

+X134883Y336783D01*

+X135020Y336750D01*

+X134883Y336717D01*

+X134621Y336609D01*

+X134380Y336461D01*

+X134164Y336277D01*

+X133980Y336061D01*

+X133832Y335820D01*

+X133724Y335558D01*

+X133658Y335282D01*

+X133635Y335000D01*

+X133658Y334718D01*

+X133724Y334442D01*

+X133832Y334180D01*

+X133980Y333939D01*

+X134164Y333723D01*

+X134380Y333539D01*

+X134621Y333391D01*

+X134883Y333283D01*

+X135159Y333217D01*

+X135438Y333195D01*

+Y189114D01*

+X135124Y189089D01*

+X134466Y188931D01*

+X133841Y188672D01*

+X133264Y188319D01*

+X132749Y187879D01*

+X132309Y187364D01*

+X131956Y186787D01*

+X131697Y186162D01*

+X131539Y185504D01*

+X131486Y184829D01*

+X131539Y184154D01*

+X131697Y183496D01*

+X131956Y182871D01*

+X132309Y182294D01*

+X132749Y181779D01*

+X133264Y181339D01*

+X133841Y180986D01*

+X134466Y180727D01*

+X135124Y180569D01*

+X135438Y180544D01*

+Y179114D01*

+X135124Y179089D01*

+X134466Y178931D01*

+X133841Y178672D01*

+X133264Y178319D01*

+X132749Y177879D01*

+X132309Y177364D01*

+X131956Y176787D01*

+X131697Y176162D01*

+X131539Y175504D01*

+X131486Y174829D01*

+X131539Y174154D01*

+X131697Y173496D01*

+X131956Y172871D01*

+X132309Y172294D01*

+X132749Y171779D01*

+X133264Y171339D01*

+X133841Y170986D01*

+X134466Y170727D01*

+X135124Y170569D01*

+X135438Y170544D01*

+Y76500D01*

+X129343D01*

+Y146870D01*

+X129402Y146939D01*

+X129550Y147180D01*

+X129658Y147442D01*

+X129724Y147718D01*

+X129741Y148000D01*

+X129724Y148282D01*

+X129658Y148558D01*

+X129550Y148820D01*

+X129402Y149061D01*

+X129343Y149130D01*

+Y172501D01*

+X129366Y172513D01*

+X129429Y172561D01*

+X129483Y172618D01*

+X129526Y172684D01*

+X129717Y173045D01*

+X129868Y173425D01*

+X129983Y173817D01*

+X130060Y174218D01*

+X130099Y174625D01*

+Y175033D01*

+X130060Y175440D01*

+X129983Y175841D01*

+X129868Y176233D01*

+X129717Y176613D01*

+X129530Y176976D01*

+X129486Y177042D01*

+X129431Y177100D01*

+X129368Y177148D01*

+X129343Y177161D01*

+Y182501D01*

+X129366Y182513D01*

+X129429Y182561D01*

+X129483Y182618D01*

+X129526Y182684D01*

+X129717Y183045D01*

+X129868Y183425D01*

+X129983Y183817D01*

+X130060Y184218D01*

+X130099Y184625D01*

+Y185033D01*

+X130060Y185440D01*

+X129983Y185841D01*

+X129868Y186233D01*

+X129717Y186613D01*

+X129530Y186976D01*

+X129486Y187042D01*

+X129431Y187100D01*

+X129368Y187148D01*

+X129343Y187161D01*

+Y240745D01*

+X129499Y240783D01*

+X129761Y240891D01*

+X130002Y241039D01*

+X130218Y241223D01*

+X130402Y241439D01*

+X130550Y241680D01*

+X130658Y241942D01*

+X130724Y242218D01*

+X130741Y242500D01*

+X130724Y242782D01*

+X130658Y243058D01*

+X130550Y243320D01*

+X130402Y243561D01*

+X130218Y243777D01*

+X130002Y243961D01*

+X129761Y244109D01*

+X129499Y244217D01*

+X129343Y244255D01*

+Y246745D01*

+X129499Y246783D01*

+X129761Y246891D01*

+X130002Y247039D01*

+X130218Y247223D01*

+X130402Y247439D01*

+X130550Y247680D01*

+X130658Y247942D01*

+X130724Y248218D01*

+X130741Y248500D01*

+X130724Y248782D01*

+X130658Y249058D01*

+X130550Y249320D01*

+X130402Y249561D01*

+X130218Y249777D01*

+X130002Y249961D01*

+X129761Y250109D01*

+X129499Y250217D01*

+X129343Y250255D01*

+Y253245D01*

+X129499Y253283D01*

+X129761Y253391D01*

+X130002Y253539D01*

+X130218Y253723D01*

+X130402Y253939D01*

+X130550Y254180D01*

+X130658Y254442D01*

+X130724Y254718D01*

+X130741Y255000D01*

+X130724Y255282D01*

+X130658Y255558D01*

+X130550Y255820D01*

+X130402Y256061D01*

+X130218Y256277D01*

+X130002Y256461D01*

+X129761Y256609D01*

+X129499Y256717D01*

+X129343Y256755D01*

+Y260745D01*

+X129499Y260783D01*

+X129761Y260891D01*

+X130002Y261039D01*

+X130218Y261223D01*

+X130402Y261439D01*

+X130550Y261680D01*

+X130658Y261942D01*

+X130724Y262218D01*

+X130741Y262500D01*

+X130724Y262782D01*

+X130658Y263058D01*

+X130550Y263320D01*

+X130402Y263561D01*

+X130218Y263777D01*

+X130002Y263961D01*

+X129761Y264109D01*

+X129499Y264217D01*

+X129343Y264255D01*

+Y266745D01*

+X129499Y266783D01*

+X129761Y266891D01*

+X130002Y267039D01*

+X130218Y267223D01*

+X130402Y267439D01*

+X130550Y267680D01*

+X130658Y267942D01*

+X130724Y268218D01*

+X130741Y268500D01*

+X130724Y268782D01*

+X130658Y269058D01*

+X130550Y269320D01*

+X130402Y269561D01*

+X130218Y269777D01*

+X130002Y269961D01*

+X129761Y270109D01*

+X129499Y270217D01*

+X129343Y270255D01*

+Y272745D01*

+X129499Y272783D01*

+X129761Y272891D01*

+X130002Y273039D01*

+X130218Y273223D01*

+X130402Y273439D01*

+X130550Y273680D01*

+X130658Y273942D01*

+X130724Y274218D01*

+X130741Y274500D01*

+X130724Y274782D01*

+X130658Y275058D01*

+X130550Y275320D01*

+X130402Y275561D01*

+X130218Y275777D01*

+X130002Y275961D01*

+X129761Y276109D01*

+X129499Y276217D01*

+X129343Y276255D01*

+Y278500D01*

+G37*

+G36*

+Y270255D02*X129223Y270283D01*

+X128941Y270306D01*

+X128659Y270283D01*

+X128383Y270217D01*

+X128121Y270109D01*

+X127938Y269997D01*

+Y273003D01*

+X128121Y272891D01*

+X128383Y272783D01*

+X128659Y272717D01*

+X128941Y272694D01*

+X129223Y272717D01*

+X129343Y272745D01*

+Y270255D01*

+G37*

+G36*

+Y264255D02*X129223Y264283D01*

+X128941Y264306D01*

+X128659Y264283D01*

+X128383Y264217D01*

+X128121Y264109D01*

+X127938Y263997D01*

+Y267003D01*

+X128121Y266891D01*

+X128383Y266783D01*

+X128659Y266717D01*

+X128941Y266694D01*

+X129223Y266717D01*

+X129343Y266745D01*

+Y264255D01*

+G37*

+G36*

+Y256755D02*X129223Y256783D01*

+X128941Y256806D01*

+X128659Y256783D01*

+X128383Y256717D01*

+X128121Y256609D01*

+X127938Y256497D01*

+Y261003D01*

+X128121Y260891D01*

+X128383Y260783D01*

+X128659Y260717D01*

+X128941Y260694D01*

+X129223Y260717D01*

+X129343Y260745D01*

+Y256755D01*

+G37*

+G36*

+Y250255D02*X129223Y250283D01*

+X128941Y250306D01*

+X128659Y250283D01*

+X128383Y250217D01*

+X128121Y250109D01*

+X127938Y249997D01*

+Y253503D01*

+X128121Y253391D01*

+X128383Y253283D01*

+X128659Y253217D01*

+X128941Y253194D01*

+X129223Y253217D01*

+X129343Y253245D01*

+Y250255D01*

+G37*

+G36*

+Y244255D02*X129223Y244283D01*

+X128941Y244306D01*

+X128659Y244283D01*

+X128383Y244217D01*

+X128121Y244109D01*

+X127938Y243997D01*

+Y247003D01*

+X128121Y246891D01*

+X128383Y246783D01*

+X128659Y246717D01*

+X128941Y246694D01*

+X129223Y246717D01*

+X129343Y246745D01*

+Y244255D01*

+G37*

+G36*

+Y149130D02*X129218Y149277D01*

+X129002Y149461D01*

+X128761Y149609D01*

+X128499Y149717D01*

+X128223Y149783D01*

+X127941Y149806D01*

+X127938Y149805D01*

+Y171094D01*

+X127946Y171098D01*

+X128012Y171142D01*

+X128070Y171197D01*

+X128118Y171260D01*

+X128156Y171329D01*

+X128182Y171404D01*

+X128197Y171482D01*

+X128199Y171561D01*

+X128189Y171640D01*

+X128166Y171716D01*

+X128132Y171788D01*

+X128088Y171853D01*

+X128033Y171911D01*

+X127970Y171959D01*

+X127938Y171976D01*

+Y177686D01*

+X127968Y177702D01*

+X128031Y177750D01*

+X128085Y177807D01*

+X128129Y177872D01*

+X128163Y177943D01*

+X128185Y178019D01*

+X128195Y178097D01*

+X128193Y178176D01*

+X128179Y178253D01*

+X128152Y178327D01*

+X128115Y178396D01*

+X128067Y178459D01*

+X128010Y178513D01*

+X127944Y178556D01*

+X127938Y178559D01*

+Y181094D01*

+X127946Y181098D01*

+X128012Y181142D01*

+X128070Y181197D01*

+X128118Y181260D01*

+X128156Y181329D01*

+X128182Y181404D01*

+X128197Y181482D01*

+X128199Y181561D01*

+X128189Y181640D01*

+X128166Y181716D01*

+X128132Y181788D01*

+X128088Y181853D01*

+X128033Y181911D01*

+X127970Y181959D01*

+X127938Y181976D01*

+Y187686D01*

+X127968Y187702D01*

+X128031Y187750D01*

+X128085Y187807D01*

+X128129Y187872D01*

+X128163Y187943D01*

+X128185Y188019D01*

+X128195Y188097D01*

+X128193Y188176D01*

+X128179Y188253D01*

+X128152Y188327D01*

+X128115Y188396D01*

+X128067Y188459D01*

+X128010Y188513D01*

+X127944Y188556D01*

+X127938Y188559D01*

+Y241003D01*

+X128121Y240891D01*

+X128383Y240783D01*

+X128659Y240717D01*

+X128941Y240694D01*

+X129223Y240717D01*

+X129343Y240745D01*

+Y187161D01*

+X129299Y187186D01*

+X129224Y187212D01*

+X129146Y187227D01*

+X129067Y187229D01*

+X128988Y187219D01*

+X128912Y187196D01*

+X128840Y187162D01*

+X128775Y187118D01*

+X128717Y187063D01*

+X128669Y187000D01*

+X128631Y186931D01*

+X128605Y186856D01*

+X128590Y186778D01*

+X128588Y186699D01*

+X128598Y186620D01*

+X128621Y186544D01*

+X128656Y186473D01*

+X128802Y186197D01*

+X128918Y185906D01*

+X129006Y185605D01*

+X129066Y185297D01*

+X129095Y184986D01*

+Y184672D01*

+X129066Y184361D01*

+X129006Y184053D01*

+X128918Y183752D01*

+X128802Y183461D01*

+X128659Y183183D01*

+X128624Y183113D01*

+X128602Y183037D01*

+X128592Y182959D01*

+X128594Y182880D01*

+X128608Y182803D01*

+X128635Y182729D01*

+X128672Y182660D01*

+X128720Y182597D01*

+X128777Y182543D01*

+X128842Y182499D01*

+X128913Y182465D01*

+X128989Y182443D01*

+X129067Y182433D01*

+X129146Y182435D01*

+X129223Y182449D01*

+X129297Y182476D01*

+X129343Y182501D01*

+Y177161D01*

+X129299Y177186D01*

+X129224Y177212D01*

+X129146Y177227D01*

+X129067Y177229D01*

+X128988Y177219D01*

+X128912Y177196D01*

+X128840Y177162D01*

+X128775Y177118D01*

+X128717Y177063D01*

+X128669Y177000D01*

+X128631Y176931D01*

+X128605Y176856D01*

+X128590Y176778D01*

+X128588Y176699D01*

+X128598Y176620D01*

+X128621Y176544D01*

+X128656Y176473D01*

+X128802Y176197D01*

+X128918Y175906D01*

+X129006Y175605D01*

+X129066Y175297D01*

+X129095Y174986D01*

+Y174672D01*

+X129066Y174361D01*

+X129006Y174053D01*

+X128918Y173752D01*

+X128802Y173461D01*

+X128659Y173183D01*

+X128624Y173113D01*

+X128602Y173037D01*

+X128592Y172959D01*

+X128594Y172880D01*

+X128608Y172803D01*

+X128635Y172729D01*

+X128672Y172660D01*

+X128720Y172597D01*

+X128777Y172543D01*

+X128842Y172499D01*

+X128913Y172465D01*

+X128989Y172443D01*

+X129067Y172433D01*

+X129146Y172435D01*

+X129223Y172449D01*

+X129297Y172476D01*

+X129343Y172501D01*

+Y149130D01*

+G37*

+G36*

+Y76500D02*X127938D01*

+Y146195D01*

+X127941Y146194D01*

+X128223Y146217D01*

+X128499Y146283D01*

+X128761Y146391D01*

+X129002Y146539D01*

+X129218Y146723D01*

+X129343Y146870D01*

+Y76500D01*

+G37*

+G36*

+X127938Y278500D02*X129343D01*

+Y276255D01*

+X129223Y276283D01*

+X128941Y276306D01*

+X128659Y276283D01*

+X128383Y276217D01*

+X128121Y276109D01*

+X127938Y275997D01*

+Y278500D01*

+G37*

+G36*

+X122255D02*X127938D01*

+Y275997D01*

+X127880Y275961D01*

+X127664Y275777D01*

+X127480Y275561D01*

+X127332Y275320D01*

+X127224Y275058D01*

+X127158Y274782D01*

+X127135Y274500D01*

+X127158Y274218D01*

+X127224Y273942D01*

+X127332Y273680D01*

+X127480Y273439D01*

+X127664Y273223D01*

+X127880Y273039D01*

+X127938Y273003D01*

+Y269997D01*

+X127880Y269961D01*

+X127664Y269777D01*

+X127480Y269561D01*

+X127332Y269320D01*

+X127224Y269058D01*

+X127158Y268782D01*

+X127135Y268500D01*

+X127158Y268218D01*

+X127224Y267942D01*

+X127332Y267680D01*

+X127480Y267439D01*

+X127664Y267223D01*

+X127880Y267039D01*

+X127938Y267003D01*

+Y263997D01*

+X127880Y263961D01*

+X127664Y263777D01*

+X127480Y263561D01*

+X127332Y263320D01*

+X127224Y263058D01*

+X127158Y262782D01*

+X127135Y262500D01*

+X127158Y262218D01*

+X127224Y261942D01*

+X127332Y261680D01*

+X127480Y261439D01*

+X127664Y261223D01*

+X127880Y261039D01*

+X127938Y261003D01*

+Y256497D01*

+X127880Y256461D01*

+X127664Y256277D01*

+X127480Y256061D01*

+X127332Y255820D01*

+X127224Y255558D01*

+X127158Y255282D01*

+X127135Y255000D01*

+X127158Y254718D01*

+X127224Y254442D01*

+X127332Y254180D01*

+X127480Y253939D01*

+X127664Y253723D01*

+X127880Y253539D01*

+X127938Y253503D01*

+Y249997D01*

+X127880Y249961D01*

+X127664Y249777D01*

+X127480Y249561D01*

+X127332Y249320D01*

+X127224Y249058D01*

+X127158Y248782D01*

+X127135Y248500D01*

+X127158Y248218D01*

+X127224Y247942D01*

+X127332Y247680D01*

+X127480Y247439D01*

+X127664Y247223D01*

+X127880Y247039D01*

+X127938Y247003D01*

+Y243997D01*

+X127880Y243961D01*

+X127664Y243777D01*

+X127480Y243561D01*

+X127332Y243320D01*

+X127224Y243058D01*

+X127158Y242782D01*

+X127135Y242500D01*

+X127158Y242218D01*

+X127224Y241942D01*

+X127332Y241680D01*

+X127480Y241439D01*

+X127664Y241223D01*

+X127880Y241039D01*

+X127938Y241003D01*

+Y188559D01*

+X127583Y188747D01*

+X127203Y188898D01*

+X126811Y189013D01*

+X126410Y189090D01*

+X126003Y189129D01*

+X125595D01*

+X125188Y189090D01*

+X124787Y189013D01*

+X124395Y188898D01*

+X124015Y188747D01*

+X123652Y188560D01*

+X123586Y188516D01*

+X123528Y188461D01*

+X123480Y188398D01*

+X123442Y188329D01*

+X123416Y188254D01*

+X123401Y188176D01*

+X123399Y188097D01*

+X123409Y188018D01*

+X123432Y187942D01*

+X123466Y187870D01*

+X123510Y187805D01*

+X123565Y187747D01*

+X123628Y187699D01*

+X123697Y187661D01*

+X123772Y187635D01*

+X123850Y187620D01*

+X123929Y187618D01*

+X124008Y187628D01*

+X124084Y187651D01*

+X124155Y187686D01*

+X124431Y187832D01*

+X124722Y187948D01*

+X125023Y188036D01*

+X125331Y188096D01*

+X125642Y188125D01*

+X125956D01*

+X126267Y188096D01*

+X126575Y188036D01*

+X126876Y187948D01*

+X127167Y187832D01*

+X127445Y187689D01*

+X127515Y187654D01*

+X127591Y187632D01*

+X127669Y187622D01*

+X127748Y187624D01*

+X127825Y187638D01*

+X127899Y187665D01*

+X127938Y187686D01*

+Y181976D01*

+X127901Y181997D01*

+X127826Y182023D01*

+X127748Y182038D01*

+X127669Y182040D01*

+X127590Y182030D01*

+X127514Y182007D01*

+X127443Y181972D01*

+X127167Y181826D01*

+X126876Y181710D01*

+X126575Y181622D01*

+X126267Y181562D01*

+X125956Y181533D01*

+X125642D01*

+X125331Y181562D01*

+X125023Y181622D01*

+X124722Y181710D01*

+X124431Y181826D01*

+X124153Y181969D01*

+X124083Y182004D01*

+X124007Y182026D01*

+X123929Y182036D01*

+X123850Y182034D01*

+X123773Y182020D01*

+X123699Y181993D01*

+X123630Y181956D01*

+X123567Y181908D01*

+X123513Y181851D01*

+X123469Y181786D01*

+X123435Y181715D01*

+X123413Y181639D01*

+X123403Y181561D01*

+X123405Y181482D01*

+X123419Y181405D01*

+X123446Y181331D01*

+X123483Y181262D01*

+X123531Y181199D01*

+X123588Y181145D01*

+X123654Y181102D01*

+X124015Y180911D01*

+X124395Y180760D01*

+X124787Y180645D01*

+X125188Y180568D01*

+X125595Y180529D01*

+X126003D01*

+X126410Y180568D01*

+X126811Y180645D01*

+X127203Y180760D01*

+X127583Y180911D01*

+X127938Y181094D01*

+Y178559D01*

+X127583Y178747D01*

+X127203Y178898D01*

+X126811Y179013D01*

+X126410Y179090D01*

+X126003Y179129D01*

+X125595D01*

+X125188Y179090D01*

+X124787Y179013D01*

+X124395Y178898D01*

+X124015Y178747D01*

+X123652Y178560D01*

+X123586Y178516D01*

+X123528Y178461D01*

+X123480Y178398D01*

+X123442Y178329D01*

+X123416Y178254D01*

+X123401Y178176D01*

+X123399Y178097D01*

+X123409Y178018D01*

+X123432Y177942D01*

+X123466Y177870D01*

+X123510Y177805D01*

+X123565Y177747D01*

+X123628Y177699D01*

+X123697Y177661D01*

+X123772Y177635D01*

+X123850Y177620D01*

+X123929Y177618D01*

+X124008Y177628D01*

+X124084Y177651D01*

+X124155Y177686D01*

+X124431Y177832D01*

+X124722Y177948D01*

+X125023Y178036D01*

+X125331Y178096D01*

+X125642Y178125D01*

+X125956D01*

+X126267Y178096D01*

+X126575Y178036D01*

+X126876Y177948D01*

+X127167Y177832D01*

+X127445Y177689D01*

+X127515Y177654D01*

+X127591Y177632D01*

+X127669Y177622D01*

+X127748Y177624D01*

+X127825Y177638D01*

+X127899Y177665D01*

+X127938Y177686D01*

+Y171976D01*

+X127901Y171997D01*

+X127826Y172023D01*

+X127748Y172038D01*

+X127669Y172040D01*

+X127590Y172030D01*

+X127514Y172007D01*

+X127443Y171972D01*

+X127167Y171826D01*

+X126876Y171710D01*

+X126575Y171622D01*

+X126267Y171562D01*

+X125956Y171533D01*

+X125642D01*

+X125331Y171562D01*

+X125023Y171622D01*

+X124722Y171710D01*

+X124431Y171826D01*

+X124153Y171969D01*

+X124083Y172004D01*

+X124007Y172026D01*

+X123929Y172036D01*

+X123850Y172034D01*

+X123773Y172020D01*

+X123699Y171993D01*

+X123630Y171956D01*

+X123567Y171908D01*

+X123513Y171851D01*

+X123469Y171786D01*

+X123435Y171715D01*

+X123413Y171639D01*

+X123403Y171561D01*

+X123405Y171482D01*

+X123419Y171405D01*

+X123446Y171331D01*

+X123483Y171262D01*

+X123531Y171199D01*

+X123588Y171145D01*

+X123654Y171102D01*

+X124015Y170911D01*

+X124395Y170760D01*

+X124787Y170645D01*

+X125188Y170568D01*

+X125595Y170529D01*

+X126003D01*

+X126410Y170568D01*

+X126811Y170645D01*

+X127203Y170760D01*

+X127583Y170911D01*

+X127938Y171094D01*

+Y149805D01*

+X127659Y149783D01*

+X127383Y149717D01*

+X127121Y149609D01*

+X126880Y149461D01*

+X126664Y149277D01*

+X126480Y149061D01*

+X126332Y148820D01*

+X126224Y148558D01*

+X126158Y148282D01*

+X126135Y148000D01*

+X126158Y147718D01*

+X126224Y147442D01*

+X126332Y147180D01*

+X126480Y146939D01*

+X126664Y146723D01*

+X126880Y146539D01*

+X127121Y146391D01*

+X127383Y146283D01*

+X127659Y146217D01*

+X127938Y146195D01*

+Y76500D01*

+X122255D01*

+Y172497D01*

+X122299Y172472D01*

+X122374Y172446D01*

+X122452Y172431D01*

+X122531Y172429D01*

+X122610Y172439D01*

+X122686Y172462D01*

+X122758Y172496D01*

+X122823Y172540D01*

+X122881Y172595D01*

+X122929Y172658D01*

+X122967Y172727D01*

+X122993Y172802D01*

+X123008Y172880D01*

+X123010Y172959D01*

+X123000Y173038D01*

+X122977Y173114D01*

+X122942Y173185D01*

+X122796Y173461D01*

+X122680Y173752D01*

+X122592Y174053D01*

+X122532Y174361D01*

+X122503Y174672D01*

+Y174986D01*

+X122532Y175297D01*

+X122592Y175605D01*

+X122680Y175906D01*

+X122796Y176197D01*

+X122939Y176475D01*

+X122974Y176545D01*

+X122996Y176621D01*

+X123006Y176699D01*

+X123004Y176778D01*

+X122990Y176855D01*

+X122963Y176929D01*

+X122926Y176998D01*

+X122878Y177061D01*

+X122821Y177115D01*

+X122756Y177159D01*

+X122685Y177193D01*

+X122609Y177215D01*

+X122531Y177225D01*

+X122452Y177223D01*

+X122375Y177209D01*

+X122301Y177182D01*

+X122255Y177157D01*

+Y182497D01*

+X122299Y182472D01*

+X122374Y182446D01*

+X122452Y182431D01*

+X122531Y182429D01*

+X122610Y182439D01*

+X122686Y182462D01*

+X122758Y182496D01*

+X122823Y182540D01*

+X122881Y182595D01*

+X122929Y182658D01*

+X122967Y182727D01*

+X122993Y182802D01*

+X123008Y182880D01*

+X123010Y182959D01*

+X123000Y183038D01*

+X122977Y183114D01*

+X122942Y183185D01*

+X122796Y183461D01*

+X122680Y183752D01*

+X122592Y184053D01*

+X122532Y184361D01*

+X122503Y184672D01*

+Y184986D01*

+X122532Y185297D01*

+X122592Y185605D01*

+X122680Y185906D01*

+X122796Y186197D01*

+X122939Y186475D01*

+X122974Y186545D01*

+X122996Y186621D01*

+X123006Y186699D01*

+X123004Y186778D01*

+X122990Y186855D01*

+X122963Y186929D01*

+X122926Y186998D01*

+X122878Y187061D01*

+X122821Y187115D01*

+X122756Y187159D01*

+X122685Y187193D01*

+X122609Y187215D01*

+X122531Y187225D01*

+X122452Y187223D01*

+X122375Y187209D01*

+X122301Y187182D01*

+X122255Y187157D01*

+Y278500D01*

+G37*

+G36*

+X114438D02*X122255D01*

+Y187157D01*

+X122232Y187145D01*

+X122169Y187097D01*

+X122115Y187040D01*

+X122072Y186974D01*

+X121881Y186613D01*

+X121730Y186233D01*

+X121615Y185841D01*

+X121538Y185440D01*

+X121499Y185033D01*

+Y184625D01*

+X121538Y184218D01*

+X121615Y183817D01*

+X121730Y183425D01*

+X121881Y183045D01*

+X122068Y182682D01*

+X122112Y182616D01*

+X122167Y182558D01*

+X122230Y182510D01*

+X122255Y182497D01*

+Y177157D01*

+X122232Y177145D01*

+X122169Y177097D01*

+X122115Y177040D01*

+X122072Y176974D01*

+X121881Y176613D01*

+X121730Y176233D01*

+X121615Y175841D01*

+X121538Y175440D01*

+X121499Y175033D01*

+Y174625D01*

+X121538Y174218D01*

+X121615Y173817D01*

+X121730Y173425D01*

+X121881Y173045D01*

+X122068Y172682D01*

+X122112Y172616D01*

+X122167Y172558D01*

+X122230Y172510D01*

+X122255Y172497D01*

+Y76500D01*

+X114438D01*

+Y119695D01*

+X114441Y119694D01*

+X114723Y119717D01*

+X114999Y119783D01*

+X115261Y119891D01*

+X115502Y120039D01*

+X115718Y120223D01*

+X115902Y120439D01*

+X116050Y120680D01*

+X116158Y120942D01*

+X116224Y121218D01*

+X116241Y121500D01*

+X116224Y121782D01*

+X116158Y122058D01*

+X116050Y122320D01*

+X115902Y122561D01*

+X115718Y122777D01*

+X115502Y122961D01*

+X115261Y123109D01*

+X114999Y123217D01*

+X114723Y123283D01*

+X114441Y123306D01*

+X114438Y123305D01*

+Y131003D01*

+X114621Y130891D01*

+X114883Y130783D01*

+X115159Y130717D01*

+X115441Y130694D01*

+X115723Y130717D01*

+X115999Y130783D01*

+X116261Y130891D01*

+X116502Y131039D01*

+X116718Y131223D01*

+X116902Y131439D01*

+X117050Y131680D01*

+X117158Y131942D01*

+X117224Y132218D01*

+X117241Y132500D01*

+X117224Y132782D01*

+X117158Y133058D01*

+X117050Y133320D01*

+X116902Y133561D01*

+X116718Y133777D01*

+X116502Y133961D01*

+X116261Y134109D01*

+X115999Y134217D01*

+X115723Y134283D01*

+X115441Y134306D01*

+X115159Y134283D01*

+X114883Y134217D01*

+X114621Y134109D01*

+X114438Y133997D01*

+Y170738D01*

+X114466Y170727D01*

+X115124Y170569D01*

+X115799Y170516D01*

+X116474Y170569D01*

+X117132Y170727D01*

+X117757Y170986D01*

+X118334Y171339D01*

+X118849Y171779D01*

+X119289Y172294D01*

+X119642Y172871D01*

+X119901Y173496D01*

+X120059Y174154D01*

+X120099Y174829D01*

+X120059Y175504D01*

+X119901Y176162D01*

+X119642Y176787D01*

+X119289Y177364D01*

+X118849Y177879D01*

+X118334Y178319D01*

+X117757Y178672D01*

+X117132Y178931D01*

+X116474Y179089D01*

+X115799Y179142D01*

+X115124Y179089D01*

+X114466Y178931D01*

+X114438Y178920D01*

+Y180738D01*

+X114466Y180727D01*

+X115124Y180569D01*

+X115799Y180516D01*

+X116474Y180569D01*

+X117132Y180727D01*

+X117757Y180986D01*

+X118334Y181339D01*

+X118849Y181779D01*

+X119289Y182294D01*

+X119642Y182871D01*

+X119901Y183496D01*

+X120059Y184154D01*

+X120099Y184829D01*

+X120059Y185504D01*

+X119901Y186162D01*

+X119642Y186787D01*

+X119289Y187364D01*

+X118849Y187879D01*

+X118334Y188319D01*

+X117757Y188672D01*

+X117132Y188931D01*

+X116474Y189089D01*

+X115799Y189142D01*

+X115124Y189089D01*

+X114466Y188931D01*

+X114438Y188920D01*

+Y278500D01*

+G37*

+G36*

+Y178920D02*X113841Y178672D01*

+X113264Y178319D01*

+X112749Y177879D01*

+X112309Y177364D01*

+X112219Y177217D01*

+Y182441D01*

+X112309Y182294D01*

+X112749Y181779D01*

+X113264Y181339D01*

+X113841Y180986D01*

+X114438Y180738D01*

+Y178920D01*

+G37*

+G36*

+Y76500D02*X112219D01*

+Y125535D01*

+X112222Y125534D01*

+X112504Y125557D01*

+X112780Y125623D01*

+X113042Y125731D01*

+X113283Y125879D01*

+X113499Y126063D01*

+X113683Y126279D01*

+X113831Y126520D01*

+X113939Y126782D01*

+X114005Y127058D01*

+X114022Y127340D01*

+X114005Y127622D01*

+X113939Y127898D01*

+X113831Y128160D01*

+X113683Y128401D01*

+X113499Y128617D01*

+X113283Y128801D01*

+X113042Y128949D01*

+X112780Y129057D01*

+X112504Y129123D01*

+X112222Y129146D01*

+X112219Y129145D01*

+Y172441D01*

+X112309Y172294D01*

+X112749Y171779D01*

+X113264Y171339D01*

+X113841Y170986D01*

+X114438Y170738D01*

+Y133997D01*

+X114380Y133961D01*

+X114164Y133777D01*

+X113980Y133561D01*

+X113832Y133320D01*

+X113724Y133058D01*

+X113658Y132782D01*

+X113635Y132500D01*

+X113658Y132218D01*

+X113724Y131942D01*

+X113832Y131680D01*

+X113980Y131439D01*

+X114164Y131223D01*

+X114380Y131039D01*

+X114438Y131003D01*

+Y123305D01*

+X114159Y123283D01*

+X113883Y123217D01*

+X113621Y123109D01*

+X113380Y122961D01*

+X113164Y122777D01*

+X112980Y122561D01*

+X112832Y122320D01*

+X112724Y122058D01*

+X112658Y121782D01*

+X112635Y121500D01*

+X112658Y121218D01*

+X112724Y120942D01*

+X112832Y120680D01*

+X112980Y120439D01*

+X113164Y120223D01*

+X113380Y120039D01*

+X113621Y119891D01*

+X113883Y119783D01*

+X114159Y119717D01*

+X114438Y119695D01*

+Y76500D01*

+G37*

+G36*

+X112219Y278500D02*X114438D01*

+Y188920D01*

+X113841Y188672D01*

+X113264Y188319D01*

+X112749Y187879D01*

+X112309Y187364D01*

+X112219Y187217D01*

+Y278500D01*

+G37*

+G36*

+X109941D02*X112219D01*

+Y187217D01*

+X111956Y186787D01*

+X111697Y186162D01*

+X111539Y185504D01*

+X111486Y184829D01*

+X111539Y184154D01*

+X111697Y183496D01*

+X111956Y182871D01*

+X112219Y182441D01*

+Y177217D01*

+X111956Y176787D01*

+X111697Y176162D01*

+X111539Y175504D01*

+X111486Y174829D01*

+X111539Y174154D01*

+X111697Y173496D01*

+X111956Y172871D01*

+X112219Y172441D01*

+Y129145D01*

+X111940Y129123D01*

+X111664Y129057D01*

+X111402Y128949D01*

+X111161Y128801D01*

+X110945Y128617D01*

+X110761Y128401D01*

+X110613Y128160D01*

+X110505Y127898D01*

+X110439Y127622D01*

+X110416Y127340D01*

+X110439Y127058D01*

+X110505Y126782D01*

+X110613Y126520D01*

+X110761Y126279D01*

+X110945Y126063D01*

+X111161Y125879D01*

+X111402Y125731D01*

+X111664Y125623D01*

+X111940Y125557D01*

+X112219Y125535D01*

+Y76500D01*

+X109941D01*

+Y170989D01*

+X109993Y171074D01*

+X110053Y171219D01*

+X110090Y171372D01*

+X110099Y171529D01*

+X110090Y178286D01*

+X110053Y178439D01*

+X109993Y178584D01*

+X109941Y178669D01*

+Y183662D01*

+X110059Y184154D01*

+X110099Y184829D01*

+X110059Y185504D01*

+X109941Y185996D01*

+Y278500D01*

+G37*

+G36*

+X162941Y228500D02*Y233500D01*

+X168441D01*

+Y228500D01*

+X162941D01*

+G37*

+G36*

+Y224000D02*Y229000D01*

+X168441D01*

+Y224000D01*

+X162941D01*

+G37*

+G36*

+Y218000D02*Y223000D01*

+X168441D01*

+Y218000D01*

+X162941D01*

+G37*

+G36*

+X166441Y211500D02*Y216500D01*

+X171941D01*

+Y211500D01*

+X166441D01*

+G37*

+G36*

+Y206000D02*Y211000D01*

+X171941D01*

+Y206000D01*

+X166441D01*

+G37*

+G36*

+Y199000D02*Y204000D01*

+X171941D01*

+Y199000D01*

+X166441D01*

+G37*

+G36*

+X258902Y303109D02*Y311109D01*

+X265402D01*

+Y303109D01*

+X258902D01*

+G37*

+G36*

+X138941Y145500D02*Y150500D01*

+X144441D01*

+Y145500D01*

+X138941D01*

+G37*

+G36*

+X132941Y335500D02*Y340500D01*

+X138441D01*

+Y335500D01*

+X132941D01*

+G37*

+G36*

+Y332000D02*Y337000D01*

+X138441D01*

+Y332000D01*

+X132941D01*

+G37*

+G36*

+X137441Y335000D02*Y340000D01*

+X142941D01*

+Y335000D01*

+X137441D01*

+G37*

+G36*

+X151441D02*Y340000D01*

+X156941D01*

+Y335000D01*

+X151441D01*

+G37*

+G36*

+X267941Y347000D02*Y352000D01*

+X273441D01*

+Y347000D01*

+X267941D01*

+G37*

+G36*

+Y340000D02*Y345000D01*

+X273441D01*

+Y340000D01*

+X267941D01*

+G37*

+G54D214*X397441Y373000D02*X393941Y376500D01*

+X398441Y314000D02*X395441D01*

+X398441Y253000D02*X394441D01*

+X398441Y193614D02*X395441D01*

+G54D215*X417000Y384000D03*

+Y294000D03*

+Y354000D03*

+X427000Y384000D03*

+Y294000D03*

+Y354000D03*

+G54D213*G36*

+X403750Y357250D02*Y350750D01*

+X410250D01*

+Y357250D01*

+X403750D01*

+G37*

+G54D216*X345799Y357329D03*

+G54D217*X315799Y337329D03*

+G54D216*X85799Y369829D03*

+G54D218*X105799Y374829D03*

+G54D213*G36*

+X102499Y368129D02*Y361529D01*

+X109099D01*

+Y368129D01*

+X102499D01*

+G37*

+G54D218*X115799Y374829D03*

+Y364829D03*

+X125799Y374829D03*

+Y364829D03*

+X135799Y374829D03*

+Y364829D03*

+X145799Y374829D03*

+Y364829D03*

+X155799D03*

+X165799D03*

+X155799Y374829D03*

+X165799D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X175799Y364829D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X215799Y374829D03*

+X225799D03*

+X235799D03*

+X215799Y364829D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X265799D03*

+X245799Y374829D03*

+X255799D03*

+X265799D03*

+X275799D03*

+Y364829D03*

+X285799Y374829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X285799Y364829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D213*G36*

+X450250Y267250D02*Y260750D01*

+X456750D01*

+Y267250D01*

+X450250D01*

+G37*

+G36*

+Y207250D02*Y200750D01*

+X456750D01*

+Y207250D01*

+X450250D01*

+G37*

+G36*

+Y177250D02*Y170750D01*

+X456750D01*

+Y177250D01*

+X450250D01*

+G37*

+G54D215*X463500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+X473500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+G54D213*G36*

+X450250Y237250D02*Y230750D01*

+X456750D01*

+Y237250D01*

+X450250D01*

+G37*

+G54D215*X463500Y234000D03*

+X473500D03*

+G54D213*G36*

+X450250Y147250D02*Y140750D01*

+X456750D01*

+Y147250D01*

+X450250D01*

+G37*

+G36*

+Y117250D02*Y110750D01*

+X456750D01*

+Y117250D01*

+X450250D01*

+G37*

+G36*

+Y87250D02*Y80750D01*

+X456750D01*

+Y87250D01*

+X450250D01*

+G37*

+G36*

+Y57250D02*Y50750D01*

+X456750D01*

+Y57250D01*

+X450250D01*

+G37*

+G54D215*X463500Y54000D03*

+X473500D03*

+G54D213*G36*

+X450250Y327250D02*Y320750D01*

+X456750D01*

+Y327250D01*

+X450250D01*

+G37*

+G54D215*X463500Y324000D03*

+X473500D03*

+G54D213*G36*

+X450250Y297250D02*Y290750D01*

+X456750D01*

+Y297250D01*

+X450250D01*

+G37*

+G54D215*X463500Y294000D03*

+X473500D03*

+X437000Y324000D03*

+G54D213*G36*

+X309191Y252250D02*Y245750D01*

+X315691D01*

+Y252250D01*

+X309191D01*

+G37*

+G54D215*X322441Y249000D03*

+X332441D03*

+X342441D03*

+G54D219*X345799Y192329D03*

+G54D216*X353000Y150000D03*

+G54D213*G36*

+X450250Y387250D02*Y380750D01*

+X456750D01*

+Y387250D01*

+X450250D01*

+G37*

+G54D215*X463500Y384000D03*

+X473500D03*

+G54D213*G36*

+X403750Y387250D02*Y380750D01*

+X410250D01*

+Y387250D01*

+X403750D01*

+G37*

+G36*

+Y297250D02*Y290750D01*

+X410250D01*

+Y297250D01*

+X403750D01*

+G37*

+G36*

+Y327250D02*Y320750D01*

+X410250D01*

+Y327250D01*

+X403750D01*

+G37*

+G54D215*X417000Y324000D03*

+X427000D03*

+G54D213*G36*

+X450250Y357250D02*Y350750D01*

+X456750D01*

+Y357250D01*

+X450250D01*

+G37*

+G54D215*X437000Y354000D03*

+X463500D03*

+X473500D03*

+X437000Y384000D03*

+Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+Y294000D03*

+G54D213*G36*

+X403750Y177250D02*Y170750D01*

+X410250D01*

+Y177250D01*

+X403750D01*

+G37*

+G36*

+Y207250D02*Y200750D01*

+X410250D01*

+Y207250D01*

+X403750D01*

+G37*

+G36*

+Y237250D02*Y230750D01*

+X410250D01*

+Y237250D01*

+X403750D01*

+G37*

+G36*

+Y267250D02*Y260750D01*

+X410250D01*

+Y267250D01*

+X403750D01*

+G37*

+G54D215*X417000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+X427000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+G54D213*G36*

+X202191Y50750D02*Y44250D01*

+X208691D01*

+Y50750D01*

+X202191D01*

+G37*

+G54D215*X205441Y57500D03*

+Y67500D03*

+G54D213*G36*

+X232191Y50750D02*Y44250D01*

+X238691D01*

+Y50750D01*

+X232191D01*

+G37*

+G54D215*X235441Y57500D03*

+Y67500D03*

+G54D213*G36*

+X262191Y50750D02*Y44250D01*

+X268691D01*

+Y50750D01*

+X262191D01*

+G37*

+G36*

+X172191D02*Y44250D01*

+X178691D01*

+Y50750D01*

+X172191D01*

+G37*

+G36*

+X142191D02*Y44250D01*

+X148691D01*

+Y50750D01*

+X142191D01*

+G37*

+G36*

+X112191D02*Y44250D01*

+X118691D01*

+Y50750D01*

+X112191D01*

+G37*

+G36*

+X82191D02*Y44250D01*

+X88691D01*

+Y50750D01*

+X82191D01*

+G37*

+G54D215*X265441Y57500D03*

+X175441D03*

+X145441D03*

+X115441D03*

+X85441D03*

+X265441Y67500D03*

+X175441D03*

+G54D213*G36*

+X292191Y50750D02*Y44250D01*

+X298691D01*

+Y50750D01*

+X292191D01*

+G37*

+G54D215*X295441Y57500D03*

+Y67500D03*

+X145441D03*

+X115441D03*

+X85441D03*

+G54D216*X85799Y179829D03*

+G54D218*X105799Y184829D03*

+G54D213*G36*

+X102499Y178129D02*Y171529D01*

+X109099D01*

+Y178129D01*

+X102499D01*

+G37*

+G54D218*X115799Y184829D03*

+Y174829D03*

+X125799Y184829D03*

+Y174829D03*

+G54D213*G36*

+X82191Y243250D02*Y236750D01*

+X88691D01*

+Y243250D01*

+X82191D01*

+G37*

+G54D215*X85441Y230000D03*

+Y220000D03*

+G54D218*X135799Y184829D03*

+X145799D03*

+X155799D03*

+X135799Y174829D03*

+X145799D03*

+X155799D03*

+X165799Y184829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X165799Y174829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+G54D213*G36*

+X192499Y200629D02*Y194029D01*

+X199099D01*

+Y200629D01*

+X192499D01*

+G37*

+G54D218*X205799Y197329D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X205799Y184829D03*

+X215799D03*

+X225799D03*

+X205799Y174829D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X235799Y184829D03*

+X245799D03*

+X255799D03*

+X265799D03*

+Y174829D03*

+X275799Y184829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X275799Y174829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D220*X386441Y163000D03*

+X400441Y194000D03*

+X389441Y184000D03*

+X400441Y189000D03*

+G54D221*X386023Y157813D03*

+X398441Y173000D03*

+G54D220*X393441Y208000D03*

+G54D221*X358941Y208500D03*

+G54D220*X384162Y188000D03*

+X458441Y195000D03*

+Y164000D03*

+X372441Y170386D03*

+G54D221*X337441Y163000D03*

+X377347Y162178D03*

+X304584Y207483D03*

+X305280Y204383D03*

+X260941Y191500D03*

+X269441Y198500D03*

+X243941Y202000D03*

+X245863Y191524D03*

+G54D220*X432324Y111000D03*

+X446441Y102000D03*

+X434882Y75000D03*

+G54D222*X440941Y123000D03*

+G54D220*X423441Y75000D03*

+G54D221*X434449Y56500D03*

+X440449D03*

+X354441Y85000D03*

+Y89500D03*

+Y95500D03*

+Y101500D03*

+Y107500D03*

+Y113500D03*

+Y119500D03*

+X245441Y127500D03*

+X309441Y141568D03*

+Y136450D03*

+X310941Y115940D03*

+X305696Y107500D03*

+X387441Y119500D03*

+Y113500D03*

+Y107500D03*

+Y101500D03*

+Y95500D03*

+Y89500D03*

+Y85000D03*

+X390941Y76000D03*

+Y71500D03*

+X391441Y66000D03*

+X394941Y58500D03*

+X393941Y51500D03*

+X392441Y45000D03*

+G54D220*X387441Y326000D03*

+X393441Y355000D03*

+X386720Y282000D03*

+X393441Y327000D03*

+X384162Y306000D03*

+X385941Y354500D03*

+X458441Y375000D03*

+X383662Y378500D03*

+X397441Y373000D03*

+X397941Y367441D03*

+G54D221*X385941Y366000D03*

+G54D220*X458441Y345000D03*

+Y315000D03*

+Y285000D03*

+X398441Y314000D03*

+Y309000D03*

+G54D221*Y291000D03*

+G54D220*X372441Y290689D03*

+Y351189D03*

+G54D221*X339837Y341827D03*

+X353390Y339521D03*

+G54D220*X375441Y235000D03*

+G54D221*X356441Y233000D03*

+X338441Y224192D03*

+Y230124D03*

+G54D220*X384512Y258000D03*

+G54D221*X371602Y260228D03*

+G54D220*X458441Y254000D03*

+Y225000D03*

+X387070Y235000D03*

+X398441Y248000D03*

+Y253000D03*

+G54D221*X396441Y235000D03*

+X392188Y239000D03*

+X388207Y247280D03*

+G54D214*X307716Y275075D03*

+X308992Y271971D03*

+X308872Y266522D03*

+X287917Y307829D03*

+X293902Y282263D03*

+X296779Y304963D03*

+X295937Y243628D03*

+G54D221*X304706Y210583D03*

+G54D214*X296727Y256227D03*

+X312157Y300156D03*

+X312122Y295038D03*

+X303365Y330000D03*

+X285430Y325000D03*

+X302941Y340007D03*

+X245557Y279508D03*

+X242456Y293543D03*

+X254740Y298329D03*

+X242168Y298800D03*

+G54D221*X230441Y293000D03*

+X240391Y278564D03*

+G54D214*X266413Y296594D03*

+X263240Y295329D03*

+X262740Y291829D03*

+X260341Y284249D03*

+X264034Y282931D03*

+G54D221*X246731Y303031D03*

+G54D214*X262750Y268772D03*

+X253101Y261836D03*

+X239302Y262235D03*

+G54D221*X221884Y254000D03*

+X224441Y252000D03*

+X225441Y249000D03*

+X224441Y244000D03*

+X230441Y247000D03*

+G54D214*X269653Y298631D03*

+G54D221*X263441Y320000D03*

+G54D214*X268941Y314000D03*

+X273229Y298582D03*

+X278225Y279602D03*

+X278207Y298612D03*

+X277174Y308219D03*

+X277449Y347500D03*

+G54D221*X260568Y316997D03*

+X261502Y307367D03*

+X279441Y285000D03*

+X270441Y336000D03*

+X249101Y328793D03*

+X270441Y342500D03*

+Y349500D03*

+Y357000D03*

+X246941Y238000D03*

+X242441Y229500D03*

+X246441D03*

+X250941D03*

+X236441Y235500D03*

+X224941Y220500D03*

+X225441Y226500D03*

+X224941Y235500D03*

+X269941Y231500D03*

+X251941Y210500D03*

+X163941Y127500D03*

+X193390D03*

+X152441Y121500D03*

+X151941Y132000D03*

+X112222Y127340D03*

+X114441Y121500D03*

+X115441Y132500D03*

+X127941Y148000D03*

+X141441D03*

+X208941D03*

+X223941D03*

+X198441Y122500D03*

+X234441D03*

+X195441Y133000D03*

+X235941D03*

+X128941Y274500D03*

+Y268500D03*

+Y262500D03*

+Y255000D03*

+Y248500D03*

+Y242500D03*

+X162441Y248500D03*

+X161941Y255000D03*

+X181941Y258500D03*

+X162441Y262500D03*

+X198441D03*

+X219441Y272500D03*

+X217441Y279000D03*

+X198441Y269500D03*

+X205441Y277000D03*

+X220729Y265580D03*

+X220441Y259500D03*

+X218441Y261500D03*

+X162441Y242500D03*

+X165941Y231000D03*

+Y226500D03*

+Y220500D03*

+X169441Y214000D03*

+Y208500D03*

+Y201500D03*

+X185441Y228000D03*

+X212941Y238000D03*

+X203941Y237500D03*

+X193941Y237000D03*

+X177441Y228000D03*

+Y217500D03*

+X104441Y204500D03*

+X100941D03*

+X185441Y217500D03*

+X193941Y212500D03*

+X202441D03*

+X210441D03*

+X220441Y215000D03*

+X162941Y268500D03*

+Y274500D03*

+X158441Y323829D03*

+Y328829D03*

+Y326500D03*

+X141307Y300883D03*

+X197441Y314500D03*

+X195441Y311500D03*

+X197441Y308500D03*

+X124831Y302385D03*

+X135441Y338500D03*

+X126441Y340500D03*

+X111941Y341000D03*

+Y357500D03*

+X121941D03*

+X130941D03*

+X135441Y335000D03*

+X111941Y334000D03*

+X117941D03*

+X126441D03*

+X139941Y338000D03*

+X142441Y357500D03*

+Y349500D03*

+X153941Y338000D03*

+X154941Y345500D03*

+X149441Y349500D03*

+X178887Y342818D03*

+X168732Y350833D03*

+X191363Y344449D03*

+X229818Y354988D03*

+G54D223*G54D221*G54D223*G54D221*G54D223*G54D221*G54D224*G54D221*G54D223*G54D221*G54D223*G54D221*G54D223*G54D221*G54D223*G54D221*G54D223*G54D221*G54D223*G54D221*G54D223*M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.outline.gbr b/bbb_cape/schematic/gerbers/20131204/cape.outline.gbr
new file mode 100644
index 0000000..2220c1d
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.outline.gbr
@@ -0,0 +1,29 @@
+G04 start of page 6 for group 4 idx 4 *

+G04 Title: 971 BBB Cape, outline *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNOUTLINE*%

+%ADD248C,0.0080*%

+G54D248*X479100Y35500D02*X73500D01*

+X68000Y42000D02*Y244000D01*

+X74500Y250500D02*X101000D01*

+X107500Y256000D02*Y312500D01*

+X101000Y319000D02*X74500D01*

+Y399800D02*X478100D01*

+X484600Y393300D02*Y42000D01*

+X68000Y325500D02*Y393300D01*

+X74500Y35500D02*G75*G02X68000Y42000I0J6500D01*G01*

+Y244000D02*G75*G02X74500Y250500I6500J0D01*G01*

+X107500Y257000D02*G75*G02X101000Y250500I-6500J0D01*G01*

+Y319000D02*G75*G02X107500Y312500I0J-6500D01*G01*

+X74500Y319000D02*G75*G02X68000Y325500I0J6500D01*G01*

+X478100Y399800D02*G75*G02X484600Y393300I0J-6500D01*G01*

+Y42000D02*G75*G02X478100Y35500I-6500J0D01*G01*

+X68000Y393300D02*G75*G02X74500Y399800I6500J0D01*G01*

+M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.plated-drill.cnc b/bbb_cape/schematic/gerbers/20131204/cape.plated-drill.cnc
new file mode 100644
index 0000000..0de77e1
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.plated-drill.cnc
@@ -0,0 +1,452 @@
+M48

+INCH

+T256C0.035

+T255C0.010

+T254C0.020

+T253C0.190

+T252C0.046

+T251C0.200

+T250C0.129

+T249C0.040

+%

+T255

+X038602Y015781

+X039844Y017300

+X035894Y020850

+X033744Y016300

+X037735Y016218

+X030458Y020748

+X030528Y020438

+X026094Y019150

+X026944Y019850

+X024394Y020200

+X024586Y019152

+X043445Y005650

+X044045Y005650

+X035444Y008500

+X035444Y008950

+X035444Y009550

+X035444Y010150

+X035444Y010750

+X035444Y011350

+X035444Y011950

+X024544Y012750

+X030944Y014157

+X030944Y013645

+X031094Y011594

+X030570Y010750

+X038744Y011950

+X038744Y011350

+X038744Y010750

+X038744Y010150

+X038744Y009550

+X038744Y008950

+X038744Y008500

+X039094Y007600

+X039094Y007150

+X039144Y006600

+X039494Y005850

+X039394Y005150

+X039244Y004500

+X038594Y036600

+X039844Y029100

+X033984Y034183

+X035339Y033952

+X035644Y023300

+X033844Y022419

+X033844Y023012

+X037160Y026023

+X039644Y023500

+X039219Y023900

+X038821Y024728

+X030772Y027508

+X030899Y027197

+X030887Y026652

+X028792Y030783

+X029390Y028226

+X029678Y030496

+X029594Y024363

+X030471Y021058

+X029673Y025623

+X031216Y030016

+X031212Y029504

+X030336Y033000

+X028543Y032500

+X030294Y034001

+X024556Y027951

+X024246Y029354

+X025474Y029833

+X024217Y029880

+X023044Y029300

+X024039Y027856

+X026641Y029659

+X026324Y029533

+X026274Y029183

+X026034Y028425

+X026403Y028293

+X024673Y030303

+X026275Y026877

+X025310Y026184

+X023930Y026224

+X022188Y025400

+X022444Y025200

+X022544Y024900

+X022444Y024400

+X023044Y024700

+X026965Y029863

+X026344Y032000

+X026894Y031400

+X027323Y029858

+X027822Y027960

+X027821Y029861

+X027717Y030822

+X027745Y034750

+X026057Y031700

+X026150Y030737

+X027944Y028500

+X027044Y033600

+X024910Y032879

+X027044Y034250

+X027044Y034950

+X027044Y035700

+X024694Y023800

+X024244Y022950

+X024644Y022950

+X025094Y022950

+X023644Y023550

+X022494Y022050

+X022544Y022650

+X022494Y023550

+X026994Y023150

+X025194Y021050

+X016394Y012750

+X019339Y012750

+X015244Y012150

+X015194Y013200

+X011222Y012734

+X011444Y012150

+X011544Y013250

+X012794Y014800

+X014144Y014800

+X020894Y014800

+X022394Y014800

+X019844Y012250

+X023444Y012250

+X019544Y013300

+X023594Y013300

+X012894Y027450

+X012894Y026850

+X012894Y026250

+X012894Y025500

+X012894Y024850

+X012894Y024250

+X016244Y024850

+X016194Y025500

+X018194Y025850

+X016244Y026250

+X019844Y026250

+X021944Y027250

+X021744Y027900

+X019844Y026950

+X020544Y027700

+X022073Y026558

+X022044Y025950

+X021844Y026150

+X016244Y024250

+X016594Y023100

+X016594Y022650

+X016594Y022050

+X016944Y021400

+X016944Y020850

+X016944Y020150

+X018544Y022800

+X021294Y023800

+X020394Y023750

+X019394Y023700

+X017744Y022800

+X017744Y021750

+X010444Y020450

+X010094Y020450

+X018544Y021750

+X019394Y021250

+X020244Y021250

+X021044Y021250

+X022044Y021500

+X016294Y026850

+X016294Y027450

+X015844Y032383

+X015844Y032883

+X015844Y032650

+X014131Y030088

+X019744Y031450

+X019544Y031150

+X019744Y030850

+X012483Y030238

+X013544Y033850

+X012644Y034050

+X011194Y034100

+X011194Y035750

+X012194Y035750

+X013094Y035750

+X013544Y033500

+X011194Y033400

+X011794Y033400

+X012644Y033400

+X013994Y033800

+X014244Y035750

+X014244Y034950

+X015394Y033800

+X015494Y034550

+X014944Y034950

+X017889Y034282

+X016873Y035083

+X019136Y034445

+X022982Y035499

+T254

+X038644Y016300

+X040044Y019400

+X038944Y018400

+X040044Y018900

+X039344Y020800

+X038416Y018800

+X045844Y019500

+X045844Y016400

+X037244Y017039

+X043232Y011100

+X044644Y010200

+X043488Y007500

+X042344Y007500

+X038744Y032600

+X039344Y035500

+X038672Y028200

+X039344Y032700

+X038416Y030600

+X038594Y035450

+X045844Y037500

+X038366Y037850

+X039744Y037300

+X039794Y036744

+X045844Y034500

+X045844Y031500

+X045844Y028500

+X039844Y031400

+X039844Y030900

+X037244Y029069

+X037244Y035119

+X037544Y023500

+X038451Y025800

+X045844Y025400

+X045844Y022500

+X038707Y023500

+X039844Y024800

+X039844Y025300

+T256

+X044094Y012300

+T249

+X041700Y038400

+X041700Y029400

+X041700Y035400

+X042700Y038400

+X042700Y029400

+X042700Y035400

+X040700Y035400

+X045350Y026400

+X045350Y020400

+X045350Y017400

+X046350Y026400

+X046350Y020400

+X046350Y017400

+X046350Y014400

+X046350Y011400

+X046350Y008400

+X047350Y026400

+X047350Y020400

+X047350Y017400

+X047350Y014400

+X047350Y011400

+X047350Y008400

+X045350Y023400

+X046350Y023400

+X047350Y023400

+X045350Y014400

+X045350Y011400

+X045350Y008400

+X045350Y005400

+X046350Y005400

+X047350Y005400

+X045350Y032400

+X046350Y032400

+X047350Y032400

+X045350Y029400

+X046350Y029400

+X047350Y029400

+X043700Y032400

+X031244Y024900

+X032244Y024900

+X033244Y024900

+X034244Y024900

+X045350Y038400

+X046350Y038400

+X047350Y038400

+X040700Y038400

+X040700Y029400

+X040700Y032400

+X041700Y032400

+X042700Y032400

+X045350Y035400

+X043700Y035400

+X046350Y035400

+X047350Y035400

+X043700Y038400

+X043700Y017400

+X043700Y020400

+X043700Y023400

+X043700Y026400

+X043700Y029400

+X040700Y017400

+X040700Y020400

+X040700Y023400

+X040700Y026400

+X041700Y017400

+X041700Y020400

+X041700Y023400

+X041700Y026400

+X042700Y017400

+X042700Y020400

+X042700Y023400

+X042700Y026400

+X020544Y004750

+X020544Y005750

+X020544Y006750

+X023544Y004750

+X023544Y005750

+X023544Y006750

+X026544Y004750

+X017544Y004750

+X014544Y004750

+X011544Y004750

+X008544Y004750

+X026544Y005750

+X017544Y005750

+X014544Y005750

+X011544Y005750

+X008544Y005750

+X026544Y006750

+X017544Y006750

+X029544Y004750

+X029544Y005750

+X029544Y006750

+X014544Y006750

+X011544Y006750

+X008544Y006750

+X008544Y024000

+X008544Y023000

+X008544Y022000

+T252

+X010580Y037483

+X010580Y036483

+X011580Y037483

+X011580Y036483

+X012580Y037483

+X012580Y036483

+X013580Y037483

+X013580Y036483

+X014580Y037483

+X014580Y036483

+X015580Y036483

+X016580Y036483

+X015580Y037483

+X016580Y037483

+X017580Y037483

+X018580Y037483

+X019580Y037483

+X020580Y037483

+X017580Y036483

+X018580Y036483

+X019580Y036483

+X020580Y036483

+X021580Y037483

+X022580Y037483

+X023580Y037483

+X021580Y036483

+X022580Y036483

+X023580Y036483

+X024580Y036483

+X025580Y036483

+X026580Y036483

+X024580Y037483

+X025580Y037483

+X026580Y037483

+X027580Y037483

+X027580Y036483

+X028580Y037483

+X029580Y037483

+X030580Y037483

+X031580Y037483

+X032580Y037483

+X028580Y036483

+X029580Y036483

+X030580Y036483

+X031580Y036483

+X032580Y036483

+X010580Y018483

+X010580Y017483

+X011580Y018483

+X011580Y017483

+X012580Y018483

+X012580Y017483

+X013580Y018483

+X014580Y018483

+X015580Y018483

+X013580Y017483

+X014580Y017483

+X015580Y017483

+X016580Y018483

+X017580Y018483

+X018580Y018483

+X019580Y018483

+X016580Y017483

+X017580Y017483

+X018580Y017483

+X019580Y017483

+X019580Y019733

+X020580Y019733

+X021580Y019733

+X022580Y019733

+X023580Y019733

+X020580Y018483

+X021580Y018483

+X022580Y018483

+X020580Y017483

+X021580Y017483

+X022580Y017483

+X023580Y017483

+X024580Y017483

+X025580Y017483

+X023580Y018483

+X024580Y018483

+X025580Y018483

+X026580Y018483

+X026580Y017483

+X027580Y018483

+X028580Y018483

+X029580Y018483

+X030580Y018483

+X031580Y018483

+X032580Y018483

+X027580Y017483

+X028580Y017483

+X029580Y017483

+X030580Y017483

+X031580Y017483

+X032580Y017483

+T250

+X034580Y035733

+X008580Y036983

+X035300Y015000

+X008580Y017983

+T253

+X034580Y019233

+T251

+X031580Y033733

+M30

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.top.gbr b/bbb_cape/schematic/gerbers/20131204/cape.top.gbr
new file mode 100644
index 0000000..ca29885
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.top.gbr
@@ -0,0 +1,3523 @@
+G04 start of page 2 for group 0 idx 0 *

+G04 Title: 971 BBB Cape, top *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:53 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNTOP*%

+%ADD199C,0.0350*%

+%ADD198C,0.0600*%

+%ADD197C,0.0200*%

+%ADD196C,0.0360*%

+%ADD195R,0.0748X0.0748*%

+%ADD194R,0.0948X0.0948*%

+%ADD193R,0.0340X0.0340*%

+%ADD192R,0.0110X0.0110*%

+%ADD191R,0.0200X0.0200*%

+%ADD190R,0.2106X0.2106*%

+%ADD189R,0.0350X0.0350*%

+%ADD188R,0.0512X0.0512*%

+%ADD187R,0.0130X0.0130*%

+%ADD186R,0.0295X0.0295*%

+%ADD185C,0.2100*%

+%ADD184C,0.0660*%

+%ADD183C,0.2200*%

+%ADD182C,0.1830*%

+%ADD181C,0.0650*%

+%ADD180C,0.0550*%

+%ADD179C,0.0400*%

+%ADD178C,0.0250*%

+%ADD177C,0.0080*%

+%ADD176C,0.0100*%

+%ADD175C,0.0001*%

+G54D175*G36*

+X323441Y99000D02*X347441Y123000D01*

+X391441D01*

+Y83000D01*

+X323441D01*

+Y99000D01*

+G37*

+G36*

+X384441Y78000D02*X393441D01*

+Y64000D01*

+X396941Y60500D01*

+Y42500D01*

+X385941D01*

+Y53500D01*

+X387441Y55000D01*

+Y63000D01*

+X384441Y66000D01*

+Y78000D01*

+G37*

+G36*

+X315441Y81000D02*X358441D01*

+Y54000D01*

+X345441D01*

+X331441Y68000D01*

+X315441D01*

+Y81000D01*

+G37*

+G36*

+X275792Y211941D02*X280021Y216170D01*

+X280057Y216201D01*

+X280180Y216344D01*

+X280180Y216344D01*

+X280279Y216506D01*

+X280351Y216680D01*

+X280395Y216864D01*

+X280410Y217052D01*

+X280406Y217099D01*

+Y244696D01*

+X282630Y246920D01*

+Y237610D01*

+X282625Y237551D01*

+X282644Y237316D01*

+X282699Y237086D01*

+X282789Y236868D01*

+X282913Y236667D01*

+X283066Y236487D01*

+X283111Y236449D01*

+X283441Y236119D01*

+Y188427D01*

+X283264Y188319D01*

+X282749Y187879D01*

+X282309Y187364D01*

+X281956Y186787D01*

+X281697Y186162D01*

+X281539Y185504D01*

+X281486Y184829D01*

+X281539Y184154D01*

+X281697Y183496D01*

+X281956Y182871D01*

+X282309Y182294D01*

+X282749Y181779D01*

+X283264Y181339D01*

+X283441Y181231D01*

+Y178427D01*

+X283264Y178319D01*

+X282749Y177879D01*

+X282309Y177364D01*

+X281956Y176787D01*

+X281697Y176162D01*

+X281539Y175504D01*

+X281486Y174829D01*

+X281539Y174154D01*

+X281697Y173496D01*

+X281956Y172871D01*

+X282309Y172294D01*

+X282749Y171779D01*

+X283264Y171339D01*

+X283441Y171231D01*

+Y169500D01*

+X275792D01*

+Y170516D01*

+X275799Y170516D01*

+X276474Y170569D01*

+X277132Y170727D01*

+X277757Y170986D01*

+X278334Y171339D01*

+X278849Y171779D01*

+X279289Y172294D01*

+X279642Y172871D01*

+X279901Y173496D01*

+X280059Y174154D01*

+X280099Y174829D01*

+X280059Y175504D01*

+X279901Y176162D01*

+X279642Y176787D01*

+X279289Y177364D01*

+X278849Y177879D01*

+X278334Y178319D01*

+X277757Y178672D01*

+X277132Y178931D01*

+X276474Y179089D01*

+X275799Y179142D01*

+X275792Y179142D01*

+Y180516D01*

+X275799Y180516D01*

+X276474Y180569D01*

+X277132Y180727D01*

+X277757Y180986D01*

+X278334Y181339D01*

+X278849Y181779D01*

+X279289Y182294D01*

+X279642Y182871D01*

+X279901Y183496D01*

+X280059Y184154D01*

+X280099Y184829D01*

+X280059Y185504D01*

+X279901Y186162D01*

+X279642Y186787D01*

+X279289Y187364D01*

+X278849Y187879D01*

+X278334Y188319D01*

+X277757Y188672D01*

+X277132Y188931D01*

+X276474Y189089D01*

+X275799Y189142D01*

+X275792Y189142D01*

+Y211941D01*

+G37*

+G36*

+X269438Y205587D02*X275792Y211941D01*

+Y189142D01*

+X275124Y189089D01*

+X274466Y188931D01*

+X273841Y188672D01*

+X273264Y188319D01*

+X272749Y187879D01*

+X272309Y187364D01*

+X271956Y186787D01*

+X271697Y186162D01*

+X271539Y185504D01*

+X271486Y184829D01*

+X271539Y184154D01*

+X271697Y183496D01*

+X271956Y182871D01*

+X272309Y182294D01*

+X272749Y181779D01*

+X273264Y181339D01*

+X273841Y180986D01*

+X274466Y180727D01*

+X275124Y180569D01*

+X275792Y180516D01*

+Y179142D01*

+X275124Y179089D01*

+X274466Y178931D01*

+X273841Y178672D01*

+X273264Y178319D01*

+X272749Y177879D01*

+X272309Y177364D01*

+X271956Y176787D01*

+X271697Y176162D01*

+X271539Y175504D01*

+X271486Y174829D01*

+X271539Y174154D01*

+X271697Y173496D01*

+X271956Y172871D01*

+X272309Y172294D01*

+X272749Y171779D01*

+X273264Y171339D01*

+X273841Y170986D01*

+X274466Y170727D01*

+X275124Y170569D01*

+X275792Y170516D01*

+Y169500D01*

+X269438D01*

+Y172538D01*

+X269642Y172871D01*

+X269901Y173496D01*

+X270059Y174154D01*

+X270099Y174829D01*

+X270059Y175504D01*

+X269901Y176162D01*

+X269642Y176787D01*

+X269438Y177120D01*

+Y182538D01*

+X269642Y182871D01*

+X269901Y183496D01*

+X270059Y184154D01*

+X270099Y184829D01*

+X270059Y185504D01*

+X269901Y186162D01*

+X269642Y186787D01*

+X269438Y187120D01*

+Y196695D01*

+X269441Y196694D01*

+X269723Y196717D01*

+X269999Y196783D01*

+X270261Y196891D01*

+X270502Y197039D01*

+X270718Y197223D01*

+X270902Y197439D01*

+X271050Y197680D01*

+X271158Y197942D01*

+X271224Y198218D01*

+X271241Y198500D01*

+X271224Y198782D01*

+X271158Y199058D01*

+X271050Y199320D01*

+X270902Y199561D01*

+X270718Y199777D01*

+X270502Y199961D01*

+X270261Y200109D01*

+X269999Y200217D01*

+X269723Y200283D01*

+X269441Y200306D01*

+X269438Y200305D01*

+Y205587D01*

+G37*

+G36*

+X260938Y197087D02*X269438Y205587D01*

+Y200305D01*

+X269159Y200283D01*

+X268883Y200217D01*

+X268621Y200109D01*

+X268380Y199961D01*

+X268164Y199777D01*

+X267980Y199561D01*

+X267832Y199320D01*

+X267724Y199058D01*

+X267658Y198782D01*

+X267635Y198500D01*

+X267658Y198218D01*

+X267724Y197942D01*

+X267832Y197680D01*

+X267980Y197439D01*

+X268164Y197223D01*

+X268380Y197039D01*

+X268621Y196891D01*

+X268883Y196783D01*

+X269159Y196717D01*

+X269438Y196695D01*

+Y187120D01*

+X269289Y187364D01*

+X268849Y187879D01*

+X268334Y188319D01*

+X267757Y188672D01*

+X267132Y188931D01*

+X266474Y189089D01*

+X265799Y189142D01*

+X265124Y189089D01*

+X264466Y188931D01*

+X263841Y188672D01*

+X263264Y188319D01*

+X262749Y187879D01*

+X262309Y187364D01*

+X261956Y186787D01*

+X261697Y186162D01*

+X261539Y185504D01*

+X261486Y184829D01*

+X261539Y184154D01*

+X261697Y183496D01*

+X261956Y182871D01*

+X262309Y182294D01*

+X262749Y181779D01*

+X263264Y181339D01*

+X263841Y180986D01*

+X264466Y180727D01*

+X265124Y180569D01*

+X265799Y180516D01*

+X266474Y180569D01*

+X267132Y180727D01*

+X267757Y180986D01*

+X268334Y181339D01*

+X268849Y181779D01*

+X269289Y182294D01*

+X269438Y182538D01*

+Y177120D01*

+X269289Y177364D01*

+X268849Y177879D01*

+X268334Y178319D01*

+X267757Y178672D01*

+X267132Y178931D01*

+X266474Y179089D01*

+X265799Y179142D01*

+X265124Y179089D01*

+X264466Y178931D01*

+X263841Y178672D01*

+X263264Y178319D01*

+X262749Y177879D01*

+X262309Y177364D01*

+X261956Y176787D01*

+X261697Y176162D01*

+X261539Y175504D01*

+X261486Y174829D01*

+X261539Y174154D01*

+X261697Y173496D01*

+X261956Y172871D01*

+X262309Y172294D01*

+X262749Y171779D01*

+X263264Y171339D01*

+X263841Y170986D01*

+X264466Y170727D01*

+X265124Y170569D01*

+X265799Y170516D01*

+X266474Y170569D01*

+X267132Y170727D01*

+X267757Y170986D01*

+X268334Y171339D01*

+X268849Y171779D01*

+X269289Y172294D01*

+X269438Y172538D01*

+Y169500D01*

+X260938D01*

+Y189695D01*

+X260941Y189694D01*

+X261223Y189717D01*

+X261499Y189783D01*

+X261761Y189891D01*

+X262002Y190039D01*

+X262218Y190223D01*

+X262402Y190439D01*

+X262550Y190680D01*

+X262658Y190942D01*

+X262724Y191218D01*

+X262741Y191500D01*

+X262724Y191782D01*

+X262658Y192058D01*

+X262550Y192320D01*

+X262402Y192561D01*

+X262218Y192777D01*

+X262002Y192961D01*

+X261761Y193109D01*

+X261499Y193217D01*

+X261223Y193283D01*

+X260941Y193306D01*

+X260938Y193305D01*

+Y197087D01*

+G37*

+G36*

+X269938Y243063D02*X270797Y243922D01*

+X270833Y243953D01*

+X270956Y244096D01*

+X270956Y244097D01*

+X270956Y244097D01*

+X271020Y244202D01*

+X271055Y244258D01*

+Y244258D01*

+X271055Y244258D01*

+X271120Y244415D01*

+X271127Y244432D01*

+X271127Y244432D01*

+X271127Y244432D01*

+X271148Y244519D01*

+X271171Y244616D01*

+Y244616D01*

+X271171Y244616D01*

+X271186Y244804D01*

+X271182Y244851D01*

+Y251016D01*

+X271666Y251500D01*

+X278449D01*

+X273987Y247038D01*

+X273951Y247007D01*

+X273828Y246864D01*

+X273729Y246702D01*

+X273657Y246528D01*

+X273613Y246344D01*

+X273598Y246156D01*

+X273602Y246109D01*

+Y226938D01*

+X269938Y223274D01*

+Y229695D01*

+X269941Y229694D01*

+X270223Y229717D01*

+X270499Y229783D01*

+X270761Y229891D01*

+X271002Y230039D01*

+X271218Y230223D01*

+X271402Y230439D01*

+X271550Y230680D01*

+X271658Y230942D01*

+X271724Y231218D01*

+X271741Y231500D01*

+X271724Y231782D01*

+X271658Y232058D01*

+X271550Y232320D01*

+X271402Y232561D01*

+X271218Y232777D01*

+X271002Y232961D01*

+X270761Y233109D01*

+X270499Y233217D01*

+X270223Y233283D01*

+X269941Y233306D01*

+X269938Y233305D01*

+Y243063D01*

+G37*

+G36*

+X260938Y234062D02*X269938Y243063D01*

+Y233305D01*

+X269659Y233283D01*

+X269383Y233217D01*

+X269121Y233109D01*

+X268880Y232961D01*

+X268664Y232777D01*

+X268480Y232561D01*

+X268332Y232320D01*

+X268224Y232058D01*

+X268158Y231782D01*

+X268135Y231500D01*

+X268158Y231218D01*

+X268224Y230942D01*

+X268332Y230680D01*

+X268480Y230439D01*

+X268664Y230223D01*

+X268880Y230039D01*

+X269121Y229891D01*

+X269383Y229783D01*

+X269659Y229717D01*

+X269938Y229695D01*

+Y223274D01*

+X260938Y214274D01*

+Y234062D01*

+G37*

+G36*

+X255792Y180516D02*X255799Y180516D01*

+X256474Y180569D01*

+X257132Y180727D01*

+X257757Y180986D01*

+X258334Y181339D01*

+X258849Y181779D01*

+X259289Y182294D01*

+X259642Y182871D01*

+X259901Y183496D01*

+X260059Y184154D01*

+X260099Y184829D01*

+X260059Y185504D01*

+X259901Y186162D01*

+X259642Y186787D01*

+X259289Y187364D01*

+X258849Y187879D01*

+X258334Y188319D01*

+X257757Y188672D01*

+X257132Y188931D01*

+X256474Y189089D01*

+X255799Y189142D01*

+X255792Y189142D01*

+Y191941D01*

+X260938Y197087D01*

+Y193305D01*

+X260659Y193283D01*

+X260383Y193217D01*

+X260121Y193109D01*

+X259880Y192961D01*

+X259664Y192777D01*

+X259480Y192561D01*

+X259332Y192320D01*

+X259224Y192058D01*

+X259158Y191782D01*

+X259135Y191500D01*

+X259158Y191218D01*

+X259224Y190942D01*

+X259332Y190680D01*

+X259480Y190439D01*

+X259664Y190223D01*

+X259880Y190039D01*

+X260121Y189891D01*

+X260383Y189783D01*

+X260659Y189717D01*

+X260938Y189695D01*

+Y169500D01*

+X255792D01*

+Y170516D01*

+X255799Y170516D01*

+X256474Y170569D01*

+X257132Y170727D01*

+X257757Y170986D01*

+X258334Y171339D01*

+X258849Y171779D01*

+X259289Y172294D01*

+X259642Y172871D01*

+X259901Y173496D01*

+X260059Y174154D01*

+X260099Y174829D01*

+X260059Y175504D01*

+X259901Y176162D01*

+X259642Y176787D01*

+X259289Y177364D01*

+X258849Y177879D01*

+X258334Y178319D01*

+X257757Y178672D01*

+X257132Y178931D01*

+X256474Y179089D01*

+X255799Y179142D01*

+X255792Y179142D01*

+Y180516D01*

+G37*

+G36*

+Y189142D02*X255124Y189089D01*

+X254466Y188931D01*

+X253841Y188672D01*

+X253264Y188319D01*

+X252749Y187879D01*

+X252309Y187364D01*

+X252114Y187045D01*

+Y188263D01*

+X255792Y191941D01*

+Y189142D01*

+G37*

+G36*

+X243938Y170946D02*X244466Y170727D01*

+X245124Y170569D01*

+X245799Y170516D01*

+X246474Y170569D01*

+X247132Y170727D01*

+X247757Y170986D01*

+X248334Y171339D01*

+X248849Y171779D01*

+X249289Y172294D01*

+X249642Y172871D01*

+X249901Y173496D01*

+X250059Y174154D01*

+X250099Y174829D01*

+X250059Y175504D01*

+X249901Y176162D01*

+X249642Y176787D01*

+X249289Y177364D01*

+X248849Y177879D01*

+X248334Y178319D01*

+X247757Y178672D01*

+X247504Y178777D01*

+X248534D01*

+X248581Y178773D01*

+X248769Y178788D01*

+X248769Y178788D01*

+X248769Y178788D01*

+X248895Y178818D01*

+X248953Y178832D01*

+X248953Y178832D01*

+X248953Y178832D01*

+X249061Y178877D01*

+X249127Y178904D01*

+X249127Y178904D01*

+X249127Y178904D01*

+X249231Y178968D01*

+X249288Y179003D01*

+X249288Y179003D01*

+X249289Y179003D01*

+X249432Y179126D01*

+X249463Y179162D01*

+X251729Y181427D01*

+X251765Y181458D01*

+X251887Y181600D01*

+X251888Y181601D01*

+X251888Y181601D01*

+X251888Y181601D01*

+X251931Y181671D01*

+X251986Y181762D01*

+X251986Y181762D01*

+X251987Y181763D01*

+X252017Y181837D01*

+X252059Y181937D01*

+X252059Y181937D01*

+X252059Y181937D01*

+X252079Y182020D01*

+X252103Y182120D01*

+X252103Y182121D01*

+X252103Y182121D01*

+X252103Y182122D01*

+X252118Y182309D01*

+X252114Y182356D01*

+Y182613D01*

+X252309Y182294D01*

+X252749Y181779D01*

+X253264Y181339D01*

+X253841Y180986D01*

+X254466Y180727D01*

+X255124Y180569D01*

+X255792Y180516D01*

+Y179142D01*

+X255124Y179089D01*

+X254466Y178931D01*

+X253841Y178672D01*

+X253264Y178319D01*

+X252749Y177879D01*

+X252309Y177364D01*

+X251956Y176787D01*

+X251697Y176162D01*

+X251539Y175504D01*

+X251486Y174829D01*

+X251539Y174154D01*

+X251697Y173496D01*

+X251956Y172871D01*

+X252309Y172294D01*

+X252749Y171779D01*

+X253264Y171339D01*

+X253841Y170986D01*

+X254466Y170727D01*

+X255124Y170569D01*

+X255792Y170516D01*

+Y169500D01*

+X243938D01*

+Y170946D01*

+G37*

+G36*

+Y178777D02*X244094D01*

+X243938Y178712D01*

+Y178777D01*

+G37*

+G36*

+X251938Y225845D02*X252176D01*

+X252223Y225841D01*

+X252411Y225856D01*

+X252595Y225900D01*

+X252769Y225972D01*

+X252931Y226071D01*

+X253074Y226194D01*

+X253105Y226230D01*

+X257627Y230751D01*

+X257637Y230764D01*

+X257659Y230783D01*

+X260938Y234062D01*

+Y214274D01*

+X251938Y205274D01*

+Y208695D01*

+X251941Y208694D01*

+X252223Y208717D01*

+X252499Y208783D01*

+X252761Y208891D01*

+X253002Y209039D01*

+X253218Y209223D01*

+X253402Y209439D01*

+X253550Y209680D01*

+X253658Y209942D01*

+X253724Y210218D01*

+X253741Y210500D01*

+X253724Y210782D01*

+X253658Y211058D01*

+X253550Y211320D01*

+X253402Y211561D01*

+X253218Y211777D01*

+X253002Y211961D01*

+X252761Y212109D01*

+X252499Y212217D01*

+X252223Y212283D01*

+X251941Y212306D01*

+X251938Y212305D01*

+Y225845D01*

+G37*

+G36*

+X243938D02*X251938D01*

+Y212305D01*

+X251659Y212283D01*

+X251383Y212217D01*

+X251121Y212109D01*

+X250880Y211961D01*

+X250664Y211777D01*

+X250480Y211561D01*

+X250332Y211320D01*

+X250224Y211058D01*

+X250158Y210782D01*

+X250135Y210500D01*

+X250158Y210218D01*

+X250224Y209942D01*

+X250332Y209680D01*

+X250480Y209439D01*

+X250664Y209223D01*

+X250880Y209039D01*

+X251121Y208891D01*

+X251383Y208783D01*

+X251659Y208717D01*

+X251938Y208695D01*

+Y205274D01*

+X243938Y197274D01*

+Y200195D01*

+X243941Y200194D01*

+X244223Y200217D01*

+X244499Y200283D01*

+X244761Y200391D01*

+X245002Y200539D01*

+X245218Y200723D01*

+X245402Y200939D01*

+X245550Y201180D01*

+X245658Y201442D01*

+X245724Y201718D01*

+X245741Y202000D01*

+X245724Y202282D01*

+X245658Y202558D01*

+X245550Y202820D01*

+X245402Y203061D01*

+X245218Y203277D01*

+X245002Y203461D01*

+X244761Y203609D01*

+X244499Y203717D01*

+X244223Y203783D01*

+X243941Y203806D01*

+X243938Y203805D01*

+Y225845D01*

+G37*

+G36*

+X215792Y180516D02*X215799Y180516D01*

+X216474Y180569D01*

+X217132Y180727D01*

+X217674Y180951D01*

+X219463Y179162D01*

+X219494Y179126D01*

+X219637Y179003D01*

+X219637Y179003D01*

+X219799Y178904D01*

+X219973Y178832D01*

+X220157Y178788D01*

+X220345Y178773D01*

+X220392Y178777D01*

+X224094D01*

+X223841Y178672D01*

+X223264Y178319D01*

+X222749Y177879D01*

+X222309Y177364D01*

+X221956Y176787D01*

+X221697Y176162D01*

+X221539Y175504D01*

+X221486Y174829D01*

+X221539Y174154D01*

+X221697Y173496D01*

+X221956Y172871D01*

+X222309Y172294D01*

+X222749Y171779D01*

+X223264Y171339D01*

+X223841Y170986D01*

+X224466Y170727D01*

+X225124Y170569D01*

+X225799Y170516D01*

+X226474Y170569D01*

+X227132Y170727D01*

+X227757Y170986D01*

+X228334Y171339D01*

+X228849Y171779D01*

+X229289Y172294D01*

+X229642Y172871D01*

+X229901Y173496D01*

+X230059Y174154D01*

+X230099Y174829D01*

+X230059Y175504D01*

+X229901Y176162D01*

+X229642Y176787D01*

+X229289Y177364D01*

+X228849Y177879D01*

+X228334Y178319D01*

+X227757Y178672D01*

+X227504Y178777D01*

+X233567D01*

+X233567Y178777D01*

+X234094D01*

+X233841Y178672D01*

+X233264Y178319D01*

+X232749Y177879D01*

+X232309Y177364D01*

+X231956Y176787D01*

+X231697Y176162D01*

+X231539Y175504D01*

+X231486Y174829D01*

+X231539Y174154D01*

+X231697Y173496D01*

+X231956Y172871D01*

+X232309Y172294D01*

+X232749Y171779D01*

+X233264Y171339D01*

+X233841Y170986D01*

+X234466Y170727D01*

+X235124Y170569D01*

+X235799Y170516D01*

+X236474Y170569D01*

+X237132Y170727D01*

+X237757Y170986D01*

+X238334Y171339D01*

+X238849Y171779D01*

+X239289Y172294D01*

+X239642Y172871D01*

+X239901Y173496D01*

+X240059Y174154D01*

+X240099Y174829D01*

+X240059Y175504D01*

+X239901Y176162D01*

+X239642Y176787D01*

+X239289Y177364D01*

+X238849Y177879D01*

+X238334Y178319D01*

+X237757Y178672D01*

+X237504Y178777D01*

+X243938D01*

+Y178712D01*

+X243841Y178672D01*

+X243264Y178319D01*

+X242749Y177879D01*

+X242309Y177364D01*

+X241956Y176787D01*

+X241697Y176162D01*

+X241539Y175504D01*

+X241486Y174829D01*

+X241539Y174154D01*

+X241697Y173496D01*

+X241956Y172871D01*

+X242309Y172294D01*

+X242749Y171779D01*

+X243264Y171339D01*

+X243841Y170986D01*

+X243938Y170946D01*

+Y169500D01*

+X215792D01*

+Y170516D01*

+X215799Y170516D01*

+X216474Y170569D01*

+X217132Y170727D01*

+X217757Y170986D01*

+X218334Y171339D01*

+X218849Y171779D01*

+X219289Y172294D01*

+X219642Y172871D01*

+X219901Y173496D01*

+X220059Y174154D01*

+X220099Y174829D01*

+X220059Y175504D01*

+X219901Y176162D01*

+X219642Y176787D01*

+X219289Y177364D01*

+X218849Y177879D01*

+X218334Y178319D01*

+X217757Y178672D01*

+X217132Y178931D01*

+X216474Y179089D01*

+X215799Y179142D01*

+X215792Y179142D01*

+Y180516D01*

+G37*

+G36*

+X235792Y223699D02*X237938Y225845D01*

+X243938D01*

+Y203805D01*

+X243659Y203783D01*

+X243383Y203717D01*

+X243121Y203609D01*

+X242880Y203461D01*

+X242664Y203277D01*

+X242480Y203061D01*

+X242332Y202820D01*

+X242224Y202558D01*

+X242158Y202282D01*

+X242135Y202000D01*

+X242158Y201718D01*

+X242224Y201442D01*

+X242332Y201180D01*

+X242480Y200939D01*

+X242664Y200723D01*

+X242880Y200539D01*

+X243121Y200391D01*

+X243383Y200283D01*

+X243659Y200217D01*

+X243938Y200195D01*

+Y197274D01*

+X238686Y192022D01*

+X235792D01*

+Y193016D01*

+X235799Y193016D01*

+X236474Y193069D01*

+X237132Y193227D01*

+X237757Y193486D01*

+X238334Y193839D01*

+X238849Y194279D01*

+X239289Y194794D01*

+X239642Y195371D01*

+X239901Y195996D01*

+X240059Y196654D01*

+X240099Y197329D01*

+X240059Y198004D01*

+X239901Y198662D01*

+X239642Y199287D01*

+X239289Y199864D01*

+X238849Y200379D01*

+X238334Y200819D01*

+X237757Y201172D01*

+X237132Y201431D01*

+X236474Y201589D01*

+X235799Y201642D01*

+X235792Y201642D01*

+Y223699D01*

+G37*

+G36*

+X225792Y213699D02*X235792Y223699D01*

+Y201642D01*

+X235124Y201589D01*

+X234466Y201431D01*

+X233841Y201172D01*

+X233264Y200819D01*

+X232749Y200379D01*

+X232309Y199864D01*

+X231956Y199287D01*

+X231697Y198662D01*

+X231539Y198004D01*

+X231486Y197329D01*

+X231539Y196654D01*

+X231697Y195996D01*

+X231956Y195371D01*

+X232309Y194794D01*

+X232749Y194279D01*

+X233264Y193839D01*

+X233841Y193486D01*

+X234466Y193227D01*

+X235124Y193069D01*

+X235792Y193016D01*

+Y192022D01*

+X231887D01*

+X231840Y192026D01*

+X231652Y192011D01*

+X231468Y191967D01*

+X231294Y191895D01*

+X231132Y191796D01*

+X231132Y191796D01*

+X230989Y191673D01*

+X230958Y191637D01*

+X227903Y188583D01*

+X227757Y188672D01*

+X227132Y188931D01*

+X226474Y189089D01*

+X225799Y189142D01*

+X225792Y189142D01*

+Y193016D01*

+X225799Y193016D01*

+X226474Y193069D01*

+X227132Y193227D01*

+X227757Y193486D01*

+X228334Y193839D01*

+X228849Y194279D01*

+X229289Y194794D01*

+X229642Y195371D01*

+X229901Y195996D01*

+X230059Y196654D01*

+X230099Y197329D01*

+X230059Y198004D01*

+X229901Y198662D01*

+X229642Y199287D01*

+X229289Y199864D01*

+X228849Y200379D01*

+X228334Y200819D01*

+X227757Y201172D01*

+X227132Y201431D01*

+X226474Y201589D01*

+X225799Y201642D01*

+X225792Y201642D01*

+Y213699D01*

+G37*

+G36*

+X218349Y206800D02*X218396Y206796D01*

+X218584Y206811D01*

+X218584Y206811D01*

+X218768Y206855D01*

+X218942Y206927D01*

+X219104Y207026D01*

+X219247Y207149D01*

+X219278Y207185D01*

+X225792Y213699D01*

+Y201642D01*

+X225124Y201589D01*

+X224466Y201431D01*

+X223841Y201172D01*

+X223264Y200819D01*

+X222749Y200379D01*

+X222309Y199864D01*

+X221956Y199287D01*

+X221697Y198662D01*

+X221539Y198004D01*

+X221486Y197329D01*

+X221539Y196654D01*

+X221697Y195996D01*

+X221956Y195371D01*

+X222309Y194794D01*

+X222749Y194279D01*

+X223264Y193839D01*

+X223841Y193486D01*

+X224466Y193227D01*

+X225124Y193069D01*

+X225792Y193016D01*

+Y189142D01*

+X225124Y189089D01*

+X224466Y188931D01*

+X223841Y188672D01*

+X223264Y188319D01*

+X222749Y187879D01*

+X222309Y187364D01*

+X221956Y186787D01*

+X221697Y186162D01*

+X221539Y185504D01*

+X221486Y184829D01*

+X221539Y184154D01*

+X221697Y183496D01*

+X221956Y182871D01*

+X222309Y182294D01*

+X222749Y181779D01*

+X223264Y181339D01*

+X223529Y181177D01*

+X220842D01*

+X219454Y182565D01*

+X219642Y182871D01*

+X219901Y183496D01*

+X220059Y184154D01*

+X220099Y184829D01*

+X220059Y185504D01*

+X219901Y186162D01*

+X219642Y186787D01*

+X219289Y187364D01*

+X218849Y187879D01*

+X218334Y188319D01*

+X217757Y188672D01*

+X217132Y188931D01*

+X216474Y189089D01*

+X215799Y189142D01*

+X215792Y189142D01*

+Y193016D01*

+X215799Y193016D01*

+X216474Y193069D01*

+X217132Y193227D01*

+X217757Y193486D01*

+X218334Y193839D01*

+X218849Y194279D01*

+X219289Y194794D01*

+X219642Y195371D01*

+X219901Y195996D01*

+X220059Y196654D01*

+X220099Y197329D01*

+X220059Y198004D01*

+X219901Y198662D01*

+X219642Y199287D01*

+X219289Y199864D01*

+X218849Y200379D01*

+X218334Y200819D01*

+X217757Y201172D01*

+X217132Y201431D01*

+X216474Y201589D01*

+X215799Y201642D01*

+X215792Y201642D01*

+Y206800D01*

+X218349D01*

+G37*

+G36*

+X215792Y189142D02*X215124Y189089D01*

+X214466Y188931D01*

+X213841Y188672D01*

+X213264Y188319D01*

+X212749Y187879D01*

+X212309Y187364D01*

+X211956Y186787D01*

+X211697Y186162D01*

+X211539Y185504D01*

+X211486Y184829D01*

+X211539Y184154D01*

+X211697Y183496D01*

+X211956Y182871D01*

+X212309Y182294D01*

+X212749Y181779D01*

+X213264Y181339D01*

+X213841Y180986D01*

+X214466Y180727D01*

+X215124Y180569D01*

+X215792Y180516D01*

+Y179142D01*

+X215124Y179089D01*

+X214466Y178931D01*

+X213841Y178672D01*

+X213264Y178319D01*

+X212749Y177879D01*

+X212309Y177364D01*

+X211956Y176787D01*

+X211697Y176162D01*

+X211539Y175504D01*

+X211486Y174829D01*

+X211539Y174154D01*

+X211697Y173496D01*

+X211956Y172871D01*

+X212309Y172294D01*

+X212749Y171779D01*

+X213264Y171339D01*

+X213841Y170986D01*

+X214466Y170727D01*

+X215124Y170569D01*

+X215792Y170516D01*

+Y169500D01*

+X211441D01*

+Y206800D01*

+X215792D01*

+Y201642D01*

+X215124Y201589D01*

+X214466Y201431D01*

+X213841Y201172D01*

+X213264Y200819D01*

+X212749Y200379D01*

+X212309Y199864D01*

+X211956Y199287D01*

+X211697Y198662D01*

+X211539Y198004D01*

+X211486Y197329D01*

+X211539Y196654D01*

+X211697Y195996D01*

+X211956Y195371D01*

+X212309Y194794D01*

+X212749Y194279D01*

+X213264Y193839D01*

+X213841Y193486D01*

+X214466Y193227D01*

+X215124Y193069D01*

+X215792Y193016D01*

+Y189142D01*

+G37*

+G36*

+X267324Y200573D02*X271324D01*

+Y196573D01*

+X267324D01*

+Y200573D01*

+G37*

+G36*

+X271324D01*

+Y196573D01*

+X267324D01*

+Y200573D01*

+G37*

+G36*

+X258824Y193573D02*X262824D01*

+Y189573D01*

+X258824D01*

+Y193573D01*

+G37*

+G36*

+X241824Y204073D02*X245824D01*

+Y200073D01*

+X241824D01*

+Y204073D01*

+G37*

+G36*

+X249824Y212573D02*X253824D01*

+Y208573D01*

+X249824D01*

+Y212573D01*

+G37*

+G36*

+X267824Y233573D02*X271824D01*

+Y229573D01*

+X267824D01*

+Y233573D01*

+G37*

+G36*

+X159441Y233000D02*X168441D01*

+Y219000D01*

+X171941Y215500D01*

+Y197500D01*

+X160941D01*

+Y208500D01*

+X162441Y210000D01*

+Y218000D01*

+X159441Y221000D01*

+Y233000D01*

+G37*

+G36*

+X182941Y321000D02*X199941D01*

+Y302500D01*

+X182941D01*

+Y321000D01*

+G37*

+G36*

+X80441Y248000D02*X109941D01*

+Y266500D01*

+X121941Y278500D01*

+X165941D01*

+Y237000D01*

+X80441D01*

+Y248000D01*

+G37*

+G36*

+X74941Y235000D02*X90441D01*

+Y225000D01*

+X74941D01*

+Y235000D01*

+G37*

+G36*

+X100441D02*X115941D01*

+Y225000D01*

+X100441D01*

+Y235000D01*

+G37*

+G36*

+X112441D02*X127941D01*

+Y225000D01*

+X112441D01*

+Y235000D01*

+G37*

+G36*

+X117441D02*X132941Y234500D01*

+Y225000D01*

+X117441D01*

+Y235000D01*

+G37*

+G36*

+Y232500D02*X132941D01*

+Y222500D01*

+X117441D01*

+Y232500D01*

+G37*

+G36*

+X114941Y223000D02*X130441D01*

+Y213000D01*

+X114941D01*

+Y223000D01*

+G37*

+G36*

+X116441Y224000D02*X131941D01*

+Y214000D01*

+X116441D01*

+Y224000D01*

+G37*

+G36*

+X99941D02*X115441D01*

+Y214000D01*

+X99941D01*

+Y224000D01*

+G37*

+G36*

+X116441Y217500D02*X131941D01*

+Y207500D01*

+X116441D01*

+Y217500D01*

+G37*

+G36*

+X85784Y194500D02*X101441D01*

+Y155500D01*

+X85784D01*

+Y169749D01*

+X85799Y169748D01*

+X87376Y169872D01*

+X88914Y170241D01*

+X90376Y170847D01*

+X91724Y171673D01*

+X92927Y172701D01*

+X93955Y173904D01*

+X94781Y175252D01*

+X95387Y176714D01*

+X95756Y178252D01*

+X95849Y179829D01*

+X95756Y181406D01*

+X95387Y182944D01*

+X94781Y184406D01*

+X93955Y185754D01*

+X92927Y186957D01*

+X91724Y187985D01*

+X90376Y188811D01*

+X88914Y189417D01*

+X87376Y189786D01*

+X85799Y189910D01*

+X85784Y189909D01*

+Y194500D01*

+G37*

+G36*

+X69941D02*X85784D01*

+Y189909D01*

+X84222Y189786D01*

+X82684Y189417D01*

+X81222Y188811D01*

+X79874Y187985D01*

+X78671Y186957D01*

+X77643Y185754D01*

+X76817Y184406D01*

+X76211Y182944D01*

+X75842Y181406D01*

+X75718Y179829D01*

+X75842Y178252D01*

+X76211Y176714D01*

+X76817Y175252D01*

+X77643Y173904D01*

+X78671Y172701D01*

+X79874Y171673D01*

+X81222Y170847D01*

+X82684Y170241D01*

+X84222Y169872D01*

+X85784Y169749D01*

+Y155500D01*

+X69941D01*

+Y194500D01*

+G37*

+G36*

+X102941Y228002D02*X113042Y228010D01*

+X113195Y228047D01*

+X113340Y228107D01*

+X113475Y228189D01*

+X113571Y228272D01*

+X113667Y228189D01*

+X113802Y228107D01*

+X113947Y228047D01*

+X114100Y228010D01*

+X114257Y228001D01*

+X125042Y228010D01*

+X125195Y228047D01*

+X125340Y228107D01*

+X125475Y228189D01*

+X125594Y228292D01*

+X125697Y228411D01*

+X125779Y228546D01*

+X125839Y228691D01*

+X125876Y228844D01*

+X125885Y229001D01*

+X125876Y234276D01*

+X125839Y234429D01*

+X125779Y234574D01*

+X125697Y234709D01*

+X125594Y234828D01*

+X125475Y234931D01*

+X125458Y234941D01*

+X132941Y235000D01*

+X132922Y233953D01*

+X132850Y233971D01*

+X132693Y233980D01*

+X129032Y233971D01*

+X128879Y233934D01*

+X128734Y233874D01*

+X128599Y233792D01*

+X128480Y233689D01*

+X128377Y233570D01*

+X128295Y233435D01*

+X128235Y233290D01*

+X128198Y233137D01*

+X128189Y232980D01*

+X128198Y223020D01*

+X128203Y223000D01*

+Y219972D01*

+X128165Y219928D01*

+X128083Y219793D01*

+X128023Y219648D01*

+X127986Y219495D01*

+X127977Y219338D01*

+X127986Y215245D01*

+X128023Y215092D01*

+X128083Y214947D01*

+X128165Y214812D01*

+X128203Y214768D01*

+Y213972D01*

+X128165Y213928D01*

+X128083Y213793D01*

+X128023Y213648D01*

+X127986Y213495D01*

+X127977Y213338D01*

+X127986Y209245D01*

+X128023Y209092D01*

+X128083Y208947D01*

+X128165Y208812D01*

+X128268Y208693D01*

+X128387Y208590D01*

+X128522Y208508D01*

+X128667Y208448D01*

+X128820Y208411D01*

+X128977Y208402D01*

+X132086Y208411D01*

+X132239Y208448D01*

+X132384Y208508D01*

+X132460Y208555D01*

+X132441Y207500D01*

+X116441D01*

+X102941Y194000D01*

+Y202250D01*

+X104441D01*

+X104794Y202271D01*

+X105138Y202354D01*

+X105466Y202489D01*

+X105768Y202674D01*

+X106037Y202904D01*

+X106267Y203173D01*

+X106452Y203475D01*

+X106587Y203803D01*

+X106670Y204147D01*

+X106698Y204500D01*

+X106670Y204853D01*

+X106587Y205197D01*

+X106452Y205525D01*

+X106267Y205827D01*

+X106037Y206096D01*

+X105768Y206326D01*

+X105466Y206511D01*

+X105138Y206646D01*

+X104794Y206729D01*

+X104441Y206750D01*

+X102941D01*

+Y208969D01*

+X105066Y208974D01*

+X105219Y209011D01*

+X105364Y209071D01*

+X105499Y209153D01*

+X105618Y209256D01*

+X105721Y209375D01*

+X105803Y209510D01*

+X105863Y209655D01*

+X105900Y209808D01*

+X105909Y209965D01*

+X105900Y213074D01*

+X105863Y213227D01*

+X105803Y213372D01*

+X105721Y213507D01*

+X105618Y213626D01*

+X105499Y213729D01*

+X105364Y213811D01*

+X105219Y213871D01*

+X105066Y213908D01*

+X104909Y213917D01*

+X102941Y213913D01*

+Y214087D01*

+X105066Y214092D01*

+X105219Y214129D01*

+X105364Y214189D01*

+X105499Y214271D01*

+X105618Y214374D01*

+X105721Y214493D01*

+X105803Y214628D01*

+X105863Y214773D01*

+X105900Y214926D01*

+X105909Y215083D01*

+X105900Y218192D01*

+X105863Y218345D01*

+X105803Y218490D01*

+X105721Y218625D01*

+X105618Y218744D01*

+X105499Y218847D01*

+X105364Y218929D01*

+X105219Y218989D01*

+X105066Y219026D01*

+X104909Y219035D01*

+X102941Y219031D01*

+Y228002D01*

+G37*

+G36*

+Y206750D02*X99884D01*

+X99884Y207173D01*

+X99847Y207326D01*

+X99787Y207471D01*

+X99705Y207606D01*

+X99602Y207725D01*

+X99483Y207828D01*

+X99348Y207910D01*

+X99203Y207970D01*

+X99078Y208000D01*

+X99203Y208030D01*

+X99348Y208090D01*

+X99483Y208172D01*

+X99602Y208275D01*

+X99705Y208394D01*

+X99787Y208529D01*

+X99847Y208674D01*

+X99884Y208827D01*

+X99893Y208984D01*

+X99892Y209293D01*

+X100232D01*

+X100264Y209256D01*

+X100383Y209153D01*

+X100518Y209071D01*

+X100663Y209011D01*

+X100816Y208974D01*

+X100973Y208965D01*

+X102941Y208969D01*

+Y206750D01*

+G37*

+G36*

+X85434Y225236D02*X85441Y225235D01*

+X86186Y225294D01*

+X86913Y225469D01*

+X87604Y225755D01*

+X88242Y226145D01*

+X88810Y226631D01*

+X89296Y227199D01*

+X89686Y227837D01*

+X89972Y228528D01*

+X90147Y229255D01*

+X90191Y230000D01*

+X90147Y230745D01*

+X89972Y231472D01*

+X89686Y232163D01*

+X89296Y232801D01*

+X88810Y233369D01*

+X88242Y233855D01*

+X87604Y234245D01*

+X86913Y234531D01*

+X86497Y234631D01*

+X101481Y234750D01*

+X101445Y234709D01*

+X101363Y234574D01*

+X101303Y234429D01*

+X101266Y234276D01*

+X101257Y234119D01*

+X101266Y228844D01*

+X101303Y228691D01*

+X101363Y228546D01*

+X101445Y228411D01*

+X101548Y228292D01*

+X101667Y228189D01*

+X101802Y228107D01*

+X101947Y228047D01*

+X102100Y228010D01*

+X102257Y228001D01*

+X102941Y228002D01*

+Y219031D01*

+X100816Y219026D01*

+X100663Y218989D01*

+X100518Y218929D01*

+X100383Y218847D01*

+X100264Y218744D01*

+X100161Y218625D01*

+X100079Y218490D01*

+X100019Y218345D01*

+X99982Y218192D01*

+X99973Y218035D01*

+X99982Y214926D01*

+X100019Y214773D01*

+X100079Y214628D01*

+X100161Y214493D01*

+X100264Y214374D01*

+X100383Y214271D01*

+X100518Y214189D01*

+X100663Y214129D01*

+X100816Y214092D01*

+X100973Y214083D01*

+X102941Y214087D01*

+Y213913D01*

+X100816Y213908D01*

+X100663Y213871D01*

+X100518Y213811D01*

+X100489Y213793D01*

+X99885D01*

+X99884Y214259D01*

+X99847Y214412D01*

+X99787Y214557D01*

+X99705Y214692D01*

+X99602Y214811D01*

+X99483Y214914D01*

+X99348Y214996D01*

+X99203Y215056D01*

+X99050Y215093D01*

+X98893Y215102D01*

+X92832Y215093D01*

+X92679Y215056D01*

+X92534Y214996D01*

+X92399Y214914D01*

+X92280Y214811D01*

+X92177Y214692D01*

+X92095Y214557D01*

+X92035Y214412D01*

+X91998Y214259D01*

+X91989Y214102D01*

+X91998Y208827D01*

+X92035Y208674D01*

+X92095Y208529D01*

+X92177Y208394D01*

+X92280Y208275D01*

+X92399Y208172D01*

+X92534Y208090D01*

+X92679Y208030D01*

+X92804Y208000D01*

+X92679Y207970D01*

+X92534Y207910D01*

+X92399Y207828D01*

+X92280Y207725D01*

+X92177Y207606D01*

+X92095Y207471D01*

+X92035Y207326D01*

+X91998Y207173D01*

+X91989Y207016D01*

+X91998Y201741D01*

+X92035Y201588D01*

+X92095Y201443D01*

+X92177Y201308D01*

+X92280Y201189D01*

+X92399Y201086D01*

+X92534Y201004D01*

+X92679Y200944D01*

+X92832Y200907D01*

+X92989Y200898D01*

+X99050Y200907D01*

+X99203Y200944D01*

+X99348Y201004D01*

+X99483Y201086D01*

+X99602Y201189D01*

+X99705Y201308D01*

+X99787Y201443D01*

+X99847Y201588D01*

+X99884Y201741D01*

+X99893Y201898D01*

+X99892Y202250D01*

+X102941D01*

+Y194000D01*

+X101941Y193000D01*

+Y192500D01*

+X85434D01*

+Y215236D01*

+X85441Y215235D01*

+X86186Y215294D01*

+X86913Y215469D01*

+X87604Y215755D01*

+X88242Y216145D01*

+X88810Y216631D01*

+X89296Y217199D01*

+X89686Y217837D01*

+X89972Y218528D01*

+X90147Y219255D01*

+X90191Y220000D01*

+X90147Y220745D01*

+X89972Y221472D01*

+X89686Y222163D01*

+X89296Y222801D01*

+X88810Y223369D01*

+X88242Y223855D01*

+X87604Y224245D01*

+X86913Y224531D01*

+X86186Y224706D01*

+X85441Y224765D01*

+X85434Y224764D01*

+Y225236D01*

+G37*

+G36*

+X69941Y234500D02*X84313Y234614D01*

+X83969Y234531D01*

+X83278Y234245D01*

+X82640Y233855D01*

+X82072Y233369D01*

+X81586Y232801D01*

+X81196Y232163D01*

+X80910Y231472D01*

+X80735Y230745D01*

+X80676Y230000D01*

+X80735Y229255D01*

+X80910Y228528D01*

+X81196Y227837D01*

+X81586Y227199D01*

+X82072Y226631D01*

+X82640Y226145D01*

+X83278Y225755D01*

+X83969Y225469D01*

+X84696Y225294D01*

+X85434Y225236D01*

+Y224764D01*

+X84696Y224706D01*

+X83969Y224531D01*

+X83278Y224245D01*

+X82640Y223855D01*

+X82072Y223369D01*

+X81586Y222801D01*

+X81196Y222163D01*

+X80910Y221472D01*

+X80735Y220745D01*

+X80676Y220000D01*

+X80735Y219255D01*

+X80910Y218528D01*

+X81196Y217837D01*

+X81586Y217199D01*

+X82072Y216631D01*

+X82640Y216145D01*

+X83278Y215755D01*

+X83969Y215469D01*

+X84696Y215294D01*

+X85434Y215236D01*

+Y192500D01*

+X69941D01*

+Y234500D01*

+G37*

+G54D176*X371215Y358262D02*X371157D01*

+X387623D02*X371287D01*

+X379941Y355000D02*X370441D01*

+X384162Y344917D02*Y350779D01*

+X379044Y340311D02*Y336000D01*

+X381603Y342614D02*Y338000D01*

+X384162Y350779D02*X379941Y355000D01*

+X386720Y353721D02*X385941Y354500D01*

+X381603Y338000D02*X391838D01*

+X376485Y347145D02*X372441Y351189D01*

+X376485Y342614D02*Y347145D01*

+X389279Y342614D02*Y355913D01*

+X386720Y342614D02*Y353721D01*

+X458441Y375000D02*X456641D01*

+Y373200D01*

+X448750D01*

+Y349250D01*

+X458441Y345000D02*X456641D01*

+Y336000D01*

+X448750Y330300D02*X376485D01*

+X448750D02*Y322775D01*

+X376485Y330300D02*Y325219D01*

+X456641Y336000D02*X379044D01*

+X402250Y323839D02*X391838D01*

+X458441Y316800D02*Y315000D01*

+Y316800D02*X458250D01*

+D03*

+X448750D01*

+Y328750D02*Y316800D01*

+X391838Y323839D02*Y321689D01*

+X394397Y319386D02*Y315434D01*

+X379044Y319386D02*Y324000D01*

+X379441Y312000D02*X370441D01*

+X381603Y314162D02*X379441Y312000D01*

+X381044Y326000D02*X387441D01*

+X379044Y324000D02*X381044Y326000D01*

+X389279Y319386D02*Y324162D01*

+X387441Y326000D02*X389279Y324162D01*

+X381603Y321689D02*Y314162D01*

+X376485Y328750D02*Y321689D01*

+X402250Y323839D02*Y317434D01*

+X395831Y314000D02*X398441D01*

+G54D177*X387172Y312000D02*X386720Y312452D01*

+Y319386D01*

+G54D176*X448750Y349250D02*X394397D01*

+X391838Y338000D02*Y353397D01*

+X394397Y349250D02*Y344917D01*

+X393441Y365941D02*X396441D01*

+X397941Y367441D01*

+X397441Y373000D02*X395441D01*

+X393441Y371000D01*

+X389279Y356605D02*X387623Y358262D01*

+X389279Y356005D02*Y356605D01*

+X391838Y353397D02*X393441Y355000D01*

+G54D177*Y358500D01*

+X385941Y366000D02*X393441Y358500D01*

+X306581Y273940D02*X307716Y275075D01*

+X305390Y270003D02*X308872Y266522D01*

+X297976Y273940D02*X306581D01*

+X297976Y271971D02*X308992D01*

+X297976Y270003D02*X305390D01*

+X297976Y287719D02*X295178D01*

+X297976Y279845D02*X296286D01*

+X294441Y278000D01*

+X295259Y287719D02*X293902Y286362D01*

+Y282263D01*

+X294482Y268095D02*Y265543D01*

+X297976Y266066D02*X301042Y263000D01*

+X318441D01*

+X294482Y265543D02*X298803Y261222D01*

+X317755D01*

+X313869Y257572D02*X299592D01*

+X294164Y263000D01*

+G54D176*X295489Y226192D02*X312917D01*

+X284130Y237551D02*X295489Y226192D01*

+X296103Y228124D02*X312620D01*

+X286099Y238128D02*X296103Y228124D01*

+X284130Y260093D02*Y237551D01*

+X286099Y260093D02*Y238128D01*

+G54D177*X280193Y251547D02*Y258394D01*

+X282162Y260093D02*Y248149D01*

+X279206Y245193D02*Y230234D01*

+X292004Y260093D02*X294441D01*

+X274802Y246156D02*X280193Y251547D01*

+X282162Y248149D02*X279206Y245193D01*

+X296748Y252388D02*Y253650D01*

+Y247270D02*Y245000D01*

+X296662Y244914D01*

+X290441D01*

+X295937D02*Y243628D01*

+X294348Y260093D02*X296748Y257693D01*

+Y253693D01*

+X290048Y252000D02*Y258394D01*

+X289441Y263000D02*X288067Y261626D01*

+Y258394D01*

+X279890Y282687D02*X294482Y268095D01*

+X294164Y263000D02*X289441D01*

+X318441D02*X332441Y249000D01*

+X317755Y261222D02*X327407Y251570D01*

+Y246410D01*

+X330486Y243331D01*

+X313869Y257572D02*X322441Y249000D01*

+X262477Y260093D02*Y253536D01*

+X264445Y260093D02*Y251504D01*

+X266414Y260093D02*X266441Y249500D01*

+X274802Y246156D02*Y226441D01*

+X256810Y231631D02*X269982Y244804D01*

+X268382Y260093D02*Y246941D01*

+X274288Y260093D02*Y255819D01*

+X269982Y251513D01*

+Y244804D01*

+X257443Y270002D02*X261210Y266235D01*

+X263795D01*

+X266978Y269418D01*

+X288066Y300735D02*X289428Y299372D01*

+X286098Y300431D02*X288774Y297755D01*

+X288066Y304963D02*Y300735D01*

+X286098Y304963D02*Y300440D01*

+Y300614D02*Y300440D01*

+Y300475D02*Y300431D01*

+X278224Y304963D02*Y298517D01*

+X276255Y304963D02*Y307300D01*

+X277174Y308219D01*

+X266413Y304963D02*Y296594D01*

+X264444Y304963D02*Y298992D01*

+Y299125D02*X263240Y297921D01*

+X262476Y304963D02*X260740Y303227D01*

+Y293329D01*

+X258841Y290090D02*Y301933D01*

+X260740Y293329D02*X262240Y291829D01*

+X262740D01*

+X253106Y295592D02*X254740Y297226D01*

+Y298329D01*

+X263240Y297921D02*Y295329D01*

+X270351Y295943D02*Y297933D01*

+X272319Y295908D02*Y297672D01*

+X270351Y297933D02*X269653Y298631D01*

+X272319Y297672D02*X273229Y298582D01*

+X253106Y270002D02*X257334D01*

+X261609Y279844D02*X264034Y282269D01*

+X266978Y286653D02*X262278D01*

+X258841Y290090D01*

+X274287Y304963D02*Y317689D01*

+X270726Y321249D01*

+X275887Y312972D02*Y318352D01*

+X270350Y304963D02*Y309150D01*

+X272318Y304963D02*Y315385D01*

+X280192Y308667D02*X275887Y312972D01*

+X278941Y328992D02*Y313000D01*

+X282161Y309780D01*

+Y303264D01*

+X272318Y315385D02*X269965Y317738D01*

+X278941Y328008D02*Y337500D01*

+X280119Y338678D01*

+X285430D01*

+X277449Y342559D02*Y347500D01*

+G54D178*X260839Y342992D02*X260347Y342500D01*

+X265957Y349992D02*Y342500D01*

+Y349992D02*X266449Y349500D01*

+X270441D01*

+X265957Y342500D02*X266000Y342457D01*

+Y335500D01*

+X265957Y342008D02*X266449Y342500D01*

+X270441D01*

+X266000Y335992D02*X266008Y336000D01*

+X270441D01*

+X266000Y356992D02*Y349500D01*

+Y356992D02*X270441D01*

+G54D177*X270708Y321267D02*X264708D01*

+X271118Y323121D02*X261394D01*

+X260568Y322295D01*

+X264708Y321267D02*X263441Y320000D01*

+X260568Y322295D02*Y316997D01*

+X269965Y317738D02*X265196D01*

+X260348Y312890D01*

+X270350Y309150D02*X269500Y310000D01*

+Y310492D02*X268941Y311051D01*

+Y314000D01*

+X268381Y304963D02*Y305794D01*

+X267156Y307019D01*

+X267255Y306920D02*X264382Y309793D01*

+Y310000D01*

+Y310492D02*X261502Y307612D01*

+Y307367D01*

+X260348Y312890D02*X257209D01*

+X254546Y315552D01*

+Y323347D01*

+X303365Y324772D02*Y330000D01*

+X296453Y340007D02*X302941D01*

+X339837Y341827D02*X349316D01*

+X358050Y350561D01*

+X353390Y339521D02*X360933Y347064D01*

+Y352336D01*

+X358050Y350561D02*Y353251D01*

+X363061Y358262D01*

+X360933Y352336D02*X363598Y355000D01*

+X371157Y358262D02*X363061D01*

+X370441Y355000D02*X363598D01*

+X307462Y300156D02*X312157D01*

+X304176Y305229D02*X369319D01*

+X303559Y307000D02*X376441D01*

+X302670Y312000D02*X370441D01*

+X297976Y283782D02*X333399D01*

+X297976Y281814D02*X333104D01*

+X297976Y277877D02*X334778D01*

+X297976Y285751D02*X333942D01*

+X297976Y289688D02*X332396D01*

+X332251Y291656D02*X332761D01*

+X371602Y260228D02*Y245343D01*

+X377944Y239000D01*

+X358441Y252000D02*Y235000D01*

+X363241Y256452D02*Y255546D01*

+X364841Y257243D02*Y256457D01*

+X366441Y257976D02*Y256869D01*

+X358441Y235000D02*X356441Y233000D01*

+X312620Y228124D02*X336441D01*

+X312917Y226192D02*X336441D01*

+Y228124D02*X338441Y230124D01*

+X330486Y243331D02*X336772D01*

+X342441Y249000D01*

+X398441Y291000D02*X389279Y300162D01*

+Y321689D02*Y300162D01*

+X369319Y305229D02*X401986Y272561D01*

+X387182Y304280D02*X384902Y302000D01*

+X381441D01*

+X387172Y304270D02*Y312000D01*

+X333399Y283782D02*X361641Y255540D01*

+X333104Y281814D02*X360041Y254877D01*

+X334778Y277877D02*X358441Y254214D01*

+Y252000D01*

+X333942Y285751D02*X363241Y256452D01*

+X332396Y289688D02*X364841Y257243D01*

+X332761Y291656D02*X366441Y257976D01*

+X396441Y235000D02*X395441D01*

+X391838Y231397D01*

+X401986Y245532D02*X391461Y235007D01*

+X388207Y247280D02*Y242981D01*

+X392188Y239000D01*

+X401986Y272561D02*Y253764D01*

+Y253878D02*Y245532D01*

+X291991Y307772D02*X298420D01*

+X295931Y299372D02*X297971Y301411D01*

+X296702Y297755D02*X304176Y305229D01*

+X292003Y304963D02*X296779D01*

+X297938Y301378D02*X303559Y307000D01*

+X289428Y299372D02*X295931D01*

+X288774Y297755D02*X296702D01*

+X297976Y295593D02*X302689D01*

+X304230Y299288D02*X305098Y300156D01*

+X303365Y319654D02*X298786D01*

+X296453Y317321D01*

+X294941Y310500D02*X296453Y312012D01*

+Y317321D01*

+X298441Y307772D02*X302670Y312000D01*

+X305098Y300156D02*X307954D01*

+X297976Y291656D02*X332557D01*

+X302689Y295593D02*X304230Y297134D01*

+Y299288D01*

+X305357Y295038D02*X303944Y293625D01*

+X299675D01*

+X305357Y295038D02*X312122D01*

+X290035Y305815D02*X291991Y307772D01*

+X290035Y304963D02*Y305815D01*

+X284129Y304963D02*Y309188D01*

+X285441Y310500D01*

+X294941D01*

+X285430Y318650D02*Y325000D01*

+X275887Y318352D02*X271118Y323121D01*

+X280192Y308667D02*Y300309D01*

+X281692Y298809D01*

+Y293836D01*

+X275876Y288020D01*

+X294441Y278000D02*X288441D01*

+X281441Y285000D01*

+X279441D01*

+X275876Y288020D02*Y284637D01*

+X277826Y282687D01*

+X279890D01*

+X264034Y282269D02*Y282931D01*

+X266978Y269418D02*Y286653D01*

+G54D176*X387425Y186369D02*X385730Y184673D01*

+G54D177*X379833Y188086D02*X383246Y184673D01*

+X385730D01*

+G54D176*X387441Y189962D02*Y186369D01*

+X387479Y190000D02*X387441Y189962D01*

+X386720Y190759D02*X387479Y190000D01*

+X386720Y203689D02*Y190759D01*

+X378441Y195000D02*X376441D01*

+X381603Y198162D02*X378441Y195000D01*

+X381603Y203689D02*Y198162D01*

+G54D177*X379833Y192610D02*Y188086D01*

+G54D176*X384162Y201386D02*Y188000D01*

+G54D177*X366441Y203078D02*X374519Y195000D01*

+X364841Y202092D02*X374323Y192610D01*

+X363241Y201429D02*X377441Y187229D01*

+X374519Y195000D02*X376510D01*

+X374323Y192610D02*X379833D01*

+G54D176*X387441Y186369D02*X387425D01*

+X387441D03*

+X391810Y186000D02*X394810Y183000D01*

+X389279Y184162D02*X389441Y184000D01*

+X389279Y187162D02*Y184162D01*

+G54D177*X389441Y184000D02*X398441Y175000D01*

+G54D176*X399882Y188441D02*X395441D01*

+X400441Y189000D02*X399882Y188441D01*

+X400000Y193559D02*X395441D01*

+G54D177*X377441Y187229D02*Y168118D01*

+Y166395D02*X386151Y157685D01*

+X377441Y166395D02*Y168000D01*

+X369127Y171314D03*

+Y169388D02*Y193214D01*

+Y169388D02*X376337Y162178D01*

+X377347D01*

+G54D176*X400441Y194000D02*X400000Y193559D01*

+X391838Y199083D02*Y195535D01*

+G54D177*X361641Y200700D02*X369127Y193214D01*

+G54D176*X458250Y196800D02*X412250D01*

+X394397Y229250D02*Y226917D01*

+X456641Y225000D02*Y218000D01*

+X458441Y196800D02*Y195000D01*

+Y196800D02*X458250D01*

+D03*

+X456641Y218000D02*X379044D01*

+Y206000D02*X389279D01*

+X379044Y201386D02*Y206000D01*

+X389279Y201386D02*Y206000D01*

+G54D177*X358941Y208500D02*X360041Y209600D01*

+G54D176*X391838Y224614D02*Y220000D01*

+G54D177*X336441Y226192D02*X338441Y224192D01*

+G54D176*X391810Y195575D02*Y186000D01*

+X391838Y195603D02*X391810Y195575D01*

+X389279Y203689D02*Y187096D01*

+X412250Y204300D02*Y196800D01*

+Y211300D02*Y197300D01*

+Y211300D02*X389117D01*

+X391973Y197309D02*X391838D01*

+X394441Y200000D02*X400441Y194000D01*

+X401750Y211300D02*X376485D01*

+Y203689D01*

+Y208000D02*Y203689D01*

+X445441Y169109D02*X448750Y165800D01*

+X445441Y181000D02*Y169109D01*

+X443441Y183000D02*X445441Y181000D01*

+X458441Y165800D02*Y164000D01*

+Y165800D02*X458250D01*

+D03*

+X448750D01*

+X394810Y183000D02*X443441D01*

+G54D177*X398441Y175000D02*Y173000D01*

+G54D178*X440941Y123000D02*X398441Y165500D01*

+Y173000D01*

+G54D177*X328601Y146898D02*X332661Y150958D01*

+Y187953D01*

+X334308Y150202D02*Y188569D01*

+X335927Y149558D02*X337441Y151072D01*

+Y163000D01*

+G54D176*X432000Y72118D02*X434882Y75000D01*

+X432000Y70000D02*Y72118D01*

+X426882Y71559D02*X423441Y75000D01*

+X426882Y70000D02*Y71559D01*

+G54D178*X339686Y89905D02*X329441D01*

+X339686D02*X352782Y103001D01*

+X371441D01*

+X397048Y89543D02*Y94393D01*

+X394441Y97000D01*

+X386941D01*

+X356323Y63493D02*X356441Y63611D01*

+X361441Y63493D02*Y73080D01*

+X367323Y65618D02*X366441Y66500D01*

+Y73080D01*

+X367323Y63493D02*Y65618D01*

+Y59382D02*Y63001D01*

+X365434Y57493D02*X367323Y59382D01*

+X361441Y57493D02*X365434D01*

+X371441Y66000D02*X372441Y65000D01*

+Y63001D01*

+Y63493D02*Y57001D01*

+X371441Y76229D02*Y66000D01*

+Y109694D02*Y73080D01*

+X372441Y56509D02*X370450D01*

+X374048Y51000D02*X374049Y51001D01*

+X370450Y56509D02*X368941Y55000D01*

+Y44500D01*

+X369527Y43914D01*

+X378362D02*X369527D01*

+X382323Y45493D02*X379934D01*

+X379941D02*X378362Y43914D01*

+X374049Y51001D02*X382323D01*

+X387441D02*Y45001D01*

+X377559Y62882D02*Y57001D01*

+X382941Y57608D02*X382942Y57607D01*

+X382941Y63500D02*Y58001D01*

+X382323Y57383D02*X382941Y58001D01*

+X389941Y62500D02*X390027Y58001D01*

+X382323Y51493D02*Y57383D01*

+X390027Y58394D02*Y53587D01*

+X387441Y51001D01*

+X376441Y64000D02*X377559Y62882D01*

+X386441Y76229D02*Y66000D01*

+X381441Y76229D02*Y65000D01*

+X376441Y76229D02*Y64000D01*

+X386441Y66000D02*X389941Y62500D01*

+X381441Y65000D02*X382941Y63500D01*

+X397048Y82457D02*X397441Y82064D01*

+Y76000D01*

+X396949Y70882D02*X392067Y66000D01*

+X391441D01*

+G54D176*X381441Y302000D02*X376441Y307000D01*

+X458441Y254000D02*X456641D01*

+Y252200D01*

+X448750D01*

+Y229250D01*

+X458441Y225000D02*X456641D01*

+X379044Y222311D02*Y218000D01*

+X386720Y224614D02*Y234650D01*

+X381603Y220000D02*X391838D01*

+X381603Y224614D02*Y220000D01*

+G54D177*X391838Y231397D02*Y224614D01*

+G54D176*X448750Y229250D02*X394397D01*

+X397497Y247056D02*X393135D01*

+X398441Y248000D02*X397497Y247056D01*

+X397615Y252174D02*X398441Y253000D01*

+X393135Y252174D02*X397615D01*

+X458441Y286800D02*Y285000D01*

+Y286800D02*X458250D01*

+D03*

+X432250D01*

+Y317434D02*Y286800D01*

+Y317434D02*X402250D01*

+X394397Y315434D02*X395831Y314000D01*

+X384162Y319386D02*Y306000D01*

+X392949Y311118D02*X395831Y314000D01*

+X395441Y306000D02*X398441Y309000D01*

+X392949Y306000D02*X395441D01*

+X389279Y232825D02*X391441Y234987D01*

+X389279Y226917D02*Y232825D01*

+X384162Y232782D02*X377944Y239000D01*

+X384162Y226917D02*Y232782D01*

+X386720Y234650D02*X387070Y235000D01*

+X376485Y233956D02*X375441Y235000D01*

+X376485Y224614D02*Y233956D01*

+G54D177*X366441Y257772D02*Y203078D01*

+X364841Y256865D02*Y202092D01*

+X363241Y256202D02*Y201429D01*

+X360041Y254877D02*Y210000D01*

+X361641Y255540D02*Y200767D01*

+X360041Y209600D02*Y229900D01*

+G54D176*X238192Y283781D02*X227240Y272829D01*

+G54D177*X237756Y285750D02*X225528Y273522D01*

+X237358Y287718D02*X223884Y274244D01*

+G54D176*X232350Y273939D02*X229240Y270829D01*

+G54D177*X228128Y289687D02*X220754D01*

+X203441Y293000D02*X204441Y292000D01*

+G54D176*X252106Y260829D02*X248799D01*

+X253106Y261829D02*X252106Y260829D01*

+X253106Y266065D02*Y261829D01*

+G54D177*Y271970D02*X259552D01*

+X253106Y268033D02*X249600D01*

+X249396Y267829D01*

+X270351Y260093D02*Y296024D01*

+X272319Y260093D02*Y295594D01*

+X278225Y260093D02*Y279602D01*

+X259552Y271970D02*X262750Y268772D01*

+X260501Y279844D02*X261609D01*

+X250834Y291655D02*X254805D01*

+X247189Y277876D02*X245557Y279508D01*

+X253106Y277876D02*X247189D01*

+X253106Y275907D02*X245166D01*

+X245207D02*X242550Y278564D01*

+X240391D01*

+G54D176*X253106Y283781D02*X238192D01*

+G54D177*X253106Y285750D02*X237756D01*

+X253106Y287718D02*X237358D01*

+G54D176*X253106Y273939D02*X232350D01*

+G54D177*X253106Y289687D02*X228091D01*

+X253106Y279844D02*X260641D01*

+X253106Y281813D02*X257905D01*

+X260341Y284249D01*

+X253106Y293624D02*X252274D01*

+X250724Y295174D01*

+Y297065D01*

+X249939Y297850D01*

+X246827D01*

+X249757Y292732D02*X250834Y291655D01*

+X249757Y292732D02*X243267D01*

+X242456Y293543D01*

+X246335Y297850D02*X243118D01*

+X242168Y298800D01*

+X239154Y268222D02*Y265356D01*

+X243681Y260829D01*

+X240788Y263721D02*X239302Y262235D01*

+X223884Y274244D02*Y256000D01*

+X225528Y273522D02*Y253087D01*

+X227240Y272829D02*Y250799D01*

+X229240Y270829D02*Y248201D01*

+X223884Y256000D02*X221884Y254000D01*

+X225528Y253087D02*X224441Y252000D01*

+X227240Y250799D02*X225441Y249000D01*

+X229240Y248201D02*X230441Y247000D01*

+X237441Y227045D02*X218396Y208000D01*

+X189441D01*

+X172611Y191170D01*

+X220729Y265580D02*X218246Y268063D01*

+X219441Y272500D02*X222262Y275321D01*

+X218309Y268000D02*X216941Y269368D01*

+Y274500D01*

+X249396Y267829D02*X246240D01*

+X262477Y253536D02*X246941Y238000D01*

+X264445Y251504D02*X242441Y229500D01*

+X266441Y249500D02*X246441Y229500D01*

+X268382Y246941D02*X250941Y229500D01*

+X239183Y190822D02*X274802Y226441D01*

+X279206Y230265D02*Y217052D01*

+X250914Y188760D01*

+X237359Y227045D02*X252223D01*

+X256778Y231600D01*

+G54D178*X275291Y220952D02*X245863Y191524D01*

+X130941Y231228D02*X130453Y230740D01*

+X135941Y231228D02*X135571Y230858D01*

+X140941Y231228D02*X141012Y231157D01*

+X145941Y231228D02*X146130Y231039D01*

+G54D179*X99311Y243370D02*X107571D01*

+G54D178*X130453Y230740D02*Y211370D01*

+X135571Y230858D02*Y217370D01*

+X141012Y231157D02*Y216468D01*

+X146130Y231039D02*Y217370D01*

+X150941Y231228D02*Y212118D01*

+X146130Y217370D02*X146571Y216929D01*

+Y211370D01*

+X146441Y211500D02*X146571Y211630D01*

+X141012Y217862D02*Y213571D01*

+X138811Y211370D01*

+X135571D01*

+X102449Y211441D02*X102347Y211543D01*

+X95941D01*

+X150941Y212118D02*X151689Y211370D01*

+X145941Y264693D02*X146130Y264504D01*

+Y226000D01*

+X155941Y231228D02*Y213914D01*

+X160941Y231228D02*Y220500D01*

+X170949Y231882D02*X170067Y231000D01*

+X165941D01*

+X170949Y237000D02*X170441Y237508D01*

+Y241457D01*

+X170048Y248543D02*X170005Y248500D01*

+X162441D01*

+X148799Y308829D02*X141799Y308888D01*

+X141307D02*X126799D01*

+X148799Y303829D02*X148740Y303770D01*

+X141799D01*

+X124831Y309514D02*Y302385D01*

+X141307Y303770D02*Y300883D01*

+X148799Y298829D02*X148599Y298629D01*

+Y292229D01*

+X148299D02*X145899Y289829D01*

+X126799D01*

+X167299Y298829D02*X156799Y288329D01*

+X140949Y328941D02*X141061Y328829D01*

+X140949Y323559D02*X141219Y323829D01*

+X140949Y318441D02*Y314492D01*

+X141799Y313642D01*

+Y308888D01*

+X141061Y328829D02*X151799D01*

+X148799Y333829D02*X141441D01*

+X151799Y328829D02*Y323829D01*

+X148799Y328829D02*X158441D01*

+Y324500D01*

+X148799Y323829D02*X158441D01*

+Y327000D01*

+X141219Y323829D02*X151799D01*

+G54D177*X159770Y318829D02*X151799D01*

+X158270Y313829D02*X151799D01*

+X151115Y359500D02*X145803Y364811D01*

+X145249Y359724D02*X139132D01*

+X135740Y363117D01*

+Y364932D01*

+X162155Y342818D02*X145249Y359724D01*

+G54D178*X168732Y355962D02*Y350833D01*

+G54D177*X151115Y359500D02*X172571D01*

+X173850Y358221D01*

+Y355962D01*

+G54D178*X155941Y213914D02*X157485Y212370D01*

+X160941Y220500D02*X164571Y216870D01*

+Y212370D01*

+X163571Y211370D01*

+Y205370D01*

+X157485Y211977D02*X158453Y211009D01*

+Y205370D01*

+X151571D01*

+X158382Y199992D02*X156674Y198284D01*

+X149157D01*

+X146441Y201000D01*

+Y211500D01*

+G54D177*X152164Y191170D02*X145828Y184834D01*

+G54D178*X163571Y204878D02*X163500Y204807D01*

+Y199500D01*

+G54D177*X172611Y191170D02*X152164D01*

+G54D178*X167299Y298829D02*X197799D01*

+X197307Y323888D02*X187799D01*

+G54D177*X179441Y338500D02*X159770Y318829D01*

+X180941Y336500D02*X158270Y313829D01*

+X178887Y342818D02*X162155D01*

+X184799Y328829D02*X199112D01*

+X205941Y295500D02*Y325147D01*

+X197259Y333829D01*

+X199112Y328829D02*X203441Y324500D01*

+X197259Y333829D02*X187799D01*

+X197441Y336500D02*X180941D01*

+X198441Y338500D02*X179441D01*

+X191363Y344449D02*X179851Y355962D01*

+X173850D01*

+X222262Y275321D02*Y280532D01*

+X216941Y274500D02*X219941Y277500D01*

+Y281500D01*

+X203519Y292922D02*X217441Y279000D01*

+X219941Y281500D02*X205941Y295500D01*

+X222262Y280500D02*Y283179D01*

+X208441Y297000D01*

+X220754Y289687D02*X210941Y299500D01*

+X208441Y297000D02*Y325500D01*

+X210941Y299500D02*Y326000D01*

+X203441Y324500D02*Y293000D01*

+X208441Y325500D02*X197441Y336500D01*

+X210941Y326000D02*X198441Y338500D01*

+X245312Y349893D02*X230441Y335022D01*

+X245312Y342893D02*X240441Y338022D01*

+X230441Y335022D02*Y293000D01*

+X240441Y309321D02*X246731Y303031D01*

+G54D178*X252834Y335500D02*X260882D01*

+X260347Y342500D02*X252398D01*

+Y349893D02*X252791Y349500D01*

+X260839D01*

+G54D177*X229818Y354988D02*X231331Y356500D01*

+X245355D01*

+G54D178*X252441Y356893D02*X252834Y356500D01*

+X260882D01*

+G54D177*X240441Y338022D02*Y309321D01*

+X258841Y302100D02*X245355Y315586D01*

+Y335500D01*

+G54D178*X252441Y335893D02*X252834Y335500D01*

+G54D177*X254546Y323347D02*X249101Y328793D01*

+G54D178*X120666Y142340D02*X119666Y141340D01*

+X131882Y132156D02*Y148000D01*

+X131390D02*X127941D01*

+X137000Y148492D02*Y130941D01*

+Y148492D02*X137492Y148000D01*

+X141441D01*

+X131882Y148492D02*X131390Y148000D01*

+G54D177*X111041Y153000D02*X188441D01*

+X109441Y155000D02*X187441D01*

+G54D178*X119666Y141340D02*X113975D01*

+X120666Y137340D02*X116666Y141340D01*

+X115036D01*

+X108857Y141832D02*Y136143D01*

+X114000Y112992D02*X114652Y112340D01*

+X118840Y117340D02*X114000Y112500D01*

+X108882Y112992D02*Y118882D01*

+X108941Y118941D01*

+G54D177*X108449D02*X107500D01*

+X105441Y121000D01*

+G54D178*X114652Y112340D02*X123916D01*

+X120666Y117340D02*X118840D01*

+G54D177*X115281Y122340D02*X123916D01*

+G54D178*X108857Y136143D02*X108941Y136059D01*

+X112542Y127340D02*X108941Y130941D01*

+X120666Y127340D02*X112222D01*

+G54D177*X115441Y132500D02*X115601Y132340D01*

+X123916D01*

+G54D178*X112542Y127340D02*X127065D01*

+X112222D02*X108941Y124059D01*

+G54D177*X114441Y121500D02*X115281Y122340D01*

+X105441Y121000D02*Y151000D01*

+X108857Y141832D02*Y150816D01*

+X105441Y151000D02*X109441Y155000D01*

+X108857Y150816D02*X111041Y153000D01*

+G54D178*X141166Y112340D02*X155222D01*

+X155382Y112500D01*

+X150542Y117340D01*

+X144416D01*

+X159949Y130941D02*X160441Y130449D01*

+G54D177*X151941Y132000D02*X151601Y132340D01*

+X144416D01*

+G54D178*X127065Y127340D02*X131882Y132156D01*

+X137000Y130941D02*X140601Y127340D01*

+X144416D01*

+G54D177*X152441Y121500D02*X151601Y122340D01*

+X144416D01*

+G54D180*X332196Y78095D02*X107941D01*

+X86941Y99095D01*

+G54D178*X160441Y130449D02*Y124059D01*

+Y127500D02*X163941D01*

+X141166Y142340D02*X154177D01*

+X155438Y141079D01*

+X141166Y137340D02*X151222D01*

+X155382Y141500D01*

+X160500Y141992D02*Y136059D01*

+X159949Y118941D02*X160500Y118390D01*

+Y112500D01*

+G54D177*X159949Y118941D02*X163382D01*

+X166441Y122000D01*

+X160933Y136059D02*X162500D01*

+X163941Y137500D01*

+Y149500D01*

+X165241Y150800D01*

+X166441Y122000D02*Y148200D01*

+X167441Y149200D01*

+G54D180*X86941Y99095D02*Y158500D01*

+G54D178*X199874Y137500D02*X195441Y141933D01*

+X190382Y141992D02*Y136059D01*

+G54D177*X186941Y121949D02*Y144000D01*

+G54D178*X195475Y112832D02*X195807Y112500D01*

+X200635Y117500D02*X195475Y112340D01*

+X189949Y118941D02*Y112340D01*

+G54D177*Y118941D02*X186941Y121949D01*

+X198441Y122500D02*X205691D01*

+G54D178*X189949Y130941D02*X193390Y127500D01*

+X205691D01*

+X193882D01*

+X190441Y124059D01*

+G54D177*X195441Y133000D02*X195941Y132500D01*

+X205691D01*

+G54D178*X195807Y112500D02*X205691D01*

+X222941D02*X236882D01*

+X202441Y117500D02*X200635D01*

+X222941D02*X231882D01*

+X208941Y127500D02*X213882Y132441D01*

+X222941Y127500D02*X219000Y131441D01*

+X219008Y148000D02*X223941D01*

+X222941Y142500D02*X235178D01*

+X236178Y141500D01*

+X236382D01*

+X232882Y137500D02*X236382Y141000D01*

+Y141500D01*

+G54D177*X236641Y152000D02*X249808Y138833D01*

+X252441Y139000D02*X237441Y154000D01*

+X238072Y155632D02*X257882Y135822D01*

+X238704Y157263D02*X257573Y138394D01*

+G54D178*X241500Y141992D02*Y136941D01*

+X242441Y136000D01*

+G54D177*X238941Y159500D02*X252619Y145822D01*

+X239941Y161500D02*X252941Y148500D01*

+G54D178*X195500Y141992D02*X196008Y142500D01*

+X205691D01*

+X202441Y137500D02*X199874D01*

+G54D177*X190382Y141008D02*Y144941D01*

+X197441Y152000D01*

+X186941Y144000D02*X196941Y154000D01*

+X189878Y149200D02*X196310Y155632D01*

+X189215Y150800D02*X195678Y157263D01*

+X188441Y153000D02*X194941Y159500D01*

+X187441Y155000D02*X193941Y161500D01*

+G54D178*X95548Y204457D02*X95591Y204500D01*

+X104441D01*

+X213882Y132441D02*Y148500D01*

+X219000Y131441D02*Y148500D01*

+X213882Y148992D02*X212890Y148000D01*

+X208941D01*

+X219000Y148008D02*X219008Y148000D01*

+G54D177*X167441Y149200D02*X189878D01*

+X165241Y150800D02*X189215D01*

+X197441Y152000D02*X236641D01*

+X237441Y154000D02*X196941D01*

+X196310Y155632D02*X238072D01*

+X195678Y157263D02*X238704D01*

+X238678D02*X238704D01*

+X194941Y159500D02*X238941D01*

+X193941Y161500D02*X239941D01*

+G54D178*X222941Y137500D02*X232882D01*

+G54D177*X235941Y133000D02*X235441Y132500D01*

+X226191D01*

+X234441Y122500D02*X226191D01*

+G54D178*X231882Y117500D02*X236882Y112500D01*

+X241449Y118941D02*Y113051D01*

+X242000Y112500D01*

+G54D177*Y112992D02*X246992Y108000D01*

+X247941Y117500D02*Y133000D01*

+X249808Y138833D02*Y121727D01*

+X253317Y118218D01*

+X252441Y123000D02*Y139000D01*

+X247941Y133000D02*X245000Y135941D01*

+G54D178*X241449Y130941D02*X241941Y130449D01*

+Y124059D01*

+Y127500D02*X245441D01*

+G54D177*X245000Y135941D02*X242000D01*

+X279941Y108000D02*X280941Y109000D01*

+X246992Y108000D02*X279941D01*

+X278619Y115822D02*X274688D01*

+X271438Y110822D02*X254619D01*

+X247941Y117500D01*

+X254619Y120822D02*X252441Y123000D01*

+X280941Y109000D02*Y113500D01*

+X280691Y147030D02*Y143314D01*

+X278199Y140822D01*

+X280941Y113500D02*X278619Y115822D01*

+X280221Y118218D02*X280909Y118906D01*

+Y123034D01*

+Y123000D02*X278088Y125822D01*

+X274688D01*

+X253317Y118218D02*X280221D01*

+X271438Y120822D02*X254619D01*

+X257882Y135822D02*X274688D01*

+X257573Y138394D02*X279063D01*

+X252619Y145822D02*X274688D01*

+X252941Y148500D02*X279221D01*

+X280691Y147030D01*

+X237387Y179977D02*X220345D01*

+X215709Y184613D01*

+Y184752D01*

+X225824Y184806D02*X231840Y190822D01*

+X239183D01*

+X250914Y188760D02*Y182309D01*

+X248581Y179977D01*

+X233567D01*

+X279972Y130822D02*X274688D01*

+X278199Y140822D02*X274688D01*

+X279047Y138394D02*X281047D01*

+X282441Y137000D01*

+Y133291D01*

+X279972Y130822D02*X282441Y133291D01*

+G54D178*X305696Y115940D02*X310941D01*

+X305696Y110822D02*Y107500D01*

+X291938Y110822D02*X306188D01*

+G54D177*X291938Y115822D02*X299638D01*

+X291938Y125822D02*X307525D01*

+X291938Y120822D02*X304788D01*

+X299638Y115822D02*X303038Y119222D01*

+X305451D01*

+X304700Y120822D02*X304927D01*

+X305083Y119222D02*X305590D01*

+X291938Y130822D02*X309763D01*

+G54D178*X304263Y135822D02*X304941Y136500D01*

+X304472Y136450D02*X309441D01*

+G54D177*X312289Y210583D02*X304706D01*

+X313178Y207483D02*X304584D01*

+X310421Y204383D02*X305280D01*

+X334308Y188633D02*X312358Y210583D01*

+X332661Y188000D02*X313178Y207483D01*

+X320804Y141863D02*Y193925D01*

+Y194000D02*X310421Y204383D01*

+G54D178*X304472Y141568D02*X303726Y140822D01*

+X291938Y145822D02*X300709D01*

+X304964Y141568D01*

+X304472D02*X309441D01*

+X291938Y135822D02*X304263D01*

+X303726Y140822D02*X295188D01*

+G54D177*X307525Y125822D02*X329417Y147713D01*

+X305590Y119222D02*X335927Y149558D01*

+X304927Y120822D02*X334308Y150202D01*

+X309763Y130822D02*X320804Y141863D01*

+X91441Y342700D02*X92041Y343300D01*

+X93841D01*

+X94441Y342700D01*

+Y341500D01*

+X91441Y338500D02*X94441Y341500D01*

+X91441Y338500D02*X94441D01*

+X95881Y339100D02*X96481Y338500D01*

+X95881Y342700D02*Y339100D01*

+Y342700D02*X96481Y343300D01*

+X97681D01*

+X98281Y342700D01*

+Y339100D01*

+X97681Y338500D02*X98281Y339100D01*

+X96481Y338500D02*X97681D01*

+X95881Y339700D02*X98281Y342100D01*

+X99721Y342340D02*X100681Y343300D01*

+Y338500D01*

+X99721D02*X101521D01*

+X102961Y342700D02*X103561Y343300D01*

+X104761D01*

+X105361Y342700D01*

+X104761Y338500D02*X105361Y339100D01*

+X103561Y338500D02*X104761D01*

+X102961Y339100D02*X103561Y338500D01*

+Y341140D02*X104761D01*

+X105361Y342700D02*Y341740D01*

+Y340540D02*Y339100D01*

+Y340540D02*X104761Y341140D01*

+X105361Y341740D02*X104761Y341140D01*

+X106801Y342340D02*X107761Y343300D01*

+Y338500D01*

+X106801D02*X108601D01*

+X110041Y342700D02*X110641Y343300D01*

+X112441D01*

+X113041Y342700D01*

+Y341500D01*

+X110041Y338500D02*X113041Y341500D01*

+X110041Y338500D02*X113041D01*

+X114481Y339100D02*X115081Y338500D01*

+X114481Y342700D02*Y339100D01*

+Y342700D02*X115081Y343300D01*

+X116281D01*

+X116881Y342700D01*

+Y339100D01*

+X116281Y338500D02*X116881Y339100D01*

+X115081Y338500D02*X116281D01*

+X114481Y339700D02*X116881Y342100D01*

+X118321Y340300D02*X120721Y343300D01*

+X118321Y340300D02*X121321D01*

+X120721Y343300D02*Y338500D01*

+G54D181*X417000Y384000D03*

+Y294000D03*

+Y354000D03*

+X427000Y384000D03*

+Y294000D03*

+Y354000D03*

+G54D175*G36*

+X403750Y357250D02*Y350750D01*

+X410250D01*

+Y357250D01*

+X403750D01*

+G37*

+G54D182*X345799Y357329D03*

+G54D183*X315799Y337329D03*

+G54D182*X85799Y369829D03*

+G54D184*X105799Y374829D03*

+G54D175*G36*

+X102499Y368129D02*Y361529D01*

+X109099D01*

+Y368129D01*

+X102499D01*

+G37*

+G54D184*X115799Y374829D03*

+Y364829D03*

+X125799Y374829D03*

+Y364829D03*

+X135799Y374829D03*

+Y364829D03*

+X145799Y374829D03*

+Y364829D03*

+X155799D03*

+X165799D03*

+X155799Y374829D03*

+X165799D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X175799Y364829D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X215799Y374829D03*

+X225799D03*

+X235799D03*

+X215799Y364829D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X265799D03*

+X245799Y374829D03*

+X255799D03*

+X265799D03*

+X275799D03*

+Y364829D03*

+X285799Y374829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X285799Y364829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D175*G36*

+X450250Y267250D02*Y260750D01*

+X456750D01*

+Y267250D01*

+X450250D01*

+G37*

+G36*

+Y207250D02*Y200750D01*

+X456750D01*

+Y207250D01*

+X450250D01*

+G37*

+G36*

+Y177250D02*Y170750D01*

+X456750D01*

+Y177250D01*

+X450250D01*

+G37*

+G54D181*X463500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+X473500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+G54D175*G36*

+X450250Y237250D02*Y230750D01*

+X456750D01*

+Y237250D01*

+X450250D01*

+G37*

+G54D181*X463500Y234000D03*

+X473500D03*

+G54D175*G36*

+X450250Y147250D02*Y140750D01*

+X456750D01*

+Y147250D01*

+X450250D01*

+G37*

+G36*

+Y117250D02*Y110750D01*

+X456750D01*

+Y117250D01*

+X450250D01*

+G37*

+G36*

+Y87250D02*Y80750D01*

+X456750D01*

+Y87250D01*

+X450250D01*

+G37*

+G36*

+Y57250D02*Y50750D01*

+X456750D01*

+Y57250D01*

+X450250D01*

+G37*

+G54D181*X463500Y54000D03*

+X473500D03*

+G54D175*G36*

+X450250Y327250D02*Y320750D01*

+X456750D01*

+Y327250D01*

+X450250D01*

+G37*

+G54D181*X463500Y324000D03*

+X473500D03*

+G54D175*G36*

+X450250Y297250D02*Y290750D01*

+X456750D01*

+Y297250D01*

+X450250D01*

+G37*

+G54D181*X463500Y294000D03*

+X473500D03*

+X437000Y324000D03*

+G54D175*G36*

+X309191Y252250D02*Y245750D01*

+X315691D01*

+Y252250D01*

+X309191D01*

+G37*

+G54D181*X322441Y249000D03*

+X332441D03*

+X342441D03*

+G54D185*X345799Y192329D03*

+G54D182*X353000Y150000D03*

+G54D175*G36*

+X450250Y387250D02*Y380750D01*

+X456750D01*

+Y387250D01*

+X450250D01*

+G37*

+G54D181*X463500Y384000D03*

+X473500D03*

+G54D175*G36*

+X403750Y387250D02*Y380750D01*

+X410250D01*

+Y387250D01*

+X403750D01*

+G37*

+G36*

+Y297250D02*Y290750D01*

+X410250D01*

+Y297250D01*

+X403750D01*

+G37*

+G36*

+Y327250D02*Y320750D01*

+X410250D01*

+Y327250D01*

+X403750D01*

+G37*

+G54D181*X417000Y324000D03*

+X427000D03*

+G54D175*G36*

+X450250Y357250D02*Y350750D01*

+X456750D01*

+Y357250D01*

+X450250D01*

+G37*

+G54D181*X437000Y354000D03*

+X463500D03*

+X473500D03*

+X437000Y384000D03*

+Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+Y294000D03*

+G54D175*G36*

+X403750Y177250D02*Y170750D01*

+X410250D01*

+Y177250D01*

+X403750D01*

+G37*

+G36*

+Y207250D02*Y200750D01*

+X410250D01*

+Y207250D01*

+X403750D01*

+G37*

+G36*

+Y237250D02*Y230750D01*

+X410250D01*

+Y237250D01*

+X403750D01*

+G37*

+G36*

+Y267250D02*Y260750D01*

+X410250D01*

+Y267250D01*

+X403750D01*

+G37*

+G54D181*X417000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+X427000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+G54D175*G36*

+X202191Y50750D02*Y44250D01*

+X208691D01*

+Y50750D01*

+X202191D01*

+G37*

+G54D181*X205441Y57500D03*

+Y67500D03*

+G54D175*G36*

+X232191Y50750D02*Y44250D01*

+X238691D01*

+Y50750D01*

+X232191D01*

+G37*

+G54D181*X235441Y57500D03*

+Y67500D03*

+G54D175*G36*

+X262191Y50750D02*Y44250D01*

+X268691D01*

+Y50750D01*

+X262191D01*

+G37*

+G36*

+X172191D02*Y44250D01*

+X178691D01*

+Y50750D01*

+X172191D01*

+G37*

+G36*

+X142191D02*Y44250D01*

+X148691D01*

+Y50750D01*

+X142191D01*

+G37*

+G36*

+X112191D02*Y44250D01*

+X118691D01*

+Y50750D01*

+X112191D01*

+G37*

+G36*

+X82191D02*Y44250D01*

+X88691D01*

+Y50750D01*

+X82191D01*

+G37*

+G54D181*X265441Y57500D03*

+X175441D03*

+X145441D03*

+X115441D03*

+X85441D03*

+X265441Y67500D03*

+X175441D03*

+G54D175*G36*

+X292191Y50750D02*Y44250D01*

+X298691D01*

+Y50750D01*

+X292191D01*

+G37*

+G54D181*X295441Y57500D03*

+Y67500D03*

+X145441D03*

+X115441D03*

+X85441D03*

+G54D182*X85799Y179829D03*

+G54D184*X105799Y184829D03*

+G54D175*G36*

+X102499Y178129D02*Y171529D01*

+X109099D01*

+Y178129D01*

+X102499D01*

+G37*

+G54D184*X115799Y184829D03*

+Y174829D03*

+X125799Y184829D03*

+Y174829D03*

+G54D175*G36*

+X82191Y243250D02*Y236750D01*

+X88691D01*

+Y243250D01*

+X82191D01*

+G37*

+G54D181*X85441Y230000D03*

+Y220000D03*

+G54D184*X135799Y184829D03*

+X145799D03*

+X155799D03*

+X135799Y174829D03*

+X145799D03*

+X155799D03*

+X165799Y184829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X165799Y174829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+G54D175*G36*

+X192499Y200629D02*Y194029D01*

+X199099D01*

+Y200629D01*

+X192499D01*

+G37*

+G54D184*X205799Y197329D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X205799Y184829D03*

+X215799D03*

+X225799D03*

+X205799Y174829D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X235799Y184829D03*

+X245799D03*

+X255799D03*

+X265799D03*

+Y174829D03*

+X275799Y184829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X275799Y174829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D186*X394949Y188441D02*X395933D01*

+X394949Y193559D02*X395933D01*

+G54D187*X394397Y203689D02*Y199083D01*

+X376485Y203689D02*Y199083D01*

+X379044Y203689D02*Y199083D01*

+X381603Y203689D02*Y199083D01*

+X384162Y203689D02*Y199083D01*

+X386720Y203689D02*Y199083D01*

+X389279Y203689D02*Y199083D01*

+X391838Y203689D02*Y199083D01*

+G54D186*X392643Y247056D02*X393627D01*

+X392643Y252174D02*X393627D01*

+G54D187*X394397Y226917D02*Y222311D01*

+X391838Y226917D02*Y222311D01*

+X389279Y226917D02*Y222311D01*

+X386720Y226917D02*Y222311D01*

+G54D188*X397048Y89543D02*X397834D01*

+X397048Y82457D02*X397834D01*

+G54D186*X396949Y70882D02*X397933D01*

+X396949Y76000D02*X397933D01*

+G54D187*X384162Y226917D02*Y222311D01*

+X381603Y226917D02*Y222311D01*

+X379044Y226917D02*Y222311D01*

+X376485Y226917D02*Y222311D01*

+G54D186*X392949Y365941D02*X393933D01*

+X392949Y371059D02*X393933D01*

+G54D187*X394397Y344917D02*Y340311D01*

+X391838Y344917D02*Y340311D01*

+X389279Y344917D02*Y340311D01*

+X386720Y344917D02*Y340311D01*

+X389279Y321689D02*Y317083D01*

+X391838Y321689D02*Y317083D01*

+X394397Y321689D02*Y317083D01*

+X384162Y344917D02*Y340311D01*

+Y321689D02*Y317083D01*

+X386720Y321689D02*Y317083D01*

+X381603Y344917D02*Y340311D01*

+Y321689D02*Y317083D01*

+X379044Y344917D02*Y340311D01*

+X376485Y344917D02*Y340311D01*

+Y321689D02*Y317083D01*

+X379044Y321689D02*Y317083D01*

+G54D186*X392949Y306000D02*X393933D01*

+X392949Y311118D02*X393933D01*

+G54D188*X326686Y89905D02*X332196D01*

+X326686Y78095D02*X332196D01*

+G54D189*X356441Y76229D02*Y69930D01*

+X361441Y76229D02*Y69930D01*

+X366441Y76229D02*Y69930D01*

+G54D190*X371441Y109694D02*Y96308D01*

+G54D189*Y76229D02*Y69930D01*

+X376441Y76229D02*Y69930D01*

+X381441Y76229D02*Y69930D01*

+X386441Y76229D02*Y69930D01*

+G54D186*X305696Y110822D02*X306680D01*

+G54D191*X291938D02*X298438D01*

+X291938Y115822D02*X298438D01*

+G54D186*X305696Y115940D02*X306680D01*

+X304472Y136450D02*X305456D01*

+X304472Y141568D02*X305456D01*

+G54D191*X271438Y145822D02*X277938D01*

+X271438Y140822D02*X277938D01*

+X271438Y135822D02*X277938D01*

+X271438Y130822D02*X277938D01*

+G54D186*X235941Y141992D02*Y141008D01*

+X241059Y141992D02*Y141008D01*

+G54D191*X271438Y125822D02*X277938D01*

+X291938D02*X298438D01*

+X291938Y130822D02*X298438D01*

+X291938Y135822D02*X298438D01*

+X291938Y140822D02*X298438D01*

+X291938Y145822D02*X298438D01*

+X271438Y120822D02*X277938D01*

+X291938D02*X298438D01*

+X271438Y115822D02*X277938D01*

+X271438Y110822D02*X277938D01*

+G54D192*X253106Y279844D02*X256504D01*

+X253106Y277876D02*X256504D01*

+X253106Y275907D02*X256504D01*

+X253106Y273939D02*X256504D01*

+X253106Y271970D02*X256504D01*

+X253106Y270002D02*X256504D01*

+G54D186*X266000Y356992D02*Y356008D01*

+X260882Y356992D02*Y356008D01*

+G54D188*X245355Y356893D02*Y356107D01*

+X252441Y356893D02*Y356107D01*

+G54D192*X253106Y268033D02*X256504D01*

+X253106Y266065D02*X256504D01*

+X262477Y260093D02*Y256695D01*

+X264445Y260093D02*Y256695D01*

+X266414Y260093D02*Y256695D01*

+X268382Y260093D02*Y256695D01*

+X270351Y260093D02*Y256695D01*

+X272319Y260093D02*Y256695D01*

+X274288Y260093D02*Y256695D01*

+X276256Y260093D02*Y256695D01*

+X278225Y260093D02*Y256695D01*

+X280193Y260093D02*Y256695D01*

+X282162Y260093D02*Y256695D01*

+X284130Y260093D02*Y256695D01*

+X286099Y260093D02*Y256695D01*

+X288067Y260093D02*Y256695D01*

+X290036Y260093D02*Y256695D01*

+X292004Y260093D02*Y256695D01*

+X297976Y266066D02*X301374D01*

+X297976Y268034D02*X301374D01*

+X297976Y270003D02*X301374D01*

+X297976Y271971D02*X301374D01*

+X297976Y273940D02*X301374D01*

+X297976Y275908D02*X301374D01*

+X297976Y277877D02*X301374D01*

+X297976Y279845D02*X301374D01*

+X297976Y281814D02*X301374D01*

+X297976Y283782D02*X301374D01*

+X297976Y285751D02*X301374D01*

+X297976Y287719D02*X301374D01*

+X297976Y289688D02*X301374D01*

+X297976Y291656D02*X301374D01*

+X297976Y293625D02*X301374D01*

+X297976Y295593D02*X301374D01*

+G54D186*X432000Y70492D02*Y69508D01*

+X426882Y70492D02*Y69508D01*

+G54D188*X339686Y89905D02*X345196D01*

+X339686Y78095D02*X345196D01*

+X382941Y58394D02*Y57608D01*

+X390027Y58394D02*Y57608D01*

+G54D186*X377559Y57493D02*Y56509D01*

+X372441Y57493D02*Y56509D01*

+Y63493D02*Y62509D01*

+X367323Y63493D02*Y62509D01*

+X356323Y63493D02*Y62509D01*

+X361441Y63493D02*Y62509D01*

+X356323Y57493D02*Y56509D01*

+X361441Y57493D02*Y56509D01*

+X382323Y45493D02*Y44509D01*

+G54D188*X374048Y43914D02*X374834D01*

+G54D186*X387441Y45493D02*Y44509D01*

+Y51493D02*Y50509D01*

+X382323Y51493D02*Y50509D01*

+G54D188*X374048Y51000D02*X374834D01*

+G54D186*X246335Y297850D02*X247319D01*

+X269500Y310492D02*Y309508D01*

+X264382Y310492D02*Y309508D01*

+G54D192*X268381Y304963D02*Y301565D01*

+X266413Y304963D02*Y301565D01*

+X264444Y304963D02*Y301565D01*

+X262476Y304963D02*Y301565D01*

+G54D188*X245312Y349893D02*Y349107D01*

+Y342893D02*Y342107D01*

+X252398Y349893D02*Y349107D01*

+G54D186*X265957Y349992D02*Y349008D01*

+X260839Y349992D02*Y349008D01*

+G54D188*X245355Y335893D02*Y335107D01*

+X252441Y335893D02*Y335107D01*

+G54D186*X266000Y335992D02*Y335008D01*

+X260882Y335992D02*Y335008D01*

+X265957Y342992D02*Y342008D01*

+X260839Y342992D02*Y342008D01*

+G54D188*X252398Y342893D02*Y342107D01*

+G54D186*X168732Y356454D02*Y355470D01*

+X173850Y356454D02*Y355470D01*

+G54D191*X148799Y333829D02*X154799D01*

+X148799Y328829D02*X154799D01*

+X148799Y323829D02*X154799D01*

+X184799D02*X190799D01*

+X184799Y328829D02*X190799D01*

+X184799Y333829D02*X190799D01*

+G54D186*X197307Y323888D02*X198291D01*

+G54D191*X148799Y318829D02*X154799D01*

+X148799Y313829D02*X154799D01*

+X148799Y308829D02*X154799D01*

+X148799Y303829D02*X154799D01*

+X148799Y298829D02*X154799D01*

+G54D186*X140949Y334059D02*X141933D01*

+X140949Y328941D02*X141933D01*

+X141307Y308888D02*X142291D01*

+X140949Y323559D02*X141933D01*

+X140949Y318441D02*X141933D01*

+X141307Y303770D02*X142291D01*

+X246335Y292732D02*X247319D01*

+G54D193*X148299Y292229D02*X148899D01*

+X148299Y284429D02*X148899D01*

+X156499Y288329D02*X157099D01*

+G54D191*X184799Y298829D02*X190799D01*

+X184799Y303829D02*X190799D01*

+G54D186*X197307Y303888D02*X198291D01*

+G54D191*X184799Y308829D02*X190799D01*

+X184799Y313829D02*X190799D01*

+X184799Y318829D02*X190799D01*

+G54D186*X197307Y318770D02*X198291D01*

+X197307Y298770D02*X198291D01*

+X158453Y205862D02*Y204878D01*

+X163571Y205862D02*Y204878D01*

+X146571Y211862D02*Y210878D01*

+X151689Y211862D02*Y210878D01*

+G54D189*X160941Y231228D02*Y224929D01*

+G54D188*X157485Y212763D02*Y211977D01*

+X164571Y212763D02*Y211977D01*

+G54D186*X158382Y199992D02*Y199008D01*

+X163500Y199992D02*Y199008D01*

+G54D189*X145941Y231228D02*Y224929D01*

+X150941Y231228D02*Y224929D01*

+X155941Y231228D02*Y224929D01*

+G54D186*X146130Y217862D02*Y216878D01*

+X131882Y148492D02*Y147508D01*

+X137000Y148492D02*Y147508D01*

+G54D189*X130941Y231228D02*Y224929D01*

+X135941Y231228D02*Y224929D01*

+X140941Y231228D02*Y224929D01*

+G54D186*X141012Y217862D02*Y216878D01*

+X130453Y217862D02*Y216878D01*

+X135571Y217862D02*Y216878D01*

+X130453Y211862D02*Y210878D01*

+X135571Y211862D02*Y210878D01*

+G54D188*X151178Y198284D02*X151964D01*

+X151178Y205370D02*X151964D01*

+G54D194*X124831Y309514D02*X128768D01*

+X124831Y289829D02*X128768D01*

+G54D188*X104816Y243370D02*X110326D01*

+X104816Y231560D02*X110326D01*

+X116816Y243370D02*X122326D01*

+X116816Y231560D02*X122326D01*

+G54D190*X145941Y264693D02*Y251307D01*

+G54D188*X170048Y248543D02*X170834D01*

+X170048Y241457D02*X170834D01*

+G54D186*X170949Y231882D02*X171933D01*

+X170949Y237000D02*X171933D01*

+G54D188*X95548Y204457D02*X96334D01*

+X95548Y211543D02*X96334D01*

+G54D186*X102449Y216559D02*X103433D01*

+X102449Y211441D02*X103433D01*

+X241449Y130941D02*X242433D01*

+X241449Y136059D02*X242433D01*

+X236882Y112992D02*Y112008D01*

+X242000Y112992D02*Y112008D01*

+X241449Y124059D02*X242433D01*

+X241449Y118941D02*X242433D01*

+G54D191*X222941Y112500D02*X229441D01*

+X222941Y117500D02*X229441D01*

+X222941Y122500D02*X229441D01*

+X222941Y127500D02*X229441D01*

+X222941Y132500D02*X229441D01*

+X222941Y137500D02*X229441D01*

+X222941Y142500D02*X229441D01*

+G54D186*X213882Y148992D02*Y148008D01*

+X219000Y148992D02*Y148008D01*

+X189949Y136059D02*X190933D01*

+X195500Y141992D02*Y141008D01*

+X190382Y141992D02*Y141008D01*

+X159949Y136059D02*X160933D01*

+X155382Y141992D02*Y141008D01*

+X160500Y141992D02*Y141008D01*

+X189949Y124059D02*X190933D01*

+X189949Y118941D02*X190933D01*

+X195475Y112832D02*Y111848D01*

+X190357Y112832D02*Y111848D01*

+G54D191*X202441Y142500D02*X208941D01*

+X202441Y137500D02*X208941D01*

+X202441Y132500D02*X208941D01*

+X202441Y127500D02*X208941D01*

+X202441Y122500D02*X208941D01*

+X202441Y117500D02*X208941D01*

+X202441Y112500D02*X208941D01*

+G54D186*X155382Y112992D02*Y112008D01*

+X160500Y112992D02*Y112008D01*

+X159949Y124059D02*X160933D01*

+X159949Y118941D02*X160933D01*

+X189949Y130941D02*X190933D01*

+X108449D02*X109433D01*

+X159949D02*X160933D01*

+G54D191*X141166Y112340D02*X147666D01*

+X141166Y117340D02*X147666D01*

+X141166Y122340D02*X147666D01*

+X141166Y127340D02*X147666D01*

+G54D186*X108449Y124059D02*X109433D01*

+X108449Y118941D02*X109433D01*

+G54D191*X141166Y132340D02*X147666D01*

+X141166Y137340D02*X147666D01*

+X141166Y142340D02*X147666D01*

+G54D186*X113975Y141832D02*Y140848D01*

+X108857Y141832D02*Y140848D01*

+X108449Y136059D02*X109433D01*

+G54D191*X120666Y142340D02*X127166D01*

+X120666Y137340D02*X127166D01*

+X120666Y132340D02*X127166D01*

+X120666Y127340D02*X127166D01*

+X120666Y122340D02*X127166D01*

+X120666Y117340D02*X127166D01*

+X120666Y112340D02*X127166D01*

+G54D186*X114000Y112992D02*Y112008D01*

+X108882Y112992D02*Y112008D01*

+X296748Y247270D02*X297732D01*

+G54D188*X290048Y244914D02*X290834D01*

+G54D186*X296748Y252388D02*X297732D01*

+G54D188*X290048Y252000D02*X290834D01*

+G54D186*X243681Y261321D02*Y260337D01*

+G54D188*X239154Y268222D02*Y267436D01*

+X246240Y268222D02*Y267436D01*

+G54D186*X248799Y261321D02*Y260337D01*

+G54D195*X296453Y340007D02*Y337349D01*

+X285430Y340007D02*Y337349D01*

+G54D186*X277449Y342559D02*X278433D01*

+X277449Y337441D02*X278433D01*

+G54D195*X296453Y318650D02*Y315992D01*

+G54D186*X303365Y324772D02*X304349D01*

+X303365Y319654D02*X304349D01*

+X307462Y295038D02*X308446D01*

+X307462Y300156D02*X308446D01*

+G54D192*X292003Y304963D02*Y301565D01*

+G54D195*X285430Y318650D02*Y315992D01*

+G54D192*X290035Y304963D02*Y301565D01*

+X288066Y304963D02*Y301565D01*

+X286098Y304963D02*Y301565D01*

+X284129Y304963D02*Y301565D01*

+X282161Y304963D02*Y301565D01*

+X280192Y304963D02*Y301565D01*

+X278224Y304963D02*Y301565D01*

+X276255Y304963D02*Y301565D01*

+X274287Y304963D02*Y301565D01*

+X272318Y304963D02*Y301565D01*

+X270350Y304963D02*Y301565D01*

+X253106Y295592D02*X256504D01*

+X253106Y293624D02*X256504D01*

+X253106Y291655D02*X256504D01*

+X253106Y289687D02*X256504D01*

+X253106Y287718D02*X256504D01*

+X253106Y285750D02*X256504D01*

+X253106Y283781D02*X256504D01*

+X253106Y281813D02*X256504D01*

+G54D196*X386441Y163000D03*

+X400441Y194000D03*

+X389441Y184000D03*

+X400441Y189000D03*

+G54D197*X386023Y157813D03*

+X398441Y173000D03*

+G54D196*X393441Y208000D03*

+G54D197*X358941Y208500D03*

+G54D196*X384162Y188000D03*

+X458441Y195000D03*

+Y164000D03*

+X372441Y170386D03*

+G54D197*X337441Y163000D03*

+X377347Y162178D03*

+X304584Y207483D03*

+X305280Y204383D03*

+X260941Y191500D03*

+X269441Y198500D03*

+X243941Y202000D03*

+X245863Y191524D03*

+G54D196*X432324Y111000D03*

+X446441Y102000D03*

+X434882Y75000D03*

+G54D198*X440941Y123000D03*

+G54D196*X423441Y75000D03*

+G54D197*X434449Y56500D03*

+X440449D03*

+X354441Y85000D03*

+Y89500D03*

+Y95500D03*

+Y101500D03*

+Y107500D03*

+Y113500D03*

+Y119500D03*

+X245441Y127500D03*

+X309441Y141568D03*

+Y136450D03*

+X310941Y115940D03*

+X305696Y107500D03*

+X387441Y119500D03*

+Y113500D03*

+Y107500D03*

+Y101500D03*

+Y95500D03*

+Y89500D03*

+Y85000D03*

+X390941Y76000D03*

+Y71500D03*

+X391441Y66000D03*

+X394941Y58500D03*

+X393941Y51500D03*

+X392441Y45000D03*

+G54D196*X387441Y326000D03*

+X393441Y355000D03*

+X386720Y282000D03*

+X393441Y327000D03*

+X384162Y306000D03*

+X385941Y354500D03*

+X458441Y375000D03*

+X383662Y378500D03*

+X397441Y373000D03*

+X397941Y367441D03*

+G54D197*X385941Y366000D03*

+G54D196*X458441Y345000D03*

+Y315000D03*

+Y285000D03*

+X398441Y314000D03*

+Y309000D03*

+G54D197*Y291000D03*

+G54D196*X372441Y290689D03*

+Y351189D03*

+G54D197*X339837Y341827D03*

+X353390Y339521D03*

+G54D196*X375441Y235000D03*

+G54D197*X356441Y233000D03*

+X338441Y224192D03*

+Y230124D03*

+G54D196*X384512Y258000D03*

+G54D197*X371602Y260228D03*

+G54D196*X458441Y254000D03*

+Y225000D03*

+X387070Y235000D03*

+X398441Y248000D03*

+Y253000D03*

+G54D197*X396441Y235000D03*

+X392188Y239000D03*

+X388207Y247280D03*

+G54D178*X307716Y275075D03*

+X308992Y271971D03*

+X308872Y266522D03*

+X287917Y307829D03*

+X293902Y282263D03*

+X296779Y304963D03*

+X295937Y243628D03*

+G54D197*X304706Y210583D03*

+G54D178*X296727Y256227D03*

+X312157Y300156D03*

+X312122Y295038D03*

+X303365Y330000D03*

+X285430Y325000D03*

+X302941Y340007D03*

+X245557Y279508D03*

+X242456Y293543D03*

+X254740Y298329D03*

+X242168Y298800D03*

+G54D197*X230441Y293000D03*

+X240391Y278564D03*

+G54D178*X266413Y296594D03*

+X263240Y295329D03*

+X262740Y291829D03*

+X260341Y284249D03*

+X264034Y282931D03*

+G54D197*X246731Y303031D03*

+G54D178*X262750Y268772D03*

+X253101Y261836D03*

+X239302Y262235D03*

+G54D197*X221884Y254000D03*

+X224441Y252000D03*

+X225441Y249000D03*

+X224441Y244000D03*

+X230441Y247000D03*

+G54D178*X269653Y298631D03*

+G54D197*X263441Y320000D03*

+G54D178*X268941Y314000D03*

+X273229Y298582D03*

+X278225Y279602D03*

+X278207Y298612D03*

+X277174Y308219D03*

+X277449Y347500D03*

+G54D197*X260568Y316997D03*

+X261502Y307367D03*

+X279441Y285000D03*

+X270441Y336000D03*

+X249101Y328793D03*

+X270441Y342500D03*

+Y349500D03*

+Y357000D03*

+X246941Y238000D03*

+X242441Y229500D03*

+X246441D03*

+X250941D03*

+X236441Y235500D03*

+X224941Y220500D03*

+X225441Y226500D03*

+X224941Y235500D03*

+X269941Y231500D03*

+X251941Y210500D03*

+X163941Y127500D03*

+X193390D03*

+X152441Y121500D03*

+X151941Y132000D03*

+X112222Y127340D03*

+X114441Y121500D03*

+X115441Y132500D03*

+X127941Y148000D03*

+X141441D03*

+X208941D03*

+X223941D03*

+X198441Y122500D03*

+X234441D03*

+X195441Y133000D03*

+X235941D03*

+X128941Y274500D03*

+Y268500D03*

+Y262500D03*

+Y255000D03*

+Y248500D03*

+Y242500D03*

+X162441Y248500D03*

+X161941Y255000D03*

+X181941Y258500D03*

+X162441Y262500D03*

+X198441D03*

+X219441Y272500D03*

+X217441Y279000D03*

+X198441Y269500D03*

+X205441Y277000D03*

+X220729Y265580D03*

+X220441Y259500D03*

+X218441Y261500D03*

+X162441Y242500D03*

+X165941Y231000D03*

+Y226500D03*

+Y220500D03*

+X169441Y214000D03*

+Y208500D03*

+Y201500D03*

+X185441Y228000D03*

+X212941Y238000D03*

+X203941Y237500D03*

+X193941Y237000D03*

+X177441Y228000D03*

+Y217500D03*

+X104441Y204500D03*

+X100941D03*

+X185441Y217500D03*

+X193941Y212500D03*

+X202441D03*

+X210441D03*

+X220441Y215000D03*

+X162941Y268500D03*

+Y274500D03*

+X158441Y323829D03*

+Y328829D03*

+Y326500D03*

+X141307Y300883D03*

+X197441Y314500D03*

+X195441Y311500D03*

+X197441Y308500D03*

+X124831Y302385D03*

+X135441Y338500D03*

+X126441Y340500D03*

+X111941Y341000D03*

+Y357500D03*

+X121941D03*

+X130941D03*

+X135441Y335000D03*

+X111941Y334000D03*

+X117941D03*

+X126441D03*

+X139941Y338000D03*

+X142441Y357500D03*

+Y349500D03*

+X153941Y338000D03*

+X154941Y345500D03*

+X149441Y349500D03*

+X178887Y342818D03*

+X168732Y350833D03*

+X191363Y344449D03*

+X229818Y354988D03*

+G54D176*G54D197*G54D176*G54D197*G54D176*G54D197*G54D199*G54D197*G54D176*G54D197*G54D176*G54D197*G54D176*G54D197*G54D176*G54D197*G54D176*G54D197*G54D176*G54D197*G54D176*M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.topmask.gbr b/bbb_cape/schematic/gerbers/20131204/cape.topmask.gbr
new file mode 100644
index 0000000..d66f97a
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.topmask.gbr
@@ -0,0 +1,724 @@
+G04 start of page 8 for group -4063 idx -4063 *

+G04 Title: 971 BBB Cape, componentmask *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNTOPMASK*%

+%ADD272R,0.0808X0.0808*%

+%ADD271R,0.0987X0.0987*%

+%ADD270R,0.0400X0.0400*%

+%ADD269R,0.0140X0.0140*%

+%ADD268R,0.0300X0.0300*%

+%ADD267R,0.2166X0.2166*%

+%ADD266R,0.0410X0.0410*%

+%ADD265R,0.0572X0.0572*%

+%ADD264R,0.0230X0.0230*%

+%ADD263R,0.0355X0.0355*%

+%ADD262C,0.2300*%

+%ADD261C,0.0860*%

+%ADD260C,0.2400*%

+%ADD259C,0.1890*%

+%ADD258C,0.0001*%

+%ADD257C,0.0710*%

+G54D257*X417000Y384000D03*

+Y294000D03*

+Y354000D03*

+X427000Y384000D03*

+Y294000D03*

+Y354000D03*

+G54D258*G36*

+X403450Y357550D02*Y350450D01*

+X410550D01*

+Y357550D01*

+X403450D01*

+G37*

+G54D259*X345799Y357329D03*

+G54D260*X315799Y337329D03*

+G54D259*X85799Y369829D03*

+G54D261*X105799Y374829D03*

+G54D258*G36*

+X101499Y369129D02*Y360529D01*

+X110099D01*

+Y369129D01*

+X101499D01*

+G37*

+G54D261*X115799Y374829D03*

+Y364829D03*

+X125799Y374829D03*

+Y364829D03*

+X135799Y374829D03*

+Y364829D03*

+X145799Y374829D03*

+Y364829D03*

+X155799D03*

+X165799D03*

+X155799Y374829D03*

+X165799D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X175799Y364829D03*

+X185799D03*

+X195799D03*

+X205799D03*

+X215799Y374829D03*

+X225799D03*

+X235799D03*

+X215799Y364829D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X265799D03*

+X245799Y374829D03*

+X255799D03*

+X265799D03*

+X275799D03*

+Y364829D03*

+X285799Y374829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X285799Y364829D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D258*G36*

+X449950Y267550D02*Y260450D01*

+X457050D01*

+Y267550D01*

+X449950D01*

+G37*

+G36*

+Y207550D02*Y200450D01*

+X457050D01*

+Y207550D01*

+X449950D01*

+G37*

+G36*

+Y177550D02*Y170450D01*

+X457050D01*

+Y177550D01*

+X449950D01*

+G37*

+G54D257*X463500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+X473500Y264000D03*

+Y204000D03*

+Y174000D03*

+Y144000D03*

+Y114000D03*

+Y84000D03*

+G54D258*G36*

+X449950Y237550D02*Y230450D01*

+X457050D01*

+Y237550D01*

+X449950D01*

+G37*

+G54D257*X463500Y234000D03*

+X473500D03*

+G54D258*G36*

+X449950Y147550D02*Y140450D01*

+X457050D01*

+Y147550D01*

+X449950D01*

+G37*

+G36*

+Y117550D02*Y110450D01*

+X457050D01*

+Y117550D01*

+X449950D01*

+G37*

+G36*

+Y87550D02*Y80450D01*

+X457050D01*

+Y87550D01*

+X449950D01*

+G37*

+G36*

+Y57550D02*Y50450D01*

+X457050D01*

+Y57550D01*

+X449950D01*

+G37*

+G54D257*X463500Y54000D03*

+X473500D03*

+G54D258*G36*

+X449950Y327550D02*Y320450D01*

+X457050D01*

+Y327550D01*

+X449950D01*

+G37*

+G54D257*X463500Y324000D03*

+X473500D03*

+G54D258*G36*

+X449950Y297550D02*Y290450D01*

+X457050D01*

+Y297550D01*

+X449950D01*

+G37*

+G54D257*X463500Y294000D03*

+X473500D03*

+X437000Y324000D03*

+G54D258*G36*

+X308891Y252550D02*Y245450D01*

+X315991D01*

+Y252550D01*

+X308891D01*

+G37*

+G54D257*X322441Y249000D03*

+X332441D03*

+X342441D03*

+G54D262*X345799Y192329D03*

+G54D259*X353000Y150000D03*

+G54D258*G36*

+X449950Y387550D02*Y380450D01*

+X457050D01*

+Y387550D01*

+X449950D01*

+G37*

+G54D257*X463500Y384000D03*

+X473500D03*

+G54D258*G36*

+X403450Y387550D02*Y380450D01*

+X410550D01*

+Y387550D01*

+X403450D01*

+G37*

+G36*

+Y297550D02*Y290450D01*

+X410550D01*

+Y297550D01*

+X403450D01*

+G37*

+G36*

+Y327550D02*Y320450D01*

+X410550D01*

+Y327550D01*

+X403450D01*

+G37*

+G54D257*X417000Y324000D03*

+X427000D03*

+G54D258*G36*

+X449950Y357550D02*Y350450D01*

+X457050D01*

+Y357550D01*

+X449950D01*

+G37*

+G54D257*X437000Y354000D03*

+X463500D03*

+X473500D03*

+X437000Y384000D03*

+Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+Y294000D03*

+G54D258*G36*

+X403450Y177550D02*Y170450D01*

+X410550D01*

+Y177550D01*

+X403450D01*

+G37*

+G36*

+Y207550D02*Y200450D01*

+X410550D01*

+Y207550D01*

+X403450D01*

+G37*

+G36*

+Y237550D02*Y230450D01*

+X410550D01*

+Y237550D01*

+X403450D01*

+G37*

+G36*

+Y267550D02*Y260450D01*

+X410550D01*

+Y267550D01*

+X403450D01*

+G37*

+G54D257*X417000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+X427000Y174000D03*

+Y204000D03*

+Y234000D03*

+Y264000D03*

+G54D258*G36*

+X201891Y51050D02*Y43950D01*

+X208991D01*

+Y51050D01*

+X201891D01*

+G37*

+G54D257*X205441Y57500D03*

+Y67500D03*

+G54D258*G36*

+X231891Y51050D02*Y43950D01*

+X238991D01*

+Y51050D01*

+X231891D01*

+G37*

+G54D257*X235441Y57500D03*

+Y67500D03*

+G54D258*G36*

+X261891Y51050D02*Y43950D01*

+X268991D01*

+Y51050D01*

+X261891D01*

+G37*

+G36*

+X171891D02*Y43950D01*

+X178991D01*

+Y51050D01*

+X171891D01*

+G37*

+G36*

+X141891D02*Y43950D01*

+X148991D01*

+Y51050D01*

+X141891D01*

+G37*

+G36*

+X111891D02*Y43950D01*

+X118991D01*

+Y51050D01*

+X111891D01*

+G37*

+G36*

+X81891D02*Y43950D01*

+X88991D01*

+Y51050D01*

+X81891D01*

+G37*

+G54D257*X265441Y57500D03*

+X175441D03*

+X145441D03*

+X115441D03*

+X85441D03*

+X265441Y67500D03*

+X175441D03*

+G54D258*G36*

+X291891Y51050D02*Y43950D01*

+X298991D01*

+Y51050D01*

+X291891D01*

+G37*

+G54D257*X295441Y57500D03*

+Y67500D03*

+X145441D03*

+X115441D03*

+X85441D03*

+G54D259*X85799Y179829D03*

+G54D261*X105799Y184829D03*

+G54D258*G36*

+X101499Y179129D02*Y170529D01*

+X110099D01*

+Y179129D01*

+X101499D01*

+G37*

+G54D261*X115799Y184829D03*

+Y174829D03*

+X125799Y184829D03*

+Y174829D03*

+G54D258*G36*

+X81891Y243550D02*Y236450D01*

+X88991D01*

+Y243550D01*

+X81891D01*

+G37*

+G54D257*X85441Y230000D03*

+Y220000D03*

+G54D261*X135799Y184829D03*

+X145799D03*

+X155799D03*

+X135799Y174829D03*

+X145799D03*

+X155799D03*

+X165799Y184829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+X165799Y174829D03*

+X175799D03*

+X185799D03*

+X195799D03*

+G54D258*G36*

+X191499Y201629D02*Y193029D01*

+X200099D01*

+Y201629D01*

+X191499D01*

+G37*

+G54D261*X205799Y197329D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X205799Y184829D03*

+X215799D03*

+X225799D03*

+X205799Y174829D03*

+X215799D03*

+X225799D03*

+X235799D03*

+X245799D03*

+X255799D03*

+X235799Y184829D03*

+X245799D03*

+X255799D03*

+X265799D03*

+Y174829D03*

+X275799Y184829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+X275799Y174829D03*

+X285799D03*

+X295799D03*

+X305799D03*

+X315799D03*

+X325799D03*

+G54D263*X394949Y188441D02*X395933D01*

+X394949Y193559D02*X395933D01*

+G54D264*X394397Y203689D02*Y199083D01*

+X376485Y203689D02*Y199083D01*

+X379044Y203689D02*Y199083D01*

+X381603Y203689D02*Y199083D01*

+X384162Y203689D02*Y199083D01*

+X386720Y203689D02*Y199083D01*

+X389279Y203689D02*Y199083D01*

+X391838Y203689D02*Y199083D01*

+G54D263*X392643Y247056D02*X393627D01*

+X392643Y252174D02*X393627D01*

+G54D264*X394397Y226917D02*Y222311D01*

+X391838Y226917D02*Y222311D01*

+X389279Y226917D02*Y222311D01*

+X386720Y226917D02*Y222311D01*

+G54D265*X397048Y89543D02*X397834D01*

+X397048Y82457D02*X397834D01*

+G54D263*X396949Y70882D02*X397933D01*

+X396949Y76000D02*X397933D01*

+G54D264*X384162Y226917D02*Y222311D01*

+X381603Y226917D02*Y222311D01*

+X379044Y226917D02*Y222311D01*

+X376485Y226917D02*Y222311D01*

+G54D263*X392949Y365941D02*X393933D01*

+X392949Y371059D02*X393933D01*

+G54D264*X394397Y344917D02*Y340311D01*

+X391838Y344917D02*Y340311D01*

+X389279Y344917D02*Y340311D01*

+X386720Y344917D02*Y340311D01*

+X389279Y321689D02*Y317083D01*

+X391838Y321689D02*Y317083D01*

+X394397Y321689D02*Y317083D01*

+X384162Y344917D02*Y340311D01*

+Y321689D02*Y317083D01*

+X386720Y321689D02*Y317083D01*

+X381603Y344917D02*Y340311D01*

+Y321689D02*Y317083D01*

+X379044Y344917D02*Y340311D01*

+X376485Y344917D02*Y340311D01*

+Y321689D02*Y317083D01*

+X379044Y321689D02*Y317083D01*

+G54D263*X392949Y306000D02*X393933D01*

+X392949Y311118D02*X393933D01*

+G54D265*X326686Y89905D02*X332196D01*

+X326686Y78095D02*X332196D01*

+G54D266*X356441Y76229D02*Y69930D01*

+X361441Y76229D02*Y69930D01*

+X366441Y76229D02*Y69930D01*

+G54D267*X371441Y109694D02*Y96308D01*

+G54D266*Y76229D02*Y69930D01*

+X376441Y76229D02*Y69930D01*

+X381441Y76229D02*Y69930D01*

+X386441Y76229D02*Y69930D01*

+G54D263*X305696Y110822D02*X306680D01*

+G54D268*X291938D02*X298438D01*

+X291938Y115822D02*X298438D01*

+G54D263*X305696Y115940D02*X306680D01*

+X304472Y136450D02*X305456D01*

+X304472Y141568D02*X305456D01*

+G54D268*X271438Y145822D02*X277938D01*

+X271438Y140822D02*X277938D01*

+X271438Y135822D02*X277938D01*

+X271438Y130822D02*X277938D01*

+G54D263*X235941Y141992D02*Y141008D01*

+X241059Y141992D02*Y141008D01*

+G54D268*X271438Y125822D02*X277938D01*

+X291938D02*X298438D01*

+X291938Y130822D02*X298438D01*

+X291938Y135822D02*X298438D01*

+X291938Y140822D02*X298438D01*

+X291938Y145822D02*X298438D01*

+X271438Y120822D02*X277938D01*

+X291938D02*X298438D01*

+X271438Y115822D02*X277938D01*

+X271438Y110822D02*X277938D01*

+G54D269*X253106Y279844D02*X256504D01*

+X253106Y277876D02*X256504D01*

+X253106Y275907D02*X256504D01*

+X253106Y273939D02*X256504D01*

+X253106Y271970D02*X256504D01*

+X253106Y270002D02*X256504D01*

+G54D263*X266000Y356992D02*Y356008D01*

+X260882Y356992D02*Y356008D01*

+G54D265*X245355Y356893D02*Y356107D01*

+X252441Y356893D02*Y356107D01*

+G54D269*X253106Y268033D02*X256504D01*

+X253106Y266065D02*X256504D01*

+X262477Y260093D02*Y256695D01*

+X264445Y260093D02*Y256695D01*

+X266414Y260093D02*Y256695D01*

+X268382Y260093D02*Y256695D01*

+X270351Y260093D02*Y256695D01*

+X272319Y260093D02*Y256695D01*

+X274288Y260093D02*Y256695D01*

+X276256Y260093D02*Y256695D01*

+X278225Y260093D02*Y256695D01*

+X280193Y260093D02*Y256695D01*

+X282162Y260093D02*Y256695D01*

+X284130Y260093D02*Y256695D01*

+X286099Y260093D02*Y256695D01*

+X288067Y260093D02*Y256695D01*

+X290036Y260093D02*Y256695D01*

+X292004Y260093D02*Y256695D01*

+X297976Y266066D02*X301374D01*

+X297976Y268034D02*X301374D01*

+X297976Y270003D02*X301374D01*

+X297976Y271971D02*X301374D01*

+X297976Y273940D02*X301374D01*

+X297976Y275908D02*X301374D01*

+X297976Y277877D02*X301374D01*

+X297976Y279845D02*X301374D01*

+X297976Y281814D02*X301374D01*

+X297976Y283782D02*X301374D01*

+X297976Y285751D02*X301374D01*

+X297976Y287719D02*X301374D01*

+X297976Y289688D02*X301374D01*

+X297976Y291656D02*X301374D01*

+X297976Y293625D02*X301374D01*

+X297976Y295593D02*X301374D01*

+G54D263*X432000Y70492D02*Y69508D01*

+X426882Y70492D02*Y69508D01*

+G54D265*X339686Y89905D02*X345196D01*

+X339686Y78095D02*X345196D01*

+X382941Y58394D02*Y57608D01*

+X390027Y58394D02*Y57608D01*

+G54D263*X377559Y57493D02*Y56509D01*

+X372441Y57493D02*Y56509D01*

+Y63493D02*Y62509D01*

+X367323Y63493D02*Y62509D01*

+X356323Y63493D02*Y62509D01*

+X361441Y63493D02*Y62509D01*

+X356323Y57493D02*Y56509D01*

+X361441Y57493D02*Y56509D01*

+X382323Y45493D02*Y44509D01*

+G54D265*X374048Y43914D02*X374834D01*

+G54D263*X387441Y45493D02*Y44509D01*

+Y51493D02*Y50509D01*

+X382323Y51493D02*Y50509D01*

+G54D265*X374048Y51000D02*X374834D01*

+G54D263*X246335Y297850D02*X247319D01*

+X269500Y310492D02*Y309508D01*

+X264382Y310492D02*Y309508D01*

+G54D269*X268381Y304963D02*Y301565D01*

+X266413Y304963D02*Y301565D01*

+X264444Y304963D02*Y301565D01*

+X262476Y304963D02*Y301565D01*

+G54D265*X245312Y349893D02*Y349107D01*

+Y342893D02*Y342107D01*

+X252398Y349893D02*Y349107D01*

+G54D263*X265957Y349992D02*Y349008D01*

+X260839Y349992D02*Y349008D01*

+G54D265*X245355Y335893D02*Y335107D01*

+X252441Y335893D02*Y335107D01*

+G54D263*X266000Y335992D02*Y335008D01*

+X260882Y335992D02*Y335008D01*

+X265957Y342992D02*Y342008D01*

+X260839Y342992D02*Y342008D01*

+G54D265*X252398Y342893D02*Y342107D01*

+G54D263*X168732Y356454D02*Y355470D01*

+X173850Y356454D02*Y355470D01*

+G54D268*X148799Y333829D02*X154799D01*

+X148799Y328829D02*X154799D01*

+X148799Y323829D02*X154799D01*

+X184799D02*X190799D01*

+X184799Y328829D02*X190799D01*

+X184799Y333829D02*X190799D01*

+G54D263*X197307Y323888D02*X198291D01*

+G54D268*X148799Y318829D02*X154799D01*

+X148799Y313829D02*X154799D01*

+X148799Y308829D02*X154799D01*

+X148799Y303829D02*X154799D01*

+X148799Y298829D02*X154799D01*

+G54D263*X140949Y334059D02*X141933D01*

+X140949Y328941D02*X141933D01*

+X141307Y308888D02*X142291D01*

+X140949Y323559D02*X141933D01*

+X140949Y318441D02*X141933D01*

+X141307Y303770D02*X142291D01*

+X246335Y292732D02*X247319D01*

+G54D270*X148299Y292229D02*X148899D01*

+X148299Y284429D02*X148899D01*

+X156499Y288329D02*X157099D01*

+G54D268*X184799Y298829D02*X190799D01*

+X184799Y303829D02*X190799D01*

+G54D263*X197307Y303888D02*X198291D01*

+G54D268*X184799Y308829D02*X190799D01*

+X184799Y313829D02*X190799D01*

+X184799Y318829D02*X190799D01*

+G54D263*X197307Y318770D02*X198291D01*

+X197307Y298770D02*X198291D01*

+X158453Y205862D02*Y204878D01*

+X163571Y205862D02*Y204878D01*

+X146571Y211862D02*Y210878D01*

+X151689Y211862D02*Y210878D01*

+G54D266*X160941Y231228D02*Y224929D01*

+G54D265*X157485Y212763D02*Y211977D01*

+X164571Y212763D02*Y211977D01*

+G54D263*X158382Y199992D02*Y199008D01*

+X163500Y199992D02*Y199008D01*

+G54D266*X145941Y231228D02*Y224929D01*

+X150941Y231228D02*Y224929D01*

+X155941Y231228D02*Y224929D01*

+G54D263*X146130Y217862D02*Y216878D01*

+X131882Y148492D02*Y147508D01*

+X137000Y148492D02*Y147508D01*

+G54D266*X130941Y231228D02*Y224929D01*

+X135941Y231228D02*Y224929D01*

+X140941Y231228D02*Y224929D01*

+G54D263*X141012Y217862D02*Y216878D01*

+X130453Y217862D02*Y216878D01*

+X135571Y217862D02*Y216878D01*

+X130453Y211862D02*Y210878D01*

+X135571Y211862D02*Y210878D01*

+G54D265*X151178Y198284D02*X151964D01*

+X151178Y205370D02*X151964D01*

+G54D271*X124831Y309514D02*X128768D01*

+X124831Y289829D02*X128768D01*

+G54D265*X104816Y243370D02*X110326D01*

+X104816Y231560D02*X110326D01*

+X116816Y243370D02*X122326D01*

+X116816Y231560D02*X122326D01*

+G54D267*X145941Y264693D02*Y251307D01*

+G54D265*X170048Y248543D02*X170834D01*

+X170048Y241457D02*X170834D01*

+G54D263*X170949Y231882D02*X171933D01*

+X170949Y237000D02*X171933D01*

+G54D265*X95548Y204457D02*X96334D01*

+X95548Y211543D02*X96334D01*

+G54D263*X102449Y216559D02*X103433D01*

+X102449Y211441D02*X103433D01*

+X241449Y130941D02*X242433D01*

+X241449Y136059D02*X242433D01*

+X236882Y112992D02*Y112008D01*

+X242000Y112992D02*Y112008D01*

+X241449Y124059D02*X242433D01*

+X241449Y118941D02*X242433D01*

+G54D268*X222941Y112500D02*X229441D01*

+X222941Y117500D02*X229441D01*

+X222941Y122500D02*X229441D01*

+X222941Y127500D02*X229441D01*

+X222941Y132500D02*X229441D01*

+X222941Y137500D02*X229441D01*

+X222941Y142500D02*X229441D01*

+G54D263*X213882Y148992D02*Y148008D01*

+X219000Y148992D02*Y148008D01*

+X189949Y136059D02*X190933D01*

+X195500Y141992D02*Y141008D01*

+X190382Y141992D02*Y141008D01*

+X159949Y136059D02*X160933D01*

+X155382Y141992D02*Y141008D01*

+X160500Y141992D02*Y141008D01*

+X189949Y124059D02*X190933D01*

+X189949Y118941D02*X190933D01*

+X195475Y112832D02*Y111848D01*

+X190357Y112832D02*Y111848D01*

+G54D268*X202441Y142500D02*X208941D01*

+X202441Y137500D02*X208941D01*

+X202441Y132500D02*X208941D01*

+X202441Y127500D02*X208941D01*

+X202441Y122500D02*X208941D01*

+X202441Y117500D02*X208941D01*

+X202441Y112500D02*X208941D01*

+G54D263*X155382Y112992D02*Y112008D01*

+X160500Y112992D02*Y112008D01*

+X159949Y124059D02*X160933D01*

+X159949Y118941D02*X160933D01*

+X189949Y130941D02*X190933D01*

+X108449D02*X109433D01*

+X159949D02*X160933D01*

+G54D268*X141166Y112340D02*X147666D01*

+X141166Y117340D02*X147666D01*

+X141166Y122340D02*X147666D01*

+X141166Y127340D02*X147666D01*

+G54D263*X108449Y124059D02*X109433D01*

+X108449Y118941D02*X109433D01*

+G54D268*X141166Y132340D02*X147666D01*

+X141166Y137340D02*X147666D01*

+X141166Y142340D02*X147666D01*

+G54D263*X113975Y141832D02*Y140848D01*

+X108857Y141832D02*Y140848D01*

+X108449Y136059D02*X109433D01*

+G54D268*X120666Y142340D02*X127166D01*

+X120666Y137340D02*X127166D01*

+X120666Y132340D02*X127166D01*

+X120666Y127340D02*X127166D01*

+X120666Y122340D02*X127166D01*

+X120666Y117340D02*X127166D01*

+X120666Y112340D02*X127166D01*

+G54D263*X114000Y112992D02*Y112008D01*

+X108882Y112992D02*Y112008D01*

+X296748Y247270D02*X297732D01*

+G54D265*X290048Y244914D02*X290834D01*

+G54D263*X296748Y252388D02*X297732D01*

+G54D265*X290048Y252000D02*X290834D01*

+G54D263*X243681Y261321D02*Y260337D01*

+G54D265*X239154Y268222D02*Y267436D01*

+X246240Y268222D02*Y267436D01*

+G54D263*X248799Y261321D02*Y260337D01*

+G54D272*X296453Y340007D02*Y337349D01*

+X285430Y340007D02*Y337349D01*

+G54D263*X277449Y342559D02*X278433D01*

+X277449Y337441D02*X278433D01*

+G54D272*X296453Y318650D02*Y315992D01*

+G54D263*X303365Y324772D02*X304349D01*

+X303365Y319654D02*X304349D01*

+X307462Y295038D02*X308446D01*

+X307462Y300156D02*X308446D01*

+G54D269*X292003Y304963D02*Y301565D01*

+G54D272*X285430Y318650D02*Y315992D01*

+G54D269*X290035Y304963D02*Y301565D01*

+X288066Y304963D02*Y301565D01*

+X286098Y304963D02*Y301565D01*

+X284129Y304963D02*Y301565D01*

+X282161Y304963D02*Y301565D01*

+X280192Y304963D02*Y301565D01*

+X278224Y304963D02*Y301565D01*

+X276255Y304963D02*Y301565D01*

+X274287Y304963D02*Y301565D01*

+X272318Y304963D02*Y301565D01*

+X270350Y304963D02*Y301565D01*

+X253106Y295592D02*X256504D01*

+X253106Y293624D02*X256504D01*

+X253106Y291655D02*X256504D01*

+X253106Y289687D02*X256504D01*

+X253106Y287718D02*X256504D01*

+X253106Y285750D02*X256504D01*

+X253106Y283781D02*X256504D01*

+X253106Y281813D02*X256504D01*

+M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.toppaste.gbr b/bbb_cape/schematic/gerbers/20131204/cape.toppaste.gbr
new file mode 100644
index 0000000..d9aadea
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.toppaste.gbr
@@ -0,0 +1,351 @@
+G04 start of page 12 for group -4015 idx -4015 *

+G04 Title: 971 BBB Cape, toppaste *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNTOPPASTE*%

+%ADD306R,0.0110X0.0110*%

+%ADD305R,0.2106X0.2106*%

+%ADD304R,0.0350X0.0350*%

+%ADD303R,0.0748X0.0748*%

+%ADD302R,0.0948X0.0948*%

+%ADD301R,0.0200X0.0200*%

+%ADD300R,0.0340X0.0340*%

+%ADD299R,0.0512X0.0512*%

+%ADD298R,0.0130X0.0130*%

+%ADD297R,0.0295X0.0295*%

+G54D297*X394949Y188441D02*X395933D01*

+X394949Y193559D02*X395933D01*

+X432000Y70492D02*Y69508D01*

+X426882Y70492D02*Y69508D01*

+X392643Y247056D02*X393627D01*

+X392643Y252174D02*X393627D01*

+X392949Y365941D02*X393933D01*

+X392949Y371059D02*X393933D01*

+X392949Y306000D02*X393933D01*

+X392949Y311118D02*X393933D01*

+G54D298*X394397Y226917D02*Y222311D01*

+X391838Y226917D02*Y222311D01*

+X389279Y226917D02*Y222311D01*

+X386720Y226917D02*Y222311D01*

+X384162Y226917D02*Y222311D01*

+X381603Y226917D02*Y222311D01*

+X379044Y226917D02*Y222311D01*

+X376485Y226917D02*Y222311D01*

+Y203689D02*Y199083D01*

+X379044Y203689D02*Y199083D01*

+X381603Y203689D02*Y199083D01*

+X384162Y203689D02*Y199083D01*

+X386720Y203689D02*Y199083D01*

+X389279Y203689D02*Y199083D01*

+X391838Y203689D02*Y199083D01*

+X394397Y203689D02*Y199083D01*

+G54D297*X296748Y247270D02*X297732D01*

+X296748Y252388D02*X297732D01*

+X243681Y261321D02*Y260337D01*

+X248799Y261321D02*Y260337D01*

+X246335Y297850D02*X247319D01*

+X246335Y292732D02*X247319D01*

+X269500Y310492D02*Y309508D01*

+X264382Y310492D02*Y309508D01*

+G54D299*X239154Y268222D02*Y267436D01*

+X246240Y268222D02*Y267436D01*

+X290048Y244914D02*X290834D01*

+X290048Y252000D02*X290834D01*

+G54D297*X168732Y356454D02*Y355470D01*

+X173850Y356454D02*Y355470D01*

+G54D300*X148299Y292229D02*X148899D01*

+X148299Y284429D02*X148899D01*

+X156499Y288329D02*X157099D01*

+G54D301*X148799Y333829D02*X154799D01*

+X148799Y328829D02*X154799D01*

+X148799Y323829D02*X154799D01*

+X148799Y318829D02*X154799D01*

+X148799Y313829D02*X154799D01*

+X148799Y308829D02*X154799D01*

+X148799Y303829D02*X154799D01*

+X148799Y298829D02*X154799D01*

+X184799D02*X190799D01*

+X184799Y303829D02*X190799D01*

+X184799Y308829D02*X190799D01*

+X184799Y313829D02*X190799D01*

+X184799Y318829D02*X190799D01*

+X184799Y323829D02*X190799D01*

+X184799Y328829D02*X190799D01*

+X184799Y333829D02*X190799D01*

+G54D297*X197307Y323888D02*X198291D01*

+X197307Y318770D02*X198291D01*

+X140949Y334059D02*X141933D01*

+X140949Y328941D02*X141933D01*

+X197307Y303888D02*X198291D01*

+X197307Y298770D02*X198291D01*

+X141307Y303770D02*X142291D01*

+X141307Y308888D02*X142291D01*

+G54D302*X124831Y309514D02*X128768D01*

+X124831Y289829D02*X128768D01*

+G54D303*X296453Y340007D02*Y337349D01*

+Y318650D02*Y315992D01*

+X285430Y318650D02*Y315992D01*

+Y340007D02*Y337349D01*

+G54D297*X303365Y324772D02*X304349D01*

+X303365Y319654D02*X304349D01*

+X277449Y342559D02*X278433D01*

+X277449Y337441D02*X278433D01*

+X307462Y295038D02*X308446D01*

+X307462Y300156D02*X308446D01*

+X131882Y148492D02*Y147508D01*

+X137000Y148492D02*Y147508D01*

+G54D299*X382941Y58394D02*Y57608D01*

+X390027Y58394D02*Y57608D01*

+X339686Y89905D02*X345196D01*

+X339686Y78095D02*X345196D01*

+G54D297*X372441Y57493D02*Y56509D01*

+X377559Y57493D02*Y56509D01*

+X372441Y63493D02*Y62509D01*

+X367323Y63493D02*Y62509D01*

+X356323Y63493D02*Y62509D01*

+X361441Y63493D02*Y62509D01*

+X356323Y57493D02*Y56509D01*

+X361441Y57493D02*Y56509D01*

+X382323Y45493D02*Y44509D01*

+X387441Y45493D02*Y44509D01*

+X382323Y51493D02*Y50509D01*

+X387441Y51493D02*Y50509D01*

+G54D299*X374048Y43914D02*X374834D01*

+X374048Y51000D02*X374834D01*

+G54D297*X158453Y205862D02*Y204878D01*

+X163571Y205862D02*Y204878D01*

+G54D299*X104816Y243370D02*X110326D01*

+X104816Y231560D02*X110326D01*

+X116816Y243370D02*X122326D01*

+X116816Y231560D02*X122326D01*

+G54D297*X146571Y211862D02*Y210878D01*

+X151689Y211862D02*Y210878D01*

+G54D304*X130941Y231228D02*Y224929D01*

+X135941Y231228D02*Y224929D01*

+X140941Y231228D02*Y224929D01*

+X145941Y231228D02*Y224929D01*

+X150941Y231228D02*Y224929D01*

+X155941Y231228D02*Y224929D01*

+X160941Y231228D02*Y224929D01*

+G54D305*X145941Y264693D02*Y251307D01*

+G54D299*X157485Y212763D02*Y211977D01*

+X164571Y212763D02*Y211977D01*

+G54D297*X146130Y217862D02*Y216878D01*

+X141012Y217862D02*Y216878D01*

+X130453Y217862D02*Y216878D01*

+X135571Y217862D02*Y216878D01*

+X130453Y211862D02*Y210878D01*

+X135571Y211862D02*Y210878D01*

+G54D299*X151178Y198284D02*X151964D01*

+X151178Y205370D02*X151964D01*

+G54D297*X158382Y199992D02*Y199008D01*

+X163500Y199992D02*Y199008D01*

+G54D299*X326686Y89905D02*X332196D01*

+X326686Y78095D02*X332196D01*

+G54D298*X394397Y344917D02*Y340311D01*

+X391838Y344917D02*Y340311D01*

+X389279Y344917D02*Y340311D01*

+X386720Y344917D02*Y340311D01*

+X384162Y344917D02*Y340311D01*

+X381603Y344917D02*Y340311D01*

+X379044Y344917D02*Y340311D01*

+X376485Y344917D02*Y340311D01*

+Y321689D02*Y317083D01*

+X379044Y321689D02*Y317083D01*

+X381603Y321689D02*Y317083D01*

+X384162Y321689D02*Y317083D01*

+X386720Y321689D02*Y317083D01*

+X389279Y321689D02*Y317083D01*

+X391838Y321689D02*Y317083D01*

+X394397Y321689D02*Y317083D01*

+G54D304*X356441Y76229D02*Y69930D01*

+X361441Y76229D02*Y69930D01*

+X366441Y76229D02*Y69930D01*

+X371441Y76229D02*Y69930D01*

+X376441Y76229D02*Y69930D01*

+X381441Y76229D02*Y69930D01*

+X386441Y76229D02*Y69930D01*

+G54D305*X371441Y109694D02*Y96308D01*

+G54D297*X241449Y130941D02*X242433D01*

+X241449Y136059D02*X242433D01*

+X213882Y148992D02*Y148008D01*

+X219000Y148992D02*Y148008D01*

+X189949Y130941D02*X190933D01*

+X189949Y136059D02*X190933D01*

+X189949Y124059D02*X190933D01*

+X189949Y118941D02*X190933D01*

+X236882Y112992D02*Y112008D01*

+X242000Y112992D02*Y112008D01*

+X241449Y124059D02*X242433D01*

+X241449Y118941D02*X242433D01*

+G54D301*X202441Y142500D02*X208941D01*

+X202441Y137500D02*X208941D01*

+X202441Y132500D02*X208941D01*

+X202441Y127500D02*X208941D01*

+X202441Y122500D02*X208941D01*

+X202441Y117500D02*X208941D01*

+X202441Y112500D02*X208941D01*

+X222941D02*X229441D01*

+X222941Y117500D02*X229441D01*

+X222941Y122500D02*X229441D01*

+X222941Y127500D02*X229441D01*

+X222941Y132500D02*X229441D01*

+X222941Y137500D02*X229441D01*

+X222941Y142500D02*X229441D01*

+G54D297*X195500Y141992D02*Y141008D01*

+X190382Y141992D02*Y141008D01*

+X195475Y112832D02*Y111848D01*

+X190357Y112832D02*Y111848D01*

+X113975Y141832D02*Y140848D01*

+X108857Y141832D02*Y140848D01*

+X155382Y112992D02*Y112008D01*

+X160500Y112992D02*Y112008D01*

+X108449Y130941D02*X109433D01*

+X108449Y136059D02*X109433D01*

+X159949Y130941D02*X160933D01*

+X159949Y136059D02*X160933D01*

+G54D301*X120666Y142340D02*X127166D01*

+X120666Y137340D02*X127166D01*

+X120666Y132340D02*X127166D01*

+X120666Y127340D02*X127166D01*

+X120666Y122340D02*X127166D01*

+X120666Y117340D02*X127166D01*

+X120666Y112340D02*X127166D01*

+X141166D02*X147666D01*

+X141166Y117340D02*X147666D01*

+X141166Y122340D02*X147666D01*

+X141166Y127340D02*X147666D01*

+X141166Y132340D02*X147666D01*

+X141166Y137340D02*X147666D01*

+X141166Y142340D02*X147666D01*

+G54D297*X114000Y112992D02*Y112008D01*

+X108882Y112992D02*Y112008D01*

+X108449Y124059D02*X109433D01*

+X108449Y118941D02*X109433D01*

+X159949Y124059D02*X160933D01*

+X159949Y118941D02*X160933D01*

+X155382Y141992D02*Y141008D01*

+X160500Y141992D02*Y141008D01*

+X305696Y110822D02*X306680D01*

+X305696Y115940D02*X306680D01*

+X304472Y136450D02*X305456D01*

+X304472Y141568D02*X305456D01*

+G54D301*X271438Y145822D02*X277938D01*

+X271438Y140822D02*X277938D01*

+X271438Y135822D02*X277938D01*

+X271438Y130822D02*X277938D01*

+X271438Y125822D02*X277938D01*

+X271438Y120822D02*X277938D01*

+X271438Y115822D02*X277938D01*

+X271438Y110822D02*X277938D01*

+X291938D02*X298438D01*

+X291938Y115822D02*X298438D01*

+X291938Y120822D02*X298438D01*

+X291938Y125822D02*X298438D01*

+X291938Y130822D02*X298438D01*

+X291938Y135822D02*X298438D01*

+X291938Y140822D02*X298438D01*

+X291938Y145822D02*X298438D01*

+G54D297*X140949Y323559D02*X141933D01*

+X140949Y318441D02*X141933D01*

+G54D299*X245312Y349893D02*Y349107D01*

+X252398Y349893D02*Y349107D01*

+X245355Y335893D02*Y335107D01*

+X252441Y335893D02*Y335107D01*

+G54D297*X266000Y335992D02*Y335008D01*

+X260882Y335992D02*Y335008D01*

+X265957Y342992D02*Y342008D01*

+X260839Y342992D02*Y342008D01*

+X265957Y349992D02*Y349008D01*

+X260839Y349992D02*Y349008D01*

+G54D299*X245312Y342893D02*Y342107D01*

+X252398Y342893D02*Y342107D01*

+G54D306*X292003Y304963D02*Y301565D01*

+X290035Y304963D02*Y301565D01*

+X288066Y304963D02*Y301565D01*

+X286098Y304963D02*Y301565D01*

+X284129Y304963D02*Y301565D01*

+X282161Y304963D02*Y301565D01*

+X280192Y304963D02*Y301565D01*

+X278224Y304963D02*Y301565D01*

+X276255Y304963D02*Y301565D01*

+X274287Y304963D02*Y301565D01*

+X272318Y304963D02*Y301565D01*

+X270350Y304963D02*Y301565D01*

+X268381Y304963D02*Y301565D01*

+X266413Y304963D02*Y301565D01*

+X264444Y304963D02*Y301565D01*

+X262476Y304963D02*Y301565D01*

+X253106Y295592D02*X256504D01*

+X253106Y293624D02*X256504D01*

+X253106Y291655D02*X256504D01*

+X253106Y289687D02*X256504D01*

+X253106Y287718D02*X256504D01*

+X253106Y285750D02*X256504D01*

+X253106Y283781D02*X256504D01*

+X253106Y281813D02*X256504D01*

+X253106Y279844D02*X256504D01*

+X253106Y277876D02*X256504D01*

+X253106Y275907D02*X256504D01*

+X253106Y273939D02*X256504D01*

+X253106Y271970D02*X256504D01*

+X253106Y270002D02*X256504D01*

+X253106Y268033D02*X256504D01*

+X253106Y266065D02*X256504D01*

+X262477Y260093D02*Y256695D01*

+X264445Y260093D02*Y256695D01*

+X266414Y260093D02*Y256695D01*

+X268382Y260093D02*Y256695D01*

+X270351Y260093D02*Y256695D01*

+X272319Y260093D02*Y256695D01*

+X274288Y260093D02*Y256695D01*

+X276256Y260093D02*Y256695D01*

+X278225Y260093D02*Y256695D01*

+X280193Y260093D02*Y256695D01*

+X282162Y260093D02*Y256695D01*

+X284130Y260093D02*Y256695D01*

+X286099Y260093D02*Y256695D01*

+X288067Y260093D02*Y256695D01*

+X290036Y260093D02*Y256695D01*

+X292004Y260093D02*Y256695D01*

+X297976Y266066D02*X301374D01*

+X297976Y268034D02*X301374D01*

+X297976Y270003D02*X301374D01*

+X297976Y271971D02*X301374D01*

+X297976Y273940D02*X301374D01*

+X297976Y275908D02*X301374D01*

+X297976Y277877D02*X301374D01*

+X297976Y279845D02*X301374D01*

+X297976Y281814D02*X301374D01*

+X297976Y283782D02*X301374D01*

+X297976Y285751D02*X301374D01*

+X297976Y287719D02*X301374D01*

+X297976Y289688D02*X301374D01*

+X297976Y291656D02*X301374D01*

+X297976Y293625D02*X301374D01*

+X297976Y295593D02*X301374D01*

+G54D297*X235941Y141992D02*Y141008D01*

+X241059Y141992D02*Y141008D01*

+G54D299*X95548Y204457D02*X96334D01*

+X95548Y211543D02*X96334D01*

+X397048Y89543D02*X397834D01*

+X397048Y82457D02*X397834D01*

+G54D297*X396949Y70882D02*X397933D01*

+X396949Y76000D02*X397933D01*

+G54D299*X170048Y248543D02*X170834D01*

+X170048Y241457D02*X170834D01*

+G54D297*X170949Y231882D02*X171933D01*

+X170949Y237000D02*X171933D01*

+X102449Y216559D02*X103433D01*

+X102449Y211441D02*X103433D01*

+X266000Y356992D02*Y356008D01*

+X260882Y356992D02*Y356008D01*

+G54D299*X245355Y356893D02*Y356107D01*

+X252441Y356893D02*Y356107D01*

+M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.topsilk.gbr b/bbb_cape/schematic/gerbers/20131204/cape.topsilk.gbr
new file mode 100644
index 0000000..2880ff7
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.topsilk.gbr
@@ -0,0 +1,977 @@
+G04 start of page 10 for group -4079 idx -4079 *

+G04 Title: 971 BBB Cape, topsilk *

+G04 Creator: pcb 20110918 *

+G04 CreationDate: Thu Dec  5 05:46:54 2013 UTC *

+G04 For: brians *

+G04 Format: Gerber/RS-274X *

+G04 PCB-Dimensions: 500000 400000 *

+G04 PCB-Coordinate-Origin: lower left *

+%MOIN*%

+%FSLAX25Y25*%

+%LNTOPSILK*%

+%ADD294C,0.0030*%

+%ADD293C,0.0080*%

+%ADD292C,0.0100*%

+%ADD291C,0.0046*%

+%ADD290C,0.0054*%

+%ADD289C,0.0070*%

+%ADD288C,0.0072*%

+%ADD287C,0.0040*%

+%ADD286C,0.0042*%

+G54D286*X389250Y174022D02*X385050Y176122D01*

+Y173497D01*

+Y238072D02*Y235972D01*

+X387150D01*

+X386625Y236497D01*

+Y237547D02*Y236497D01*

+Y237547D02*X387150Y238072D01*

+X388725D01*

+X389250Y237547D02*X388725Y238072D01*

+X389250Y237547D02*Y236497D01*

+X388725Y235972D02*X389250Y236497D01*

+X387675Y265792D02*X385050Y267892D01*

+X387675Y268417D02*Y265792D01*

+X385050Y267892D02*X389250D01*

+X385575Y298027D02*X385050Y298552D01*

+Y299602D02*Y298552D01*

+Y299602D02*X385575Y300127D01*

+X389250Y299602D02*X388725Y300127D01*

+X389250Y299602D02*Y298552D01*

+X388725Y298027D02*X389250Y298552D01*

+X386940Y299602D02*Y298552D01*

+X385575Y300127D02*X386415D01*

+X387465D02*X388725D01*

+X387465D02*X386940Y299602D01*

+X386415Y300127D02*X386940Y299602D01*

+X385890Y359977D02*X385050Y360817D01*

+X389250D01*

+Y361552D02*Y359977D01*

+X388725Y389272D02*X389250Y389797D01*

+X385575Y389272D02*X388725D01*

+X385575D02*X385050Y389797D01*

+Y390847D02*Y389797D01*

+Y390847D02*X385575Y391372D01*

+X388725D01*

+X389250Y390847D02*X388725Y391372D01*

+X389250Y390847D02*Y389797D01*

+X388200Y389272D02*X386100Y391372D01*

+G54D287*X308438Y226485D02*X310438D01*

+X317538Y228485D02*Y224485D01*

+X318838Y228485D02*X319538Y227785D01*

+Y225185D01*

+X318838Y224485D02*X319538Y225185D01*

+X317038Y224485D02*X318838D01*

+X317038Y228485D02*X318838D01*

+X320738D02*X321738D01*

+X321238D02*Y224485D01*

+X320738D02*X321738D01*

+X322938Y227985D02*Y224985D01*

+Y227985D02*X323438Y228485D01*

+X324438D01*

+X324938Y227985D01*

+Y224985D01*

+X324438Y224485D02*X324938Y224985D01*

+X323438Y224485D02*X324438D01*

+X322938Y224985D02*X323438Y224485D01*

+X328638D02*X329938D01*

+X327938Y225185D02*X328638Y224485D01*

+X327938Y227785D02*Y225185D01*

+Y227785D02*X328638Y228485D01*

+X329938D01*

+X331138D02*Y224485D01*

+X333138D01*

+X334338Y228485D02*Y224485D01*

+Y226485D02*X336338Y228485D01*

+X334338Y226485D02*X336338Y224485D01*

+X339338Y228485D02*X341338D01*

+X341838Y227985D01*

+Y226985D01*

+X341338Y226485D02*X341838Y226985D01*

+X339838Y226485D02*X341338D01*

+X339838Y228485D02*Y224485D01*

+X340638Y226485D02*X341838Y224485D01*

+X345038Y228485D02*X345538Y227985D01*

+X343538Y228485D02*X345038D01*

+X343038Y227985D02*X343538Y228485D01*

+X343038Y227985D02*Y226985D01*

+X343538Y226485D01*

+X345038D01*

+X345538Y225985D01*

+Y224985D01*

+X345038Y224485D02*X345538Y224985D01*

+X343538Y224485D02*X345038D01*

+X343038Y224985D02*X343538Y224485D01*

+X346738Y228485D02*X348738D01*

+X347738D02*Y224485D01*

+X310438Y220485D02*X310938Y219985D01*

+X308938Y220485D02*X310438D01*

+X308438Y219985D02*X308938Y220485D01*

+X308438Y219985D02*Y218985D01*

+X308938Y218485D01*

+X310438D01*

+X310938Y217985D01*

+Y216985D01*

+X310438Y216485D02*X310938Y216985D01*

+X308938Y216485D02*X310438D01*

+X308438Y216985D02*X308938Y216485D01*

+X312138Y220485D02*Y218485D01*

+X312638Y216485D01*

+X313638Y218485D01*

+X314638Y216485D01*

+X315138Y218485D01*

+Y220485D02*Y218485D01*

+X316838Y220485D02*Y216485D01*

+X318138Y220485D02*X318838Y219785D01*

+Y217185D01*

+X318138Y216485D02*X318838Y217185D01*

+X316338Y216485D02*X318138D01*

+X316338Y220485D02*X318138D01*

+X322338Y218485D02*X323838D01*

+X321838Y217985D02*X322338Y218485D01*

+X321838Y217985D02*Y216985D01*

+X322338Y216485D01*

+X323838D01*

+X325038Y217985D02*Y216985D01*

+Y217985D02*X325538Y218485D01*

+X326538D01*

+X327038Y217985D01*

+Y216985D01*

+X326538Y216485D02*X327038Y216985D01*

+X325538Y216485D02*X326538D01*

+X325038Y216985D02*X325538Y216485D01*

+X328738Y217985D02*Y216485D01*

+Y217985D02*X329238Y218485D01*

+X329738D01*

+X330238Y217985D01*

+Y216485D01*

+X328238Y218485D02*X328738Y217985D01*

+X331938D02*Y216485D01*

+Y217985D02*X332438Y218485D01*

+X332938D01*

+X333438Y217985D01*

+Y216485D01*

+X331438Y218485D02*X331938Y217985D01*

+X335138Y216485D02*X336638D01*

+X334638Y216985D02*X335138Y216485D01*

+X334638Y217985D02*Y216985D01*

+Y217985D02*X335138Y218485D01*

+X336138D01*

+X336638Y217985D01*

+X334638Y217485D02*X336638D01*

+Y217985D02*Y217485D01*

+X338338Y218485D02*X339838D01*

+X337838Y217985D02*X338338Y218485D01*

+X337838Y217985D02*Y216985D01*

+X338338Y216485D01*

+X339838D01*

+X341538Y220485D02*Y216985D01*

+X342038Y216485D01*

+X341038Y218985D02*X342038D01*

+X343038Y217985D02*Y216985D01*

+Y217985D02*X343538Y218485D01*

+X344538D01*

+X345038Y217985D01*

+Y216985D01*

+X344538Y216485D02*X345038Y216985D01*

+X343538Y216485D02*X344538D01*

+X343038Y216985D02*X343538Y216485D01*

+X346738Y217985D02*Y216485D01*

+Y217985D02*X347238Y218485D01*

+X348238D01*

+X346238D02*X346738Y217985D01*

+X236256Y328497D02*Y326997D01*

+X238456Y328997D02*Y326997D01*

+X234456D02*X238456D01*

+X234456Y328997D02*Y326997D01*

+Y332197D02*Y330197D01*

+Y332197D02*X234956Y332697D01*

+X235956D01*

+X236456Y332197D02*X235956Y332697D01*

+X236456Y332197D02*Y330697D01*

+X234456D02*X238456D01*

+X236456Y331497D02*X238456Y332697D01*

+X234456Y335897D02*Y333897D01*

+Y335897D02*X234956Y336397D01*

+X235956D01*

+X236456Y335897D02*X235956Y336397D01*

+X236456Y335897D02*Y334397D01*

+X234456D02*X238456D01*

+X236456Y335197D02*X238456Y336397D01*

+X234456Y339397D02*X238456D01*

+X234456Y341897D02*X238456D01*

+X236456D02*Y339397D01*

+X238456Y345097D02*Y343097D01*

+Y345097D02*X237956Y345597D01*

+X236756D02*X237956D01*

+X236256Y345097D02*X236756Y345597D01*

+X236256Y345097D02*Y343597D01*

+X234456D02*X238456D01*

+X234456Y345097D02*Y343097D01*

+Y345097D02*X234956Y345597D01*

+X235756D01*

+X236256Y345097D02*X235756Y345597D01*

+X234456Y351097D02*Y348597D01*

+X238456D02*X234456Y351097D01*

+X238456D02*Y348597D01*

+X234456Y354597D02*X238456D01*

+X234456Y355897D02*X235156Y356597D01*

+X237756D01*

+X238456Y355897D02*X237756Y356597D01*

+X238456Y355897D02*Y354097D01*

+X234456Y355897D02*Y354097D01*

+X238456Y359797D02*Y357797D01*

+Y359797D02*X237956Y360297D01*

+X236756D02*X237956D01*

+X236256Y359797D02*X236756Y360297D01*

+X236256Y359797D02*Y358297D01*

+X234456D02*X238456D01*

+X234456Y359797D02*Y357797D01*

+Y359797D02*X234956Y360297D01*

+X235756D01*

+X236256Y359797D02*X235756Y360297D01*

+G54D288*X322150Y46597D02*Y42997D01*

+Y58837D02*Y55237D01*

+X320350Y57037D02*X323950D01*

+X320350Y67477D02*X325750D01*

+X320350D02*X318550Y68737D01*

+Y70717D02*Y68737D01*

+Y70717D02*X320350Y71977D01*

+X325750D01*

+X322150D02*Y67477D01*

+G54D286*X87438Y79216D02*X87963Y78691D01*

+X87438Y82366D02*Y79216D01*

+Y82366D02*X87963Y82891D01*

+X89013D01*

+X89538Y82366D01*

+Y79216D01*

+X89013Y78691D02*X89538Y79216D01*

+X87963Y78691D02*X89013D01*

+X87438Y79741D02*X89538Y81841D01*

+X115368Y82051D02*X116208Y82891D01*

+Y78691D01*

+X115368D02*X116943D01*

+X146553Y82366D02*X147078Y82891D01*

+X148653D01*

+X149178Y82366D01*

+Y81316D01*

+X146553Y78691D02*X149178Y81316D01*

+X146553Y78691D02*X149178D01*

+X176898Y82366D02*X177423Y82891D01*

+X178473D01*

+X178998Y82366D01*

+X178473Y78691D02*X178998Y79216D01*

+X177423Y78691D02*X178473D01*

+X176898Y79216D02*X177423Y78691D01*

+Y81001D02*X178473D01*

+X178998Y82366D02*Y81526D01*

+Y80476D02*Y79216D01*

+Y80476D02*X178473Y81001D01*

+X178998Y81526D02*X178473Y81001D01*

+X206718Y80266D02*X208818Y82891D01*

+X206718Y80266D02*X209343D01*

+X208818Y82891D02*Y78691D01*

+X237063Y82891D02*X239163D01*

+X237063D02*Y80791D01*

+X237588Y81316D01*

+X238638D01*

+X239163Y80791D01*

+Y79216D01*

+X238638Y78691D02*X239163Y79216D01*

+X237588Y78691D02*X238638D01*

+X237063Y79216D02*X237588Y78691D01*

+X268458Y82891D02*X268983Y82366D01*

+X267408Y82891D02*X268458D01*

+X266883Y82366D02*X267408Y82891D01*

+X266883Y82366D02*Y79216D01*

+X267408Y78691D01*

+X268458Y81001D02*X268983Y80476D01*

+X266883Y81001D02*X268458D01*

+X267408Y78691D02*X268458D01*

+X268983Y79216D01*

+Y80476D02*Y79216D01*

+X297228Y78691D02*X299328Y82891D01*

+X296703D02*X299328D01*

+G54D289*X111691Y227000D02*Y223500D01*

+Y218250D02*Y214750D01*

+X109941Y216500D02*X113441D01*

+G54D286*X443890Y51997D02*X443050Y52837D01*

+X447250D01*

+Y53572D02*Y51997D01*

+X443890Y54832D02*X443050Y55672D01*

+X447250D01*

+Y56407D02*Y54832D01*

+X443890Y82237D02*X443050Y83077D01*

+X447250D01*

+Y83812D02*Y82237D01*

+X446725Y85072D02*X447250Y85597D01*

+X443575Y85072D02*X446725D01*

+X443575D02*X443050Y85597D01*

+Y86647D02*Y85597D01*

+Y86647D02*X443575Y87172D01*

+X446725D01*

+X447250Y86647D02*X446725Y87172D01*

+X447250Y86647D02*Y85597D01*

+X446200Y85072D02*X444100Y87172D01*

+X447250Y115417D02*X445150Y116992D01*

+X443575D02*X445150D01*

+X443050Y116467D02*X443575Y116992D01*

+X443050Y116467D02*Y115417D01*

+X443575Y114892D02*X443050Y115417D01*

+X443575Y114892D02*X444625D01*

+X445150Y115417D01*

+Y116992D02*Y115417D01*

+X446725Y144712D02*X447250Y145237D01*

+X445885Y144712D02*X446725D01*

+X445885D02*X445150Y145447D01*

+Y146077D02*Y145447D01*

+Y146077D02*X445885Y146812D01*

+X446725D01*

+X447250Y146287D02*X446725Y146812D01*

+X447250Y146287D02*Y145237D01*

+X444415Y144712D02*X445150Y145447D01*

+X443575Y144712D02*X444415D01*

+X443575D02*X443050Y145237D01*

+Y146287D02*Y145237D01*

+Y146287D02*X443575Y146812D01*

+X444415D01*

+X445150Y146077D02*X444415Y146812D01*

+X447250Y176947D02*X443050Y179047D01*

+Y176422D01*

+Y208342D02*X443575Y208867D01*

+X443050Y208342D02*Y207292D01*

+X443575Y206767D02*X443050Y207292D01*

+X443575Y206767D02*X446725D01*

+X447250Y207292D01*

+X444940Y208342D02*X445465Y208867D01*

+X444940Y208342D02*Y206767D01*

+X447250Y208342D02*Y207292D01*

+Y208342D02*X446725Y208867D01*

+X445465D02*X446725D01*

+X443050Y238687D02*Y236587D01*

+X445150D01*

+X444625Y237112D01*

+Y238162D02*Y237112D01*

+Y238162D02*X445150Y238687D01*

+X446725D01*

+X447250Y238162D02*X446725Y238687D01*

+X447250Y238162D02*Y237112D01*

+X446725Y236587D02*X447250Y237112D01*

+X445675Y266407D02*X443050Y268507D01*

+X445675Y269032D02*Y266407D01*

+X443050Y268507D02*X447250D01*

+X443575Y296752D02*X443050Y297277D01*

+Y298327D02*Y297277D01*

+Y298327D02*X443575Y298852D01*

+X447250Y298327D02*X446725Y298852D01*

+X447250Y298327D02*Y297277D01*

+X446725Y296752D02*X447250Y297277D01*

+X444940Y298327D02*Y297277D01*

+X443575Y298852D02*X444415D01*

+X445465D02*X446725D01*

+X445465D02*X444940Y298327D01*

+X444415Y298852D02*X444940Y298327D01*

+X443575Y326572D02*X443050Y327097D01*

+Y328672D02*Y327097D01*

+Y328672D02*X443575Y329197D01*

+X444625D01*

+X447250Y326572D02*X444625Y329197D01*

+X447250D02*Y326572D01*

+X443890Y356917D02*X443050Y357757D01*

+X447250D01*

+Y358492D02*Y356917D01*

+X446725Y386212D02*X447250Y386737D01*

+X443575Y386212D02*X446725D01*

+X443575D02*X443050Y386737D01*

+Y387787D02*Y386737D01*

+Y387787D02*X443575Y388312D01*

+X446725D01*

+X447250Y387787D02*X446725Y388312D01*

+X447250Y387787D02*Y386737D01*

+X446200Y386212D02*X444100Y388312D01*

+G54D288*X408938Y134585D02*X412538D01*

+X424418D02*X428018D01*

+X426218Y136385D02*Y132785D01*

+X440798Y138185D02*Y130985D01*

+X443138Y138185D02*X444398Y136925D01*

+Y132245D01*

+X443138Y130985D02*X444398Y132245D01*

+X439898Y130985D02*X443138D01*

+X439898Y138185D02*X443138D01*

+G54D290*X404438Y150435D02*X407138D01*

+X413618D02*X416318D01*

+X414968Y151785D02*Y149085D01*

+X425228Y151785D02*Y147735D01*

+Y151785D02*X426173Y153135D01*

+X427658D01*

+X428603Y151785D01*

+Y147735D01*

+X425228Y150435D02*X428603D01*

+X435083Y147735D02*X437783D01*

+X438458Y148410D01*

+Y150030D02*Y148410D01*

+X437783Y150705D02*X438458Y150030D01*

+X435758Y150705D02*X437783D01*

+X435758Y153135D02*Y147735D01*

+X435083Y153135D02*X437783D01*

+X438458Y152460D01*

+Y151380D01*

+X437783Y150705D02*X438458Y151380D01*

+G54D291*X190941Y241350D02*Y236750D01*

+Y241350D02*X193241D01*

+X190941Y239280D02*X192666D01*

+X194621Y241350D02*X196921D01*

+X197496Y240775D01*

+Y239625D01*

+X196921Y239050D02*X197496Y239625D01*

+X195196Y239050D02*X196921D01*

+X195196Y241350D02*Y236750D01*

+X196116Y239050D02*X197496Y236750D01*

+X199681D02*X201176D01*

+X198876Y237555D02*X199681Y236750D01*

+X198876Y240545D02*Y237555D01*

+Y240545D02*X199681Y241350D01*

+X201176D01*

+X204626D02*X206926D01*

+X205776D02*Y236750D01*

+X208881D02*X210606D01*

+X208306Y237325D02*X208881Y236750D01*

+X208306Y238475D02*Y237325D01*

+Y238475D02*X208881Y239050D01*

+X210031D01*

+X210606Y238475D01*

+X208306Y237900D02*X210606D01*

+Y238475D02*Y237900D01*

+X213711Y239050D02*X214286Y238475D01*

+X212561Y239050D02*X213711D01*

+X211986Y238475D02*X212561Y239050D01*

+X211986Y238475D02*Y237325D01*

+X212561Y236750D01*

+X214286Y239050D02*Y237325D01*

+X214861Y236750D01*

+X212561D02*X213711D01*

+X214286Y237325D01*

+X216816Y238475D02*Y236750D01*

+Y238475D02*X217391Y239050D01*

+X217966D01*

+X218541Y238475D01*

+Y236750D01*

+Y238475D02*X219116Y239050D01*

+X219691D01*

+X220266Y238475D01*

+Y236750D01*

+X216241Y239050D02*X216816Y238475D01*

+X224291Y236750D02*X226016Y239050D01*

+Y240775D02*Y239050D01*

+X225441Y241350D02*X226016Y240775D01*

+X224291Y241350D02*X225441D01*

+X223716Y240775D02*X224291Y241350D01*

+X223716Y240775D02*Y239625D01*

+X224291Y239050D01*

+X226016D01*

+X227971Y236750D02*X230271Y241350D01*

+X227396D02*X230271D01*

+X231651Y240430D02*X232571Y241350D01*

+Y236750D01*

+X231651D02*X233376D01*

+X236826D02*X239126D01*

+X239701Y237325D01*

+Y238705D02*Y237325D01*

+X239126Y239280D02*X239701Y238705D01*

+X237401Y239280D02*X239126D01*

+X237401Y241350D02*Y236750D01*

+X236826Y241350D02*X239126D01*

+X239701Y240775D01*

+Y239855D01*

+X239126Y239280D02*X239701Y239855D01*

+X241081Y236750D02*X243381D01*

+X243956Y237325D01*

+Y238705D02*Y237325D01*

+X243381Y239280D02*X243956Y238705D01*

+X241656Y239280D02*X243381D01*

+X241656Y241350D02*Y236750D01*

+X241081Y241350D02*X243381D01*

+X243956Y240775D01*

+Y239855D01*

+X243381Y239280D02*X243956Y239855D01*

+X245336Y236750D02*X247636D01*

+X248211Y237325D01*

+Y238705D02*Y237325D01*

+X247636Y239280D02*X248211Y238705D01*

+X245911Y239280D02*X247636D01*

+X245911Y241350D02*Y236750D01*

+X245336Y241350D02*X247636D01*

+X248211Y240775D01*

+Y239855D01*

+X247636Y239280D02*X248211Y239855D01*

+X252466Y236750D02*X253961D01*

+X251661Y237555D02*X252466Y236750D01*

+X251661Y240545D02*Y237555D01*

+Y240545D02*X252466Y241350D01*

+X253961D01*

+X257066Y239050D02*X257641Y238475D01*

+X255916Y239050D02*X257066D01*

+X255341Y238475D02*X255916Y239050D01*

+X255341Y238475D02*Y237325D01*

+X255916Y236750D01*

+X257641Y239050D02*Y237325D01*

+X258216Y236750D01*

+X255916D02*X257066D01*

+X257641Y237325D01*

+X260171Y238475D02*Y235025D01*

+X259596Y239050D02*X260171Y238475D01*

+X260746Y239050D01*

+X261896D01*

+X262471Y238475D01*

+Y237325D01*

+X261896Y236750D02*X262471Y237325D01*

+X260746Y236750D02*X261896D01*

+X260171Y237325D02*X260746Y236750D01*

+X264426D02*X266151D01*

+X263851Y237325D02*X264426Y236750D01*

+X263851Y238475D02*Y237325D01*

+Y238475D02*X264426Y239050D01*

+X265576D01*

+X266151Y238475D01*

+X263851Y237900D02*X266151D01*

+Y238475D02*Y237900D01*

+X202441Y227775D02*X203016Y228350D01*

+X204741D01*

+X205316Y227775D01*

+Y226625D01*

+X202441Y223750D02*X205316Y226625D01*

+X202441Y223750D02*X205316D01*

+X206696Y224325D02*X207271Y223750D01*

+X206696Y227775D02*Y224325D01*

+Y227775D02*X207271Y228350D01*

+X208421D01*

+X208996Y227775D01*

+Y224325D01*

+X208421Y223750D02*X208996Y224325D01*

+X207271Y223750D02*X208421D01*

+X206696Y224900D02*X208996Y227200D01*

+X210376Y227430D02*X211296Y228350D01*

+Y223750D01*

+X210376D02*X212101D01*

+X213481Y227775D02*X214056Y228350D01*

+X215206D01*

+X215781Y227775D01*

+X215206Y223750D02*X215781Y224325D01*

+X214056Y223750D02*X215206D01*

+X213481Y224325D02*X214056Y223750D01*

+Y226280D02*X215206D01*

+X215781Y227775D02*Y226855D01*

+Y225705D02*Y224325D01*

+Y225705D02*X215206Y226280D01*

+X215781Y226855D02*X215206Y226280D01*

+X217161Y227430D02*X218081Y228350D01*

+Y223750D01*

+X217161D02*X218886D01*

+X220266Y227775D02*X220841Y228350D01*

+X222566D01*

+X223141Y227775D01*

+Y226625D01*

+X220266Y223750D02*X223141Y226625D01*

+X220266Y223750D02*X223141D01*

+X224521Y224325D02*X225096Y223750D01*

+X224521Y227775D02*Y224325D01*

+Y227775D02*X225096Y228350D01*

+X226246D01*

+X226821Y227775D01*

+Y224325D01*

+X226246Y223750D02*X226821Y224325D01*

+X225096Y223750D02*X226246D01*

+X224521Y224900D02*X226821Y227200D01*

+X228201Y225475D02*X230501Y228350D01*

+X228201Y225475D02*X231076D01*

+X230501Y228350D02*Y223750D01*

+X234526Y227775D02*X235101Y228350D01*

+X236826D01*

+X237401Y227775D01*

+Y226625D01*

+X234526Y223750D02*X237401Y226625D01*

+X234526Y223750D02*X237401D01*

+X238781Y224325D02*X239356Y223750D01*

+X238781Y227775D02*Y224325D01*

+Y227775D02*X239356Y228350D01*

+X240506D01*

+X241081Y227775D01*

+Y224325D01*

+X240506Y223750D02*X241081Y224325D01*

+X239356Y223750D02*X240506D01*

+X238781Y224900D02*X241081Y227200D01*

+X242461Y227430D02*X243381Y228350D01*

+Y223750D01*

+X242461D02*X244186D01*

+X245566Y227775D02*X246141Y228350D01*

+X247291D01*

+X247866Y227775D01*

+X247291Y223750D02*X247866Y224325D01*

+X246141Y223750D02*X247291D01*

+X245566Y224325D02*X246141Y223750D01*

+Y226280D02*X247291D01*

+X247866Y227775D02*Y226855D01*

+Y225705D02*Y224325D01*

+Y225705D02*X247291Y226280D01*

+X247866Y226855D02*X247291Y226280D01*

+X249246Y226050D02*X251546D01*

+X252926Y228350D02*Y223750D01*

+Y224325D02*X253501Y223750D01*

+X254651D01*

+X255226Y224325D01*

+Y225475D02*Y224325D01*

+X254651Y226050D02*X255226Y225475D01*

+X253501Y226050D02*X254651D01*

+X252926Y225475D02*X253501Y226050D01*

+X256606Y227430D02*X257526Y228350D01*

+Y223750D01*

+X256606D02*X258331D01*

+G54D292*X448500Y126200D02*Y101200D01*

+X478500Y126200D02*Y101200D01*

+Y126200D02*X448500D01*

+Y119700D02*X478500D01*

+X458500Y101200D02*Y119700D01*

+X468500Y101200D02*Y119700D01*

+X448500Y101200D02*X478500D01*

+X448500D02*X458500D01*

+X448500Y96200D02*Y71200D01*

+X478500Y96200D02*Y71200D01*

+Y96200D02*X448500D01*

+Y89700D02*X478500D01*

+X458500Y71200D02*Y89700D01*

+X468500Y71200D02*Y89700D01*

+X448500Y71200D02*X478500D01*

+X448500D02*X458500D01*

+X448500Y66200D02*Y41200D01*

+X478500Y66200D02*Y41200D01*

+Y66200D02*X448500D01*

+Y59700D02*X478500D01*

+X458500Y41200D02*Y59700D01*

+X468500Y41200D02*Y59700D01*

+X448500Y41200D02*X478500D01*

+X448500D02*X458500D01*

+X448500Y216200D02*Y191200D01*

+X478500Y216200D02*Y191200D01*

+Y216200D02*X448500D01*

+Y209700D02*X478500D01*

+X458500Y191200D02*Y209700D01*

+X468500Y191200D02*Y209700D01*

+X448500Y191200D02*X478500D01*

+X448500D02*X458500D01*

+X448500Y186200D02*Y161200D01*

+X478500Y186200D02*Y161200D01*

+Y186200D02*X448500D01*

+Y179700D02*X478500D01*

+X458500Y161200D02*Y179700D01*

+X468500Y161200D02*Y179700D01*

+X448500Y161200D02*X478500D01*

+X448500D02*X458500D01*

+X448500Y156200D02*Y131200D01*

+X478500Y156200D02*Y131200D01*

+Y156200D02*X448500D01*

+Y149700D02*X478500D01*

+X458500Y131200D02*Y149700D01*

+X468500Y131200D02*Y149700D01*

+X448500Y131200D02*X478500D01*

+X448500D02*X458500D01*

+X402000Y186200D02*Y161200D01*

+X442000Y186200D02*Y161200D01*

+Y186200D02*X402000D01*

+Y179700D02*X442000D01*

+X412000Y161200D02*Y179700D01*

+X422000Y161200D02*Y179700D01*

+X432000Y161200D02*Y179700D01*

+X402000Y161200D02*X442000D01*

+X402000D02*X412000D01*

+X448500Y396200D02*Y371200D01*

+X478500Y396200D02*Y371200D01*

+X448500Y396200D02*X478500D01*

+X448500Y389700D02*X478500D01*

+X458500D02*Y371200D01*

+X468500Y389700D02*Y371200D01*

+X448500D02*X478500D01*

+X448500D02*X458500D01*

+X448500Y366200D02*Y341200D01*

+X478500Y366200D02*Y341200D01*

+Y366200D02*X448500D01*

+Y359700D02*X478500D01*

+X458500Y341200D02*Y359700D01*

+X468500Y341200D02*Y359700D01*

+X448500Y341200D02*X478500D01*

+X448500D02*X458500D01*

+X402000Y366200D02*Y341200D01*

+X442000Y366200D02*Y341200D01*

+Y366200D02*X402000D01*

+Y359700D02*X442000D01*

+X412000Y341200D02*Y359700D01*

+X422000Y341200D02*Y359700D01*

+X432000Y341200D02*Y359700D01*

+X402000Y341200D02*X442000D01*

+X402000D02*X412000D01*

+X402000Y396200D02*Y371200D01*

+X442000Y396200D02*Y371200D01*

+Y396200D02*X402000D01*

+Y389700D02*X442000D01*

+X412000Y371200D02*Y389700D01*

+X422000Y371200D02*Y389700D01*

+X432000Y371200D02*Y389700D01*

+X402000Y371200D02*X442000D01*

+X402000D02*X412000D01*

+X448500Y336200D02*Y311200D01*

+X478500Y336200D02*Y311200D01*

+Y336200D02*X448500D01*

+Y329700D02*X478500D01*

+X458500Y311200D02*Y329700D01*

+X468500Y311200D02*Y329700D01*

+X448500Y311200D02*X478500D01*

+X448500D02*X458500D01*

+X448500Y306200D02*Y281200D01*

+X478500Y306200D02*Y281200D01*

+Y306200D02*X448500D01*

+Y299700D02*X478500D01*

+X458500Y281200D02*Y299700D01*

+X468500Y281200D02*Y299700D01*

+X448500Y281200D02*X478500D01*

+X448500D02*X458500D01*

+X402000Y306200D02*Y281200D01*

+X442000Y306200D02*Y281200D01*

+Y306200D02*X402000D01*

+Y299700D02*X442000D01*

+X412000Y281200D02*Y299700D01*

+X422000Y281200D02*Y299700D01*

+X432000Y281200D02*Y299700D01*

+X402000Y281200D02*X442000D01*

+X402000D02*X412000D01*

+X402000Y336200D02*Y311200D01*

+X442000Y336200D02*Y311200D01*

+X402000Y336200D02*X442000D01*

+X402000Y329700D02*X442000D01*

+X412000D02*Y311200D01*

+X422000Y329700D02*Y311200D01*

+X432000Y329700D02*Y311200D01*

+X402000D02*X442000D01*

+X402000D02*X412000D01*

+X402000Y276200D02*Y251200D01*

+X442000Y276200D02*Y251200D01*

+X402000Y276200D02*X442000D01*

+X402000Y269700D02*X442000D01*

+X412000D02*Y251200D01*

+X422000Y269700D02*Y251200D01*

+X432000Y269700D02*Y251200D01*

+X402000D02*X442000D01*

+X402000D02*X412000D01*

+X374835Y346566D02*X396047D01*

+X374835D02*Y315434D01*

+X396047D01*

+Y346566D02*Y333500D01*

+Y328500D02*Y315434D01*

+Y333500D02*G75*G03X396047Y328500I0J-2500D01*G01*

+G54D293*X242304Y270584D02*X243090D01*

+X242304Y265074D02*X243090D01*

+X287686Y248850D02*Y248064D01*

+X293196Y248850D02*Y248064D01*

+G54D292*X146799Y335829D02*Y296829D01*

+X192799D01*

+Y335829D01*

+X146799D02*X167299D01*

+X192799D02*X172299D01*

+X167299D02*G75*G03X172299Y335829I2500J0D01*G01*

+G54D293*X120894Y283923D02*X118925Y285892D01*

+X120894Y283923D02*X134673D01*

+Y315419D02*Y283923D01*

+X118925Y315419D02*X134673D01*

+X118925D02*Y285892D01*

+G54D292*X145699Y294729D02*X159599D01*

+X145699D02*Y281929D01*

+X159599D01*

+Y294729D02*Y281929D01*

+X127831Y222173D02*Y237921D01*

+X164051Y222173D02*X127831D01*

+X164051Y237921D02*Y222173D01*

+X126256Y237921D02*Y278079D01*

+X165626Y237921D02*Y278079D01*

+Y237921D02*X126256D01*

+X165626Y278079D02*X126256D01*

+G54D293*X93186Y208393D02*Y207607D01*

+X98696Y208393D02*Y207607D01*

+X173196Y245393D02*Y244607D01*

+X167686Y245393D02*Y244607D01*

+X248505Y359255D02*X249291D01*

+X248505Y353745D02*X249291D01*

+X248505Y338255D02*X249291D01*

+X248505Y332745D02*X249291D01*

+X248462Y345255D02*X249248D01*

+X248462Y339745D02*X249248D01*

+X296525Y297214D02*Y261544D01*

+X257955D02*X296525D01*

+X257955Y300114D02*Y261544D01*

+Y300114D02*X293625D01*

+X296525Y297214D01*

+X293625Y298214D02*G75*G03X293625Y298214I0J-1000D01*G01*

+X248462Y352255D02*X249248D01*

+X248462Y346745D02*X249248D01*

+G54D292*X291150Y314280D02*G75*G03X291150Y314280I500J0D01*G01*

+X133241Y42500D02*X158241D01*

+X133241Y72500D02*X158241D01*

+X133241D02*Y42500D01*

+X139741Y72500D02*Y42500D01*

+Y52500D02*X158241D01*

+X139741Y62500D02*X158241D01*

+Y72500D02*Y42500D01*

+Y52500D02*Y42500D01*

+X103241D02*X128241D01*

+X103241Y72500D02*X128241D01*

+X103241D02*Y42500D01*

+X109741Y72500D02*Y42500D01*

+Y52500D02*X128241D01*

+X109741Y62500D02*X128241D01*

+Y72500D02*Y42500D01*

+Y52500D02*Y42500D01*

+X73241D02*X98241D01*

+X73241Y72500D02*X98241D01*

+X73241D02*Y42500D01*

+X79741Y72500D02*Y42500D01*

+Y52500D02*X98241D01*

+X79741Y62500D02*X98241D01*

+Y72500D02*Y42500D01*

+Y52500D02*Y42500D01*

+X193241D02*X218241D01*

+X193241Y72500D02*X218241D01*

+X193241D02*Y42500D01*

+X199741Y72500D02*Y42500D01*

+Y52500D02*X218241D01*

+X199741Y62500D02*X218241D01*

+Y72500D02*Y42500D01*

+Y52500D02*Y42500D01*

+X223241D02*X248241D01*

+X223241Y72500D02*X248241D01*

+X223241D02*Y42500D01*

+X229741Y72500D02*Y42500D01*

+Y52500D02*X248241D01*

+X229741Y62500D02*X248241D01*

+Y72500D02*Y42500D01*

+Y52500D02*Y42500D01*

+X163241D02*X188241D01*

+X163241Y72500D02*X188241D01*

+X163241D02*Y42500D01*

+X169741Y72500D02*Y42500D01*

+Y52500D02*X188241D01*

+X169741Y62500D02*X188241D01*

+Y72500D02*Y42500D01*

+Y52500D02*Y42500D01*

+X200441Y144500D02*Y110500D01*

+X231441D01*

+Y144500D01*

+X200441D02*X213441D01*

+X231441D02*X218441D01*

+X213441D02*G75*G03X218441Y144500I2500J0D01*G01*

+G54D293*X112885Y239433D02*Y235497D01*

+X102257Y239433D02*Y235497D01*

+X124885D02*Y239433D01*

+X114257Y235497D02*Y239433D01*

+X160635Y215125D02*X161421D01*

+X160635Y209615D02*X161421D01*

+X148816Y202220D02*Y201434D01*

+X154326Y202220D02*Y201434D01*

+G54D292*X118666Y144340D02*Y110340D01*

+X149666D01*

+Y144340D01*

+X118666D02*X131666D01*

+X149666D02*X136666D01*

+X131666D02*G75*G03X136666Y144340I2500J0D01*G01*

+X72641Y245000D02*X97641D01*

+X72641Y215000D02*X97641D01*

+Y245000D02*Y215000D01*

+X91141Y245000D02*Y215000D01*

+X72641Y235000D02*X91141D01*

+X72641Y225000D02*X91141D01*

+X72641Y245000D02*Y215000D01*

+Y245000D02*Y235000D01*

+X253241Y42500D02*X278241D01*

+X253241Y72500D02*X278241D01*

+X253241D02*Y42500D01*

+X259741Y72500D02*Y42500D01*

+Y52500D02*X278241D01*

+X259741Y62500D02*X278241D01*

+Y72500D02*Y42500D01*

+Y52500D02*Y42500D01*

+X283241D02*X308241D01*

+X283241Y72500D02*X308241D01*

+X283241D02*Y42500D01*

+X289741Y72500D02*Y42500D01*

+Y52500D02*X308241D01*

+X289741Y62500D02*X308241D01*

+Y72500D02*Y42500D01*

+Y52500D02*Y42500D01*

+X269438Y147822D02*Y108822D01*

+X300438D01*

+Y147822D01*

+X269438D02*X282438D01*

+X300438D02*X287438D01*

+X282438D02*G75*G03X287438Y147822I2500J0D01*G01*

+X374835Y228566D02*X396047D01*

+X374835D02*Y197434D01*

+X396047D01*

+Y228566D02*Y215500D01*

+Y210500D02*Y197434D01*

+Y215500D02*G75*G03X396047Y210500I0J-2500D01*G01*

+X402000Y216200D02*Y191200D01*

+X442000Y216200D02*Y191200D01*

+Y216200D02*X402000D01*

+Y209700D02*X442000D01*

+X412000Y191200D02*Y209700D01*

+X422000Y191200D02*Y209700D01*

+X432000Y191200D02*Y209700D01*

+X402000Y191200D02*X442000D01*

+X402000D02*X412000D01*

+X448500Y246200D02*Y221200D01*

+X478500Y246200D02*Y221200D01*

+X448500Y246200D02*X478500D01*

+X448500Y239700D02*X478500D01*

+X458500D02*Y221200D01*

+X468500Y239700D02*Y221200D01*

+X448500D02*X478500D01*

+X448500D02*X458500D01*

+X402000Y246200D02*Y221200D01*

+X442000Y246200D02*Y221200D01*

+Y246200D02*X402000D01*

+Y239700D02*X442000D01*

+X412000Y221200D02*Y239700D01*

+X422000Y221200D02*Y239700D01*

+X432000Y221200D02*Y239700D01*

+X402000Y221200D02*X442000D01*

+X402000D02*X412000D01*

+X448500Y276200D02*Y251200D01*

+X478500Y276200D02*Y251200D01*

+Y276200D02*X448500D01*

+Y269700D02*X478500D01*

+X458500Y251200D02*Y269700D01*

+X468500Y251200D02*Y269700D01*

+X448500Y251200D02*X478500D01*

+X448500D02*X458500D01*

+X307441Y261200D02*Y236200D01*

+X347441Y261200D02*Y236200D01*

+Y261200D02*X307441D01*

+Y254700D02*X347441D01*

+X317441Y236200D02*Y254700D01*

+X327441Y236200D02*Y254700D01*

+X337441Y236200D02*Y254700D01*

+X307441Y236200D02*X347441D01*

+X307441D02*X317441D01*

+G54D293*X386091Y60756D02*X386877D01*

+X386091Y55246D02*X386877D01*

+X371686Y47850D02*Y47064D01*

+X377196Y47850D02*Y47064D01*

+G54D294*X347755Y85968D02*Y82032D01*

+X337127Y85968D02*Y82032D01*

+G54D293*X334755Y85968D02*Y82032D01*

+X324127Y85968D02*Y82032D01*

+G54D292*X353331Y67174D02*Y82922D01*

+X389551Y67174D02*X353331D01*

+X389551Y82922D02*Y67174D01*

+X351756Y82922D02*Y123080D01*

+X391126Y82922D02*Y123080D01*

+Y82922D02*X351756D01*

+X391126Y123080D02*X351756D01*

+G54D293*X400196Y86393D02*Y85607D01*

+X394686Y86393D02*Y85607D01*

+M02*

diff --git a/bbb_cape/schematic/gerbers/20131204/cape.zip b/bbb_cape/schematic/gerbers/20131204/cape.zip
new file mode 100644
index 0000000..5598263
--- /dev/null
+++ b/bbb_cape/schematic/gerbers/20131204/cape.zip
Binary files differ
diff --git a/bbb_cape/schematic/gschemrc b/bbb_cape/schematic/gschemrc
new file mode 100644
index 0000000..fcf437d
--- /dev/null
+++ b/bbb_cape/schematic/gschemrc
@@ -0,0 +1,3 @@
+(load (string-append geda-data-path "/scheme/auto-uref.scm")) ; load the autonumbering script
+(add-hook! add-component-hook auto-uref)       ; autonumber when adding a component
+(add-hook! copy-component-hook auto-uref)      ; autonumber when copying a component
diff --git a/bbb_cape/schematic/packages/1812.fp b/bbb_cape/schematic/packages/1812.fp
new file mode 100644
index 0000000..d0210c9
--- /dev/null
+++ b/bbb_cape/schematic/packages/1812.fp
@@ -0,0 +1,11 @@
+Element["" "1812" "1812" "1812" 15.0000mm 1574.80mil -3.7498mm -39.38mil 0 100 ""]
+(
+	Pad[98.43mil -19.68mil 98.43mil 19.69mil 94.80mil 39.37mil 2.5080mm "2" "2" "square"]
+	Pad[-98.42mil -19.68mil -98.42mil 19.69mil 94.80mil 39.37mil 2.5080mm "1" "1" "square"]
+	ElementLine [-157.48mil -59.05mil -137.79mil -2.0000mm 8.00mil]
+	ElementLine [-157.48mil 2.0000mm -157.48mil -59.05mil 8.00mil]
+	ElementLine [157.48mil 2.0000mm -157.48mil 2.0000mm 8.00mil]
+	ElementLine [157.48mil -2.0000mm 157.48mil 2.0000mm 8.00mil]
+	ElementLine [-137.79mil -2.0000mm 157.48mil -2.0000mm 8.00mil]
+
+	)
diff --git a/bbb_cape/schematic/packages/22-23-2031.fp b/bbb_cape/schematic/packages/22-23-2031.fp
new file mode 100644
index 0000000..5b98bc0
--- /dev/null
+++ b/bbb_cape/schematic/packages/22-23-2031.fp
@@ -0,0 +1,14 @@
+Element(0x00 "Molex 22-23-2031 1x3 connector" "" "22-23-2031" 360 0 3 100 0x00)
+(
+	Pin(62 147 65 40 "1" 0x101)
+	Pin(162 147 65 40 "2" 0x01)
+	Pin(262 147 65 40 "3" 0x01)
+	ElementLine(0 0 0 290 10)
+	ElementLine(324 0 324 290 10)
+	ElementLine(324 0 0 0 10)
+	ElementLine(0 90 324 90 10)
+	ElementLine(112 290 112 90 10)
+	ElementLine(212 290 212 90 10)
+	ElementLine(0 290 324 290 10)
+	Mark(162 147)
+)
diff --git a/bbb_cape/schematic/packages/22-23-2041.fp b/bbb_cape/schematic/packages/22-23-2041.fp
new file mode 100644
index 0000000..43ffa87
--- /dev/null
+++ b/bbb_cape/schematic/packages/22-23-2041.fp
@@ -0,0 +1,16 @@
+Element(0x00 "Molex 22-23-2041 1x4 connector" "" "22-23-2041" 360 0 3 100 0x00)
+(
+	Pin(62 147 65 40 "1" 0x101)
+	Pin(162 147 65 40 "2" 0x01)
+	Pin(262 147 65 40 "3" 0x01)
+	Pin(362 147 65 40 "4" 0x01)
+	ElementLine(0 0 0 290 10)
+	ElementLine(424 0 424 290 10)
+	ElementLine(424 0 0 0 10)
+	ElementLine(0 90 424 90 10)
+	ElementLine(112 290 112 90 10)
+	ElementLine(212 290 212 90 10)
+	ElementLine(312 290 312 90 10)
+	ElementLine(0 290 424 290 10)
+	Mark(212 147)
+)
diff --git a/bbb_cape/schematic/packages/4-40_bolt.fp b/bbb_cape/schematic/packages/4-40_bolt.fp
new file mode 100644
index 0000000..dfe3c5f
--- /dev/null
+++ b/bbb_cape/schematic/packages/4-40_bolt.fp
@@ -0,0 +1,4 @@
+Element[0x0 "#4-40 bolt" "" "" 0 0 0 0 0 100 0x0]
+(
+   Pin[0 0 18300 1800 18900 12850 "the_hole" "1" 0x01]
+)
diff --git a/bbb_cape/schematic/packages/ABMM2.fp b/bbb_cape/schematic/packages/ABMM2.fp
new file mode 100644
index 0000000..66d118d
--- /dev/null
+++ b/bbb_cape/schematic/packages/ABMM2.fp
@@ -0,0 +1,12 @@
+# author: Bdale Garbee
+# email: bdale@gag.com
+# dist-license: GPL 2
+# use-license: unlimited
+Element[0x0 "ABM8" "" "" 0 0 0 0 0 100 0x0]
+(
+   Pad[ 5512 -9349 5512 -12007 7480 -3936 8080 "pin2" "2" 0x0100]
+   Pad[ 5512 9350 5512 12008 7480 -3936 8080 "pin1" "1" 0x0100]
+   Pad[ -5511 9350 -5511 12008 7480 -3936 8080 "pin4" "4" 0x0100]
+   Pad[ -5511 -9349 -5511 -12007 7480 -3936 8080 "pin3" "3" 0x0100]
+   ElementArc[ 709 13720 500 500 0 360 1000 ]
+)
diff --git a/bbb_cape/schematic/packages/TOPMOD.fp b/bbb_cape/schematic/packages/TOPMOD.fp
new file mode 100644
index 0000000..3f72817
--- /dev/null
+++ b/bbb_cape/schematic/packages/TOPMOD.fp
@@ -0,0 +1,19 @@
+Element["" "National 7-pin TO switcher module" "" "" 39370 39370 0 0 0 100 "TO-PMOD"]
+(
+	Pad[-15000 26772 -15000 33071 3504 2000 4104 "1" "1" "square,edge2"]
+	Pad[-10000 26772 -10000 33071 3504 2000 4104 "2" "2" "square,edge2"]
+	Pad[-5000 26772 -5000 33071 3504 2000 4104 "3" "3" "square,edge2"]
+	Pad[0 26772 0 33071 3504 2000 4104 "4" "4" "square,edge2"]
+	Pad[5000 26772 5000 33071 3504 2000 4104 "5" "5" "square,edge2"]
+	Pad[10000 26772 10000 33071 3504 2000 4104 "6" "6" "square,edge2"]
+	Pad[15000 26772 15000 33071 3504 2000 4104 "7" "7" "square,edge2"]
+	Pad[0 -6693 0 6693 21063 2000 21663 "8" "8" "square"]
+	ElementLine [-18110 35827 -18110 20079 1000]
+	ElementLine [18110 35827 -18110 35827 1000]
+	ElementLine [18110 20079 18110 35827 1000]
+	ElementLine [-19685 20079 -19685 -20079 1000]
+	ElementLine [19685 20079 19685 -20079 1000]
+	ElementLine [19685 20079 -19685 20079 1000]
+	ElementLine [19685 -20079 -19685 -20079 1000]
+
+	)
diff --git a/bbb_cape/schematic/packages/beaglebone.fp b/bbb_cape/schematic/packages/beaglebone.fp
new file mode 100644
index 0000000..ea013ee
--- /dev/null
+++ b/bbb_cape/schematic/packages/beaglebone.fp
@@ -0,0 +1,116 @@
+Element[0x0 "beaglebone-cape" "" "" 0 0 -112500 -118000 0 100 0x0]
+(
+   ElementArc[155000 -60000 50000 50000 180 90 1000]
+   ElementArc[155000 55000 50000 50000 90 90 1000]
+   ElementArc[-110000 80000 25000 25000 0 90 1000]
+   ElementLine[-112500 -110000 155000 -110000 1000]
+   ElementLine[205000 55000 205000 -60000 1000]
+   ElementLine[-110000 105000 155000 105000 1000]
+   ElementLine[-135000 80000 -135000 22500 1000]
+   ElementLine[-135000 22500 -55000 22500 1000]
+   ElementLine[-55000 22500 -55000 -47500 1000]
+   ElementLine[-55000 -47500 -112500 -47500 1000]
+   ElementLine[-112500 -47500 -112500 -110000 1000]
+   Pin[-77500 92500 18300 1800 18900 12850 "bogus_442" "442" 0x01]
+   Pin[-77500 -97500 18300 1800 18900 12850 "bogus_542" "542" 0x01]
+   Pin[182500 80000 21000 1800 23000 19000 "bogus_642" "642" 0x01]
+   Pin[182500 -85000 18300 1800 18900 12850 "bogus_742" "742" 0x01]
+   Pin[-57500 87500 6600 2000 8600 4600 "" "48" 0x01]
+   Pin[-57500 97500 6600 2000 8600 4600 "" "47" 0x0101]
+   Pin[-47500 87500 6600 2000 8600 4600 "" "50" 0x01]
+   Pin[-47500 97500 6600 2000 8600 4600 "" "49" 0x01]
+   Pin[-37500 87500 6600 2000 8600 4600 "" "52" 0x01]
+   Pin[-37500 97500 6600 2000 8600 4600 "" "51" 0x01]
+   Pin[-27500 87500 6600 2000 8600 4600 "" "54" 0x01]
+   Pin[-27500 97500 6600 2000 8600 4600 "" "53" 0x01]
+   Pin[-17500 87500 6600 2000 8600 4600 "" "56" 0x01]
+   Pin[-17500 97500 6600 2000 8600 4600 "" "55" 0x01]
+   Pin[-7500 87500 6600 2000 8600 4600 "" "58" 0x01]
+   Pin[-7500 97500 6600 2000 8600 4600 "" "57" 0x01]
+   Pin[2500 87500 6600 2000 8600 4600 "" "60" 0x01]
+   Pin[2500 97500 6600 2000 8600 4600 "" "59" 0x01]
+   Pin[12500 87500 6600 2000 8600 4600 "" "62" 0x01]
+   Pin[12500 97500 6600 2000 8600 4600 "" "61" 0x01]
+   Pin[22500 87500 6600 2000 8600 4600 "" "64" 0x01]
+   Pin[22500 97500 6600 2000 8600 4600 "" "63" 0x01]
+   Pin[32500 87500 6600 2000 8600 4600 "" "66" 0x01]
+   Pin[32500 97500 6600 2000 8600 4600 "" "65" 0x01]
+   Pin[42500 87500 6600 2000 8600 4600 "" "68" 0x01]
+   Pin[42500 97500 6600 2000 8600 4600 "" "67" 0x01]
+   Pin[52500 87500 6600 2000 8600 4600 "" "70" 0x01]
+   Pin[52500 97500 6600 2000 8600 4600 "" "69" 0x01]
+   Pin[62500 87500 6600 2000 8600 4600 "" "72" 0x01]
+   Pin[62500 97500 6600 2000 8600 4600 "" "71" 0x01]
+   Pin[72500 87500 6600 2000 8600 4600 "" "74" 0x01]
+   Pin[72500 97500 6600 2000 8600 4600 "" "73" 0x01]
+   Pin[82500 87500 6600 2000 8600 4600 "" "76" 0x01]
+   Pin[82500 97500 6600 2000 8600 4600 "" "75" 0x01]
+   Pin[92500 87500 6600 2000 8600 4600 "" "78" 0x01]
+   Pin[92500 97500 6600 2000 8600 4600 "" "77" 0x01]
+   Pin[102500 87500 6600 2000 8600 4600 "" "80" 0x01]
+   Pin[102500 97500 6600 2000 8600 4600 "" "79" 0x01]
+   Pin[112500 87500 6600 2000 8600 4600 "" "82" 0x01]
+   Pin[112500 97500 6600 2000 8600 4600 "" "81" 0x01]
+   Pin[122500 87500 6600 2000 8600 4600 "" "84" 0x01]
+   Pin[122500 97500 6600 2000 8600 4600 "" "83" 0x01]
+   Pin[132500 87500 6600 2000 8600 4600 "" "86" 0x01]
+   Pin[132500 97500 6600 2000 8600 4600 "" "85" 0x01]
+   Pin[142500 87500 6600 2000 8600 4600 "" "88" 0x01]
+   Pin[142500 97500 6600 2000 8600 4600 "" "87" 0x01]
+   Pin[152500 87500 6600 2000 8600 4600 "" "90" 0x01]
+   Pin[152500 97500 6600 2000 8600 4600 "" "89" 0x01]
+   Pin[162500 87500 6600 2000 8600 4600 "" "92" 0x01]
+   Pin[162500 97500 6600 2000 8600 4600 "" "91" 0x01]
+   Pin[-57500 -102500 6600 2000 8600 4600 "" "2" 0x01]
+   Pin[-57500 -92500 6600 2000 8600 4600 "" "1" 0x0101]
+   Pin[-47500 -102500 6600 2000 8600 4600 "" "4" 0x01]
+   Pin[-47500 -92500 6600 2000 8600 4600 "" "3" 0x01]
+   Pin[-37500 -102500 6600 2000 8600 4600 "" "6" 0x01]
+   Pin[-37500 -92500 6600 2000 8600 4600 "" "5" 0x01]
+   Pin[-27500 -102500 6600 2000 8600 4600 "" "8" 0x01]
+   Pin[-27500 -92500 6600 2000 8600 4600 "" "7" 0x01]
+   Pin[-17500 -102500 6600 2000 8600 4600 "" "10" 0x01]
+   Pin[-17500 -92500 6600 2000 8600 4600 "" "9" 0x01]
+   Pin[-7500 -102500 6600 2000 8600 4600 "" "12" 0x01]
+   Pin[-7500 -92500 6600 2000 8600 4600 "" "11" 0x01]
+   Pin[2500 -102500 6600 2000 8600 4600 "" "14" 0x01]
+   Pin[2500 -92500 6600 2000 8600 4600 "" "13" 0x01]
+   Pin[12500 -102500 6600 2000 8600 4600 "" "16" 0x01]
+   Pin[12500 -92500 6600 2000 8600 4600 "" "15" 0x01]
+   Pin[22500 -102500 6600 2000 8600 4600 "" "18" 0x01]
+   Pin[22500 -92500 6600 2000 8600 4600 "" "17" 0x01]
+   Pin[32500 -102500 6600 2000 8600 4600 "" "20" 0x01]
+   Pin[32500 -92500 6600 2000 8600 4600 "" "19" 0x01]
+   Pin[42500 -102500 6600 2000 8600 4600 "" "22" 0x01]
+   Pin[42500 -92500 6600 2000 8600 4600 "" "21" 0x01]
+   Pin[52500 -102500 6600 2000 8600 4600 "" "24" 0x01]
+   Pin[52500 -92500 6600 2000 8600 4600 "" "23" 0x01]
+   Pin[62500 -102500 6600 2000 8600 4600 "" "26" 0x01]
+   Pin[62500 -92500 6600 2000 8600 4600 "" "25" 0x01]
+   Pin[72500 -102500 6600 2000 8600 4600 "" "28" 0x01]
+   Pin[72500 -92500 6600 2000 8600 4600 "" "27" 0x01]
+   Pin[82500 -102500 6600 2000 8600 4600 "" "30" 0x01]
+   Pin[82500 -92500 6600 2000 8600 4600 "" "29" 0x01]
+   Pin[92500 -102500 6600 2000 8600 4600 "" "32" 0x01]
+   Pin[92500 -92500 6600 2000 8600 4600 "" "31" 0x01]
+   Pin[102500 -102500 6600 2000 8600 4600 "" "34" 0x01]
+   Pin[102500 -92500 6600 2000 8600 4600 "" "33" 0x01]
+   Pin[112500 -102500 6600 2000 8600 4600 "" "36" 0x01]
+   Pin[112500 -92500 6600 2000 8600 4600 "" "35" 0x01]
+   Pin[122500 -102500 6600 2000 8600 4600 "" "38" 0x01]
+   Pin[122500 -92500 6600 2000 8600 4600 "" "37" 0x01]
+   Pin[132500 -102500 6600 2000 8600 4600 "" "40" 0x01]
+   Pin[132500 -92500 6600 2000 8600 4600 "" "39" 0x01]
+   Pin[142500 -102500 6600 2000 8600 4600 "" "42" 0x01]
+   Pin[142500 -92500 6600 2000 8600 4600 "" "41" 0x01]
+   Pin[152500 -102500 6600 2000 8600 4600 "" "44" 0x01]
+   Pin[152500 -92500 6600 2000 8600 4600 "" "43" 0x01]
+   Pin[162500 -102500 6600 2000 8600 4600 "" "46" 0x01]
+   Pin[162500 -92500 6600 2000 8600 4600 "" "45" 0x01]
+   Pin[32500 75000 6600 2000 8600 4600 "" "UART1" 0x101]
+   Pin[42500 75000 6600 2000 8600 4600 "" "UART2" 0x01]
+   Pin[52500 75000 6600 2000 8600 4600 "" "UART3" 0x01]
+   Pin[62500 75000 6600 2000 8600 4600 "" "UART4" 0x01]
+   Pin[72500 75000 6600 2000 8600 4600 "" "UART5" 0x01]
+   Pin[152500 -65000 22000 1800 24000 20000 "bogus_842" "842" 0x01]
+)
diff --git a/bbb_cape/schematic/simple switcher 5V.sch b/bbb_cape/schematic/simple switcher 5V.sch
new file mode 100644
index 0000000..4d07654
--- /dev/null
+++ b/bbb_cape/schematic/simple switcher 5V.sch
@@ -0,0 +1,245 @@
+v 20110115 2
+C 44700 46900 1 0 0 lmz12002-1.sym
+{
+T 45200 47800 5 10 1 1 0 0 1
+device=LMZ12002
+T 46600 47800 5 10 1 1 0 0 1
+refdes=U3
+T 44700 46900 5 10 0 0 0 0 1
+pn=LMZ12002LMZ12002TZ-ADJ/NOPB
+}
+N 46200 44200 46200 46900 4
+N 46200 46700 46500 46700 4
+N 46500 46700 46500 46900 4
+C 47000 45200 1 90 0 capacitor-1.sym
+{
+T 46300 45400 5 10 0 0 90 0 1
+device=CAPACITOR
+T 46500 45400 5 10 1 1 90 0 1
+refdes=C2
+T 46100 45400 5 10 0 0 90 0 1
+symversion=0.1
+T 47000 45200 5 10 0 0 90 0 1
+footprint=0805
+T 47100 45200 5 10 1 1 90 0 1
+value=10 nf
+T 47000 45200 5 10 0 0 0 0 1
+pn=GRM216R71H103KA01D
+}
+C 43600 45400 1 90 0 capacitor-1.sym
+{
+T 42900 45600 5 10 0 0 90 0 1
+device=CAPACITOR
+T 43100 45600 5 10 1 1 90 0 1
+refdes=C3
+T 42700 45600 5 10 0 0 90 0 1
+symversion=0.1
+T 43600 45400 5 10 0 0 90 0 1
+footprint=1210
+T 43700 45400 5 10 1 1 90 0 1
+value=10 uF
+T 43600 45400 5 10 0 0 0 0 1
+pn=C3225X7R1E106MT
+}
+C 42800 45400 1 90 0 capacitor-1.sym
+{
+T 42100 45600 5 10 0 0 90 0 1
+device=CAPACITOR
+T 42300 45600 5 10 1 1 90 0 1
+refdes=C4
+T 41900 45600 5 10 0 0 90 0 1
+symversion=0.1
+T 42800 45400 5 10 0 0 90 0 1
+footprint=1210
+T 42900 45400 5 10 1 1 90 0 1
+value=10 uF
+T 42800 45400 5 10 0 0 0 0 1
+pn=C3225X7R1E106MT
+}
+C 42500 44700 1 0 0 gnd-1.sym
+N 43400 46300 43400 46600 4
+N 41800 46600 45100 46600 4
+N 45100 46600 45100 46900 4
+N 42600 46600 42600 46300 4
+N 42600 45000 42600 45400 4
+N 42600 45200 43400 45200 4
+N 43400 45200 43400 45400 4
+C 49400 45000 1 90 0 capacitor-1.sym
+{
+T 48700 45200 5 10 0 0 90 0 1
+device=CAPACITOR
+T 48900 45200 5 10 1 1 90 0 1
+refdes=C5
+T 48500 45200 5 10 0 0 90 0 1
+symversion=0.1
+T 49400 45000 5 10 0 0 90 0 1
+footprint=0805
+T 49500 45000 5 10 1 1 90 0 1
+value=22 nf
+T 49400 45000 5 10 0 0 0 0 1
+pn=CC0805KRX7R9BB223
+}
+C 44200 45000 1 0 0 resistor-1.sym
+{
+T 44500 45400 5 10 0 0 0 0 1
+device=RESISTOR
+T 44400 45300 5 10 1 1 0 0 1
+refdes=R2
+T 44100 44800 5 10 1 1 0 0 1
+value=34.0 kohm
+T 44200 45000 5 10 0 0 0 0 1
+footprint=0603
+T 44200 45000 5 10 0 0 0 0 1
+pn=CRCW060334K0FKEA
+}
+C 44300 45900 1 0 0 resistor-1.sym
+{
+T 44600 46300 5 10 0 0 0 0 1
+device=RESISTOR
+T 44500 46200 5 10 1 1 0 0 1
+refdes=R3
+T 44100 45700 5 10 1 1 0 0 1
+value=154.0 kohm
+T 44300 45900 5 10 0 0 0 0 1
+footprint=0603
+T 44300 45900 5 10 0 0 0 0 1
+pn=CRCW0603154KFKEA
+}
+N 45400 46900 45400 46000 4
+N 45400 46000 45200 46000 4
+C 44200 44200 1 0 0 resistor-1.sym
+{
+T 44500 44600 5 10 0 0 0 0 1
+device=RESISTOR
+T 44400 44500 5 10 1 1 0 0 1
+refdes=R4
+T 44200 44000 5 10 1 1 0 0 1
+value=9.31 kohm
+T 44200 44200 5 10 0 0 0 0 1
+footprint=0603
+T 44200 44200 5 10 0 0 0 0 1
+pn=ERJ-3EKF9311V
+}
+N 45700 44300 45700 46900 4
+N 45100 45100 45700 45100 4
+N 45700 44300 45100 44300 4
+N 44200 45100 43900 45100 4
+N 43900 45100 43900 46600 4
+C 43900 43800 1 0 0 gnd-1.sym
+N 44200 44300 44000 44300 4
+N 44000 44300 44000 44100 4
+C 46100 43900 1 0 0 gnd-1.sym
+N 46800 45200 46800 45000 4
+N 46800 45000 46200 45000 4
+C 46400 44400 1 0 0 resistor-1.sym
+{
+T 46700 44800 5 10 0 0 0 0 1
+device=RESISTOR
+T 46600 44700 5 10 1 1 0 0 1
+refdes=R5
+T 46400 44200 5 10 1 1 0 0 1
+value=1.27 kohm
+T 46400 44400 5 10 0 0 0 0 1
+footprint=0805
+T 46400 44400 5 10 0 0 0 0 1
+pn=CRCW08051K27FKEA
+}
+N 46200 44500 46400 44500 4
+N 47300 44500 47300 46900 4
+C 47500 46000 1 0 0 resistor-1.sym
+{
+T 47800 46400 5 10 0 0 0 0 1
+device=RESISTOR
+T 47700 46300 5 10 1 1 0 0 1
+refdes=R6
+T 47500 45800 5 10 1 1 0 0 1
+value=6.65 kohm
+T 47500 46000 5 10 0 0 0 0 1
+footprint=0805
+T 47500 46000 5 10 0 0 0 0 1
+pn=CRCW08056K65FKEA
+}
+N 47500 46100 47300 46100 4
+N 47600 46900 47600 46600 4
+N 47600 46600 51400 46600 4
+N 48400 46100 48600 46100 4
+N 48600 46100 48600 46600 4
+N 49200 45900 49200 46600 4
+N 49200 45000 49200 44800 4
+N 49200 44800 47300 44800 4
+C 50300 45000 1 90 0 capacitor-1.sym
+{
+T 49600 45200 5 10 0 0 90 0 1
+device=CAPACITOR
+T 49800 45200 5 10 1 1 90 0 1
+refdes=C6
+T 49400 45200 5 10 0 0 90 0 1
+symversion=0.1
+T 50300 45000 5 10 0 0 90 0 1
+footprint=1210
+T 50400 45000 5 10 1 1 90 0 1
+value=100 uF
+T 50300 45000 5 10 0 0 0 0 1
+pn=C3225X5R0J107MT
+}
+N 50100 46600 50100 45900 4
+C 50000 43900 1 0 0 gnd-1.sym
+N 50100 45000 50100 44200 4
+N 47000 46900 47000 46500 4
+N 47000 46500 46800 46500 4
+N 46800 46500 46800 46100 4
+N 44300 46000 44100 46000 4
+N 44100 46000 44100 46600 4
+C 41200 43900 1 0 0 in-1.sym
+{
+T 41200 44200 5 10 0 0 0 0 1
+device=INPUT
+T 41200 44200 5 10 1 1 0 0 1
+refdes=GND
+}
+C 51400 46500 1 0 0 out-1.sym
+{
+T 51400 46800 5 10 0 0 0 0 1
+device=OUTPUT
+T 51400 46800 5 10 1 1 0 0 1
+refdes=VOUT
+}
+C 42400 43900 1 90 0 gnd-1.sym
+N 41800 44000 42100 44000 4
+C 41200 46500 1 0 0 in-1.sym
+{
+T 41200 46800 5 10 0 0 0 0 1
+device=INPUT
+T 41200 46800 5 10 1 1 0 0 1
+refdes=VIN
+}
+C 51100 46200 1 270 0 resistor-1.sym
+{
+T 51500 45900 5 10 0 0 270 0 1
+device=RESISTOR
+T 51400 46000 5 10 1 1 270 0 1
+refdes=R13
+T 51100 46200 5 10 0 0 270 0 1
+footprint=0603
+T 50900 46200 5 10 1 1 270 0 1
+value=300 ohms
+T 51100 46200 5 10 0 1 0 0 1
+pn=CRCW0603300RFKEAHP
+}
+C 51400 44300 1 90 0 led-3.sym
+{
+T 50750 45250 5 10 0 0 90 0 1
+device=LED
+T 50850 44750 5 10 1 1 90 0 1
+refdes=D1
+T 51400 44300 5 10 0 0 90 0 1
+footprint=0805
+T 51500 44500 5 10 1 1 90 0 1
+value=green
+T 51400 44300 5 10 0 1 0 0 1
+pn=LG R971-KN-1
+}
+N 51200 46600 51200 46200 4
+N 51200 45300 51200 45200 4
+C 51100 43900 1 0 0 gnd-1.sym
+N 51200 44300 51200 44200 4
diff --git a/bbb_cape/schematic/symbols/4-40_bolt-1.sym b/bbb_cape/schematic/symbols/4-40_bolt-1.sym
new file mode 100644
index 0000000..6d6fcfb
--- /dev/null
+++ b/bbb_cape/schematic/symbols/4-40_bolt-1.sym
@@ -0,0 +1,14 @@
+v 20110115 2
+V 600 500 500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+T -300 1200 8 10 0 1 0 0 1
+device=4-40_bolt
+T 500 1300 8 10 0 1 0 0 1
+description=#4-40 mounting bolt hole
+T 0 1200 8 10 0 1 0 0 1
+footprint=4-40_bolt
+T 500 700 8 10 1 1 0 0 1
+refdes=B?
+T 1100 1400 8 10 0 1 0 0 1
+numslots=1
+T 0 1100 9 10 1 0 0 0 1
+#4-40 bolt hole
diff --git a/bbb_cape/schematic/symbols/ADXRS453-1.sym b/bbb_cape/schematic/symbols/ADXRS453-1.sym
new file mode 100644
index 0000000..299f900
--- /dev/null
+++ b/bbb_cape/schematic/symbols/ADXRS453-1.sym
@@ -0,0 +1,190 @@
+v 20110115 2
+T 600 1800 8 10 0 1 0 0 1
+footprint=SO16W
+B 300 0 1500 2500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 2300 300 2300 1 0 0
+{
+T 0 2300 5 10 0 0 0 0 1
+pintype=pwr
+T 355 2295 5 10 1 1 0 0 1
+pinlabel=DVDD
+T 205 2345 5 10 1 1 0 6 1
+pinnumber=1
+T 0 2300 5 10 0 0 0 0 1
+pinseq=1
+}
+P 0 2000 300 2000 1 0 0
+{
+T 0 2000 5 10 0 0 0 0 1
+pintype=pwr
+T 355 1995 5 10 1 1 0 0 1
+pinlabel=DVSS
+T 205 2045 5 10 1 1 0 6 1
+pinnumber=13
+T 0 2000 5 10 0 0 0 0 1
+pinseq=2
+}
+P 0 1700 300 1700 1 0 0
+{
+T 0 1700 5 10 0 0 0 0 1
+pintype=pwr
+T 355 1695 5 10 1 1 0 0 1
+pinlabel=AVDD
+T 205 1745 5 10 1 1 0 6 1
+pinnumber=14
+T 0 1700 5 10 0 0 0 0 1
+pinseq=3
+}
+P 0 1400 300 1400 1 0 0
+{
+T 0 1400 5 10 0 0 0 0 1
+pintype=pwr
+T 355 1395 5 10 1 1 0 0 1
+pinlabel=AVSS
+T 205 1445 5 10 1 1 0 6 1
+pinnumber=11
+T 0 1400 5 10 0 0 0 0 1
+pinseq=4
+}
+P 0 1100 300 1100 1 0 0
+{
+T 0 1100 5 10 0 0 0 0 1
+pintype=in
+T 355 1095 5 10 1 1 0 0 1
+pinlabel=RSVD
+T 205 1145 5 10 1 1 0 6 1
+pinnumber=2
+T 0 1100 5 10 0 0 0 0 1
+pinseq=5
+}
+P 0 800 300 800 1 0 0
+{
+T 0 800 5 10 0 0 0 0 1
+pintype=in
+T 355 795 5 10 1 1 0 0 1
+pinlabel=RSVD
+T 205 845 5 10 1 1 0 6 1
+pinnumber=3
+T 0 800 5 10 0 0 0 0 1
+pinseq=6
+}
+P 0 500 300 500 1 0 0
+{
+T 0 500 5 10 0 0 0 0 1
+pintype=in
+T 355 495 5 10 1 1 0 0 1
+pinlabel=RSVD
+T 205 545 5 10 1 1 0 6 1
+pinnumber=10
+T 0 500 5 10 0 0 0 0 1
+pinseq=7
+}
+P 0 200 300 200 1 0 0
+{
+T 0 200 5 10 0 0 0 0 1
+pintype=in
+T 355 195 5 10 1 1 0 0 1
+pinlabel=RSVD
+T 205 245 5 10 1 1 0 6 1
+pinnumber=12
+T 0 200 5 10 0 0 0 0 1
+pinseq=8
+}
+P 2100 2300 1800 2300 1 0 0
+{
+T 2100 2300 5 10 0 0 0 0 1
+pintype=in
+T 1745 2295 5 10 1 1 0 6 1
+pinlabel=\_CS\_
+T 1895 2345 5 10 1 1 0 0 1
+pinnumber=4
+T 2100 2300 5 10 0 0 0 0 1
+pinseq=9
+}
+P 2100 2000 1800 2000 1 0 0
+{
+T 2100 2000 5 10 0 0 0 0 1
+pintype=in
+T 1745 1995 5 10 1 1 0 6 1
+pinlabel=SCLK
+T 1895 2045 5 10 1 1 0 0 1
+pinnumber=16
+T 2100 2000 5 10 0 0 0 0 1
+pinseq=10
+}
+P 2100 1700 1800 1700 1 0 0
+{
+T 2100 1700 5 10 0 0 0 0 1
+pintype=out
+T 1745 1695 5 10 1 1 0 6 1
+pinlabel=MISO
+T 1895 1745 5 10 1 1 0 0 1
+pinnumber=5
+T 2100 1700 5 10 0 0 0 0 1
+pinseq=11
+}
+P 2100 1400 1800 1400 1 0 0
+{
+T 2100 1400 5 10 0 0 0 0 1
+pintype=in
+T 1745 1395 5 10 1 1 0 6 1
+pinlabel=MOSI
+T 1895 1445 5 10 1 1 0 0 1
+pinnumber=15
+T 2100 1400 5 10 0 0 0 0 1
+pinseq=12
+}
+P 2100 1100 1800 1100 1 0 0
+{
+T 2100 1100 5 10 0 0 0 0 1
+pintype=pwr
+T 1745 1095 5 10 1 1 0 6 1
+pinlabel=PDD
+T 1895 1145 5 10 1 1 0 0 1
+pinnumber=6
+T 2100 1100 5 10 0 0 0 0 1
+pinseq=13
+}
+P 2100 800 1800 800 1 0 0
+{
+T 2100 800 5 10 0 0 0 0 1
+pintype=pwr
+T 1745 795 5 10 1 1 0 6 1
+pinlabel=PSS
+T 1895 845 5 10 1 1 0 0 1
+pinnumber=7
+T 2100 800 5 10 0 0 0 0 1
+pinseq=14
+}
+P 2100 500 1800 500 1 0 0
+{
+T 2100 500 5 10 0 0 0 0 1
+pintype=pas
+T 1745 495 5 10 1 1 0 6 1
+pinlabel=VX
+T 1895 545 5 10 1 1 0 0 1
+pinnumber=8
+T 2100 500 5 10 0 0 0 0 1
+pinseq=15
+}
+P 2100 200 1800 200 1 0 0
+{
+T 2100 200 5 10 0 0 0 0 1
+pintype=pas
+T 1745 195 5 10 1 1 0 6 1
+pinlabel=CP5
+T 1895 245 5 10 1 1 0 0 1
+pinnumber=9
+T 2100 200 5 10 0 0 0 0 1
+pinseq=16
+}
+T 1000 3200 8 10 0 1 0 0 1
+device=ADXRS453
+T 1300 2800 8 10 0 1 0 0 1
+description=Analog Devices ADXRS453 gyro
+T 1500 2600 8 10 1 1 0 0 1
+refdes=U?
+T -400 2900 8 10 0 1 0 0 1
+numslots=1
+T 400 2600 9 10 1 0 0 0 1
+ADXRS453
diff --git a/bbb_cape/schematic/symbols/AM26LV32E-1.sym b/bbb_cape/schematic/symbols/AM26LV32E-1.sym
new file mode 100644
index 0000000..a155259
--- /dev/null
+++ b/bbb_cape/schematic/symbols/AM26LV32E-1.sym
@@ -0,0 +1,190 @@
+v 20110115 2
+P 1800 2300 1500 2300 1 0 0
+{
+T 1800 2300 5 10 0 0 0 0 1
+pintype=in
+T 1445 2295 5 10 1 1 0 6 1
+pinlabel=1A
+T 1595 2345 5 10 1 1 0 0 1
+pinnumber=2
+T 1800 2300 5 10 0 0 0 0 1
+pinseq=7
+}
+P 1800 2000 1500 2000 1 0 0
+{
+T 1800 2000 5 10 0 0 0 0 1
+pintype=in
+T 1445 1995 5 10 1 1 0 6 1
+pinlabel=1B
+T 1595 2045 5 10 1 1 0 0 1
+pinnumber=1
+T 1800 2000 5 10 0 0 0 0 1
+pinseq=9
+}
+P 1800 1700 1500 1700 1 0 0
+{
+T 1800 1700 5 10 0 0 0 0 1
+pintype=in
+T 1445 1695 5 10 1 1 0 6 1
+pinlabel=2A
+T 1595 1745 5 10 1 1 0 0 1
+pinnumber=6
+T 1800 1700 5 10 0 0 0 0 1
+pinseq=11
+}
+P 1800 1400 1500 1400 1 0 0
+{
+T 1800 1400 5 10 0 0 0 0 1
+pintype=in
+T 1445 1395 5 10 1 1 0 6 1
+pinlabel=2B
+T 1595 1445 5 10 1 1 0 0 1
+pinnumber=7
+T 1800 1400 5 10 0 0 0 0 1
+pinseq=12
+}
+P 1800 800 1500 800 1 0 0
+{
+T 1800 800 5 10 0 0 0 0 1
+pintype=in
+T 1445 795 5 10 1 1 0 6 1
+pinlabel=3B
+T 1595 845 5 10 1 1 0 0 1
+pinnumber=9
+T 1800 800 5 10 0 0 0 0 1
+pinseq=14
+}
+P 1800 500 1500 500 1 0 0
+{
+T 1800 500 5 10 0 0 0 0 1
+pintype=in
+T 1445 495 5 10 1 1 0 6 1
+pinlabel=4A
+T 1595 545 5 10 1 1 0 0 1
+pinnumber=14
+T 1800 500 5 10 0 0 0 0 1
+pinseq=15
+}
+P 1800 200 1500 200 1 0 0
+{
+T 1800 200 5 10 0 0 0 0 1
+pintype=in
+T 1445 195 5 10 1 1 0 6 1
+pinlabel=4B
+T 1595 245 5 10 1 1 0 0 1
+pinnumber=15
+T 1800 200 5 10 0 0 0 0 1
+pinseq=16
+}
+P 1800 1100 1500 1100 1 0 0
+{
+T 1800 1100 5 10 0 0 0 0 1
+pintype=in
+T 1445 1095 5 10 1 1 0 6 1
+pinlabel=3A
+T 1595 1145 5 10 1 1 0 0 1
+pinnumber=10
+T 1800 1100 5 10 0 0 0 0 1
+pinseq=13
+}
+B 300 0 1200 2500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 2300 300 2300 1 0 0
+{
+T 0 2300 5 10 0 0 0 0 1
+pintype=out
+T 355 2295 5 10 1 1 0 0 1
+pinlabel=1Y
+T 205 2345 5 10 1 1 0 6 1
+pinnumber=3
+T 0 2300 5 10 0 0 0 0 1
+pinseq=1
+}
+P 0 2000 300 2000 1 0 0
+{
+T 0 2000 5 10 0 0 0 0 1
+pintype=out
+T 355 1995 5 10 1 1 0 0 1
+pinlabel=2Y
+T 205 2045 5 10 1 1 0 6 1
+pinnumber=5
+T 0 2000 5 10 0 0 0 0 1
+pinseq=2
+}
+P 0 1700 300 1700 1 0 0
+{
+T 0 1700 5 10 0 0 0 0 1
+pintype=out
+T 355 1695 5 10 1 1 0 0 1
+pinlabel=3Y
+T 205 1745 5 10 1 1 0 6 1
+pinnumber=11
+T 0 1700 5 10 0 0 0 0 1
+pinseq=3
+}
+P 0 1400 300 1400 1 0 0
+{
+T 0 1400 5 10 0 0 0 0 1
+pintype=out
+T 355 1395 5 10 1 1 0 0 1
+pinlabel=4Y
+T 205 1445 5 10 1 1 0 6 1
+pinnumber=13
+T 0 1400 5 10 0 0 0 0 1
+pinseq=4
+}
+P 0 1100 300 1100 1 0 0
+{
+T 0 1100 5 10 0 0 0 0 1
+pintype=in
+T 355 1095 5 10 1 1 0 0 1
+pinlabel=ENABLE
+T 205 1145 5 10 1 1 0 6 1
+pinnumber=4
+T 0 1100 5 10 0 0 0 0 1
+pinseq=5
+}
+P 0 800 300 800 1 0 0
+{
+T 0 800 5 10 0 0 0 0 1
+pintype=in
+T 355 795 5 10 1 1 0 0 1
+pinlabel=\_ENABLE\_
+T 205 845 5 10 1 1 0 6 1
+pinnumber=12
+T 0 800 5 10 0 0 0 0 1
+pinseq=6
+}
+P 0 500 300 500 1 0 0
+{
+T 0 500 5 10 0 0 0 0 1
+pintype=pwr
+T 355 495 5 10 1 1 0 0 1
+pinlabel=GND
+T 205 545 5 10 1 1 0 6 1
+pinnumber=8
+T 0 500 5 10 0 0 0 0 1
+pinseq=8
+}
+P 0 200 300 200 1 0 0
+{
+T 0 200 5 10 0 0 0 0 1
+pintype=pwr
+T 355 195 5 10 1 1 0 0 1
+pinlabel=VCC
+T 205 245 5 10 1 1 0 6 1
+pinnumber=16
+T 0 200 5 10 0 0 0 0 1
+pinseq=10
+}
+T -600 2200 8 10 0 1 0 0 1
+device=AM26LV32E
+T -800 2000 8 10 0 1 0 0 1
+description=TI AM26LV32E LOW-VOLTAGE HIGH-SPEED QUADRUPLE DIFFERENTIAL LINE RECEIVER
+T -1400 1700 8 10 0 1 0 0 1
+footprint=TSSOP16
+T 1300 2600 8 10 1 1 0 0 1
+refdes=U?
+T -600 1200 8 10 0 1 0 0 1
+numslots=0
+T 200 2600 9 10 1 0 0 0 1
+AM26LV32E
diff --git a/bbb_cape/schematic/symbols/MCP3008-ISL-1.sym b/bbb_cape/schematic/symbols/MCP3008-ISL-1.sym
new file mode 100644
index 0000000..2627b4e
--- /dev/null
+++ b/bbb_cape/schematic/symbols/MCP3008-ISL-1.sym
@@ -0,0 +1,190 @@
+v 20110115 2
+B 300 0 1900 2400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 2500 1600 2200 1600 1 0 0
+{
+T 2500 1600 5 10 0 0 0 0 1
+pintype=pwr
+T 2145 1595 5 10 1 1 0 6 1
+pinlabel=DVDD
+T 2295 1645 5 10 1 1 0 0 1
+pinnumber=16
+T 2500 1600 5 10 0 0 0 0 1
+pinseq=0
+}
+P 2500 1300 2200 1300 1 0 0
+{
+T 2500 1300 5 10 0 0 0 0 1
+pintype=pwr
+T 2145 1295 5 10 1 1 0 6 1
+pinlabel=DGND
+T 2295 1345 5 10 1 1 0 0 1
+pinnumber=9
+T 2500 1300 5 10 0 0 0 0 1
+pinseq=0
+}
+P 2500 2200 2200 2200 1 0 0
+{
+T 2500 2200 5 10 0 0 0 0 1
+pintype=pwr
+T 2145 2195 5 10 1 1 0 6 1
+pinlabel=AVDD
+T 2295 2245 5 10 1 1 0 0 1
+pinnumber=15
+T 2500 2200 5 10 0 0 0 0 1
+pinseq=0
+}
+P 2500 1900 2200 1900 1 0 0
+{
+T 2500 1900 5 10 0 0 0 0 1
+pintype=pwr
+T 2145 1895 5 10 1 1 0 6 1
+pinlabel=AGND
+T 2295 1945 5 10 1 1 0 0 1
+pinnumber=14
+T 2500 1900 5 10 0 0 0 0 1
+pinseq=0
+}
+P 2500 1000 2200 1000 1 0 0
+{
+T 2500 1000 5 10 0 0 0 0 1
+pintype=clk
+T 2145 995 5 10 1 1 0 6 1
+pinlabel=CLK
+T 2295 1045 5 10 1 1 0 0 1
+pinnumber=13
+T 2500 1000 5 10 0 0 0 0 1
+pinseq=0
+}
+P 2500 700 2200 700 1 0 0
+{
+T 2500 700 5 10 0 0 0 0 1
+pintype=in
+T 2145 695 5 10 1 1 0 6 1
+pinlabel=\_CS\_
+T 2295 745 5 10 1 1 0 0 1
+pinnumber=10
+T 2500 700 5 10 0 0 0 0 1
+pinseq=0
+}
+P 2500 400 2200 400 1 0 0
+{
+T 2500 400 5 10 0 0 0 0 1
+pintype=in
+T 2145 395 5 10 1 1 0 6 1
+pinlabel=MOSI
+T 2295 445 5 10 1 1 0 0 1
+pinnumber=11
+T 2500 400 5 10 0 0 0 0 1
+pinseq=0
+}
+P 2500 100 2200 100 1 0 0
+{
+T 2500 100 5 10 0 0 0 0 1
+pintype=out
+T 2145 95 5 10 1 1 0 6 1
+pinlabel=MISO
+T 2295 145 5 10 1 1 0 0 1
+pinnumber=12
+T 2500 100 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 2200 300 2200 1 0 0
+{
+T 0 2200 5 10 0 0 0 0 1
+pintype=in
+T 355 2195 5 10 1 1 0 0 1
+pinlabel=CH0
+T 205 2245 5 10 1 1 0 6 1
+pinnumber=1
+T 0 2200 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 1900 300 1900 1 0 0
+{
+T 0 1900 5 10 0 0 0 0 1
+pintype=in
+T 355 1895 5 10 1 1 0 0 1
+pinlabel=CH1
+T 205 1945 5 10 1 1 0 6 1
+pinnumber=2
+T 0 1900 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 1600 300 1600 1 0 0
+{
+T 0 1600 5 10 0 0 0 0 1
+pintype=in
+T 355 1595 5 10 1 1 0 0 1
+pinlabel=CH2
+T 205 1645 5 10 1 1 0 6 1
+pinnumber=3
+T 0 1600 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 1300 300 1300 1 0 0
+{
+T 0 1300 5 10 0 0 0 0 1
+pintype=in
+T 355 1295 5 10 1 1 0 0 1
+pinlabel=CH3
+T 205 1345 5 10 1 1 0 6 1
+pinnumber=4
+T 0 1300 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 1000 300 1000 1 0 0
+{
+T 0 1000 5 10 0 0 0 0 1
+pintype=in
+T 355 995 5 10 1 1 0 0 1
+pinlabel=CH4
+T 205 1045 5 10 1 1 0 6 1
+pinnumber=5
+T 0 1000 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 700 300 700 1 0 0
+{
+T 0 700 5 10 0 0 0 0 1
+pintype=in
+T 355 695 5 10 1 1 0 0 1
+pinlabel=CH5
+T 205 745 5 10 1 1 0 6 1
+pinnumber=6
+T 0 700 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 400 300 400 1 0 0
+{
+T 0 400 5 10 0 0 0 0 1
+pintype=in
+T 355 395 5 10 1 1 0 0 1
+pinlabel=CH6
+T 205 445 5 10 1 1 0 6 1
+pinnumber=7
+T 0 400 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 100 300 100 1 0 0
+{
+T 0 100 5 10 0 0 0 0 1
+pintype=in
+T 355 95 5 10 1 1 0 0 1
+pinlabel=CH7
+T 205 145 5 10 1 1 0 6 1
+pinnumber=8
+T 0 100 5 10 0 0 0 0 1
+pinseq=0
+}
+T 3100 800 8 10 0 1 0 0 1
+footprint=SO16
+T 3000 900 8 10 0 1 0 0 1
+device=MCP3008-ISL
+T 3000 600 8 10 0 1 0 0 1
+description=microchip SPI ADC
+T 1100 2200 8 10 1 1 0 0 1
+refdes=U?
+T 1400 2700 8 10 0 1 0 0 1
+numslots=1
+T 700 2500 9 10 1 0 0 0 1
+MCP3008-ISL
diff --git a/bbb_cape/schematic/symbols/STM32F2-1.sym b/bbb_cape/schematic/symbols/STM32F2-1.sym
new file mode 100644
index 0000000..aee47d1
--- /dev/null
+++ b/bbb_cape/schematic/symbols/STM32F2-1.sym
@@ -0,0 +1,718 @@
+v 20110115 2
+B 300 0 2900 12700 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 3500 12500 3200 12500 1 0 0
+{
+T 3500 12500 5 10 0 0 0 0 1
+pintype=io
+T 3145 12495 5 10 1 1 0 6 1
+pinlabel=PA0
+T 3295 12545 5 10 1 1 0 0 1
+pinnumber=14
+T 3500 12500 5 10 0 0 0 0 1
+pinseq=1
+}
+P 3500 12100 3200 12100 1 0 0
+{
+T 3500 12100 5 10 0 0 0 0 1
+pintype=io
+T 3145 12095 5 10 1 1 0 6 1
+pinlabel=PA1
+T 3295 12145 5 10 1 1 0 0 1
+pinnumber=15
+T 3500 12100 5 10 0 0 0 0 1
+pinseq=2
+}
+P 3500 11700 3200 11700 1 0 0
+{
+T 3500 11700 5 10 0 0 0 0 1
+pintype=io
+T 3145 11695 5 10 1 1 0 6 1
+pinlabel=PA2
+T 3295 11745 5 10 1 1 0 0 1
+pinnumber=16
+T 3500 11700 5 10 0 0 0 0 1
+pinseq=3
+}
+P 3500 11300 3200 11300 1 0 0
+{
+T 3500 11300 5 10 0 0 0 0 1
+pintype=io
+T 3145 11295 5 10 1 1 0 6 1
+pinlabel=PA3
+T 3295 11345 5 10 1 1 0 0 1
+pinnumber=17
+T 3500 11300 5 10 0 0 0 0 1
+pinseq=4
+}
+P 3500 10900 3200 10900 1 0 0
+{
+T 3500 10900 5 10 0 0 0 0 1
+pintype=io
+T 3145 10895 5 10 1 1 0 6 1
+pinlabel=PA4
+T 3295 10945 5 10 1 1 0 0 1
+pinnumber=20
+T 3500 10900 5 10 0 0 0 0 1
+pinseq=5
+}
+P 3500 10500 3200 10500 1 0 0
+{
+T 3500 10500 5 10 0 0 0 0 1
+pintype=io
+T 3145 10495 5 10 1 1 0 6 1
+pinlabel=PA5
+T 3295 10545 5 10 1 1 0 0 1
+pinnumber=21
+T 3500 10500 5 10 0 0 0 0 1
+pinseq=6
+}
+P 3500 10100 3200 10100 1 0 0
+{
+T 3500 10100 5 10 0 0 0 0 1
+pintype=io
+T 3145 10095 5 10 1 1 0 6 1
+pinlabel=PA6
+T 3295 10145 5 10 1 1 0 0 1
+pinnumber=22
+T 3500 10100 5 10 0 0 0 0 1
+pinseq=7
+}
+P 3500 9700 3200 9700 1 0 0
+{
+T 3500 9700 5 10 0 0 0 0 1
+pintype=io
+T 3145 9695 5 10 1 1 0 6 1
+pinlabel=PA7
+T 3295 9745 5 10 1 1 0 0 1
+pinnumber=23
+T 3500 9700 5 10 0 0 0 0 1
+pinseq=8
+}
+P 3500 9300 3200 9300 1 0 0
+{
+T 3500 9300 5 10 0 0 0 0 1
+pintype=io
+T 3145 9295 5 10 1 1 0 6 1
+pinlabel=PA8
+T 3295 9345 5 10 1 1 0 0 1
+pinnumber=41
+T 3500 9300 5 10 0 0 0 0 1
+pinseq=9
+}
+P 3500 8900 3200 8900 1 0 0
+{
+T 3500 8900 5 10 0 0 0 0 1
+pintype=io
+T 3145 8895 5 10 1 1 0 6 1
+pinlabel=PA9
+T 3295 8945 5 10 1 1 0 0 1
+pinnumber=42
+T 3500 8900 5 10 0 0 0 0 1
+pinseq=10
+}
+P 3500 8500 3200 8500 1 0 0
+{
+T 3500 8500 5 10 0 0 0 0 1
+pintype=io
+T 3145 8495 5 10 1 1 0 6 1
+pinlabel=PA10
+T 3295 8545 5 10 1 1 0 0 1
+pinnumber=43
+T 3500 8500 5 10 0 0 0 0 1
+pinseq=11
+}
+P 3500 8100 3200 8100 1 0 0
+{
+T 3500 8100 5 10 0 0 0 0 1
+pintype=io
+T 3145 8095 5 10 1 1 0 6 1
+pinlabel=PA11
+T 3295 8145 5 10 1 1 0 0 1
+pinnumber=44
+T 3500 8100 5 10 0 0 0 0 1
+pinseq=12
+}
+P 3500 7700 3200 7700 1 0 0
+{
+T 3500 7700 5 10 0 0 0 0 1
+pintype=io
+T 3145 7695 5 10 1 1 0 6 1
+pinlabel=PA12
+T 3295 7745 5 10 1 1 0 0 1
+pinnumber=45
+T 3500 7700 5 10 0 0 0 0 1
+pinseq=13
+}
+P 3500 7300 3200 7300 1 0 0
+{
+T 3500 7300 5 10 0 0 0 0 1
+pintype=io
+T 3145 7295 5 10 1 1 0 6 1
+pinlabel=PA13
+T 3295 7345 5 10 1 1 0 0 1
+pinnumber=46
+T 3500 7300 5 10 0 0 0 0 1
+pinseq=14
+}
+P 3500 6900 3200 6900 1 0 0
+{
+T 3500 6900 5 10 0 0 0 0 1
+pintype=io
+T 3145 6895 5 10 1 1 0 6 1
+pinlabel=PA14
+T 3295 6945 5 10 1 1 0 0 1
+pinnumber=49
+T 3500 6900 5 10 0 0 0 0 1
+pinseq=15
+}
+P 3500 6500 3200 6500 1 0 0
+{
+T 3500 6500 5 10 0 0 0 0 1
+pintype=io
+T 3145 6495 5 10 1 1 0 6 1
+pinlabel=PA15
+T 3295 6545 5 10 1 1 0 0 1
+pinnumber=50
+T 3500 6500 5 10 0 0 0 0 1
+pinseq=16
+}
+P 3500 6100 3200 6100 1 0 0
+{
+T 3500 6100 5 10 0 0 0 0 1
+pintype=io
+T 3145 6095 5 10 1 1 0 6 1
+pinlabel=PB0
+T 3295 6145 5 10 1 1 0 0 1
+pinnumber=26
+T 3500 6100 5 10 0 0 0 0 1
+pinseq=17
+}
+P 3500 5700 3200 5700 1 0 0
+{
+T 3500 5700 5 10 0 0 0 0 1
+pintype=io
+T 3145 5695 5 10 1 1 0 6 1
+pinlabel=PB1
+T 3295 5745 5 10 1 1 0 0 1
+pinnumber=27
+T 3500 5700 5 10 0 0 0 0 1
+pinseq=18
+}
+P 3500 5300 3200 5300 1 0 0
+{
+T 3500 5300 5 10 0 0 0 0 1
+pintype=io
+T 3145 5295 5 10 1 1 0 6 1
+pinlabel=PB2
+T 3295 5345 5 10 1 1 0 0 1
+pinnumber=28
+T 3500 5300 5 10 0 0 0 0 1
+pinseq=19
+}
+P 3500 4900 3200 4900 1 0 0
+{
+T 3500 4900 5 10 0 0 0 0 1
+pintype=io
+T 3145 4895 5 10 1 1 0 6 1
+pinlabel=PB3
+T 3295 4945 5 10 1 1 0 0 1
+pinnumber=55
+T 3500 4900 5 10 0 0 0 0 1
+pinseq=20
+}
+P 3500 4500 3200 4500 1 0 0
+{
+T 3500 4500 5 10 0 0 0 0 1
+pintype=io
+T 3145 4495 5 10 1 1 0 6 1
+pinlabel=PB4
+T 3295 4545 5 10 1 1 0 0 1
+pinnumber=56
+T 3500 4500 5 10 0 0 0 0 1
+pinseq=21
+}
+P 3500 4100 3200 4100 1 0 0
+{
+T 3500 4100 5 10 0 0 0 0 1
+pintype=io
+T 3145 4095 5 10 1 1 0 6 1
+pinlabel=PB5
+T 3295 4145 5 10 1 1 0 0 1
+pinnumber=57
+T 3500 4100 5 10 0 0 0 0 1
+pinseq=22
+}
+P 3500 3700 3200 3700 1 0 0
+{
+T 3500 3700 5 10 0 0 0 0 1
+pintype=io
+T 3145 3695 5 10 1 1 0 6 1
+pinlabel=PB6
+T 3295 3745 5 10 1 1 0 0 1
+pinnumber=58
+T 3500 3700 5 10 0 0 0 0 1
+pinseq=23
+}
+P 3500 3300 3200 3300 1 0 0
+{
+T 3500 3300 5 10 0 0 0 0 1
+pintype=io
+T 3145 3295 5 10 1 1 0 6 1
+pinlabel=PB7
+T 3295 3345 5 10 1 1 0 0 1
+pinnumber=59
+T 3500 3300 5 10 0 0 0 0 1
+pinseq=24
+}
+P 3500 2900 3200 2900 1 0 0
+{
+T 3500 2900 5 10 0 0 0 0 1
+pintype=io
+T 3145 2895 5 10 1 1 0 6 1
+pinlabel=PB8
+T 3295 2945 5 10 1 1 0 0 1
+pinnumber=61
+T 3500 2900 5 10 0 0 0 0 1
+pinseq=25
+}
+P 3500 2500 3200 2500 1 0 0
+{
+T 3500 2500 5 10 0 0 0 0 1
+pintype=io
+T 3145 2495 5 10 1 1 0 6 1
+pinlabel=PB9
+T 3295 2545 5 10 1 1 0 0 1
+pinnumber=62
+T 3500 2500 5 10 0 0 0 0 1
+pinseq=26
+}
+P 3500 2100 3200 2100 1 0 0
+{
+T 3500 2100 5 10 0 0 0 0 1
+pintype=io
+T 3145 2095 5 10 1 1 0 6 1
+pinlabel=PB10
+T 3295 2145 5 10 1 1 0 0 1
+pinnumber=29
+T 3500 2100 5 10 0 0 0 0 1
+pinseq=27
+}
+P 3500 1700 3200 1700 1 0 0
+{
+T 3500 1700 5 10 0 0 0 0 1
+pintype=io
+T 3145 1695 5 10 1 1 0 6 1
+pinlabel=PB11
+T 3295 1745 5 10 1 1 0 0 1
+pinnumber=30
+T 3500 1700 5 10 0 0 0 0 1
+pinseq=28
+}
+P 3500 1300 3200 1300 1 0 0
+{
+T 3500 1300 5 10 0 0 0 0 1
+pintype=io
+T 3145 1295 5 10 1 1 0 6 1
+pinlabel=PB12
+T 3295 1345 5 10 1 1 0 0 1
+pinnumber=33
+T 3500 1300 5 10 0 0 0 0 1
+pinseq=29
+}
+P 3500 900 3200 900 1 0 0
+{
+T 3500 900 5 10 0 0 0 0 1
+pintype=io
+T 3145 895 5 10 1 1 0 6 1
+pinlabel=PB13
+T 3295 945 5 10 1 1 0 0 1
+pinnumber=34
+T 3500 900 5 10 0 0 0 0 1
+pinseq=30
+}
+P 3500 500 3200 500 1 0 0
+{
+T 3500 500 5 10 0 0 0 0 1
+pintype=io
+T 3145 495 5 10 1 1 0 6 1
+pinlabel=PB14
+T 3295 545 5 10 1 1 0 0 1
+pinnumber=35
+T 3500 500 5 10 0 0 0 0 1
+pinseq=31
+}
+P 3500 100 3200 100 1 0 0
+{
+T 3500 100 5 10 0 0 0 0 1
+pintype=io
+T 3145 95 5 10 1 1 0 6 1
+pinlabel=PB15
+T 3295 145 5 10 1 1 0 0 1
+pinnumber=36
+T 3500 100 5 10 0 0 0 0 1
+pinseq=32
+}
+P 0 12500 300 12500 1 0 0
+{
+T 0 12500 5 10 0 0 0 0 1
+pintype=io
+T 355 12495 5 10 1 1 0 0 1
+pinlabel=PC0
+T 205 12545 5 10 1 1 0 6 1
+pinnumber=8
+T 0 12500 5 10 0 0 0 0 1
+pinseq=33
+}
+P 0 12100 300 12100 1 0 0
+{
+T 0 12100 5 10 0 0 0 0 1
+pintype=io
+T 355 12095 5 10 1 1 0 0 1
+pinlabel=PC1
+T 205 12145 5 10 1 1 0 6 1
+pinnumber=9
+T 0 12100 5 10 0 0 0 0 1
+pinseq=34
+}
+P 0 11700 300 11700 1 0 0
+{
+T 0 11700 5 10 0 0 0 0 1
+pintype=io
+T 355 11695 5 10 1 1 0 0 1
+pinlabel=PC2
+T 205 11745 5 10 1 1 0 6 1
+pinnumber=10
+T 0 11700 5 10 0 0 0 0 1
+pinseq=35
+}
+P 0 11300 300 11300 1 0 0
+{
+T 0 11300 5 10 0 0 0 0 1
+pintype=io
+T 355 11295 5 10 1 1 0 0 1
+pinlabel=PC3
+T 205 11345 5 10 1 1 0 6 1
+pinnumber=11
+T 0 11300 5 10 0 0 0 0 1
+pinseq=36
+}
+P 0 10900 300 10900 1 0 0
+{
+T 0 10900 5 10 0 0 0 0 1
+pintype=io
+T 355 10895 5 10 1 1 0 0 1
+pinlabel=PC4
+T 205 10945 5 10 1 1 0 6 1
+pinnumber=24
+T 0 10900 5 10 0 0 0 0 1
+pinseq=37
+}
+P 0 10500 300 10500 1 0 0
+{
+T 0 10500 5 10 0 0 0 0 1
+pintype=io
+T 355 10495 5 10 1 1 0 0 1
+pinlabel=PC5
+T 205 10545 5 10 1 1 0 6 1
+pinnumber=25
+T 0 10500 5 10 0 0 0 0 1
+pinseq=38
+}
+P 0 10100 300 10100 1 0 0
+{
+T 0 10100 5 10 0 0 0 0 1
+pintype=io
+T 355 10095 5 10 1 1 0 0 1
+pinlabel=PC6
+T 205 10145 5 10 1 1 0 6 1
+pinnumber=37
+T 0 10100 5 10 0 0 0 0 1
+pinseq=39
+}
+P 0 9700 300 9700 1 0 0
+{
+T 0 9700 5 10 0 0 0 0 1
+pintype=io
+T 355 9695 5 10 1 1 0 0 1
+pinlabel=PC7
+T 205 9745 5 10 1 1 0 6 1
+pinnumber=38
+T 0 9700 5 10 0 0 0 0 1
+pinseq=40
+}
+P 0 9300 300 9300 1 0 0
+{
+T 0 9300 5 10 0 0 0 0 1
+pintype=io
+T 355 9295 5 10 1 1 0 0 1
+pinlabel=PC8
+T 205 9345 5 10 1 1 0 6 1
+pinnumber=39
+T 0 9300 5 10 0 0 0 0 1
+pinseq=41
+}
+P 0 8900 300 8900 1 0 0
+{
+T 0 8900 5 10 0 0 0 0 1
+pintype=io
+T 355 8895 5 10 1 1 0 0 1
+pinlabel=PC9
+T 205 8945 5 10 1 1 0 6 1
+pinnumber=40
+T 0 8900 5 10 0 0 0 0 1
+pinseq=42
+}
+P 0 8500 300 8500 1 0 0
+{
+T 0 8500 5 10 0 0 0 0 1
+pintype=io
+T 355 8495 5 10 1 1 0 0 1
+pinlabel=PC10
+T 205 8545 5 10 1 1 0 6 1
+pinnumber=51
+T 0 8500 5 10 0 0 0 0 1
+pinseq=43
+}
+P 0 8100 300 8100 1 0 0
+{
+T 0 8100 5 10 0 0 0 0 1
+pintype=io
+T 355 8095 5 10 1 1 0 0 1
+pinlabel=PC11
+T 205 8145 5 10 1 1 0 6 1
+pinnumber=52
+T 0 8100 5 10 0 0 0 0 1
+pinseq=44
+}
+P 0 7700 300 7700 1 0 0
+{
+T 0 7700 5 10 0 0 0 0 1
+pintype=io
+T 355 7695 5 10 1 1 0 0 1
+pinlabel=PC12
+T 205 7745 5 10 1 1 0 6 1
+pinnumber=53
+T 0 7700 5 10 0 0 0 0 1
+pinseq=45
+}
+P 0 7300 300 7300 1 0 0
+{
+T 0 7300 5 10 0 0 0 0 1
+pintype=io
+T 355 7295 5 10 1 1 0 0 1
+pinlabel=PC13
+T 205 7345 5 10 1 1 0 6 1
+pinnumber=2
+T 0 7300 5 10 0 0 0 0 1
+pinseq=46
+}
+P 0 6900 300 6900 1 0 0
+{
+T 0 6900 5 10 0 0 0 0 1
+pintype=io
+T 355 6895 5 10 1 1 0 0 1
+pinlabel=PC14
+T 205 6945 5 10 1 1 0 6 1
+pinnumber=3
+T 0 6900 5 10 0 0 0 0 1
+pinseq=47
+}
+P 0 6500 300 6500 1 0 0
+{
+T 0 6500 5 10 0 0 0 0 1
+pintype=io
+T 355 6495 5 10 1 1 0 0 1
+pinlabel=PC15
+T 205 6545 5 10 1 1 0 6 1
+pinnumber=4
+T 0 6500 5 10 0 0 0 0 1
+pinseq=48
+}
+P 0 6100 300 6100 1 0 0
+{
+T 0 6100 5 10 0 0 0 0 1
+pintype=io
+T 355 6095 5 10 1 1 0 0 1
+pinlabel=PD2
+T 205 6145 5 10 1 1 0 6 1
+pinnumber=54
+T 0 6100 5 10 0 0 0 0 1
+pinseq=49
+}
+P 0 5700 300 5700 1 0 0
+{
+T 0 5700 5 10 0 0 0 0 1
+pintype=in
+T 355 5695 5 10 1 1 0 0 1
+pinlabel=OSC in
+T 205 5745 5 10 1 1 0 6 1
+pinnumber=5
+T 0 5700 5 10 0 0 0 0 1
+pinseq=50
+}
+P 0 5300 300 5300 1 0 0
+{
+T 0 5300 5 10 0 0 0 0 1
+pintype=out
+T 355 5295 5 10 1 1 0 0 1
+pinlabel=OSC out
+T 205 5345 5 10 1 1 0 6 1
+pinnumber=6
+T 0 5300 5 10 0 0 0 0 1
+pinseq=51
+}
+P 0 4900 300 4900 1 0 0
+{
+T 0 4900 5 10 0 0 0 0 1
+pintype=in
+T 355 4895 5 10 1 1 0 0 1
+pinlabel=\_RST\_
+T 205 4945 5 10 1 1 0 6 1
+pinnumber=7
+T 0 4900 5 10 0 0 0 0 1
+pinseq=52
+}
+P 0 4500 300 4500 1 0 0
+{
+T 0 4500 5 10 0 0 0 0 1
+pintype=in
+T 355 4495 5 10 1 1 0 0 1
+pinlabel=BOOT0
+T 205 4545 5 10 1 1 0 6 1
+pinnumber=60
+T 0 4500 5 10 0 0 0 0 1
+pinseq=53
+}
+P 0 4100 300 4100 1 0 0
+{
+T 0 4100 5 10 0 0 0 0 1
+pintype=pas
+T 355 4095 5 10 1 1 0 0 1
+pinlabel=VCAP 1
+T 205 4145 5 10 1 1 0 6 1
+pinnumber=31
+T 0 4100 5 10 0 0 0 0 1
+pinseq=54
+}
+P 0 3700 300 3700 1 0 0
+{
+T 0 3700 5 10 0 0 0 0 1
+pintype=pas
+T 355 3695 5 10 1 1 0 0 1
+pinlabel=VCAP 2
+T 205 3745 5 10 1 1 0 6 1
+pinnumber=47
+T 0 3700 5 10 0 0 0 0 1
+pinseq=55
+}
+P 0 3300 300 3300 1 0 0
+{
+T 0 3300 5 10 0 0 0 0 1
+pintype=pwr
+T 355 3295 5 10 1 1 0 0 1
+pinlabel=VBAT
+T 205 3345 5 10 1 1 0 6 1
+pinnumber=1
+T 0 3300 5 10 0 0 0 0 1
+pinseq=56
+}
+P 0 2900 300 2900 1 0 0
+{
+T 0 2900 5 10 0 0 0 0 1
+pintype=pwr
+T 355 2895 5 10 1 1 0 0 1
+pinlabel=VDD 1
+T 205 2945 5 10 1 1 0 6 1
+pinnumber=32
+T 0 2900 5 10 0 0 0 0 1
+pinseq=57
+}
+P 0 2500 300 2500 1 0 0
+{
+T 0 2500 5 10 0 0 0 0 1
+pintype=pwr
+T 355 2495 5 10 1 1 0 0 1
+pinlabel=VDD 2
+T 205 2545 5 10 1 1 0 6 1
+pinnumber=48
+T 0 2500 5 10 0 0 0 0 1
+pinseq=58
+}
+P 0 2100 300 2100 1 0 0
+{
+T 0 2100 5 10 0 0 0 0 1
+pintype=pwr
+T 355 2095 5 10 1 1 0 0 1
+pinlabel=VDD 4
+T 205 2145 5 10 1 1 0 6 1
+pinnumber=19
+T 0 2100 5 10 0 0 0 0 1
+pinseq=59
+}
+P 0 1700 300 1700 1 0 0
+{
+T 0 1700 5 10 0 0 0 0 1
+pintype=pwr
+T 355 1695 5 10 1 1 0 0 1
+pinlabel=VDD 3
+T 205 1745 5 10 1 1 0 6 1
+pinnumber=64
+T 0 1700 5 10 0 0 0 0 1
+pinseq=60
+}
+P 0 1300 300 1300 1 0 0
+{
+T 0 1300 5 10 0 0 0 0 1
+pintype=pwr
+T 355 1295 5 10 1 1 0 0 1
+pinlabel=VSS 3
+T 205 1345 5 10 1 1 0 6 1
+pinnumber=63
+T 0 1300 5 10 0 0 0 0 1
+pinseq=61
+}
+P 0 900 300 900 1 0 0
+{
+T 0 900 5 10 0 0 0 0 1
+pintype=pwr
+T 355 895 5 10 1 1 0 0 1
+pinlabel=VSS 4
+T 205 945 5 10 1 1 0 6 1
+pinnumber=18
+T 0 900 5 10 0 0 0 0 1
+pinseq=62
+}
+P 0 500 300 500 1 0 0
+{
+T 0 500 5 10 0 0 0 0 1
+pintype=pwr
+T 355 495 5 10 1 1 0 0 1
+pinlabel=VDD analog
+T 205 545 5 10 1 1 0 6 1
+pinnumber=13
+T 0 500 5 10 0 0 0 0 1
+pinseq=63
+}
+P 0 100 300 100 1 0 0
+{
+T 0 100 5 10 0 0 0 0 1
+pintype=pwr
+T 355 95 5 10 1 1 0 0 1
+pinlabel=VSS analog
+T 205 145 5 10 1 1 0 6 1
+pinnumber=12
+T 0 100 5 10 0 0 0 0 1
+pinseq=64
+}
+T 13100 11700 8 10 0 1 0 0 1
+device=STM32F2
+T 13100 11700 8 10 0 1 0 0 1
+description=STM32F2 (or STM32F4)
+T 10400 12900 8 10 0 1 0 0 1
+footprint=LQFP64_10
+T 1700 12100 8 10 1 1 0 0 1
+refdes=U?
+T 16000 7300 8 10 0 1 0 0 1
+numslots=0
+T 1400 12400 9 10 1 0 0 0 1
+STM32F2
diff --git a/bbb_cape/schematic/symbols/TC1262-1.sym b/bbb_cape/schematic/symbols/TC1262-1.sym
new file mode 100644
index 0000000..1cdbc5c
--- /dev/null
+++ b/bbb_cape/schematic/symbols/TC1262-1.sym
@@ -0,0 +1,58 @@
+v 20110115 2
+T -8000 4300 8 10 0 1 0 0 1
+footprint=SOT223
+B 300 0 1500 700 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 500 300 500 1 0 0
+{
+T 0 500 5 10 0 0 0 0 1
+pintype=pwr
+T 355 495 5 10 1 1 0 0 1
+pinlabel=VIN
+T 205 545 5 10 1 1 0 6 1
+pinnumber=1
+T 0 500 5 10 0 0 0 0 1
+pinseq=1
+}
+P 0 200 300 200 1 0 0
+{
+T 0 200 5 10 0 0 0 0 1
+pintype=pwr
+T 355 195 5 10 1 1 0 0 1
+pinlabel=VOUT
+T 205 245 5 10 1 1 0 6 1
+pinnumber=3
+T 0 200 5 10 0 0 0 0 1
+pinseq=2
+}
+P 2100 500 1800 500 1 0 0
+{
+T 2100 500 5 10 0 0 0 0 1
+pintype=pwr
+T 1745 495 5 10 1 1 0 6 1
+pinlabel=GND
+T 1895 545 5 10 1 1 0 0 1
+pinnumber=2
+T 2100 500 5 10 0 0 0 0 1
+pinseq=3
+}
+P 2100 200 1800 200 1 0 0
+{
+T 2100 200 5 10 0 0 0 0 1
+pintype=pwr
+T 1745 195 5 10 1 1 0 6 1
+pinlabel=PAD
+T 1895 245 5 10 1 1 0 0 1
+pinnumber=4
+T 2100 200 5 10 0 0 0 0 1
+pinseq=4
+}
+T 1500 900 8 10 0 1 0 0 1
+device=TC1262
+T 1500 900 8 10 0 1 0 0 1
+description=500mA Fixed Output CMOS LDO
+T 1400 800 8 10 1 1 0 0 1
+refdes=U?
+T 1900 1000 8 10 0 1 0 0 1
+numslots=1
+T 500 800 9 10 1 0 0 0 1
+TC1262
diff --git a/bbb_cape/schematic/symbols/adc_buffer-1.sym b/bbb_cape/schematic/symbols/adc_buffer-1.sym
new file mode 100644
index 0000000..d23bea0
--- /dev/null
+++ b/bbb_cape/schematic/symbols/adc_buffer-1.sym
@@ -0,0 +1,124 @@
+v 20110115 2
+B 400 0 1700 1300 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1100 400 1100 1 0 0
+{
+T 0 1100 5 10 0 0 0 0 1
+pintype=in
+T 455 1095 5 10 1 1 0 0 1
+pinlabel=IN1
+T 305 1145 5 10 0 1 0 6 1
+pinnumber=IN1
+T 0 1100 5 10 0 0 0 0 1
+pinseq=1
+}
+P 0 800 400 800 1 0 0
+{
+T 0 800 5 10 0 0 0 0 1
+pintype=in
+T 455 795 5 10 1 1 0 0 1
+pinlabel=IN2
+T 305 845 5 10 0 1 0 6 1
+pinnumber=IN2
+T 0 800 5 10 0 0 0 0 1
+pinseq=2
+}
+P 0 500 400 500 1 0 0
+{
+T 0 500 5 10 0 0 0 0 1
+pintype=in
+T 455 495 5 10 1 1 0 0 1
+pinlabel=IN3
+T 305 545 5 10 0 1 0 6 1
+pinnumber=IN3
+T 0 500 5 10 0 0 0 0 1
+pinseq=3
+}
+P 0 200 400 200 1 0 0
+{
+T 0 200 5 10 0 0 0 0 1
+pintype=in
+T 455 195 5 10 1 1 0 0 1
+pinlabel=IN4
+T 305 245 5 10 0 1 0 6 1
+pinnumber=IN4
+T 0 200 5 10 0 0 0 0 1
+pinseq=4
+}
+P 1100 1600 1100 1300 1 0 0
+{
+T 1100 1600 5 10 0 0 0 0 1
+pintype=pwr
+T 1100 1245 5 10 1 1 90 6 1
+pinlabel=GND
+T 1050 1395 5 10 0 1 90 0 1
+pinnumber=GND
+T 1100 1600 5 10 0 0 0 0 1
+pinseq=5
+}
+P 1400 1600 1400 1300 1 0 0
+{
+T 1400 1600 5 10 0 0 0 0 1
+pintype=pwr
+T 1400 1245 5 10 1 1 90 6 1
+pinlabel=VCC
+T 1350 1395 5 10 0 1 90 0 1
+pinnumber=VCC
+T 1400 1600 5 10 0 0 0 0 1
+pinseq=0
+}
+P 2400 1100 2100 1100 1 0 0
+{
+T 2400 1100 5 10 0 0 0 0 1
+pintype=out
+T 2045 1095 5 10 1 1 0 6 1
+pinlabel=OUT1
+T 2195 1145 5 10 0 1 0 0 1
+pinnumber=OUT1
+T 2400 1100 5 10 0 0 0 0 1
+pinseq=7
+}
+P 2400 800 2100 800 1 0 0
+{
+T 2400 800 5 10 0 0 0 0 1
+pintype=out
+T 2045 795 5 10 1 1 0 6 1
+pinlabel=OUT2
+T 2195 845 5 10 0 1 0 0 1
+pinnumber=OUT2
+T 2400 800 5 10 0 0 0 0 1
+pinseq=8
+}
+P 2400 500 2100 500 1 0 0
+{
+T 2400 500 5 10 0 0 0 0 1
+pintype=out
+T 2045 495 5 10 1 1 0 6 1
+pinlabel=OUT3
+T 2195 545 5 10 0 1 0 0 1
+pinnumber=OUT3
+T 2400 500 5 10 0 0 0 0 1
+pinseq=9
+}
+P 2400 200 2100 200 1 0 0
+{
+T 2400 200 5 10 0 0 0 0 1
+pintype=out
+T 2045 195 5 10 1 1 0 6 1
+pinlabel=OUT4
+T 2195 245 5 10 0 1 0 0 1
+pinnumber=OUT4
+T 2400 200 5 10 0 0 0 0 1
+pinseq=10
+}
+T 2700 1500 8 10 0 1 0 0 1
+device=ADC buffer
+T 900 1900 8 10 0 1 0 0 1
+description=buffer for voltage clamping ADC inputs
+T 1200 1900 8 10 0 1 0 0 1
+source=adc_buffer.sch
+T 1700 1400 8 10 1 1 0 0 1
+refdes=X?
+T 1400 1900 8 10 0 1 0 0 1
+numslots=1
+T 100 1400 9 10 1 0 0 0 1
+ADC buffer
diff --git a/bbb_cape/schematic/symbols/beaglebone-1.sym b/bbb_cape/schematic/symbols/beaglebone-1.sym
new file mode 100644
index 0000000..c2f9a56
--- /dev/null
+++ b/bbb_cape/schematic/symbols/beaglebone-1.sym
@@ -0,0 +1,1030 @@
+v 20110115 2
+P 8700 18500 8400 18500 1 0 0
+{
+T 8500 18550 5 8 1 1 0 0 1
+pinnumber=1
+T 8500 18450 5 8 0 1 0 2 1
+pinseq=1
+T 8350 18500 9 8 1 1 0 6 1
+pinlabel=GND
+T 8350 18500 5 8 0 1 0 8 1
+pintype=pwr
+}
+P 8700 18100 8400 18100 1 0 0
+{
+T 8500 18150 5 8 1 1 0 0 1
+pinnumber=2
+T 8500 18050 5 8 0 1 0 2 1
+pinseq=2
+T 8350 18100 9 8 1 1 0 6 1
+pinlabel=GND
+T 8350 18100 5 8 0 1 0 8 1
+pintype=pwr
+}
+P 8700 17700 8400 17700 1 0 0
+{
+T 8500 17750 5 8 1 1 0 0 1
+pinnumber=3
+T 8500 17650 5 8 0 1 0 2 1
+pinseq=3
+T 8350 17700 9 8 1 1 0 6 1
+pinlabel=(R9) GPIO1_6
+T 8350 17700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 17300 8400 17300 1 0 0
+{
+T 8500 17350 5 8 1 1 0 0 1
+pinnumber=4
+T 8500 17250 5 8 0 1 0 2 1
+pinseq=4
+T 8350 17300 9 8 1 1 0 6 1
+pinlabel=(T9) GPIO1_7
+T 8350 17300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 16900 8400 16900 1 0 0
+{
+T 8500 16950 5 8 1 1 0 0 1
+pinnumber=5
+T 8500 16850 5 8 0 1 0 2 1
+pinseq=5
+T 8350 16900 9 8 1 1 0 6 1
+pinlabel=(R8) GPIO1_2
+T 8350 16900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 16500 8400 16500 1 0 0
+{
+T 8500 16550 5 8 1 1 0 0 1
+pinnumber=6
+T 8500 16450 5 8 0 1 0 2 1
+pinseq=6
+T 8350 16500 9 8 1 1 0 6 1
+pinlabel=(T8) GPIO1_3
+T 8350 16500 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 16100 8400 16100 1 0 0
+{
+T 8500 16150 5 8 1 1 0 0 1
+pinnumber=7
+T 8500 16050 5 8 0 1 0 2 1
+pinseq=7
+T 8350 16100 9 8 1 1 0 6 1
+pinlabel=(R7) TIMER4
+T 8350 16100 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 15700 8400 15700 1 0 0
+{
+T 8500 15750 5 8 1 1 0 0 1
+pinnumber=8
+T 8500 15650 5 8 0 1 0 2 1
+pinseq=8
+T 8350 15700 9 8 1 1 0 6 1
+pinlabel=(T7) TIMER7
+T 8350 15700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 15300 8400 15300 1 0 0
+{
+T 8500 15350 5 8 1 1 0 0 1
+pinnumber=9
+T 8500 15250 5 8 0 1 0 2 1
+pinseq=9
+T 8350 15300 9 8 1 1 0 6 1
+pinlabel=(T6) TIMER5
+T 8350 15300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 14900 8400 14900 1 0 0
+{
+T 8500 14950 5 8 1 1 0 0 1
+pinnumber=10
+T 8500 14850 5 8 0 1 0 2 1
+pinseq=10
+T 8350 14900 9 8 1 1 0 6 1
+pinlabel=(U6) TIMER6
+T 8350 14900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 14500 8400 14500 1 0 0
+{
+T 8500 14550 5 8 1 1 0 0 1
+pinnumber=11
+T 8500 14450 5 8 0 1 0 2 1
+pinseq=11
+T 8350 14500 9 8 1 1 0 6 1
+pinlabel=(R12) GPIO1_13
+T 8350 14500 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 14100 8400 14100 1 0 0
+{
+T 8500 14150 5 8 1 1 0 0 1
+pinnumber=12
+T 8500 14050 5 8 0 1 0 2 1
+pinseq=12
+T 8350 14100 9 8 1 1 0 6 1
+pinlabel=(T12) GPIO1_12
+T 8350 14100 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 13700 8400 13700 1 0 0
+{
+T 8500 13750 5 8 1 1 0 0 1
+pinnumber=13
+T 8500 13650 5 8 0 1 0 2 1
+pinseq=13
+T 8350 13700 9 8 1 1 0 6 1
+pinlabel=(T10) EHRPWM2B
+T 8350 13700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 13300 8400 13300 1 0 0
+{
+T 8500 13350 5 8 1 1 0 0 1
+pinnumber=14
+T 8500 13250 5 8 0 1 0 2 1
+pinseq=14
+T 8350 13300 9 8 1 1 0 6 1
+pinlabel=(T11) GPIO0_26
+T 8350 13300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 12900 8400 12900 1 0 0
+{
+T 8500 12950 5 8 1 1 0 0 1
+pinnumber=15
+T 8500 12850 5 8 0 1 0 2 1
+pinseq=15
+T 8350 12900 9 8 1 1 0 6 1
+pinlabel=(U13) GPIO1_15
+T 8350 12900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 12500 8400 12500 1 0 0
+{
+T 8500 12550 5 8 1 1 0 0 1
+pinnumber=16
+T 8500 12450 5 8 0 1 0 2 1
+pinseq=16
+T 8350 12500 9 8 1 1 0 6 1
+pinlabel=(V13) GPIO1_14
+T 8350 12500 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 12100 8400 12100 1 0 0
+{
+T 8500 12150 5 8 1 1 0 0 1
+pinnumber=17
+T 8500 12050 5 8 0 1 0 2 1
+pinseq=17
+T 8350 12100 9 8 1 1 0 6 1
+pinlabel=(U12) GPIO0_27
+T 8350 12100 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 11700 8400 11700 1 0 0
+{
+T 8500 11750 5 8 1 1 0 0 1
+pinnumber=18
+T 8500 11650 5 8 0 1 0 2 1
+pinseq=18
+T 8350 11700 9 8 1 1 0 6 1
+pinlabel=(V12) GPIO2_1
+T 8350 11700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 11300 8400 11300 1 0 0
+{
+T 8500 11350 5 8 1 1 0 0 1
+pinnumber=19
+T 8500 11250 5 8 0 1 0 2 1
+pinseq=19
+T 8350 11300 9 8 1 1 0 6 1
+pinlabel=(U10) EHRPWM2A
+T 8350 11300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 10900 8400 10900 1 0 0
+{
+T 8500 10950 5 8 1 1 0 0 1
+pinnumber=20
+T 8500 10850 5 8 0 1 0 2 1
+pinseq=20
+T 8350 10900 9 8 1 1 0 6 1
+pinlabel=(V9) GPIO1_31
+T 8350 10900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 10500 8400 10500 1 0 0
+{
+T 8500 10550 5 8 1 1 0 0 1
+pinnumber=21
+T 8500 10450 5 8 0 1 0 2 1
+pinseq=21
+T 8350 10500 9 8 1 1 0 6 1
+pinlabel=(U9) GPIO1_30
+T 8350 10500 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 10100 8400 10100 1 0 0
+{
+T 8500 10150 5 8 1 1 0 0 1
+pinnumber=22
+T 8500 10050 5 8 0 1 0 2 1
+pinseq=22
+T 8350 10100 9 8 1 1 0 6 1
+pinlabel=(V8) GPIO1_5
+T 8350 10100 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 9700 8400 9700 1 0 0
+{
+T 8500 9750 5 8 1 1 0 0 1
+pinnumber=23
+T 8500 9650 5 8 0 1 0 2 1
+pinseq=23
+T 8350 9700 9 8 1 1 0 6 1
+pinlabel=(U8) GPIO1_4
+T 8350 9700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 9300 8400 9300 1 0 0
+{
+T 8500 9350 5 8 1 1 0 0 1
+pinnumber=24
+T 8500 9250 5 8 0 1 0 2 1
+pinseq=24
+T 8350 9300 9 8 1 1 0 6 1
+pinlabel=(V7) GPIO1_1
+T 8350 9300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 8900 8400 8900 1 0 0
+{
+T 8500 8950 5 8 1 1 0 0 1
+pinnumber=25
+T 8500 8850 5 8 0 1 0 2 1
+pinseq=25
+T 8350 8900 9 8 1 1 0 6 1
+pinlabel=(U7) GPIO1_0
+T 8350 8900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 8500 8400 8500 1 0 0
+{
+T 8500 8550 5 8 1 1 0 0 1
+pinnumber=26
+T 8500 8450 5 8 0 1 0 2 1
+pinseq=26
+T 8350 8500 9 8 1 1 0 6 1
+pinlabel=(V6) GPIO1_29
+T 8350 8500 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 8100 8400 8100 1 0 0
+{
+T 8500 8150 5 8 1 1 0 0 1
+pinnumber=27
+T 8500 8050 5 8 0 1 0 2 1
+pinseq=27
+T 8350 8100 9 8 1 1 0 6 1
+pinlabel=(U5) GPIO2_22
+T 8350 8100 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 7700 8400 7700 1 0 0
+{
+T 8500 7750 5 8 1 1 0 0 1
+pinnumber=28
+T 8500 7650 5 8 0 1 0 2 1
+pinseq=28
+T 8350 7700 9 8 1 1 0 6 1
+pinlabel=(V5) GPIO2_24
+T 8350 7700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 7300 8400 7300 1 0 0
+{
+T 8500 7350 5 8 1 1 0 0 1
+pinnumber=29
+T 8500 7250 5 8 0 1 0 2 1
+pinseq=29
+T 8350 7300 9 8 1 1 0 6 1
+pinlabel=(R5) GPIO2_23
+T 8350 7300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 6900 8400 6900 1 0 0
+{
+T 8500 6950 5 8 1 1 0 0 1
+pinnumber=30
+T 8500 6850 5 8 0 1 0 2 1
+pinseq=30
+T 8350 6900 9 8 1 1 0 6 1
+pinlabel=(R6) GPIO2_25
+T 8350 6900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 6500 8400 6500 1 0 0
+{
+T 8500 6550 5 8 1 1 0 0 1
+pinnumber=31
+T 8500 6450 5 8 0 1 0 2 1
+pinseq=31
+T 8350 6500 9 8 1 1 0 6 1
+pinlabel=(V4) UART5_CTSN
+T 8350 6500 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 6100 8400 6100 1 0 0
+{
+T 8500 6150 5 8 1 1 0 0 1
+pinnumber=32
+T 8500 6050 5 8 0 1 0 2 1
+pinseq=32
+T 8350 6100 9 8 1 1 0 6 1
+pinlabel=(T5) UART5_RTSN
+T 8350 6100 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 5700 8400 5700 1 0 0
+{
+T 8500 5750 5 8 1 1 0 0 1
+pinnumber=33
+T 8500 5650 5 8 0 1 0 2 1
+pinseq=33
+T 8350 5700 9 8 1 1 0 6 1
+pinlabel=(V3) UART4_RTSN
+T 8350 5700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 5300 8400 5300 1 0 0
+{
+T 8500 5350 5 8 1 1 0 0 1
+pinnumber=34
+T 8500 5250 5 8 0 1 0 2 1
+pinseq=34
+T 8350 5300 9 8 1 1 0 6 1
+pinlabel=(U4) UART3_RTSN
+T 8350 5300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 4900 8400 4900 1 0 0
+{
+T 8500 4950 5 8 1 1 0 0 1
+pinnumber=35
+T 8500 4850 5 8 0 1 0 2 1
+pinseq=35
+T 8350 4900 9 8 1 1 0 6 1
+pinlabel=(V2) UART4_CTSN
+T 8350 4900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 4500 8400 4500 1 0 0
+{
+T 8500 4550 5 8 1 1 0 0 1
+pinnumber=36
+T 8500 4450 5 8 0 1 0 2 1
+pinseq=36
+T 8350 4500 9 8 1 1 0 6 1
+pinlabel=(U3) UART3_CTSN
+T 8350 4500 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 4100 8400 4100 1 0 0
+{
+T 8500 4150 5 8 1 1 0 0 1
+pinnumber=37
+T 8500 4050 5 8 0 1 0 2 1
+pinseq=37
+T 8350 4100 9 8 1 1 0 6 1
+pinlabel=(U1) UART5_TXD
+T 8350 4100 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 3700 8400 3700 1 0 0
+{
+T 8500 3750 5 8 1 1 0 0 1
+pinnumber=38
+T 8500 3650 5 8 0 1 0 2 1
+pinseq=38
+T 8350 3700 9 8 1 1 0 6 1
+pinlabel=(U2) UART5_RXD
+T 8350 3700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 3300 8400 3300 1 0 0
+{
+T 8500 3350 5 8 1 1 0 0 1
+pinnumber=39
+T 8500 3250 5 8 0 1 0 2 1
+pinseq=39
+T 8350 3300 9 8 1 1 0 6 1
+pinlabel=(T3) GPIO2_12
+T 8350 3300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 2900 8400 2900 1 0 0
+{
+T 8500 2950 5 8 1 1 0 0 1
+pinnumber=40
+T 8500 2850 5 8 0 1 0 2 1
+pinseq=40
+T 8350 2900 9 8 1 1 0 6 1
+pinlabel=(T4) GPIO2_13
+T 8350 2900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 2500 8400 2500 1 0 0
+{
+T 8500 2550 5 8 1 1 0 0 1
+pinnumber=41
+T 8500 2450 5 8 0 1 0 2 1
+pinseq=41
+T 8350 2500 9 8 1 1 0 6 1
+pinlabel=(T1) GPIO2_10
+T 8350 2500 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 2100 8400 2100 1 0 0
+{
+T 8500 2150 5 8 1 1 0 0 1
+pinnumber=42
+T 8500 2050 5 8 0 1 0 2 1
+pinseq=42
+T 8350 2100 9 8 1 1 0 6 1
+pinlabel=(T2) GPIO2_11
+T 8350 2100 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 1700 8400 1700 1 0 0
+{
+T 8500 1750 5 8 1 1 0 0 1
+pinnumber=43
+T 8500 1650 5 8 0 1 0 2 1
+pinseq=43
+T 8350 1700 9 8 1 1 0 6 1
+pinlabel=(R3) GPIO2_8
+T 8350 1700 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 1300 8400 1300 1 0 0
+{
+T 8500 1350 5 8 1 1 0 0 1
+pinnumber=44
+T 8500 1250 5 8 0 1 0 2 1
+pinseq=44
+T 8350 1300 9 8 1 1 0 6 1
+pinlabel=(R4) GPIO2_9
+T 8350 1300 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 900 8400 900 1 0 0
+{
+T 8500 950 5 8 1 1 0 0 1
+pinnumber=45
+T 8500 850 5 8 0 1 0 2 1
+pinseq=45
+T 8350 900 9 8 1 1 0 6 1
+pinlabel=(R1) GPIO2_6
+T 8350 900 5 8 0 1 0 8 1
+pintype=io
+}
+P 8700 500 8400 500 1 0 0
+{
+T 8500 550 5 8 1 1 0 0 1
+pinnumber=46
+T 8500 450 5 8 0 1 0 2 1
+pinseq=46
+T 8350 500 9 8 1 1 0 6 1
+pinlabel=(R2) GPIO2_7
+T 8350 500 5 8 0 1 0 8 1
+pintype=io
+}
+P 100 18500 400 18500 1 0 0
+{
+T 300 18550 5 8 1 1 0 6 1
+pinnumber=47
+T 300 18450 5 8 0 1 0 8 1
+pinseq=1
+T 450 18500 9 8 1 1 0 0 1
+pinlabel=(1) GND
+T 450 18500 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 100 18100 400 18100 1 0 0
+{
+T 300 18150 5 8 1 1 0 6 1
+pinnumber=48
+T 300 18050 5 8 0 1 0 8 1
+pinseq=2
+T 450 18100 9 8 1 1 0 0 1
+pinlabel=(2) GND
+T 450 18100 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 100 17700 400 17700 1 0 0
+{
+T 300 17750 5 8 1 1 0 6 1
+pinnumber=49
+T 300 17650 5 8 0 1 0 8 1
+pinseq=3
+T 450 17700 9 8 1 1 0 0 1
+pinlabel=(3) DC_3.3V
+T 450 17700 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 100 17300 400 17300 1 0 0
+{
+T 300 17350 5 8 1 1 0 6 1
+pinnumber=50
+T 300 17250 5 8 0 1 0 8 1
+pinseq=4
+T 450 17300 9 8 1 1 0 0 1
+pinlabel=(4) DC_3.3V
+T 450 17300 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 100 16900 400 16900 1 0 0
+{
+T 300 16950 5 8 1 1 0 6 1
+pinnumber=51
+T 300 16850 5 8 0 1 0 8 1
+pinseq=5
+T 450 16900 9 8 1 1 0 0 1
+pinlabel=(5) VDD_5V
+T 450 16900 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 100 16500 400 16500 1 0 0
+{
+T 300 16550 5 8 1 1 0 6 1
+pinnumber=52
+T 300 16450 5 8 0 1 0 8 1
+pinseq=6
+T 450 16500 9 8 1 1 0 0 1
+pinlabel=(6) VDD_5V
+T 450 16500 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 100 16100 400 16100 1 0 0
+{
+T 300 16150 5 8 1 1 0 6 1
+pinnumber=53
+T 300 16050 5 8 0 1 0 8 1
+pinseq=7
+T 450 16100 9 8 1 1 0 0 1
+pinlabel=(7) SYS_5V
+T 450 16100 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 100 15700 400 15700 1 0 0
+{
+T 300 15750 5 8 1 1 0 6 1
+pinnumber=54
+T 300 15650 5 8 0 1 0 8 1
+pinseq=8
+T 450 15700 9 8 1 1 0 0 1
+pinlabel=(8) SYS_5V
+T 450 15700 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 100 15300 400 15300 1 0 0
+{
+T 300 15350 5 8 1 1 0 6 1
+pinnumber=55
+T 300 15250 5 8 0 1 0 8 1
+pinseq=9
+T 450 15300 9 8 1 1 0 0 1
+pinlabel=(9) PWR_BUT
+T 450 15300 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 14900 400 14900 1 0 0
+{
+T 300 14950 5 8 1 1 0 6 1
+pinnumber=56
+T 300 14850 5 8 0 1 0 8 1
+pinseq=10
+T 450 14900 9 8 1 1 0 0 1
+pinlabel=(10) SYS_RESETn (A10)
+T 450 14900 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 14500 400 14500 1 0 0
+{
+T 300 14550 5 8 1 1 0 6 1
+pinnumber=57
+T 300 14450 5 8 0 1 0 8 1
+pinseq=57
+T 450 14500 9 8 1 1 0 0 1
+pinlabel=(11) UART4_RXD (T17)
+T 450 14500 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 14100 400 14100 1 0 0
+{
+T 300 14150 5 8 1 1 0 6 1
+pinnumber=58
+T 300 14050 5 8 0 1 0 8 1
+pinseq=58
+T 450 14100 9 8 1 1 0 0 1
+pinlabel=(12) GPIO1_28 (U18)
+T 450 14100 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 13700 400 13700 1 0 0
+{
+T 300 13750 5 8 1 1 0 6 1
+pinnumber=59
+T 300 13650 5 8 0 1 0 8 1
+pinseq=59
+T 450 13700 9 8 1 1 0 0 1
+pinlabel=(13) UART4_TXD (U17)
+T 450 13700 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 13300 400 13300 1 0 0
+{
+T 300 13350 5 8 1 1 0 6 1
+pinnumber=60
+T 300 13250 5 8 0 1 0 8 1
+pinseq=60
+T 450 13300 9 8 1 1 0 0 1
+pinlabel=(14) EHRPWM1A (U14)
+T 450 13300 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 12900 400 12900 1 0 0
+{
+T 300 12950 5 8 1 1 0 6 1
+pinnumber=61
+T 300 12850 5 8 0 1 0 8 1
+pinseq=61
+T 450 12900 9 8 1 1 0 0 1
+pinlabel=(15) GPIO1_16 (R13)
+T 450 12900 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 12500 400 12500 1 0 0
+{
+T 300 12550 5 8 1 1 0 6 1
+pinnumber=62
+T 300 12450 5 8 0 1 0 8 1
+pinseq=62
+T 450 12500 9 8 1 1 0 0 1
+pinlabel=(16) EHRPWM1B (T14)
+T 450 12500 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 12100 400 12100 1 0 0
+{
+T 300 12150 5 8 1 1 0 6 1
+pinnumber=63
+T 300 12050 5 8 0 1 0 8 1
+pinseq=63
+T 450 12100 9 8 1 1 0 0 1
+pinlabel=(17) I2C1_SCL (A16)
+T 450 12100 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 11700 400 11700 1 0 0
+{
+T 300 11750 5 8 1 1 0 6 1
+pinnumber=64
+T 300 11650 5 8 0 1 0 8 1
+pinseq=64
+T 450 11700 9 8 1 1 0 0 1
+pinlabel=(18) I2C1_SDA (B16)
+T 450 11700 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 11300 400 11300 1 0 0
+{
+T 300 11350 5 8 1 1 0 6 1
+pinnumber=65
+T 300 11250 5 8 0 1 0 8 1
+pinseq=65
+T 450 11300 9 8 1 1 0 0 1
+pinlabel=(19) I2C2_SCL (D17)
+T 450 11300 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 10900 400 10900 1 0 0
+{
+T 300 10950 5 8 1 1 0 6 1
+pinnumber=66
+T 300 10850 5 8 0 1 0 8 1
+pinseq=66
+T 450 10900 9 8 1 1 0 0 1
+pinlabel=(20) I2C2_SDA (D18)
+T 450 10900 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 10500 400 10500 1 0 0
+{
+T 300 10550 5 8 1 1 0 6 1
+pinnumber=67
+T 300 10450 5 8 0 1 0 8 1
+pinseq=67
+T 450 10500 9 8 1 1 0 0 1
+pinlabel=(21) UART2_TXD (B17)
+T 450 10500 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 10100 400 10100 1 0 0
+{
+T 300 10150 5 8 1 1 0 6 1
+pinnumber=68
+T 300 10050 5 8 0 1 0 8 1
+pinseq=68
+T 450 10100 9 8 1 1 0 0 1
+pinlabel=(22) UART2_RXD (A17)
+T 450 10100 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 9700 400 9700 1 0 0
+{
+T 300 9750 5 8 1 1 0 6 1
+pinnumber=69
+T 300 9650 5 8 0 1 0 8 1
+pinseq=69
+T 450 9700 9 8 1 1 0 0 1
+pinlabel=(23) GPIO1_17 (V14)
+T 450 9700 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 9300 400 9300 1 0 0
+{
+T 300 9350 5 8 1 1 0 6 1
+pinnumber=70
+T 300 9250 5 8 0 1 0 8 1
+pinseq=70
+T 450 9300 9 8 1 1 0 0 1
+pinlabel=(24) UART1_TXD (D15)
+T 450 9300 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 8900 400 8900 1 0 0
+{
+T 300 8950 5 8 1 1 0 6 1
+pinnumber=71
+T 300 8850 5 8 0 1 0 8 1
+pinseq=71
+T 450 8900 9 8 1 1 0 0 1
+pinlabel=(25) GPIO3_21 (A14)
+T 450 8900 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 8500 400 8500 1 0 0
+{
+T 300 8550 5 8 1 1 0 6 1
+pinnumber=72
+T 300 8450 5 8 0 1 0 8 1
+pinseq=72
+T 450 8500 9 8 1 1 0 0 1
+pinlabel=(26) UART1_RXD (D16)
+T 450 8500 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 8100 400 8100 1 0 0
+{
+T 300 8150 5 8 1 1 0 6 1
+pinnumber=73
+T 300 8050 5 8 0 1 0 8 1
+pinseq=73
+T 450 8100 9 8 1 1 0 0 1
+pinlabel=(27) GPIO3_19 (C13)
+T 450 8100 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 7700 400 7700 1 0 0
+{
+T 300 7750 5 8 1 1 0 6 1
+pinnumber=74
+T 300 7650 5 8 0 1 0 8 1
+pinseq=74
+T 450 7700 9 8 1 1 0 0 1
+pinlabel=(28) SPI1_CS0 (C12)
+T 450 7700 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 7300 400 7300 1 0 0
+{
+T 300 7350 5 8 1 1 0 6 1
+pinnumber=75
+T 300 7250 5 8 0 1 0 8 1
+pinseq=75
+T 450 7300 9 8 1 1 0 0 1
+pinlabel=(29) SPI1_D0 (B13)
+T 450 7300 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 6900 400 6900 1 0 0
+{
+T 300 6950 5 8 1 1 0 6 1
+pinnumber=76
+T 300 6850 5 8 0 1 0 8 1
+pinseq=76
+T 450 6900 9 8 1 1 0 0 1
+pinlabel=(30) SPI1_D1 (D12)
+T 450 6900 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 6500 400 6500 1 0 0
+{
+T 300 6550 5 8 1 1 0 6 1
+pinnumber=77
+T 300 6450 5 8 0 1 0 8 1
+pinseq=77
+T 450 6500 9 8 1 1 0 0 1
+pinlabel=(31) SPI1_SCLK (A13)
+T 450 6500 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 6100 400 6100 1 0 0
+{
+T 300 6150 5 8 1 1 0 6 1
+pinnumber=78
+T 300 6050 5 8 0 1 0 8 1
+pinseq=78
+T 450 6100 9 8 1 1 0 0 1
+pinlabel=(32) VADC
+T 450 6100 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 5700 400 5700 1 0 0
+{
+T 300 5750 5 8 1 1 0 6 1
+pinnumber=79
+T 300 5650 5 8 0 1 0 8 1
+pinseq=79
+T 450 5700 9 8 1 1 0 0 1
+pinlabel=(33) AIN4 (C8)
+T 450 5700 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 5300 400 5300 1 0 0
+{
+T 300 5350 5 8 1 1 0 6 1
+pinnumber=80
+T 300 5250 5 8 0 1 0 8 1
+pinseq=80
+T 450 5300 9 8 1 1 0 0 1
+pinlabel=(34) AGND
+T 450 5300 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 4900 400 4900 1 0 0
+{
+T 300 4950 5 8 1 1 0 6 1
+pinnumber=81
+T 300 4850 5 8 0 1 0 8 1
+pinseq=81
+T 450 4900 9 8 1 1 0 0 1
+pinlabel=(35) AIN6 (A8)
+T 450 4900 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 4500 400 4500 1 0 0
+{
+T 300 4550 5 8 1 1 0 6 1
+pinnumber=82
+T 300 4450 5 8 0 1 0 8 1
+pinseq=82
+T 450 4500 9 8 1 1 0 0 1
+pinlabel=(36) AIN5 (B8)
+T 450 4500 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 4100 400 4100 1 0 0
+{
+T 300 4150 5 8 1 1 0 6 1
+pinnumber=83
+T 300 4050 5 8 0 1 0 8 1
+pinseq=83
+T 450 4100 9 8 1 1 0 0 1
+pinlabel=(37) AIN2 (B7)
+T 450 4100 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 3700 400 3700 1 0 0
+{
+T 300 3750 5 8 1 1 0 6 1
+pinnumber=84
+T 300 3650 5 8 0 1 0 8 1
+pinseq=84
+T 450 3700 9 8 1 1 0 0 1
+pinlabel=(38) AIN3 (A7)
+T 450 3700 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 3300 400 3300 1 0 0
+{
+T 300 3350 5 8 1 1 0 6 1
+pinnumber=85
+T 300 3250 5 8 0 1 0 8 1
+pinseq=85
+T 450 3300 9 8 1 1 0 0 1
+pinlabel=(39) AIN0 (B6)
+T 450 3300 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 2900 400 2900 1 0 0
+{
+T 300 2950 5 8 1 1 0 6 1
+pinnumber=86
+T 300 2850 5 8 0 1 0 8 1
+pinseq=86
+T 450 2900 9 8 1 1 0 0 1
+pinlabel=(40) AIN1 (C7)
+T 450 2900 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 2500 400 2500 1 0 0
+{
+T 300 2550 5 8 1 1 0 6 1
+pinnumber=87
+T 300 2450 5 8 0 1 0 8 1
+pinseq=87
+T 450 2500 9 8 1 1 0 0 1
+pinlabel=(41) CLKOUT2 (D14)
+T 450 2500 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 2100 400 2100 1 0 0
+{
+T 300 2150 5 8 1 1 0 6 1
+pinnumber=88
+T 300 2050 5 8 0 1 0 8 1
+pinseq=88
+T 450 2100 9 8 1 1 0 0 1
+pinlabel=(42) GPIO0_7 (C18)
+T 450 2100 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 1700 400 1700 1 0 0
+{
+T 300 1750 5 8 1 1 0 6 1
+pinnumber=89
+T 300 1650 5 8 0 1 0 8 1
+pinseq=89
+T 450 1700 9 8 1 1 0 0 1
+pinlabel=(43) GND
+T 450 1700 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 1300 400 1300 1 0 0
+{
+T 300 1350 5 8 1 1 0 6 1
+pinnumber=90
+T 300 1250 5 8 0 1 0 8 1
+pinseq=90
+T 450 1300 9 8 1 1 0 0 1
+pinlabel=(44) GND
+T 450 1300 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 900 400 900 1 0 0
+{
+T 300 950 5 8 1 1 0 6 1
+pinnumber=91
+T 300 850 5 8 0 1 0 8 1
+pinseq=91
+T 450 900 9 8 1 1 0 0 1
+pinlabel=(45) GND
+T 450 900 5 8 0 1 0 2 1
+pintype=io
+}
+P 100 500 400 500 1 0 0
+{
+T 300 550 5 8 1 1 0 6 1
+pinnumber=92
+T 300 450 5 8 0 1 0 8 1
+pinseq=92
+T 450 500 9 8 1 1 0 0 1
+pinlabel=(46) GND
+T 450 500 5 8 0 1 0 2 1
+pintype=io
+}
+B 400 100 8000 18800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+T 8400 19000 8 10 1 1 0 6 1
+refdes=U?
+T 3400 18550 9 10 1 0 0 0 1
+BEAGLEBONE BLACK CAPE
+T 4200 9850 5 10 0 0 0 0 1
+device=BEAGLEBOND BLACK CAPE
+T 4200 10050 5 10 0 0 0 0 1
+footprint=beaglebone
+T 4200 10650 5 10 0 0 0 0 1
+description=TI Sitara AM335x powered development board
+T 4200 10850 5 10 0 0 0 0 1
+numslots=0
+T 1300 18500 3 10 1 0 0 0 1
+P9
+T 7500 18500 3 10 1 0 0 0 1
+P8
diff --git a/bbb_cape/schematic/symbols/crystal.sym b/bbb_cape/schematic/symbols/crystal.sym
new file mode 100644
index 0000000..17dcee8
--- /dev/null
+++ b/bbb_cape/schematic/symbols/crystal.sym
@@ -0,0 +1,62 @@
+v 20110115 2
+P 500 400 800 400 1 0 0
+{
+T 650 450 5 8 1 1 0 6 1
+pinnumber=1
+T 750 350 5 8 0 1 0 8 1
+pinseq=1
+T 850 400 9 8 0 1 0 0 1
+pinlabel=1
+T 850 400 5 8 0 1 0 2 1
+pintype=pas
+}
+P 1100 400 1400 400 1 0 1
+{
+T 1250 450 5 8 1 1 0 0 1
+pinnumber=3
+T 1250 350 5 8 0 1 0 2 1
+pinseq=3
+T 1150 400 9 8 0 1 0 6 1
+pinlabel=3
+T 1150 400 5 8 0 1 0 8 1
+pintype=pas
+}
+B 850 300 200 200 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+T 200 500 5 10 0 0 0 0 1
+device=CRYSTAL
+L 800 540 800 260 3 0 0 0 -1 -1
+L 1100 540 1100 260 3 0 0 0 -1 -1
+T 800 700 8 10 1 1 0 0 1
+refdes=U?
+T 200 1100 5 10 0 0 0 0 1
+description=crystal
+T 200 900 5 10 0 0 0 0 1
+numslots=0
+T 200 700 5 10 0 0 0 0 1
+symversion=0.1
+P 700 200 500 200 1 0 1
+{
+T 656 248 5 8 1 1 0 6 1
+pinnumber=2
+T 650 150 5 8 0 1 0 8 1
+pinseq=2
+T 755 195 9 8 0 1 0 0 1
+pinlabel=2
+T 750 200 5 8 0 1 0 2 1
+pintype=gnd
+}
+L 1200 600 700 600 3 0 0 0 -1 -1
+P 1200 200 1400 200 1 0 1
+{
+T 1250 250 5 8 1 1 0 0 1
+pinnumber=4
+T 1250 150 5 8 0 1 0 2 1
+pinseq=4
+T 1150 200 9 8 0 1 0 6 1
+pinlabel=4
+T 1150 200 5 8 0 1 0 8 1
+pintype=pwr
+}
+L 700 600 700 200 3 0 0 0 -1 -1
+L 700 200 1200 200 3 0 0 0 -1 -1
+L 1200 200 1200 600 3 0 0 0 -1 -1
diff --git a/bbb_cape/schematic/symbols/digital-input-1.sym b/bbb_cape/schematic/symbols/digital-input-1.sym
new file mode 100644
index 0000000..ac015c8
--- /dev/null
+++ b/bbb_cape/schematic/symbols/digital-input-1.sym
@@ -0,0 +1,47 @@
+v 20110115 2
+B 300 0 1700 700 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 500 300 500 1 0 0
+{
+T 0 500 5 10 0 0 0 0 1
+pintype=pwr
+T 355 495 5 10 1 1 0 0 1
+pinlabel=SGND
+T 205 545 5 10 0 1 0 6 1
+pinnumber=SGND
+T 0 500 5 10 0 0 0 0 1
+pinseq=1
+}
+P 0 200 300 200 1 0 0
+{
+T 0 200 5 10 0 0 0 0 1
+pintype=pwr
+T 355 195 5 10 1 1 0 0 1
+pinlabel=SVCC
+T 205 245 5 10 0 1 0 6 1
+pinnumber=SVCC
+T 0 200 5 10 0 0 0 0 1
+pinseq=2
+}
+P 2300 300 2000 300 1 0 0
+{
+T 2300 300 5 10 0 0 0 0 1
+pintype=out
+T 1945 295 5 10 1 1 0 6 1
+pinlabel=OUT
+T 2095 345 5 10 0 1 0 0 1
+pinnumber=OUT
+T 2300 300 5 10 0 0 0 0 1
+pinseq=3
+}
+T 2500 900 8 10 0 1 0 0 1
+device=encoder-input
+T 1400 1000 8 10 0 1 0 0 1
+description=1 encoder input
+T 2900 700 8 10 0 1 0 0 1
+source=encoder input.sch
+T 1700 800 8 10 1 1 0 0 1
+refdes=X?
+T 2900 400 8 10 0 1 0 0 1
+numslots=1
+T 400 800 9 10 1 0 0 0 1
+digital input
diff --git a/bbb_cape/schematic/symbols/digital-input-x4-1.sym b/bbb_cape/schematic/symbols/digital-input-x4-1.sym
new file mode 100644
index 0000000..650855d
--- /dev/null
+++ b/bbb_cape/schematic/symbols/digital-input-x4-1.sym
@@ -0,0 +1,113 @@
+v 20110115 2
+B 300 300 2000 1500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 2600 1400 2300 1400 1 0 0
+{
+T 2600 1400 5 10 0 0 0 0 1
+pintype=out
+T 2245 1395 5 10 1 1 0 6 1
+pinlabel=OUT0
+T 2395 1445 5 10 0 1 0 0 1
+pinnumber=OUT0
+T 2600 1400 5 10 0 0 0 0 1
+pinseq=1
+}
+P 2600 1100 2300 1100 1 0 0
+{
+T 2600 1100 5 10 0 0 0 0 1
+pintype=out
+T 2245 1095 5 10 1 1 0 6 1
+pinlabel=OUT1
+T 2395 1145 5 10 0 1 0 0 1
+pinnumber=OUT1
+T 2600 1100 5 10 0 0 0 0 1
+pinseq=2
+}
+P 2600 800 2300 800 1 0 0
+{
+T 2600 800 5 10 0 0 0 0 1
+pintype=out
+T 2245 795 5 10 1 1 0 6 1
+pinlabel=OUT2
+T 2395 845 5 10 0 1 0 0 1
+pinnumber=OUT2
+T 2600 800 5 10 0 0 0 0 1
+pinseq=3
+}
+P 2600 500 2300 500 1 0 0
+{
+T 2600 500 5 10 0 0 0 0 1
+pintype=out
+T 2245 495 5 10 1 1 0 6 1
+pinlabel=OUT3
+T 2395 545 5 10 0 1 0 0 1
+pinnumber=OUT3
+T 2600 500 5 10 0 0 0 0 1
+pinseq=4
+}
+P 0 1400 300 1400 1 0 0
+{
+T 0 1400 5 10 0 0 0 0 1
+pintype=pwr
+T 355 1395 5 10 1 1 0 0 1
+pinlabel=SGND
+T 205 1445 5 10 0 1 0 6 1
+pinnumber=SGND
+T 0 1400 5 10 0 0 0 0 1
+pinseq=5
+}
+P 0 1100 300 1100 1 0 0
+{
+T 0 1100 5 10 0 0 0 0 1
+pintype=pwr
+T 355 1095 5 10 1 1 0 0 1
+pinlabel=SVCC
+T 205 1145 5 10 0 1 0 6 1
+pinnumber=SVCC
+T 0 1100 5 10 0 0 0 0 1
+pinseq=6
+}
+P 0 800 300 800 1 0 0
+{
+T 0 800 5 10 0 0 0 0 1
+pintype=pwr
+T 355 795 5 10 1 1 0 0 1
+pinlabel=DGND
+T 205 845 5 10 0 1 0 6 1
+pinnumber=DGND
+T 0 800 5 10 0 0 0 0 1
+pinseq=7
+}
+P 0 500 300 500 1 0 0
+{
+T 0 500 5 10 0 0 0 0 1
+pintype=pwr
+T 355 495 5 10 1 1 0 0 1
+pinlabel=DVCC
+T 205 545 5 10 0 1 0 6 1
+pinnumber=DVCC
+T 0 500 5 10 0 0 0 0 1
+pinseq=0
+}
+T 1300 1500 8 10 0 1 0 0 1
+device=digital-input-x4
+T 1900 1600 8 10 0 1 0 0 1
+description=set of 4 digital inputs
+T 400 1600 8 10 1 1 0 0 1
+source=unknown
+T 2000 1900 8 10 1 1 0 0 1
+refdes=X?
+T 1200 1800 8 10 0 1 0 0 1
+numslots=1
+T 400 1900 9 10 1 0 0 0 1
+digital inputs x4
+P 1300 0 1300 300 1 0 0
+{
+T 1300 0 5 10 0 0 0 0 1
+pintype=in
+T 1300 355 5 10 1 1 90 0 1
+pinlabel=DIFFA
+T 1250 205 5 10 0 1 90 6 1
+pinnumber=DIFFA
+T 1300 0 5 10 0 0 0 0 1
+pinseq=9
+}
diff --git a/bbb_cape/schematic/symbols/diode-sot23.sym b/bbb_cape/schematic/symbols/diode-sot23.sym
new file mode 100644
index 0000000..c229137
--- /dev/null
+++ b/bbb_cape/schematic/symbols/diode-sot23.sym
@@ -0,0 +1,35 @@
+v 20110115 2
+L 300 400 300 0 3 0 0 0 -1 -1
+L 300 400 600 200 3 0 0 0 -1 -1
+T 400 600 5 10 0 0 0 0 1
+device=DIODE
+L 600 200 300 0 3 0 0 0 -1 -1
+L 600 400 600 0 3 0 0 0 -1 -1
+P 0 200 200 200 1 0 0
+{
+T 100 250 5 8 0 1 0 0 1
+pinnumber=1
+T 100 250 5 8 0 0 0 0 1
+pinseq=1
+T 100 250 5 8 0 1 0 0 1
+pinlabel=1
+T 100 250 5 8 0 1 0 0 1
+pintype=pas
+}
+P 900 200 700 200 1 0 0
+{
+T 700 250 5 8 0 1 0 0 1
+pinnumber=3
+T 700 250 5 8 0 0 0 0 1
+pinseq=3
+T 700 250 5 8 0 1 0 0 1
+pinlabel=3
+T 700 250 5 8 0 1 0 0 1
+pintype=pas
+}
+L 700 200 600 200 3 0 0 0 -1 -1
+L 300 200 200 200 3 0 0 0 -1 -1
+T 300 500 8 10 1 1 0 0 1
+refdes=D?
+T 195 700 8 10 0 1 0 0 1
+footprint=SOT23
diff --git a/bbb_cape/schematic/symbols/encoder-input-1.sym b/bbb_cape/schematic/symbols/encoder-input-1.sym
new file mode 100644
index 0000000..0db4194
--- /dev/null
+++ b/bbb_cape/schematic/symbols/encoder-input-1.sym
@@ -0,0 +1,58 @@
+v 20110115 2
+B 300 0 1700 700 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 500 300 500 1 0 0
+{
+T 0 500 5 10 0 0 0 0 1
+pintype=pwr
+T 355 495 5 10 1 1 0 0 1
+pinlabel=SGND
+T 205 545 5 10 0 1 0 6 1
+pinnumber=SGND
+T 0 500 5 10 0 0 0 0 1
+pinseq=1
+}
+P 0 200 300 200 1 0 0
+{
+T 0 200 5 10 0 0 0 0 1
+pintype=pwr
+T 355 195 5 10 1 1 0 0 1
+pinlabel=SVCC
+T 205 245 5 10 0 1 0 6 1
+pinnumber=SVCC
+T 0 200 5 10 0 0 0 0 1
+pinseq=2
+}
+P 2300 500 2000 500 1 0 0
+{
+T 2300 500 5 10 0 0 0 0 1
+pintype=out
+T 1945 495 5 10 1 1 0 6 1
+pinlabel=CH1
+T 2095 545 5 10 0 1 0 0 1
+pinnumber=CH1
+T 2300 500 5 10 0 0 0 0 1
+pinseq=3
+}
+T 2500 900 8 10 0 1 0 0 1
+device=encoder-input
+T 1400 1000 8 10 0 1 0 0 1
+description=1 encoder input
+T 2900 700 8 10 0 1 0 0 1
+source=encoder input.sch
+T 1700 800 8 10 1 1 0 0 1
+refdes=X?
+T 2900 400 8 10 0 1 0 0 1
+numslots=1
+T 400 800 9 10 1 0 0 0 1
+encoder input
+P 2300 200 2000 200 1 0 0
+{
+T 2300 200 5 10 0 0 0 0 1
+pintype=out
+T 1945 195 5 10 1 1 0 6 1
+pinlabel=CH2
+T 2095 245 5 10 0 1 0 0 1
+pinnumber=CH2
+T 2300 200 5 10 0 0 0 0 1
+pinseq=4
+}
diff --git a/bbb_cape/schematic/symbols/lmz12002-1.sym b/bbb_cape/schematic/symbols/lmz12002-1.sym
new file mode 100644
index 0000000..07d13f5
--- /dev/null
+++ b/bbb_cape/schematic/symbols/lmz12002-1.sym
@@ -0,0 +1,98 @@
+v 20110115 2
+B 0 200 3100 1000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 400 0 400 200 1 0 0
+{
+T 400 0 5 10 0 0 0 0 1
+pintype=pwr
+T 400 255 5 10 1 1 90 0 1
+pinlabel=VIN
+T 350 105 5 10 1 1 90 6 1
+pinnumber=1
+T 400 0 5 10 0 0 0 0 1
+pinseq=1
+}
+P 700 0 700 200 1 0 0
+{
+T 700 0 5 10 0 0 0 0 1
+pintype=in
+T 700 255 5 10 1 1 90 0 1
+pinlabel=RON
+T 650 105 5 10 1 1 90 6 1
+pinnumber=2
+T 700 0 5 10 0 0 0 0 1
+pinseq=2
+}
+P 1000 0 1000 200 1 0 0
+{
+T 1000 0 5 10 0 0 0 0 1
+pintype=in
+T 1000 255 5 10 1 1 90 0 1
+pinlabel=EN
+T 950 105 5 10 1 1 90 6 1
+pinnumber=3
+T 1000 0 5 10 0 0 0 0 1
+pinseq=3
+}
+P 1500 0 1500 200 1 0 0
+{
+T 1500 0 5 10 0 0 0 0 1
+pintype=pwr
+T 1500 255 5 10 1 1 90 0 1
+pinlabel=GND
+T 1450 105 5 10 1 1 90 6 1
+pinnumber=4
+T 1500 0 5 10 0 0 0 0 1
+pinseq=4
+}
+P 1800 0 1800 200 1 0 0
+{
+T 1800 0 5 10 0 0 0 0 1
+pintype=pwr
+T 1800 255 5 10 1 1 90 0 1
+pinlabel=PAD
+T 1750 105 5 10 1 1 90 6 1
+pinnumber=8
+T 1800 0 5 10 0 0 0 0 1
+pinseq=8
+}
+P 2300 0 2300 200 1 0 0
+{
+T 2300 0 5 10 0 0 0 0 1
+pintype=in
+T 2300 255 5 10 1 1 90 0 1
+pinlabel=SS
+T 2250 105 5 10 1 1 90 6 1
+pinnumber=5
+T 2300 0 5 10 0 0 0 0 1
+pinseq=5
+}
+P 2600 0 2600 200 1 0 0
+{
+T 2600 0 5 10 0 0 0 0 1
+pintype=in
+T 2600 255 5 10 1 1 90 0 1
+pinlabel=FB
+T 2550 105 5 10 1 1 90 6 1
+pinnumber=6
+T 2600 0 5 10 0 0 0 0 1
+pinseq=6
+}
+P 2900 0 2900 200 1 0 0
+{
+T 2900 0 5 10 0 0 0 0 1
+pintype=out
+T 2900 255 5 10 1 1 90 0 1
+pinlabel=VOUT
+T 2850 105 5 10 1 1 90 6 1
+pinnumber=7
+T 2900 0 5 10 0 0 0 0 1
+pinseq=7
+}
+T 500 900 8 10 1 1 0 0 1
+device=LMZ12002
+T 1900 900 8 10 1 1 0 0 1
+refdes=U?
+T 1100 1295 8 10 0 1 0 0 1
+footprint=TOPMOD
+T 900 1262 8 10 0 1 0 0 1
+numslots=0
diff --git a/bbb_cape/schematic/symbols/max3221-1.sym b/bbb_cape/schematic/symbols/max3221-1.sym
new file mode 100644
index 0000000..b67bd87
--- /dev/null
+++ b/bbb_cape/schematic/symbols/max3221-1.sym
@@ -0,0 +1,193 @@
+v 20110115 2
+T 350 8200 5 10 0 0 0 0 1
+device=MAX3221
+T 350 7900 5 10 0 0 0 0 1
+description=Maxim RS-232 transceiver with autoshutdown and ESD protection
+T 350 5500 5 10 0 0 0 0 1
+footprint=TSSOP16
+T 350 5200 5 10 0 0 0 0 1
+numslots=0
+T 2350 4200 8 10 1 1 0 6 1
+refdes=U?
+T 350 4150 9 10 1 0 0 0 1
+MAX3221
+B 300 0 2000 4100 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 300 3700 0 3700 1 0 1
+{
+T 200 3750 5 8 1 1 0 6 1
+pinnumber=13
+T 200 3650 5 8 0 1 0 8 1
+pinseq=1
+T 350 3750 9 8 1 1 0 0 1
+pinlabel=DOUT
+T 350 3650 5 8 0 1 0 2 1
+pintype=out
+}
+P 2300 3700 2600 3700 1 0 1
+{
+T 2800 3750 5 8 1 1 0 6 1
+pinnumber=15
+T 2800 3650 5 8 0 1 0 8 1
+pinseq=2
+T 2950 3750 9 8 1 1 0 0 1
+pinlabel=VCC
+T 2950 3650 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 300 2100 0 2100 1 0 1
+{
+T 200 2150 5 8 1 1 0 6 1
+pinnumber=3
+T 200 2050 5 8 0 1 0 8 1
+pinseq=5
+T 350 2100 9 8 1 1 0 0 1
+pinlabel=V+
+T 350 2050 5 8 0 1 0 2 1
+pintype=pas
+}
+P 2300 2300 2600 2300 1 0 1
+{
+T 2550 2350 5 8 1 1 0 6 1
+pinnumber=9
+T 2550 2250 5 8 0 1 0 8 1
+pinseq=15
+T 2250 2350 9 8 1 1 0 6 1
+pinlabel=ROUT
+T 2250 2250 5 8 0 1 0 8 1
+pintype=out
+}
+P 200 2700 0 2700 1 0 1
+{
+T 200 2750 5 8 1 1 0 6 1
+pinnumber=10
+T 200 2650 5 8 0 1 0 8 1
+pinseq=4
+T 350 2750 9 8 1 1 0 0 1
+pinlabel=\_INVALID\_
+T 350 2650 5 8 0 1 0 2 1
+pintype=out
+}
+P 2300 1300 2600 1300 1 0 1
+{
+T 2550 1350 5 8 1 1 0 6 1
+pinnumber=4
+T 2550 1250 5 8 0 1 0 8 1
+pinseq=13
+T 2250 1300 9 8 1 1 0 6 1
+pinlabel=C1-
+T 2250 1250 5 8 0 1 0 8 1
+pintype=pas
+}
+P 2300 2700 2600 2700 1 0 1
+{
+T 2550 2750 5 8 1 1 0 6 1
+pinnumber=8
+T 2550 2650 5 8 0 1 0 8 1
+pinseq=16
+T 2250 2750 9 8 1 1 0 6 1
+pinlabel=RIN
+T 2250 2650 5 8 0 1 0 8 1
+pintype=in
+}
+P 2300 3300 2600 3300 1 0 1
+{
+T 2800 3350 5 8 1 1 0 6 1
+pinnumber=14
+T 2800 3250 5 8 0 1 0 8 1
+pinseq=3
+T 2950 3350 9 8 1 1 0 0 1
+pinlabel=GND
+T 2950 3250 5 8 0 1 0 2 1
+pintype=pwr
+}
+P 300 1700 0 1700 1 0 1
+{
+T 200 1750 5 8 1 1 0 6 1
+pinnumber=7
+T 200 1650 5 8 0 1 0 8 1
+pinseq=6
+T 350 1700 9 8 1 1 0 0 1
+pinlabel=V-
+T 350 1650 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1100 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 200 1100 0 1100 1 0 1
+{
+T 200 1150 5 8 1 1 0 6 1
+pinnumber=1
+T 200 1050 5 8 0 1 0 8 1
+pinseq=7
+T 350 1100 9 8 1 1 0 0 1
+pinlabel=\_EN\_
+T 350 1050 5 8 0 1 0 2 1
+pintype=in
+}
+P 2300 1700 2600 1700 1 0 1
+{
+T 2550 1750 5 8 1 1 0 6 1
+pinnumber=2
+T 2550 1650 5 8 0 1 0 8 1
+pinseq=14
+T 2250 1700 9 8 1 1 0 6 1
+pinlabel=C1+
+T 2250 1650 5 8 0 1 0 8 1
+pintype=pas
+}
+P 2300 500 2600 500 1 0 1
+{
+T 2550 550 5 8 1 1 0 6 1
+pinnumber=6
+T 2550 450 5 8 0 1 0 8 1
+pinseq=11
+T 2250 500 9 8 1 1 0 6 1
+pinlabel=C2-
+T 2250 450 5 8 0 1 0 8 1
+pintype=pas
+}
+P 2300 900 2600 900 1 0 1
+{
+T 2550 950 5 8 1 1 0 6 1
+pinnumber=5
+T 2550 850 5 8 0 1 0 8 1
+pinseq=12
+T 2250 900 9 8 1 1 0 6 1
+pinlabel=C2+
+T 2250 850 5 8 0 1 0 8 1
+pintype=pas
+}
+P 300 700 0 700 1 0 1
+{
+T 200 750 5 8 1 1 0 6 1
+pinnumber=12
+T 200 650 5 8 0 1 0 8 1
+pinseq=8
+T 350 700 9 8 1 1 0 0 1
+pinlabel=FORCEON
+T 350 650 5 8 0 1 0 2 1
+pintype=in
+}
+V 250 300 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 200 300 0 300 1 0 1
+{
+T 200 350 5 8 1 1 0 6 1
+pinnumber=16
+T 200 250 5 8 0 1 0 8 1
+pinseq=9
+T 350 300 9 8 1 1 0 0 1
+pinlabel=\_FORCEOFF\_
+T 350 250 5 8 0 1 0 2 1
+pintype=in
+}
+V 250 2700 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 300 3300 0 3300 1 0 1
+{
+T 550 3350 5 8 1 1 0 6 1
+pinnumber=11
+T 550 3250 5 8 0 1 0 8 1
+pinseq=10
+T 250 3300 9 8 1 1 0 6 1
+pinlabel=DIN
+T 250 3250 5 8 0 1 0 8 1
+pintype=in
+}
diff --git a/bbb_cape/schematic/symbols/quad_opamp-2.sym b/bbb_cape/schematic/symbols/quad_opamp-2.sym
new file mode 100644
index 0000000..569bd13
--- /dev/null
+++ b/bbb_cape/schematic/symbols/quad_opamp-2.sym
@@ -0,0 +1,86 @@
+v 20050820 1
+L 200 800 200 0 3 0 0 0 -1 -1
+L 200 800 800 400 3 0 0 0 -1 -1
+T 600 600 5 10 0 0 0 0 1
+device=QUAD_OPAMP
+L 800 400 200 0 3 0 0 0 -1 -1
+L 300 250 300 150 3 0 0 0 -1 -1
+L 250 200 350 200 3 0 0 0 -1 -1
+L 250 600 350 600 3 0 0 0 -1 -1
+P 0 200 200 200 1 0 0
+{
+T 0 200 5 10 1 1 0 0 1
+pinnumber=3
+T 0 200 5 10 0 0 0 0 1
+pinseq=1
+T 0 200 5 10 0 0 0 0 1
+pintype=in
+T 0 200 5 10 0 0 0 0 1
+pinlabel=IN+
+}
+P 0 600 200 600 1 0 0
+{
+T 0 600 5 10 1 1 0 0 1
+pinnumber=2
+T 0 600 5 10 0 0 0 0 1
+pinseq=2
+T 0 600 5 10 0 0 0 0 1
+pintype=in
+T 0 600 5 10 0 0 0 0 1
+pinlabel=IN-
+}
+P 800 400 1000 400 1 0 1
+{
+T 800 400 5 10 1 1 0 0 1
+pinnumber=1
+T 800 400 5 10 0 0 0 0 1
+pinseq=5
+T 800 400 5 10 0 0 0 0 1
+pintype=out
+T 800 400 5 10 0 0 0 0 1
+pinlabel=OUT
+}
+P 500 600 500 800 1 0 1
+{
+T 600 600 5 10 1 1 0 0 1
+pinnumber=11
+T 600 600 5 10 0 0 0 0 1
+pinseq=3
+T 500 600 5 10 0 0 0 0 1
+pinlabel=V+
+T 500 600 5 10 0 0 0 0 1
+pintype=pwr
+}
+P 500 200 500 0 1 0 1
+{
+T 600 100 5 10 1 1 0 0 1
+pinnumber=4
+T 600 100 5 10 0 0 0 0 1
+pinseq=4
+T 500 200 5 10 0 0 0 0 1
+pinlabel=V-
+T 500 200 5 10 0 0 0 0 1
+pintype=pwr
+}
+T 200 900 8 10 1 1 0 0 1
+refdes=U?
+T 200 2300 5 10 0 0 0 0 1
+slot=1
+T 200 1300 5 10 0 0 0 0 1
+numslots=4
+T 200 1500 5 10 0 0 0 0 1
+slotdef=1:3,2,4,11,1
+T 200 1700 5 10 0 0 0 0 1
+slotdef=2:5,6,4,11,7
+T 200 1900 5 10 0 0 0 0 1
+slotdef=3:10,9,4,11,8
+T 200 2100 5 10 0 0 0 0 1
+slotdef=4:12,13,4,11,14
+T 2400 2300 5 10 0 0 0 0 1
+footprint=SO14
+T 2400 2100 5 10 0 0 0 0 1
+footprint2=DIP14
+T 200 2500 5 10 0 0 0 0 1
+symversion=0.1
+T 200 2700 5 10 0 0 0 0 1
+documentation=http://www.onsemi.com/pub/Collateral/LM324-D.PDF
diff --git a/bbb_cape/schematic/symbols/regulator-1.sym b/bbb_cape/schematic/symbols/regulator-1.sym
new file mode 100644
index 0000000..b08f11c
--- /dev/null
+++ b/bbb_cape/schematic/symbols/regulator-1.sym
@@ -0,0 +1,45 @@
+v 20110115 2
+B 0 500 2000 1200 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+T 200 1500 9 10 1 0 0 0 1
+Power Regulator
+P 500 200 500 500 1 0 0
+{
+T 500 200 5 10 0 0 0 0 1
+pintype=pwr
+T 500 555 5 10 1 1 90 0 1
+pinlabel=GND
+T 450 405 5 10 0 1 90 6 1
+pinnumber=GND
+T 500 200 5 10 0 0 0 0 1
+pinseq=1
+}
+P 1000 200 1000 500 1 0 0
+{
+T 1000 200 5 10 0 0 0 0 1
+pintype=pwr
+T 1000 555 5 10 1 1 90 0 1
+pinlabel=VIN
+T 950 405 5 10 0 1 90 6 1
+pinnumber=VIN
+T 1000 200 5 10 0 0 0 0 1
+pinseq=2
+}
+T -1100 700 8 10 0 1 0 0 1
+device=regulator
+T -700 1300 8 10 0 1 0 0 1
+description=voltage regulator
+T 800 1300 8 10 1 1 0 0 1
+refdes=X?
+P 1500 200 1500 500 1 0 0
+{
+T 1500 200 5 10 0 0 0 0 1
+pintype=pwr
+T 1500 555 5 10 1 1 90 0 1
+pinlabel=VOUT
+T 1450 405 5 10 0 1 90 6 1
+pinnumber=VOUT
+T 1500 200 5 10 0 0 0 0 1
+pinseq=0
+}
+T 0 1100 8 10 1 1 0 0 1
+source=unknown
diff --git a/bbb_cape/src/bbb/bbb.gyp b/bbb_cape/src/bbb/bbb.gyp
new file mode 100644
index 0000000..1722bce
--- /dev/null
+++ b/bbb_cape/src/bbb/bbb.gyp
@@ -0,0 +1,166 @@
+{
+  'target_defaults': {
+    'include_dirs': [
+      '..',
+    ],
+    'direct_dependent_settings': {
+      'include_dirs': [
+        '..',
+      ],
+    },
+  },
+  'targets': [
+    {
+      'target_name': 'crc',
+      'type': 'static_library',
+      'sources': [
+        'crc.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/common/common.gyp:once',
+      ],
+    },
+    {
+      'target_name': 'byte_reader',
+      'type': 'static_library',
+      'sources': [
+        # 'byte_reader.h',
+      ],
+      'dependencies': [
+        '<(AOS)/common/common.gyp:time',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:time',
+      ],
+    },
+    {
+      'target_name': 'uart_reader',
+      'type': 'static_library',
+      'sources': [
+        'uart_reader.cc',
+        'uart_reader_termios2.c',
+      ],
+      'dependencies': [
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/common/common.gyp:time',
+        'byte_reader',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:time',
+        'byte_reader',
+      ],
+    },
+    {
+      'target_name': 'cows_test',
+      'type': 'executable',
+      'sources': [
+        'cows_test.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        '<(DEPTH)/bbb_cape/src/cape/cape.gyp:cows',
+      ],
+    },
+    {
+      'target_name': 'packet_finder_test',
+      'type': 'executable',
+      'sources': [
+        'packet_finder_test.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        'packet_finder',
+        '<(AOS)/common/common.gyp:queue_testutils',
+        '<(AOS)/common/common.gyp:time',
+      ],
+    },
+    {
+      'target_name': 'sensor_generation',
+      'type': 'static_library',
+      'sources': [
+        'sensor_generation.q',
+      ],
+      'variables': {
+        'header_path': 'bbb',
+      },
+      'includes': ['../../../aos/build/queues.gypi'],
+    },
+    {
+      'target_name': 'packet_finder',
+      'type': 'static_library',
+      'sources': [
+        'packet_finder.cc',
+      ],
+      'dependencies': [
+        '<(DEPTH)/bbb_cape/src/cape/cape.gyp:cows',
+        '<(AOS)/build/aos.gyp:logging',
+        'crc',
+        '<(AOS)/common/common.gyp:time',
+        'byte_reader',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/common/common.gyp:time',
+        'byte_reader',
+      ],
+    },
+    {
+      'target_name': 'data_struct',
+      'type': 'static_library',
+      'sources': [
+        # 'data_struct.h',
+      ],
+      'dependencies': [
+        '<(DEPTH)/bbb_cape/src/cape/cape.gyp:data_struct',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/bbb_cape/src/cape/cape.gyp:data_struct',
+      ],
+    },
+    {
+      'target_name': 'uart_reader_main',
+      'type': 'executable',
+      'sources': [
+        'uart_reader_main.cc',
+      ],
+      'dependencies': [
+        'uart_reader',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        'packet_finder',
+        'data_struct',
+        '<(AOS)/common/common.gyp:time',
+      ],
+    },
+    {
+      'target_name': 'gpios',
+      'type': 'static_library',
+      'sources': [
+        'gpios.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+    },
+    {
+      'target_name': 'sensor_reader',
+      'type': 'static_library',
+      'sources': [
+        'sensor_reader.cc',
+      ],
+      'dependencies': [
+        'uart_reader',
+        'packet_finder',
+        'data_struct',
+        '<(AOS)/common/common.gyp:time',
+        'sensor_generation',
+      ],
+      'export_dependent_settings': [
+        'uart_reader',
+        'packet_finder',
+        'data_struct',
+        '<(AOS)/common/common.gyp:time',
+      ],
+    },
+  ],
+}
diff --git a/bbb_cape/src/bbb/byte_reader.h b/bbb_cape/src/bbb/byte_reader.h
new file mode 100644
index 0000000..16e364c
--- /dev/null
+++ b/bbb_cape/src/bbb/byte_reader.h
@@ -0,0 +1,25 @@
+#ifndef BBB_BYTE_READER_H_
+#define BBB_BYTE_READER_H_
+
+#include <sys/types.h>
+
+#include "aos/common/time.h"
+
+namespace bbb {
+
+class ByteReader {
+ public:
+  // We have 64-bit ints in some of our data.
+  typedef char __attribute__((aligned(8))) AlignedChar;
+
+  // Implemented by subclasses to provide a data source 
+  // for these algorithms.
+  // Returns the number of bytes read, -1 if there is an error in errno, or -2
+  // if reading takes longer than timeout.
+  virtual ssize_t ReadBytes(AlignedChar *dest, size_t max_bytes,
+                            const ::aos::time::Time &timeout_time) = 0;
+};
+
+}  // namespace bbb
+
+#endif  // BBB_BYTE_READER_H_
diff --git a/bbb_cape/src/bbb/cows_test.cc b/bbb_cape/src/bbb/cows_test.cc
new file mode 100644
index 0000000..06eba5b
--- /dev/null
+++ b/bbb_cape/src/bbb/cows_test.cc
@@ -0,0 +1,17 @@
+#include "cape/cows.h"
+
+#include <gtest/gtest.h>
+
+namespace testing {
+
+TEST(CowsTest, StupidZeros) {
+  static const uint8_t kTestInput[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01,
+                                       0x00};
+  uint32_t input[3];
+  memcpy(input, kTestInput, 12);
+  uint32_t output[2];
+  EXPECT_EQ(
+      1u, cows_unstuff(input, sizeof(kTestInput), output, sizeof(output) * 4));
+}
+
+}  // namespace testing
diff --git a/bbb_cape/src/bbb/crc.cc b/bbb_cape/src/bbb/crc.cc
new file mode 100644
index 0000000..b16eb94
--- /dev/null
+++ b/bbb_cape/src/bbb/crc.cc
@@ -0,0 +1,44 @@
+#include "bbb/crc.h"
+
+#include "aos/common/once.h"
+
+// There are various implementations that look a lot like this scattered around
+// the internet.
+
+namespace cape {
+namespace {
+
+const uint32_t kPolynomial = 0x04c11db7;
+
+const uint32_t *GenerateTable() {
+  static uint32_t table[256];
+
+  for (int i = 0; i < 256; ++i) {
+    uint32_t c = i << 24;
+    for (int j = 8; j > 0; --j) {
+      c = c & 0x80000000 ? ((c << 1) ^ kPolynomial) : (c << 1);
+    }
+    table[i] = c;
+  }
+
+  return table;
+}
+
+}  // namespace
+
+uint32_t CalculateChecksum(uint8_t *data, size_t length) {
+  static ::aos::Once<const uint32_t> table_once(GenerateTable);
+  const uint32_t *const table = table_once.Get();
+
+  uint32_t r = 0xFFFFFFFF;
+
+  for (size_t i = 0; i < (length / 4); ++i) {
+    for (int ii = 3; ii >= 0; --ii) {
+      r = (r << 8) ^ table[(r >> 24) ^ data[i * 4 + ii]];
+    }
+  }
+
+  return r;
+}
+
+}  // namespace cape
diff --git a/bbb_cape/src/bbb/crc.h b/bbb_cape/src/bbb/crc.h
new file mode 100644
index 0000000..7a8eb95
--- /dev/null
+++ b/bbb_cape/src/bbb/crc.h
@@ -0,0 +1,15 @@
+#ifndef BBB_CRC_H_
+#define BBB_CRC_H_
+
+#include <string.h>
+#include <stdint.h>
+
+namespace cape {
+
+// Calculates a CRC32 checksum for data. This is definitely the same one as the
+// cape MCU does in hardware which seems to be the same one as Ethernet etc use.
+uint32_t CalculateChecksum(uint8_t *data, size_t length);
+
+}  // namespace cape
+
+#endif  // BBB_CRC_H_
diff --git a/bbb_cape/src/bbb/data_struct.h b/bbb_cape/src/bbb/data_struct.h
new file mode 100644
index 0000000..767c0e0
--- /dev/null
+++ b/bbb_cape/src/bbb/data_struct.h
@@ -0,0 +1,9 @@
+#include <stdint.h>
+
+namespace bbb {
+
+#define DATA_STRUCT_NAME DataStruct
+#include "cape/data_struct.h"
+#undef DATA_STRUCT_NAME
+
+}  // namespace bbb
diff --git a/bbb_cape/src/bbb/gpios.cc b/bbb_cape/src/bbb/gpios.cc
new file mode 100644
index 0000000..5a9c76e
--- /dev/null
+++ b/bbb_cape/src/bbb/gpios.cc
@@ -0,0 +1,153 @@
+#include "bbb/gpios.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "aos/common/logging/logging_impl.h"
+
+namespace bbb {
+
+Pin::Pin(int bank, int pin)
+    : handle_(NULL),
+      direction_(0),
+      kernel_pin_(bank * 32 + pin),
+      exported_(false) {}
+
+Pin::~Pin() {
+  // Unexport the pin.
+  if ((handle_ = fopen("/sys/class/gpio/unexport", "ab")) == NULL) {
+    LOG(WARNING, "Could not unexport gpio pin.\n");
+    // There's nothing intelligent we can really do here.
+    return;
+  }
+
+  char gpio_num[2];
+  snprintf(gpio_num, sizeof(gpio_num), "%d", kernel_pin_);
+  fwrite(gpio_num, sizeof(char), 2, handle_);
+  fclose(handle_);
+}
+
+int Pin::DoExport() {
+  char gpio_num[2];
+  snprintf(gpio_num, sizeof(gpio_num), "%d", kernel_pin_);
+
+  // Export the pin.
+  if ((handle_ = fopen("/sys/class/gpio/export", "ab")) == NULL) {
+    LOG(ERROR, "Could not export GPIO pin.\n");
+    return -1;
+  }
+
+  fwrite(gpio_num, sizeof(char), 2, handle_);
+  fclose(handle_);
+
+  exported_ = true;
+  return 0;
+}
+
+int Pin::DoPinDirSet(int direction) {
+  char buf[4], type_path[64];
+  snprintf(type_path, sizeof(type_path), "/sys/class/gpio/gpio%d/direction",
+           kernel_pin_);
+
+  if ((handle_ = fopen(type_path, "rb+")) == NULL) {
+    LOG(ERROR, "Unable to set pin direction.\n");
+    return -1;
+  }
+
+  direction_ = direction;
+  switch (direction) {
+    case 1:
+      strcpy(buf, "in");
+      break;
+    case 2:
+      strcpy(buf, "low");
+      break;
+    case 0:
+      return 0;
+    default:
+      LOG(ERROR, "Invalid direction identifier %d.\n", direction);
+      direction_ = 0;
+      return -1;
+  }
+  fwrite(buf, sizeof(char), 3, handle_);
+  fclose(handle_);
+
+  return 0;
+}
+
+int Pin::MakeInput() {
+  if (!exported_) {
+    if (DoExport()) {
+      return -1;
+    }
+  }
+
+  return DoPinDirSet(1);
+}
+
+int Pin::MakeOutput() {
+  if (!exported_) {
+    if (DoExport()) {
+      return -1;
+    }
+  }
+
+  return DoPinDirSet(2);
+}
+
+int Pin::Write(uint8_t value) {
+  if (direction_ != 2) {
+    LOG(ERROR, "Only pins set as output can be written to.\n");
+    return -1;
+  }
+
+  char buf, val_path[64];
+  snprintf(val_path, sizeof(val_path), "/sys/class/gpio/gpio%d/value",
+           kernel_pin_);
+  if (value != 0) {
+    value = 1;
+  }
+
+  if ((handle_ = fopen(val_path, "rb+")) == NULL) {
+    LOG(ERROR, "Unable to set pin value.\n");
+    return -1;
+  }
+
+  snprintf(&buf, sizeof(buf), "%d", value);
+  fwrite(&buf, sizeof(char), 1, handle_);
+  fclose(handle_);
+
+  return 0;
+}
+
+int Pin::Read() {
+  // NOTE: I can't find any docs confirming that one can indeed
+  // poll a pin's value using this method, but it seems that it
+  // should work. Really, the "right" (interrupt driven) way to
+  // do this is to set an event, but that involves messing with
+  // dev tree crap, which I'm not willing to do unless we need
+  // this functionality.
+
+  if (direction_ != 1) {
+    LOG(ERROR, "Only pins set as input can be read from.\n");
+    return -1;
+  }
+
+  char buf, val_path[64];
+  snprintf(val_path, sizeof(val_path), "/sys/class/gpio/gpio%d/value",
+           kernel_pin_);
+
+  if ((handle_ = fopen(val_path, "rb")) == NULL) {
+    LOG(ERROR, "Unable to read pin value.\n");
+    return -1;
+  }
+
+  if (fread(&buf, sizeof(char), 1, handle_) <= 0) {
+    LOG(ERROR, "Failed to read pin value from file.\n");
+    return -1;
+  }
+  fclose(handle_);
+  return atoi(&buf);
+}
+
+}  // namespace bbb
diff --git a/bbb_cape/src/bbb/gpios.h b/bbb_cape/src/bbb/gpios.h
new file mode 100644
index 0000000..a377d68
--- /dev/null
+++ b/bbb_cape/src/bbb/gpios.h
@@ -0,0 +1,40 @@
+#ifndef BBB_CAPE_SRC_BBB_CAPE_CONTROL_H_
+#define BBB_CAPE_SRC_BBB_CAPE_CONTROL_H_
+
+#include <stdint.h>
+#include <stdio.h>
+
+// As it turns out, controlling the BBB's GPIO pins
+// from C++ is kind of a pain. The purpose of this
+// code is to provide a simple wrapper that masks
+// all the ugly stuff and exposes a nice API.
+
+// Based on example from 
+// <http://learnbuildshare.wordpress.com/2013/05/29/beaglebone-black-digital-ouput/>
+
+namespace bbb {
+
+class Pin {
+  FILE *handle_;
+  int direction_;
+  int kernel_pin_;
+  bool exported_;
+
+  int DoPinDirSet(int direction);
+  int DoExport();
+
+public:
+  // Here, for example, if you wanted to use
+  // GPIO1_28, you would give the ctor
+  // 1, 28 as arguments.
+  Pin(int bank, int pin);
+  ~Pin();
+  int MakeInput();
+  int MakeOutput();
+  int Write(uint8_t value);
+  int Read();
+};
+
+}  // namespace bbb
+
+#endif
diff --git a/bbb_cape/src/bbb/packet_finder.cc b/bbb_cape/src/bbb/packet_finder.cc
new file mode 100644
index 0000000..713ea69
--- /dev/null
+++ b/bbb_cape/src/bbb/packet_finder.cc
@@ -0,0 +1,143 @@
+#include "bbb/packet_finder.h"
+
+#include <errno.h>
+#include <inttypes.h>
+#include <stdlib.h>
+
+#include <algorithm>
+
+#include "aos/common/logging/logging.h"
+#include "bbb_cape/src/cape/cows.h"
+#include "bbb/crc.h"
+
+using ::aos::time::Time;
+
+namespace bbb {
+
+PacketFinder::PacketFinder(ByteReader *reader, size_t packet_size)
+    : reader_(reader),
+      packet_size_(packet_size),
+      buf_(new AlignedChar[packet_size_]),
+      unstuffed_data_(new AlignedChar[packet_size_ - 4]) {
+  CHECK((packet_size_ % 4) == 0);
+}
+
+PacketFinder::~PacketFinder() {
+  delete buf_;
+  delete unstuffed_data_;
+}
+
+bool PacketFinder::FindPacket(const ::Time &timeout_time) {
+  // How many 0 bytes we've found at the front so far.
+  int zeros_found = 0;
+  while (true) {
+    size_t already_read = ::std::max(0, packet_bytes_);
+    ssize_t new_bytes = reader_->ReadBytes(
+        buf_ + already_read, packet_size_ - already_read, timeout_time);
+    if (new_bytes < 0) {
+      if (new_bytes == -1) {
+        LOG(ERROR, "ReadBytes(%p, %zd) failed with %d: %s\n",
+            buf_ + already_read, packet_size_ - already_read, errno,
+            strerror(errno));
+      } else if (new_bytes == -2) {
+        LOG(WARNING, "timed out\n");
+      } else {
+        LOG(WARNING, "bad ByteReader %p returned %zd\n", reader_, new_bytes);
+      }
+      return false;
+    }
+
+    if (!irq_priority_increased_) {
+      // TODO(brians): Do this cleanly.
+      int chrt_result = system("bash -c 'chrt -r -p 55"
+                               " $(top -n1 | fgrep irq/89 | cut -d\" \" -f2)'");
+      if (chrt_result == -1) {
+        LOG(FATAL, "system(chrt -r -p 55 the_irq) failed\n");
+      } else if (!WIFEXITED(chrt_result) || WEXITSTATUS(chrt_result) != 0) {
+        LOG(FATAL, "$(chrt -r -p 55 the_irq) failed, return value = %d\n",
+            WEXITSTATUS(chrt_result));
+      }
+
+      irq_priority_increased_ = true;
+    }
+
+    if (packet_bytes_ == -1) {
+      for (size_t to_check = already_read; to_check < already_read + new_bytes;
+           ++to_check) {
+        if (buf_[to_check] == 0) {
+          ++zeros_found;
+          if (zeros_found == 4) {
+            packet_bytes_ = 0;
+            zeros_found = 0;
+            new_bytes -= to_check + 1;
+            memmove(buf_, buf_ + to_check + 1, new_bytes);
+            to_check = 0;
+            break;
+          }
+        } else {
+          zeros_found = 0;
+        }
+      }
+    }
+    if (packet_bytes_ != -1) {  // if we decided that these are good bytes
+      packet_bytes_ += new_bytes;
+      if (packet_bytes_ == static_cast<ssize_t>(packet_size_)) return true;
+    }
+  }
+}
+
+bool PacketFinder::ProcessPacket() {
+  uint32_t unstuffed = cows_unstuff(
+      reinterpret_cast<uint32_t *>(buf_), packet_size_,
+      reinterpret_cast<uint32_t *>(unstuffed_data_), packet_size_ - 4);
+  if (unstuffed == 0) {
+    LOG(WARNING, "invalid packet\n");
+    return false;
+  } else if (unstuffed != (packet_size_ - 4) / 4) {
+    LOG(WARNING, "packet is %" PRIu32 " words instead of %" PRIu32 "\n",
+        unstuffed, (packet_size_ - 4) / 4);
+    return false;
+  }
+
+  // Make sure the checksum checks out.
+  uint32_t sent_checksum;
+  memcpy(&sent_checksum, unstuffed_data_ + packet_size_ - 8, 4);
+  uint32_t calculated_checksum = cape::CalculateChecksum(
+      reinterpret_cast<uint8_t *>(unstuffed_data_), packet_size_ - 8);
+  if (sent_checksum != calculated_checksum) {
+    LOG(WARNING, "sent checksum: %" PRIx32 " vs calculated: %" PRIx32"\n",
+        sent_checksum, calculated_checksum);
+    return false;
+  }
+
+  return true;
+}
+
+bool PacketFinder::ReadPacket(const ::Time &timeout_time) {
+  if (!FindPacket(timeout_time)) return false;
+
+  if (!ProcessPacket()) {
+    packet_bytes_ = -1;
+    int zeros = 0;
+    for (size_t i = 0; i < packet_size_; ++i) {
+      if (buf_[i] == 0) {
+        ++zeros;
+        if (zeros == 4) {
+          LOG(INFO, "found another packet start at %d\n", i);
+          packet_bytes_ = packet_size_ - (i + 1);
+          memmove(buf_, buf_ + i + 1, packet_bytes_);
+          return false;
+        }
+      } else {
+        zeros = 0;
+      }
+    }
+    return false;
+  } else {
+    packet_bytes_ = -1;
+  }
+
+  return true;
+}
+
+}  // namespace bbb
diff --git a/bbb_cape/src/bbb/packet_finder.h b/bbb_cape/src/bbb/packet_finder.h
new file mode 100644
index 0000000..9b74583
--- /dev/null
+++ b/bbb_cape/src/bbb/packet_finder.h
@@ -0,0 +1,71 @@
+#ifndef BBB_CAPE_SRC_BBB_PACKET_FINDER_H_
+#define BBB_CAPE_SRC_BBB_PACKET_FINDER_H_
+
+#include <stdint.h>
+#include <string.h>
+
+#include "aos/common/logging/logging.h"
+#include "aos/common/time.h"
+#include "aos/common/macros.h"
+
+#include "bbb/byte_reader.h"
+
+namespace bbb {
+
+class PacketFinder {
+ public:
+  // *reader has to stay alive for the entire lifetime of this object but this
+  // object does not take ownership.
+  explicit PacketFinder(ByteReader *reader, size_t packet_size);
+  ~PacketFinder();
+
+  // Returns true if it succeeds or false if it gets an I/O error (or timeout)
+  // first.
+  // timeout_time is when this method should give up trying to read a packet and
+  // return false.
+  bool ReadPacket(const ::aos::time::Time &timeout_time);
+
+  // Gets a reference to the received packet.
+  // The most recent call to ReadPacket() must have returned true or the data
+  // pointed to is undefined.
+  template <typename T>
+  const T *get_packet() {
+    static_assert(alignof(T) <= alignof(*unstuffed_data_),
+                  "We need to align our data better.");
+    CHECK(sizeof(T) <= packet_size_ - 8);
+    return reinterpret_cast<const T *>(unstuffed_data_);
+  }
+
+ private:
+  typedef ByteReader::AlignedChar AlignedChar;
+
+  // Reads bytes until there are 4 zeros and then fills up buf_.
+  // Returns true if it finds one or false if it gets an I/O error first or the
+  // packet is invalid in some way.
+  bool FindPacket(const ::aos::time::Time &timeout_time);
+
+  // Processes a packet currently in buf_ and leaves the result in
+  // unstuffed_data_.
+  // Returns true if it succeeds or false if there was something wrong with the
+  // data.
+  bool ProcessPacket();
+
+  ByteReader *const reader_;
+  const size_t packet_size_;
+
+  AlignedChar *const buf_;
+  AlignedChar *const unstuffed_data_;
+
+  // How many bytes of the packet we've read in (or -1 if we don't know where
+  // the packet is).
+  int packet_bytes_ = -1;
+
+  // Whether we've increased the priority of the IRQ yet.
+  bool irq_priority_increased_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(PacketFinder);
+};
+
+}  // namespace bbb
+
+#endif
diff --git a/bbb_cape/src/bbb/packet_finder_test.cc b/bbb_cape/src/bbb/packet_finder_test.cc
new file mode 100644
index 0000000..437bf8d
--- /dev/null
+++ b/bbb_cape/src/bbb/packet_finder_test.cc
@@ -0,0 +1,125 @@
+#include "bbb/packet_finder.h"
+
+#include "gtest/gtest.h"
+
+#include "aos/common/queue_testutils.h"
+#include "aos/common/time.h"
+
+#include "bbb/byte_reader.h"
+
+namespace bbb {
+namespace testing {
+
+class PacketFinderTest : public ::testing::Test {
+ public:
+  void SetUp() override {
+    ::aos::common::testing::EnableTestLogging();
+  }
+};
+
+class TestByteReader : public ByteReader {
+ public:
+  TestByteReader(const void *data, size_t data_size)
+      : data_(data), data_size_(data_size), bytes_left_(data_size) {}
+
+  virtual ssize_t ReadBytes(AlignedChar *dest, size_t max_bytes,
+                            const ::aos::time::Time &/*timeout_time*/)
+      override {
+    size_t to_transfer = ::std::min(max_bytes, bytes_left_);
+    memcpy(dest, static_cast<const uint8_t *>(data_) + data_size_ - bytes_left_,
+           to_transfer);
+    bytes_left_ -= to_transfer;
+    return to_transfer;
+  }
+
+ private:
+  const void *const data_;
+  const size_t data_size_;
+  size_t bytes_left_;
+};
+
+TEST_F(PacketFinderTest, StupidZeros) {
+  static const uint8_t kTestData[] = {
+    0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x01, 0x00,
+    0x02, 0x00, 0x00, 0x00, 0x69, 0x3D, 0xE0, 0x03, 0x02, 0x00, 0x00, 0x00,
+    0x43, 0x5E, 0x12, 0x16, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x10, 0x00,
+    0x2A, 0x00, 0x1B, 0x00, 0x4E, 0x01, 0x72, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x04, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0x90, 0x01, 0x00, 0x20,
+    0x00, 0xED, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+    0x00, 0x38, 0x00, 0x40, 0x05, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+    0x00, 0x10, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0xED, 0x00, 0xE0,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+    0xFF, 0x8E, 0xFE, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+    0xD0, 0x07, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA1, 0x79, 0xE0, 0x03,
+    0x02, 0x00, 0x00, 0x00, 0x43, 0x5E, 0x12, 0x16, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x00,
+    0x00, 0x00, 0x10, 0x00, 0x29, 0x00, 0x1B, 0x00, 0x50, 0x01, 0x72, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF,
+    0x90, 0x01, 0x00, 0x20, 0x00, 0xED, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00,
+    0x05, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00,
+    0x00, 0xB0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+    0xF1, 0xFF, 0xFF, 0xFF, 0x00, 0x38, 0x00, 0x40, 0x00, 0x38, 0x00, 0x40,
+    0x82, 0x00, 0x00, 0x00, 0xE6, 0x6F, 0x7E, 0xC7, 0x00, 0x00, 0x00, 0x00,
+    0x02, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
+    0xDA, 0xB5, 0xE0, 0x03, 0x02, 0x00, 0x00, 0x00, 0x43, 0x5E, 0x12, 0x16,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+    0x02, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x10, 0x00, 0x2A, 0x00, 0x1B, 0x00,
+    0x50, 0x01, 0x72, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+    0xF1, 0xFF, 0xFF, 0xFF, 0x90, 0x01, 0x00, 0x20, 0x00, 0xED, 0x00, 0xE0,
+    0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40,
+    0x05, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+    0x06, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0x00, 0x38, 0x00, 0x40,
+    0x00, 0x38, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0xDD, 0xD1, 0x5D, 0x8E,
+    0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x01, 0x00,
+    0x02, 0x00, 0x00, 0x00, 0x13, 0xF2, 0xE0, 0x03, 0x02, 0x00, 0x00, 0x00,
+    0x43, 0x5E, 0x12, 0x16, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x10, 0x00,
+    0x29, 0x00, 0x1B, 0x00, 0x50, 0x01, 0x72, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x04, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0x90, 0x01, 0x00, 0x20,
+    0x00, 0xED, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+    0x00, 0x38, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00,
+    0x00, 0x10, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xED, 0x00, 0xE0,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+    0x68, 0x26, 0xC4, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+    0x00, 0x08, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4B, 0x2E, 0xE1, 0x03,
+    0x02, 0x00, 0x00, 0x00, 0x43, 0x5E, 0x12, 0x16, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x00,
+    0x00, 0x00, 0x10, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x50, 0x01, 0x72, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF,
+    0x90, 0x01, 0x00, 0x20, 0x00, 0xED, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00,
+    0x05, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00,
+    0x00, 0xC0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+    0xF1, 0xFF, 0xFF, 0xFF, 0x00, 0x38, 0x00, 0x40, 0x00, 0x38, 0x00, 0x40,
+    0x00, 0x38, 0x00, 0x40, 0xAD, 0x8B, 0x6A, 0x10, 0x00, 0x00, 0x00, 0x00,
+    0x02, 0x00, 0x00, 0x00, 0x10, 0x08, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
+    0x84, 0x6A, 0xE1, 0x03, 0x02, 0x00, 0x00, 0x00, 0x43, 0x5E, 0x12, 0x16,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+    0x02, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x29, 0x00, 0x1B, 0x00,
+    0x4E, 0x01, 0x72, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+    0xF1, 0xFF, 0xFF, 0xFF, 0x90, 0x01, 0x00, 0x20, 0x00, 0xED, 0x00, 0xE0,
+    0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40,
+    0x06, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+    0x39, 0x00, 0x00, 0x00, 0x00, 0xED, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xFC, 0x94, 0x39, 0xF5,
+    0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00
+  };
+  TestByteReader reader(kTestData, sizeof(kTestData));
+  PacketFinder packet_finder(&reader, 144);
+  EXPECT_TRUE(packet_finder.ReadPacket(::aos::time::Time(0, 0)));
+}
+
+}  // namespace testing
+}  // namespace bbb
diff --git a/bbb_cape/src/bbb/sensor_generation.q b/bbb_cape/src/bbb/sensor_generation.q
new file mode 100644
index 0000000..a121999
--- /dev/null
+++ b/bbb_cape/src/bbb/sensor_generation.q
@@ -0,0 +1,14 @@
+package bbb;
+
+// Each different set of values here represents a different set of sensor
+// values (ie different encoder zeros etc).
+message SensorGeneration {
+	// The PID of the process reading sensor values.
+	int32_t reader_pid;
+	// A count of how many times a sensor reading process sees the cape reset.
+	uint32_t cape_resets;
+};
+
+// A new message is placed on here by the process that reads sensor values each
+// time it starts up or detects the cape resetting.
+queue SensorGeneration sensor_generation;
diff --git a/bbb_cape/src/bbb/sensor_reader.cc b/bbb_cape/src/bbb/sensor_reader.cc
new file mode 100644
index 0000000..2c36ae3
--- /dev/null
+++ b/bbb_cape/src/bbb/sensor_reader.cc
@@ -0,0 +1,61 @@
+#include "bbb/sensor_reader.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <inttypes.h>
+
+#include "bbb/sensor_generation.q.h"
+
+namespace bbb {
+
+SensorReader::SensorReader(const ::std::string &/*cape_code*/)
+    : reader_(750000), packet_finder_(&reader_, DATA_STRUCT_SEND_SIZE - 4) {
+  static_assert(sizeof(SensorGeneration::reader_pid) >= sizeof(pid_t),
+                "pid_t is really big");
+  ResetHappened();
+}
+
+const DataStruct *SensorReader::ReadPacket() {
+  static constexpr ::aos::time::Time kTimeout =
+      ::aos::time::Time::InSeconds(0.5);
+
+  while (true) {
+    ::aos::time::Time next_timeout = last_received_time_ + kTimeout;
+    if (next_timeout <= ::aos::time::Time::Now()) {
+      LOG(WARNING, "too long since good packet received\n");
+      Reset(false);
+    }
+    if (packet_finder_.ReadPacket(next_timeout)) {
+      last_received_time_ = ::aos::time::Time::Now();
+      const DataStruct *data = packet_finder_.get_packet<DataStruct>();
+      // TODO(brians): Check the flash checksum and reflash it if necessary.
+      if (data->timestamp < last_cape_timestamp_) {
+        LOG(WARNING, "cape timestamp decreased: %" PRIu64 " to %" PRIu64 "\n",
+            last_cape_timestamp_, data->timestamp);
+        ResetHappened();
+      }
+      last_cape_timestamp_ = data->timestamp;
+      return data;
+    }
+    LOG(WARNING, "receiving packet failed\n");
+  }
+}
+
+::aos::time::Time SensorReader::GetCapeTimestamp() {
+  return ::aos::time::Time::InUS(last_cape_timestamp_ * 10);
+}
+
+void SensorReader::Reset(bool reflash) {
+  LOG(INFO, "Reset(%s)\n", reflash ? "true" : "false");
+  // TODO(brians): Actually reset it and maybe reflash it.
+  ResetHappened();
+}
+
+void SensorReader::ResetHappened() {
+  sensor_generation.MakeWithBuilder().reader_pid(getpid())
+      .cape_resets(cape_resets_++).Send();
+  last_received_time_ = ::aos::time::Time::Now();
+  last_cape_timestamp_ = 0;
+}
+
+}  // namespace bbb
diff --git a/bbb_cape/src/bbb/sensor_reader.h b/bbb_cape/src/bbb/sensor_reader.h
new file mode 100644
index 0000000..16b2496
--- /dev/null
+++ b/bbb_cape/src/bbb/sensor_reader.h
@@ -0,0 +1,50 @@
+#ifndef BBB_CAPE_SRC_BBB_SENSOR_READER_H_
+#define BBB_CAPE_SRC_BBB_SENSOR_READER_H_
+
+#include <string>
+
+#include "aos/common/time.h"
+
+#include "bbb/uart_reader.h"
+#include "bbb/packet_finder.h"
+#include "bbb/data_struct.h"
+
+namespace bbb {
+
+// A class that handles reading sensor values from the BBB cape.
+// Automatically handles the gyro data and exposes the other data for other code
+// to deal with.
+class SensorReader {
+ public:
+  // The relative priority that tasks doing this should get run at (ie what to
+  // pass to ::aos::Init(int)).
+  static const int kRelativePriority = 5;
+
+  // cape_code is the name of the code that should be deployed to the cape if
+  // it's not already there.
+  SensorReader(const ::std::string &cape_code);
+
+  // Reads in 1 data packet, handles the gyro data in it, and returns a pointer
+  // to it.
+  const DataStruct *ReadPacket();
+
+  // Returns the timestamp the cape sent with the most recently read packet.
+  ::aos::time::Time GetCapeTimestamp();
+
+ private:
+  // Resets the cape.
+  void Reset(bool reflash);
+  // Called after a reset happens.
+  void ResetHappened();
+
+  UartReader reader_;
+  PacketFinder packet_finder_;
+
+  int cape_resets_ = 0;
+  ::aos::time::Time last_received_time_ = ::aos::time::Time::InSeconds(0);
+  uint64_t last_cape_timestamp_;
+};
+
+}  // namespace bbb
+
+#endif  // BBB_CAPE_SRC_BBB_SENSOR_READER_H_
diff --git a/bbb_cape/src/bbb/uart_reader.cc b/bbb_cape/src/bbb/uart_reader.cc
new file mode 100644
index 0000000..cebe127
--- /dev/null
+++ b/bbb_cape/src/bbb/uart_reader.cc
@@ -0,0 +1,79 @@
+#include "bbb/uart_reader.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <linux/serial.h>
+#include <unistd.h>
+
+#include "aos/common/logging/logging.h"
+
+// This is the code for receiving data from the cape via UART.
+// NOTE: In order for this to work, you MUST HAVE
+// "capemgr.enable_partno=BB_UART1"
+// in your BBB's /media/BEAGLEBONE/uEnv.txt file!
+// `su -c "echo BB-UART1 > /sys/devices/bone_capemgr.*/slots"` works too, but
+// you have to do it every time.
+
+namespace bbb {
+namespace {
+// TODO(brians): Determine this in some way that allows easy switching for
+// testing with /dev/ttyUSB0 for example.
+const char *device = "/dev/ttyO1";
+}  // namespace
+
+extern "C" {
+
+// Sets all of the weird, annoying TTY flags on fd. In a separate file because
+// the structure it uses is so weird and annoying and carries so much baggage it
+// messes up all the #includes in whatever file it's used in.
+// Defined in uart_reader_termios2.c.
+extern int aos_uart_reader_set_tty_options(int fd, int baud_rate);
+
+}  // extern "C"
+
+UartReader::UartReader(int32_t baud_rate)
+    : fd_(open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)) {
+  
+  if (fd_ < 0) {
+    LOG(FATAL, "open(%s, O_RDWR | O_NOCTTY | O_NOBLOCK) failed with %d: %s."
+               " Did you read my note in bbb/uart_reader.cc?\n",
+        device, errno, strerror(errno));
+  }
+
+  if (aos_uart_reader_set_tty_options(fd_, baud_rate) != 0) {
+    LOG(FATAL, "aos_uart_reader_set_tty_options(%d) failed with %d: %s\n",
+        fd_, errno, strerror(errno));
+  }
+
+  FD_ZERO(&fd_set_);
+  FD_SET(fd_, &fd_set_);
+}
+
+UartReader::~UartReader() {
+  if (fd_ > 0) close(fd_);
+}
+
+ssize_t UartReader::ReadBytes(AlignedChar *dest, size_t max_bytes,
+                              const ::aos::time::Time &timeout_time) {
+  do {
+    ::aos::time::Time timeout = timeout_time - ::aos::time::Time::Now();
+    if (timeout < ::aos::time::Time(0, 0)) return -2;
+    struct timeval timeout_timeval = timeout.ToTimeval();
+    switch (select(fd_ + 1, &fd_set_, NULL, NULL, &timeout_timeval)) {
+      case 0:
+        return -2;
+      case -1:
+        continue;
+      case 1:
+        break;
+      default:
+        LOG(WARNING, "unknown select return value\n");
+        return -1;
+    }
+    ssize_t r = read(fd_, dest, max_bytes);
+    if (r != -1) return r;
+  } while (errno == EINTR);
+  return -1;
+}
+
+}  // namespace bbb
diff --git a/bbb_cape/src/bbb/uart_reader.h b/bbb_cape/src/bbb/uart_reader.h
new file mode 100644
index 0000000..c441167
--- /dev/null
+++ b/bbb_cape/src/bbb/uart_reader.h
@@ -0,0 +1,33 @@
+#ifndef BBB_CAPE_SRC_BBB_UART_READER_H_
+#define BBB_CAPE_SRC_BBB_UART_READER_H_
+
+#include <stdint.h>
+#include <string.h>
+#include <sys/select.h>
+
+#include "aos/common/time.h"
+#include "aos/common/macros.h"
+
+#include "bbb/byte_reader.h"
+
+namespace bbb {
+
+class UartReader : public ByteReader {
+ public:
+  UartReader(int32_t baud_rate);
+  virtual ~UartReader();
+
+  virtual ssize_t ReadBytes(AlignedChar *dest, size_t max_bytes,
+                            const ::aos::time::Time &timeout_time) override;
+
+ private:
+  const int fd_;
+  // Gets initialized to only contain fd_.
+  fd_set fd_set_;
+
+  DISALLOW_COPY_AND_ASSIGN(UartReader);
+};
+
+}  // namespace bbb
+
+#endif
diff --git a/bbb_cape/src/bbb/uart_reader_main.cc b/bbb_cape/src/bbb/uart_reader_main.cc
new file mode 100644
index 0000000..46c8a8e
--- /dev/null
+++ b/bbb_cape/src/bbb/uart_reader_main.cc
@@ -0,0 +1,43 @@
+#include <stdint.h>
+#include <inttypes.h>
+
+#include "aos/atom_code/init.h"
+#include "aos/common/logging/logging_impl.h"
+#include "aos/common/time.h"
+
+#include "bbb/uart_reader.h"
+#include "bbb/packet_finder.h"
+#include "bbb/data_struct.h"
+
+int main() {
+  ::aos::Init();
+
+  ::bbb::UartReader reader(750000);
+  ::bbb::PacketFinder receiver(&reader, DATA_STRUCT_SEND_SIZE - 4);
+
+  while (true) {
+    if (!receiver.ReadPacket(::aos::time::Time::Now() +
+                             ::aos::time::Time::InSeconds(1.5))) {
+      LOG(WARNING, "Could not read a packet.\n");
+      continue;
+    }
+
+    const ::bbb::DataStruct *packet = receiver.get_packet< ::bbb::DataStruct>();
+    LOG(DEBUG, "got one!\n");
+    LOG(DEBUG, "timestamp %" PRIu64 "\n", packet->timestamp);
+    LOG(DEBUG, "gyro old=%d uninit=%d z=%d bad=%d %" PRId64 " \n",
+        packet->old_gyro_reading, packet->uninitialized_gyro,
+        packet->zeroing_gyro, packet->bad_gyro, packet->gyro_angle);
+    for (int i = 0; i < 8; ++i) {
+      LOG(DEBUG, "enc[%d]=%" PRId32 "\n", i, packet->test.encoders[i]);
+      LOG(DEBUG, "adc[%d]=%f (%" PRIx16 ")\n", i,
+          3.3 * packet->test.analogs[i] / 0x3FF, packet->test.analogs[i]);
+    }
+    LOG(DEBUG, "digitals=%x\n", packet->test.digitals);
+    LOG(DEBUG, "+=%" PRId32 "/%" PRIu8 " and -=%" PRId32 "/%" PRIu8 "\n",
+        packet->test.posedge_value, packet->test.posedge_count,
+        packet->test.negedge_value, packet->test.negedge_count);
+  }
+
+  ::aos::Cleanup();
+}
diff --git a/bbb_cape/src/bbb/uart_reader_termios2.c b/bbb_cape/src/bbb/uart_reader_termios2.c
new file mode 100644
index 0000000..4ee609f
--- /dev/null
+++ b/bbb_cape/src/bbb/uart_reader_termios2.c
@@ -0,0 +1,46 @@
+// This file is to work around #include conflicts when including the kernel's
+// termios.h file to get the new termios2 struct.
+
+#include <asm/termios.h>
+
+// We can't even #include <sys/ioctl.h>...
+extern int ioctl(int d, int request, ...);
+
+int aos_uart_reader_set_tty_options(int fd, int baud_rate) {
+	struct termios2 options;
+	if (ioctl(fd, TCGETS2, &options) != 0) {
+    return -1;
+	}
+
+	options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR |
+											 ICRNL | IXON);
+	options.c_oflag &= ~OPOST;
+	options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
+	options.c_cflag &= ~(CSIZE | PARENB);
+	options.c_cflag |= CS8;
+
+	options.c_ispeed = baud_rate;
+	options.c_ospeed = baud_rate;
+	options.c_cflag = (options.c_cflag & ~CBAUD) | BOTHER;
+
+  options.c_cflag |= CLOCAL;  // ignore modem flow control
+  options.c_cflag |= CREAD;  // enable receiver
+  options.c_cflag &= ~CRTSCTS;  // disable flow control
+  //options.c_cflag |= PARENB;  // enable parity; defaults to even
+  options.c_cflag = (options.c_cflag & ~CSIZE) | CS8;  // 8 bits
+  options.c_cflag &= ~CSTOPB;  // 1 stop bit
+  options.c_iflag = 0;
+  // Replace any received characters with parity or framing errors with 0s.
+  options.c_iflag = (options.c_iflag & ~(IGNPAR | PARMRK)) | INPCK;
+  //options.c_iflag |= IGNCR | PARMRK;
+  options.c_oflag = 0;
+  options.c_lflag = 0;
+  options.c_cc[VMIN] = 20;
+  options.c_cc[VTIME] = 0;
+
+	if (ioctl(fd, TCSETS2, &options) != 0) {
+    return -1;
+	}
+
+  return 0;
+}
diff --git a/bbb_cape/src/cape/.gitignore b/bbb_cape/src/cape/.gitignore
new file mode 100644
index 0000000..01dd76a
--- /dev/null
+++ b/bbb_cape/src/cape/.gitignore
@@ -0,0 +1 @@
+.obj/
diff --git a/bbb_cape/src/cape/CMSIS/STM32F2XX.h b/bbb_cape/src/cape/CMSIS/STM32F2XX.h
new file mode 100644
index 0000000..0f676b0
--- /dev/null
+++ b/bbb_cape/src/cape/CMSIS/STM32F2XX.h
@@ -0,0 +1,6720 @@
+/**
+  ******************************************************************************
+  * @file    stm32f2xx.h
+  * @author  MCD Application Team
+  * @version V1.0.0
+  * @date    18-April-2011
+  * @brief   CMSIS Cortex-M3 Device Peripheral Access Layer Header File. 
+  *          This file contains all the peripheral register's definitions, bits 
+  *          definitions and memory mapping for STM32F2xx devices.
+  *            
+  *          The file is the unique include file that the application programmer
+  *          is using in the C source code, usually in main.c. This file contains:
+  *           - Configuration section that allows to select:
+  *           - Data structures and the address mapping for all peripherals
+  *           - Peripheral's registers declarations and bits definition
+  *           - Macros to access peripheralÂ’s registers hardware
+  *  
+  ******************************************************************************
+  * @attention
+  *
+  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+  *
+  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
+  ******************************************************************************  
+  */ 
+
+#ifndef __STM32F2xx_H
+#define __STM32F2xx_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif /* __cplusplus */
+  
+/**
+ * @brief STM32F2Xxx Standard Peripherals Library version number V1.0.0
+   */
+#define __STM32F2XX_STDPERIPH_VERSION_MAIN   (0x01) /*!< [31:24] main version */                                  
+#define __STM32F2XX_STDPERIPH_VERSION_SUB1   (0x00) /*!< [23:16] sub1 version */
+#define __STM32F2XX_STDPERIPH_VERSION_SUB2   (0x00) /*!< [15:8]  sub2 version */
+#define __STM32F2XX_STDPERIPH_VERSION_RC     (0x00) /*!< [7:0]  release candidate */ 
+#define __STM32F2XX_STDPERIPH_VERSION        ((__STM32F2XX_STDPERIPH_VERSION_MAIN << 24)\
+                                             |(__STM32F2XX_STDPERIPH_VERSION_SUB1 << 16)\
+                                             |(__STM32F2XX_STDPERIPH_VERSION_SUB2 << 8)\
+                                             |(__STM32F2XX_STDPERIPH_VERSION_RC))
+                                             
+/**
+ * @brief Configuration of the Cortex-M3 Processor and Core Peripherals 
+ */
+#define __MPU_PRESENT             1 /*!< STM32F2XX provide an MPU */
+#define __NVIC_PRIO_BITS          4 /*!< STM32F2XX uses 4 Bits for the Priority Levels */
+#define __Vendor_SysTickConfig    0 /*!< Set to 1 if different SysTick Config is used */
+
+/**
+ * @brief STM32F2XX Interrupt Number Definition, according to the selected device 
+ *        in @ref Library_configuration_section 
+ */
+typedef enum IRQn
+{
+/******  Cortex-M3 Processor Exceptions Numbers ****************************************************************/
+  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                                          */
+  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt                           */
+  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                                   */
+  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                                 */
+  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                                    */
+  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                              */
+  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                                    */
+  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                                */
+/******  STM32 specific Interrupt Numbers **********************************************************************/
+  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                                         */
+  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt                         */
+  TAMP_STAMP_IRQn             = 2,      /*!< Tamper and TimeStamp interrupts through the EXTI line             */
+  RTC_WKUP_IRQn               = 3,      /*!< RTC Wakeup interrupt through the EXTI line                        */
+  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                                            */
+  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                              */
+  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                              */
+  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                              */
+  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                              */
+  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                              */
+  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                              */
+  DMA1_Stream0_IRQn           = 11,     /*!< DMA1 Stream 0 global Interrupt                                    */
+  DMA1_Stream1_IRQn           = 12,     /*!< DMA1 Stream 1 global Interrupt                                    */
+  DMA1_Stream2_IRQn           = 13,     /*!< DMA1 Stream 2 global Interrupt                                    */
+  DMA1_Stream3_IRQn           = 14,     /*!< DMA1 Stream 3 global Interrupt                                    */
+  DMA1_Stream4_IRQn           = 15,     /*!< DMA1 Stream 4 global Interrupt                                    */
+  DMA1_Stream5_IRQn           = 16,     /*!< DMA1 Stream 5 global Interrupt                                    */
+  DMA1_Stream6_IRQn           = 17,     /*!< DMA1 Stream 6 global Interrupt                                    */
+  ADC_IRQn                    = 18,     /*!< ADC1, ADC2 and ADC3 global Interrupts                             */
+  CAN1_TX_IRQn                = 19,     /*!< CAN1 TX Interrupt                                                 */
+  CAN1_RX0_IRQn               = 20,     /*!< CAN1 RX0 Interrupt                                                */
+  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                                */
+  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                                */
+  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                                     */
+  TIM1_BRK_TIM9_IRQn          = 24,     /*!< TIM1 Break interrupt and TIM9 global interrupt                    */
+  TIM1_UP_TIM10_IRQn          = 25,     /*!< TIM1 Update Interrupt and TIM10 global interrupt                  */
+  TIM1_TRG_COM_TIM11_IRQn     = 26,     /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
+  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                                    */
+  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                             */
+  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                             */
+  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                             */
+  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                              */
+  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                              */
+  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                              */
+  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                              */  
+  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                             */
+  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                             */
+  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                                           */
+  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                                           */
+  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                                           */
+  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                                   */
+  RTC_Alarm_IRQn              = 41,     /*!< RTC Alarm (A and B) through EXTI Line Interrupt                   */
+  OTG_FS_WKUP_IRQn            = 42,     /*!< USB OTG FS Wakeup through EXTI line interrupt                     */    
+  TIM8_BRK_TIM12_IRQn         = 43,     /*!< TIM8 Break Interrupt and TIM12 global interrupt                   */
+  TIM8_UP_TIM13_IRQn          = 44,     /*!< TIM8 Update Interrupt and TIM13 global interrupt                  */
+  TIM8_TRG_COM_TIM14_IRQn     = 45,     /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */
+  TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                                    */
+  DMA1_Stream7_IRQn           = 47,     /*!< DMA1 Stream7 Interrupt                                            */
+  FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                             */
+  SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                             */
+  TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                             */
+  SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                             */
+  UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                                            */
+  UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                                            */
+  TIM6_DAC_IRQn               = 54,     /*!< TIM6 global and DAC1&2 underrun error  interrupts                 */
+  TIM7_IRQn                   = 55,     /*!< TIM7 global interrupt                                             */
+  DMA2_Stream0_IRQn           = 56,     /*!< DMA2 Stream 0 global Interrupt                                    */
+  DMA2_Stream1_IRQn           = 57,     /*!< DMA2 Stream 1 global Interrupt                                    */
+  DMA2_Stream2_IRQn           = 58,     /*!< DMA2 Stream 2 global Interrupt                                    */
+  DMA2_Stream3_IRQn           = 59,     /*!< DMA2 Stream 3 global Interrupt                                    */
+  DMA2_Stream4_IRQn           = 60,     /*!< DMA2 Stream 4 global Interrupt                                    */
+  ETH_IRQn                    = 61,     /*!< Ethernet global Interrupt                                         */
+  ETH_WKUP_IRQn               = 62,     /*!< Ethernet Wakeup through EXTI line Interrupt                       */
+  CAN2_TX_IRQn                = 63,     /*!< CAN2 TX Interrupt                                                 */
+  CAN2_RX0_IRQn               = 64,     /*!< CAN2 RX0 Interrupt                                                */
+  CAN2_RX1_IRQn               = 65,     /*!< CAN2 RX1 Interrupt                                                */
+  CAN2_SCE_IRQn               = 66,     /*!< CAN2 SCE Interrupt                                                */
+  OTG_FS_IRQn                 = 67,     /*!< USB OTG FS global Interrupt                                       */
+  DMA2_Stream5_IRQn           = 68,     /*!< DMA2 Stream 5 global interrupt                                    */
+  DMA2_Stream6_IRQn           = 69,     /*!< DMA2 Stream 6 global interrupt                                    */
+  DMA2_Stream7_IRQn           = 70,     /*!< DMA2 Stream 7 global interrupt                                    */
+  USART6_IRQn                 = 71,     /*!< USART6 global interrupt                                           */ 
+  I2C3_EV_IRQn                = 72,     /*!< I2C3 event interrupt                                              */
+  I2C3_ER_IRQn                = 73,     /*!< I2C3 error interrupt                                              */
+  OTG_HS_EP1_OUT_IRQn         = 74,     /*!< USB OTG HS End Point 1 Out global interrupt                       */
+  OTG_HS_EP1_IN_IRQn          = 75,     /*!< USB OTG HS End Point 1 In global interrupt                        */
+  OTG_HS_WKUP_IRQn            = 76,     /*!< USB OTG HS Wakeup through EXTI interrupt                          */
+  OTG_HS_IRQn                 = 77,     /*!< USB OTG HS global interrupt                                       */
+  DCMI_IRQn                   = 78,     /*!< DCMI global interrupt                                             */
+  CRYP_IRQn                   = 79,     /*!< CRYP crypto global interrupt                                      */
+  HASH_RNG_IRQn               = 80      /*!< Hash and Rng global interrupt                                     */
+} IRQn_Type;
+
+#include "core_cm3.h"
+#include <stdint.h>
+
+/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */
+typedef int32_t  s32;
+typedef int16_t s16;
+typedef int8_t  s8;
+
+typedef const int32_t sc32;  /*!< Read Only */
+typedef const int16_t sc16;  /*!< Read Only */
+typedef const int8_t sc8;   /*!< Read Only */
+
+typedef __IO int32_t  vs32;
+typedef __IO int16_t  vs16;
+typedef __IO int8_t   vs8;
+
+typedef __I int32_t vsc32;  /*!< Read Only */
+typedef __I int16_t vsc16;  /*!< Read Only */
+typedef __I int8_t vsc8;   /*!< Read Only */
+
+typedef uint32_t  u32;
+typedef uint16_t u16;
+typedef uint8_t  u8;
+
+typedef const uint32_t uc32;  /*!< Read Only */
+typedef const uint16_t uc16;  /*!< Read Only */
+typedef const uint8_t uc8;   /*!< Read Only */
+
+typedef __IO uint32_t  vu32;
+typedef __IO uint16_t vu16;
+typedef __IO uint8_t  vu8;
+
+typedef __I uint32_t vuc32;  /*!< Read Only */
+typedef __I uint16_t vuc16;  /*!< Read Only */
+typedef __I uint8_t vuc8;   /*!< Read Only */
+
+typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
+
+typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
+#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
+
+typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
+
+/** 
+  * @brief Analog to Digital Converter  
+  */
+
+typedef struct
+{
+  __IO uint32_t SR;     /*!< ADC status register,                         Address offset: 0x00 */
+  __IO uint32_t CR1;    /*!< ADC control register 1,                      Address offset: 0x04 */      
+  __IO uint32_t CR2;    /*!< ADC control register 2,                      Address offset: 0x08 */
+  __IO uint32_t SMPR1;  /*!< ADC sample time register 1,                  Address offset: 0x0C */
+  __IO uint32_t SMPR2;  /*!< ADC sample time register 2,                  Address offset: 0x10 */
+  __IO uint32_t JOFR1;  /*!< ADC injected channel data offset register 1, Address offset: 0x14 */
+  __IO uint32_t JOFR2;  /*!< ADC injected channel data offset register 2, Address offset: 0x18 */
+  __IO uint32_t JOFR3;  /*!< ADC injected channel data offset register 3, Address offset: 0x1C */
+  __IO uint32_t JOFR4;  /*!< ADC injected channel data offset register 4, Address offset: 0x20 */
+  __IO uint32_t HTR;    /*!< ADC watchdog higher threshold register,      Address offset: 0x24 */
+  __IO uint32_t LTR;    /*!< ADC watchdog lower threshold register,       Address offset: 0x28 */
+  __IO uint32_t SQR1;   /*!< ADC regular sequence register 1,             Address offset: 0x2C */
+  __IO uint32_t SQR2;   /*!< ADC regular sequence register 2,             Address offset: 0x30 */
+  __IO uint32_t SQR3;   /*!< ADC regular sequence register 3,             Address offset: 0x34 */
+  __IO uint32_t JSQR;   /*!< ADC injected sequence register,              Address offset: 0x38*/
+  __IO uint32_t JDR1;   /*!< ADC injected data register 1,                Address offset: 0x3C */
+  __IO uint32_t JDR2;   /*!< ADC injected data register 2,                Address offset: 0x40 */
+  __IO uint32_t JDR3;   /*!< ADC injected data register 3,                Address offset: 0x44 */
+  __IO uint32_t JDR4;   /*!< ADC injected data register 4,                Address offset: 0x48 */
+  __IO uint32_t DR;     /*!< ADC regular data register,                   Address offset: 0x4C */
+} ADC_TypeDef;
+
+typedef struct
+{
+  __IO uint32_t CSR;    /*!< ADC Common status register,                  Address offset: ADC1 base address + 0x300 */
+  __IO uint32_t CCR;    /*!< ADC common control register,                 Address offset: ADC1 base address + 0x304 */
+  __IO uint32_t CDR;    /*!< ADC common regular data register for dual
+                             AND triple modes,                            Address offset: ADC1 base address + 0x308 */
+} ADC_Common_TypeDef;
+
+
+/** 
+  * @brief Controller Area Network TxMailBox 
+  */
+
+typedef struct
+{
+  __IO uint32_t TIR;  /*!< CAN TX mailbox identifier register */
+  __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */
+  __IO uint32_t TDLR; /*!< CAN mailbox data low register */
+  __IO uint32_t TDHR; /*!< CAN mailbox data high register */
+} CAN_TxMailBox_TypeDef;
+
+/** 
+  * @brief Controller Area Network FIFOMailBox 
+  */
+  
+typedef struct
+{
+  __IO uint32_t RIR;  /*!< CAN receive FIFO mailbox identifier register */
+  __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */
+  __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */
+  __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */
+} CAN_FIFOMailBox_TypeDef;
+
+/** 
+  * @brief Controller Area Network FilterRegister 
+  */
+  
+typedef struct
+{
+  __IO uint32_t FR1; /*!< CAN Filter bank register 1 */
+  __IO uint32_t FR2; /*!< CAN Filter bank register 1 */
+} CAN_FilterRegister_TypeDef;
+
+/** 
+  * @brief Controller Area Network 
+  */
+  
+typedef struct
+{
+  __IO uint32_t              MCR;                 /*!< CAN master control register,         Address offset: 0x00          */
+  __IO uint32_t              MSR;                 /*!< CAN master status register,          Address offset: 0x04          */
+  __IO uint32_t              TSR;                 /*!< CAN transmit status register,        Address offset: 0x08          */
+  __IO uint32_t              RF0R;                /*!< CAN receive FIFO 0 register,         Address offset: 0x0C          */
+  __IO uint32_t              RF1R;                /*!< CAN receive FIFO 1 register,         Address offset: 0x10          */
+  __IO uint32_t              IER;                 /*!< CAN interrupt enable register,       Address offset: 0x14          */
+  __IO uint32_t              ESR;                 /*!< CAN error status register,           Address offset: 0x18          */
+  __IO uint32_t              BTR;                 /*!< CAN bit timing register,             Address offset: 0x1C          */
+  uint32_t                   RESERVED0[88];       /*!< Reserved, 0x020 - 0x17F                                            */
+  CAN_TxMailBox_TypeDef      sTxMailBox[3];       /*!< CAN Tx MailBox,                      Address offset: 0x180 - 0x1AC */
+  CAN_FIFOMailBox_TypeDef    sFIFOMailBox[2];     /*!< CAN FIFO MailBox,                    Address offset: 0x1B0 - 0x1CC */
+  uint32_t                   RESERVED1[12];       /*!< Reserved, 0x1D0 - 0x1FF                                            */
+  __IO uint32_t              FMR;                 /*!< CAN filter master register,          Address offset: 0x200         */
+  __IO uint32_t              FM1R;                /*!< CAN filter mode register,            Address offset: 0x204         */
+  uint32_t                   RESERVED2;           /*!< Reserved, 0x208                                                    */
+  __IO uint32_t              FS1R;                /*!< CAN filter scale register,           Address offset: 0x20C         */
+  uint32_t                   RESERVED3;           /*!< Reserved, 0x210                                                    */
+  __IO uint32_t              FFA1R;               /*!< CAN filter FIFO assignment register, Address offset: 0x214         */
+  uint32_t                   RESERVED4;           /*!< Reserved, 0x218                                                    */
+  __IO uint32_t              FA1R;                /*!< CAN filter activation register,      Address offset: 0x21C         */
+  uint32_t                   RESERVED5[8];        /*!< Reserved, 0x220-0x23F                                              */ 
+  CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register,                 Address offset: 0x240-0x31C   */
+} CAN_TypeDef;
+
+/** 
+  * @brief CRC calculation unit 
+  */
+
+typedef struct
+{
+  __IO uint32_t DR;         /*!< CRC Data register,             Address offset: 0x00 */
+  __IO uint8_t  IDR;        /*!< CRC Independent data register, Address offset: 0x04 */
+  uint8_t       RESERVED0;  /*!< Reserved, 0x05                                      */
+  uint16_t      RESERVED1;  /*!< Reserved, 0x06                                      */
+  __IO uint32_t CR;         /*!< CRC Control register,          Address offset: 0x08 */
+} CRC_TypeDef;
+
+/** 
+  * @brief Digital to Analog Converter
+  */
+
+typedef struct
+{
+  __IO uint32_t CR;       /*!< DAC control register,                                    Address offset: 0x00 */
+  __IO uint32_t SWTRIGR;  /*!< DAC software trigger register,                           Address offset: 0x04 */
+  __IO uint32_t DHR12R1;  /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */
+  __IO uint32_t DHR12L1;  /*!< DAC channel1 12-bit left aligned data holding register,  Address offset: 0x0C */
+  __IO uint32_t DHR8R1;   /*!< DAC channel1 8-bit right aligned data holding register,  Address offset: 0x10 */
+  __IO uint32_t DHR12R2;  /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */
+  __IO uint32_t DHR12L2;  /*!< DAC channel2 12-bit left aligned data holding register,  Address offset: 0x18 */
+  __IO uint32_t DHR8R2;   /*!< DAC channel2 8-bit right-aligned data holding register,  Address offset: 0x1C */
+  __IO uint32_t DHR12RD;  /*!< Dual DAC 12-bit right-aligned data holding register,     Address offset: 0x20 */
+  __IO uint32_t DHR12LD;  /*!< DUAL DAC 12-bit left aligned data holding register,      Address offset: 0x24 */
+  __IO uint32_t DHR8RD;   /*!< DUAL DAC 8-bit right aligned data holding register,      Address offset: 0x28 */
+  __IO uint32_t DOR1;     /*!< DAC channel1 data output register,                       Address offset: 0x2C */
+  __IO uint32_t DOR2;     /*!< DAC channel2 data output register,                       Address offset: 0x30 */
+  __IO uint32_t SR;       /*!< DAC status register,                                     Address offset: 0x34 */
+} DAC_TypeDef;
+
+/** 
+  * @brief Debug MCU
+  */
+
+typedef struct
+{
+  __IO uint32_t IDCODE;  /*!< MCU device ID code,               Address offset: 0x00 */
+  __IO uint32_t CR;      /*!< Debug MCU configuration register, Address offset: 0x04 */
+  __IO uint32_t APB1FZ;  /*!< Debug MCU APB1 freeze register,   Address offset: 0x08 */
+  __IO uint32_t APB2FZ;  /*!< Debug MCU APB2 freeze register,   Address offset: 0x0C */
+}DBGMCU_TypeDef;
+
+/** 
+  * @brief DCMI
+  */
+
+typedef struct
+{
+  __IO uint32_t CR;       /*!< DCMI control register 1,                       Address offset: 0x00 */
+  __IO uint32_t SR;       /*!< DCMI status register,                          Address offset: 0x04 */
+  __IO uint32_t RISR;     /*!< DCMI raw interrupt status register,            Address offset: 0x08 */
+  __IO uint32_t IER;      /*!< DCMI interrupt enable register,                Address offset: 0x0C */
+  __IO uint32_t MISR;     /*!< DCMI masked interrupt status register,         Address offset: 0x10 */
+  __IO uint32_t ICR;      /*!< DCMI interrupt clear register,                 Address offset: 0x14 */
+  __IO uint32_t ESCR;     /*!< DCMI embedded synchronization code register,   Address offset: 0x18 */
+  __IO uint32_t ESUR;     /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */
+  __IO uint32_t CWSTRTR;  /*!< DCMI crop window start,                        Address offset: 0x20 */
+  __IO uint32_t CWSIZER;  /*!< DCMI crop window size,                         Address offset: 0x24 */
+  __IO uint32_t DR;       /*!< DCMI data register,                            Address offset: 0x28 */
+} DCMI_TypeDef;
+
+/** 
+  * @brief DMA Controller
+  */
+
+typedef struct
+{
+  __IO uint32_t CR;     /*!< DMA stream x configuration register      */
+  __IO uint32_t NDTR;   /*!< DMA stream x number of data register     */
+  __IO uint32_t PAR;    /*!< DMA stream x peripheral address register */
+  __IO uint32_t M0AR;   /*!< DMA stream x memory 0 address register   */
+  __IO uint32_t M1AR;   /*!< DMA stream x memory 1 address register   */
+  __IO uint32_t FCR;    /*!< DMA stream x FIFO control register       */
+} DMA_Stream_TypeDef;
+
+typedef struct
+{
+  __IO uint32_t LISR;   /*!< DMA low interrupt status register,      Address offset: 0x00 */
+  __IO uint32_t HISR;   /*!< DMA high interrupt status register,     Address offset: 0x04 */
+  __IO uint32_t LIFCR;  /*!< DMA low interrupt flag clear register,  Address offset: 0x08 */
+  __IO uint32_t HIFCR;  /*!< DMA high interrupt flag clear register, Address offset: 0x0C */
+} DMA_TypeDef;
+
+/** 
+  * @brief Ethernet MAC
+  */
+
+typedef struct
+{
+  __IO uint32_t MACCR;
+  __IO uint32_t MACFFR;
+  __IO uint32_t MACHTHR;
+  __IO uint32_t MACHTLR;
+  __IO uint32_t MACMIIAR;
+  __IO uint32_t MACMIIDR;
+  __IO uint32_t MACFCR;
+  __IO uint32_t MACVLANTR;             /*    8 */
+  uint32_t      RESERVED0[2];
+  __IO uint32_t MACRWUFFR;             /*   11 */
+  __IO uint32_t MACPMTCSR;
+  uint32_t      RESERVED1[2];
+  __IO uint32_t MACSR;                 /*   15 */
+  __IO uint32_t MACIMR;
+  __IO uint32_t MACA0HR;
+  __IO uint32_t MACA0LR;
+  __IO uint32_t MACA1HR;
+  __IO uint32_t MACA1LR;
+  __IO uint32_t MACA2HR;
+  __IO uint32_t MACA2LR;
+  __IO uint32_t MACA3HR;
+  __IO uint32_t MACA3LR;               /*   24 */
+  uint32_t      RESERVED2[40];
+  __IO uint32_t MMCCR;                 /*   65 */
+  __IO uint32_t MMCRIR;
+  __IO uint32_t MMCTIR;
+  __IO uint32_t MMCRIMR;
+  __IO uint32_t MMCTIMR;               /*   69 */
+  uint32_t      RESERVED3[14];
+  __IO uint32_t MMCTGFSCCR;            /*   84 */
+  __IO uint32_t MMCTGFMSCCR;
+  uint32_t      RESERVED4[5];
+  __IO uint32_t MMCTGFCR;
+  uint32_t      RESERVED5[10];
+  __IO uint32_t MMCRFCECR;
+  __IO uint32_t MMCRFAECR;
+  uint32_t      RESERVED6[10];
+  __IO uint32_t MMCRGUFCR;
+  uint32_t      RESERVED7[334];
+  __IO uint32_t PTPTSCR;
+  __IO uint32_t PTPSSIR;
+  __IO uint32_t PTPTSHR;
+  __IO uint32_t PTPTSLR;
+  __IO uint32_t PTPTSHUR;
+  __IO uint32_t PTPTSLUR;
+  __IO uint32_t PTPTSAR;
+  __IO uint32_t PTPTTHR;
+  __IO uint32_t PTPTTLR;
+  __IO uint32_t RESERVED8;
+  __IO uint32_t PTPTSSR;  /* added for STM32F2xx */
+  uint32_t      RESERVED9[565];
+  __IO uint32_t DMABMR;
+  __IO uint32_t DMATPDR;
+  __IO uint32_t DMARPDR;
+  __IO uint32_t DMARDLAR;
+  __IO uint32_t DMATDLAR;
+  __IO uint32_t DMASR;
+  __IO uint32_t DMAOMR;
+  __IO uint32_t DMAIER;
+  __IO uint32_t DMAMFBOCR;
+  __IO uint32_t DMARSWTR;  /* added for STM32F2xx */
+  uint32_t      RESERVED10[8];
+  __IO uint32_t DMACHTDR;
+  __IO uint32_t DMACHRDR;
+  __IO uint32_t DMACHTBAR;
+  __IO uint32_t DMACHRBAR;
+} ETH_TypeDef;
+
+/** 
+  * @brief External Interrupt/Event Controller
+  */
+
+typedef struct
+{
+  __IO uint32_t IMR;    /*!< EXTI Interrupt mask register,            Address offset: 0x00 */
+  __IO uint32_t EMR;    /*!< EXTI Event mask register,                Address offset: 0x04 */
+  __IO uint32_t RTSR;   /*!< EXTI Rising trigger selection register,  Address offset: 0x08 */
+  __IO uint32_t FTSR;   /*!< EXTI Falling trigger selection register, Address offset: 0x0C */
+  __IO uint32_t SWIER;  /*!< EXTI Software interrupt event register,  Address offset: 0x10 */
+  __IO uint32_t PR;     /*!< EXTI Pending register,                   Address offset: 0x14 */
+} EXTI_TypeDef;
+
+/** 
+  * @brief FLASH Registers
+  */
+
+typedef struct
+{
+  __IO uint32_t ACR;      /*!< FLASH access control register, Address offset: 0x00 */
+  __IO uint32_t KEYR;     /*!< FLASH key register,            Address offset: 0x04 */
+  __IO uint32_t OPTKEYR;  /*!< FLASH option key register,     Address offset: 0x08 */
+  __IO uint32_t SR;       /*!< FLASH status register,         Address offset: 0x0C */
+  __IO uint32_t CR;       /*!< FLASH control register,        Address offset: 0x10 */
+  __IO uint32_t OPTCR;    /*!< FLASH option control register, Address offset: 0x14 */
+} FLASH_TypeDef;
+
+/** 
+  * @brief Flexible Static Memory Controller
+  */
+
+typedef struct
+{
+  __IO uint32_t BTCR[8];    /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */   
+} FSMC_Bank1_TypeDef; 
+
+/** 
+  * @brief Flexible Static Memory Controller Bank1E
+  */
+  
+typedef struct
+{
+  __IO uint32_t BWTR[7];    /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */
+} FSMC_Bank1E_TypeDef;
+
+/** 
+  * @brief Flexible Static Memory Controller Bank2
+  */
+  
+typedef struct
+{
+  __IO uint32_t PCR2;       /*!< NAND Flash control register 2,                       Address offset: 0x60 */
+  __IO uint32_t SR2;        /*!< NAND Flash FIFO status and interrupt register 2,     Address offset: 0x64 */
+  __IO uint32_t PMEM2;      /*!< NAND Flash Common memory space timing register 2,    Address offset: 0x68 */
+  __IO uint32_t PATT2;      /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */
+  uint32_t      RESERVED0;  /*!< Reserved, 0x70                                                            */
+  __IO uint32_t ECCR2;      /*!< NAND Flash ECC result registers 2,                   Address offset: 0x74 */
+} FSMC_Bank2_TypeDef;
+
+/** 
+  * @brief Flexible Static Memory Controller Bank3
+  */
+  
+typedef struct
+{
+  __IO uint32_t PCR3;       /*!< NAND Flash control register 3,                       Address offset: 0x80 */
+  __IO uint32_t SR3;        /*!< NAND Flash FIFO status and interrupt register 3,     Address offset: 0x84 */
+  __IO uint32_t PMEM3;      /*!< NAND Flash Common memory space timing register 3,    Address offset: 0x88 */
+  __IO uint32_t PATT3;      /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */
+  uint32_t      RESERVED0;  /*!< Reserved, 0x90                                                            */
+  __IO uint32_t ECCR3;      /*!< NAND Flash ECC result registers 3,                   Address offset: 0x94 */
+} FSMC_Bank3_TypeDef;
+
+/** 
+  * @brief Flexible Static Memory Controller Bank4
+  */
+  
+typedef struct
+{
+  __IO uint32_t PCR4;       /*!< PC Card  control register 4,                       Address offset: 0xA0 */
+  __IO uint32_t SR4;        /*!< PC Card  FIFO status and interrupt register 4,     Address offset: 0xA4 */
+  __IO uint32_t PMEM4;      /*!< PC Card  Common memory space timing register 4,    Address offset: 0xA8 */
+  __IO uint32_t PATT4;      /*!< PC Card  Attribute memory space timing register 4, Address offset: 0xAC */
+  __IO uint32_t PIO4;       /*!< PC Card  I/O space timing register 4,              Address offset: 0xB0 */
+} FSMC_Bank4_TypeDef; 
+
+/** 
+  * @brief General Purpose I/O
+  */
+
+typedef struct
+{
+  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
+  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
+  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
+  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
+  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
+  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
+  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
+  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
+  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
+  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x24-0x28 */
+} GPIO_TypeDef;
+
+/** 
+  * @brief System configuration controller
+  */
+  
+typedef struct
+{
+  __IO uint32_t MEMRMP;       /*!< SYSCFG memory remap register,                      Address offset: 0x00      */
+  __IO uint32_t PMC;          /*!< SYSCFG peripheral mode configuration register,     Address offset: 0x04      */
+  __IO uint32_t EXTICR[4];    /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */
+  uint32_t      RESERVED[2];  /*!< Reserved, 0x18-0x1C                                                          */ 
+  __IO uint32_t CMPCR;        /*!< SYSCFG Compensation cell control register,         Address offset: 0x20      */
+} SYSCFG_TypeDef;
+
+/** 
+  * @brief Inter-integrated Circuit Interface
+  */
+
+typedef struct
+{
+  __IO uint16_t CR1;        /*!< I2C Control register 1,     Address offset: 0x00 */
+  uint16_t      RESERVED0;  /*!< Reserved, 0x02                                   */
+  __IO uint16_t CR2;        /*!< I2C Control register 2,     Address offset: 0x04 */
+  uint16_t      RESERVED1;  /*!< Reserved, 0x06                                   */
+  __IO uint16_t OAR1;       /*!< I2C Own address register 1, Address offset: 0x08 */
+  uint16_t      RESERVED2;  /*!< Reserved, 0x0A                                   */
+  __IO uint16_t OAR2;       /*!< I2C Own address register 2, Address offset: 0x0C */
+  uint16_t      RESERVED3;  /*!< Reserved, 0x0E                                   */
+  __IO uint16_t DR;         /*!< I2C Data register,          Address offset: 0x10 */
+  uint16_t      RESERVED4;  /*!< Reserved, 0x12                                   */
+  __IO uint16_t SR1;        /*!< I2C Status register 1,      Address offset: 0x14 */
+  uint16_t      RESERVED5;  /*!< Reserved, 0x16                                   */
+  __IO uint16_t SR2;        /*!< I2C Status register 2,      Address offset: 0x18 */
+  uint16_t      RESERVED6;  /*!< Reserved, 0x1A                                   */
+  __IO uint16_t CCR;        /*!< I2C Clock control register, Address offset: 0x1C */
+  uint16_t      RESERVED7;  /*!< Reserved, 0x1E                                   */
+  __IO uint16_t TRISE;      /*!< I2C TRISE register,         Address offset: 0x20 */
+  uint16_t      RESERVED8;  /*!< Reserved, 0x22                                   */
+} I2C_TypeDef;
+
+/** 
+  * @brief Independent WATCHDOG
+  */
+
+typedef struct
+{
+  __IO uint32_t KR;   /*!< IWDG Key register,       Address offset: 0x00 */
+  __IO uint32_t PR;   /*!< IWDG Prescaler register, Address offset: 0x04 */
+  __IO uint32_t RLR;  /*!< IWDG Reload register,    Address offset: 0x08 */
+  __IO uint32_t SR;   /*!< IWDG Status register,    Address offset: 0x0C */
+} IWDG_TypeDef;
+
+/** 
+  * @brief Power Control
+  */
+
+typedef struct
+{
+  __IO uint32_t CR;   /*!< PWR power control register,        Address offset: 0x00 */
+  __IO uint32_t CSR;  /*!< PWR power control/status register, Address offset: 0x04 */
+} PWR_TypeDef;
+
+/** 
+  * @brief Reset and Clock Control
+  */
+
+typedef struct
+{
+  __IO uint32_t CR;            /*!< RCC clock control register,                                  Address offset: 0x00 */
+  __IO uint32_t PLLCFGR;       /*!< RCC PLL configuration register,                              Address offset: 0x04 */
+  __IO uint32_t CFGR;          /*!< RCC clock configuration register,                            Address offset: 0x08 */
+  __IO uint32_t CIR;           /*!< RCC clock interrupt register,                                Address offset: 0x0C */
+  __IO uint32_t AHB1RSTR;      /*!< RCC AHB1 peripheral reset register,                          Address offset: 0x10 */
+  __IO uint32_t AHB2RSTR;      /*!< RCC AHB2 peripheral reset register,                          Address offset: 0x14 */
+  __IO uint32_t AHB3RSTR;      /*!< RCC AHB3 peripheral reset register,                          Address offset: 0x18 */
+  uint32_t      RESERVED0;     /*!< Reserved, 0x1C                                                                    */
+  __IO uint32_t APB1RSTR;      /*!< RCC APB1 peripheral reset register,                          Address offset: 0x20 */
+  __IO uint32_t APB2RSTR;      /*!< RCC APB2 peripheral reset register,                          Address offset: 0x24 */
+  uint32_t      RESERVED1[2];  /*!< Reserved, 0x28-0x2C                                                               */
+  __IO uint32_t AHB1ENR;       /*!< RCC AHB1 peripheral clock register,                          Address offset: 0x30 */
+  __IO uint32_t AHB2ENR;       /*!< RCC AHB2 peripheral clock register,                          Address offset: 0x34 */
+  __IO uint32_t AHB3ENR;       /*!< RCC AHB3 peripheral clock register,                          Address offset: 0x38 */
+  uint32_t      RESERVED2;     /*!< Reserved, 0x3C                                                                    */
+  __IO uint32_t APB1ENR;       /*!< RCC APB1 peripheral clock enable register,                   Address offset: 0x40 */
+  __IO uint32_t APB2ENR;       /*!< RCC APB2 peripheral clock enable register,                   Address offset: 0x44 */
+  uint32_t      RESERVED3[2];  /*!< Reserved, 0x48-0x4C                                                               */
+  __IO uint32_t AHB1LPENR;     /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */
+  __IO uint32_t AHB2LPENR;     /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */
+  __IO uint32_t AHB3LPENR;     /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */
+  uint32_t      RESERVED4;     /*!< Reserved, 0x5C                                                                    */
+  __IO uint32_t APB1LPENR;     /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */
+  __IO uint32_t APB2LPENR;     /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */
+  uint32_t      RESERVED5[2];  /*!< Reserved, 0x68-0x6C                                                               */
+  __IO uint32_t BDCR;          /*!< RCC Backup domain control register,                          Address offset: 0x70 */
+  __IO uint32_t CSR;           /*!< RCC clock control & status register,                         Address offset: 0x74 */
+  uint32_t      RESERVED6[2];  /*!< Reserved, 0x78-0x7C                                                               */
+  __IO uint32_t SSCGR;         /*!< RCC spread spectrum clock generation register,               Address offset: 0x80 */
+  __IO uint32_t PLLI2SCFGR;    /*!< RCC PLLI2S configuration register,                           Address offset: 0x84 */
+} RCC_TypeDef;
+
+/** 
+  * @brief Real-Time Clock
+  */
+
+typedef struct
+{
+  __IO uint32_t TR;      /*!< RTC time register,                                        Address offset: 0x00 */
+  __IO uint32_t DR;      /*!< RTC date register,                                        Address offset: 0x04 */
+  __IO uint32_t CR;      /*!< RTC control register,                                     Address offset: 0x08 */
+  __IO uint32_t ISR;     /*!< RTC initialization and status register,                   Address offset: 0x0C */
+  __IO uint32_t PRER;    /*!< RTC prescaler register,                                   Address offset: 0x10 */
+  __IO uint32_t WUTR;    /*!< RTC wakeup timer register,                                Address offset: 0x14 */
+  __IO uint32_t CALIBR;  /*!< RTC calibration register,                                 Address offset: 0x18 */
+  __IO uint32_t ALRMAR;  /*!< RTC alarm A register,                                     Address offset: 0x1C */
+  __IO uint32_t ALRMBR;  /*!< RTC alarm B register,                                     Address offset: 0x20 */
+  __IO uint32_t WPR;     /*!< RTC write protection register,                            Address offset: 0x24 */
+  uint32_t RESERVED1;    /*!< Reserved, 0x28                                                                 */
+  uint32_t RESERVED2;    /*!< Reserved, 0x2C                                                                 */
+  __IO uint32_t TSTR;    /*!< RTC time stamp time register,                             Address offset: 0x30 */
+  __IO uint32_t TSDR;    /*!< RTC time stamp date register,                             Address offset: 0x34 */
+  uint32_t RESERVED3;    /*!< Reserved, 0x38                                                                 */
+  uint32_t RESERVED4;    /*!< Reserved, 0x3C                                                                 */
+  __IO uint32_t TAFCR;   /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */
+  uint32_t RESERVED5;    /*!< Reserved, 0x44                                                                 */
+  uint32_t RESERVED6;    /*!< Reserved, 0x48                                                                 */
+  uint32_t RESERVED7;    /*!< Reserved, 0x4C                                                                 */
+  __IO uint32_t BKP0R;   /*!< RTC backup register 1,                                    Address offset: 0x50 */
+  __IO uint32_t BKP1R;   /*!< RTC backup register 1,                                    Address offset: 0x54 */
+  __IO uint32_t BKP2R;   /*!< RTC backup register 2,                                    Address offset: 0x58 */
+  __IO uint32_t BKP3R;   /*!< RTC backup register 3,                                    Address offset: 0x5C */
+  __IO uint32_t BKP4R;   /*!< RTC backup register 4,                                    Address offset: 0x60 */
+  __IO uint32_t BKP5R;   /*!< RTC backup register 5,                                    Address offset: 0x64 */
+  __IO uint32_t BKP6R;   /*!< RTC backup register 6,                                    Address offset: 0x68 */
+  __IO uint32_t BKP7R;   /*!< RTC backup register 7,                                    Address offset: 0x6C */
+  __IO uint32_t BKP8R;   /*!< RTC backup register 8,                                    Address offset: 0x70 */
+  __IO uint32_t BKP9R;   /*!< RTC backup register 9,                                    Address offset: 0x74 */
+  __IO uint32_t BKP10R;  /*!< RTC backup register 10,                                   Address offset: 0x78 */
+  __IO uint32_t BKP11R;  /*!< RTC backup register 11,                                   Address offset: 0x7C */
+  __IO uint32_t BKP12R;  /*!< RTC backup register 12,                                   Address offset: 0x80 */
+  __IO uint32_t BKP13R;  /*!< RTC backup register 13,                                   Address offset: 0x84 */
+  __IO uint32_t BKP14R;  /*!< RTC backup register 14,                                   Address offset: 0x88 */
+  __IO uint32_t BKP15R;  /*!< RTC backup register 15,                                   Address offset: 0x8C */
+  __IO uint32_t BKP16R;  /*!< RTC backup register 16,                                   Address offset: 0x90 */
+  __IO uint32_t BKP17R;  /*!< RTC backup register 17,                                   Address offset: 0x94 */
+  __IO uint32_t BKP18R;  /*!< RTC backup register 18,                                   Address offset: 0x98 */
+  __IO uint32_t BKP19R;  /*!< RTC backup register 19,                                   Address offset: 0x9C */
+} RTC_TypeDef;
+
+/** 
+  * @brief SD host Interface
+  */
+
+typedef struct
+{
+  __IO uint32_t POWER;          /*!< SDIO power control register,    Address offset: 0x00 */
+  __IO uint32_t CLKCR;          /*!< SDI clock control register,     Address offset: 0x04 */
+  __IO uint32_t ARG;            /*!< SDIO argument register,         Address offset: 0x08 */
+  __IO uint32_t CMD;            /*!< SDIO command register,          Address offset: 0x0C */
+  __I uint32_t  RESPCMD;        /*!< SDIO command response register, Address offset: 0x10 */
+  __I uint32_t  RESP1;          /*!< SDIO response 1 register,       Address offset: 0x14 */
+  __I uint32_t  RESP2;          /*!< SDIO response 2 register,       Address offset: 0x18 */
+  __I uint32_t  RESP3;          /*!< SDIO response 3 register,       Address offset: 0x1C */
+  __I uint32_t  RESP4;          /*!< SDIO response 4 register,       Address offset: 0x20 */
+  __IO uint32_t DTIMER;         /*!< SDIO data timer register,       Address offset: 0x24 */
+  __IO uint32_t DLEN;           /*!< SDIO data length register,      Address offset: 0x28 */
+  __IO uint32_t DCTRL;          /*!< SDIO data control register,     Address offset: 0x2C */
+  __I uint32_t  DCOUNT;         /*!< SDIO data counter register,     Address offset: 0x30 */
+  __I uint32_t  STA;            /*!< SDIO status register,           Address offset: 0x34 */
+  __IO uint32_t ICR;            /*!< SDIO interrupt clear register,  Address offset: 0x38 */
+  __IO uint32_t MASK;           /*!< SDIO mask register,             Address offset: 0x3C */
+  uint32_t      RESERVED0[2];   /*!< Reserved, 0x40-0x44                                  */
+  __I uint32_t  FIFOCNT;        /*!< SDIO FIFO counter register,     Address offset: 0x48 */
+  uint32_t      RESERVED1[13];  /*!< Reserved, 0x4C-0x7C                                  */
+  __IO uint32_t FIFO;           /*!< SDIO data FIFO register,        Address offset: 0x80 */
+} SDIO_TypeDef;
+
+/** 
+  * @brief Serial Peripheral Interface
+  */
+
+typedef struct
+{
+  __IO uint16_t CR1;        /*!< SPI control register 1 (not used in I2S mode),      Address offset: 0x00 */
+  uint16_t      RESERVED0;  /*!< Reserved, 0x02                                                           */
+  __IO uint16_t CR2;        /*!< SPI control register 2,                             Address offset: 0x04 */
+  uint16_t      RESERVED1;  /*!< Reserved, 0x06                                                           */
+  __IO uint16_t SR;         /*!< SPI status register,                                Address offset: 0x08 */
+  uint16_t      RESERVED2;  /*!< Reserved, 0x0A                                                           */
+  __IO uint16_t DR;         /*!< SPI data register,                                  Address offset: 0x0C */
+  uint16_t      RESERVED3;  /*!< Reserved, 0x0E                                                           */
+  __IO uint16_t CRCPR;      /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */
+  uint16_t      RESERVED4;  /*!< Reserved, 0x12                                                           */
+  __IO uint16_t RXCRCR;     /*!< SPI RX CRC register (not used in I2S mode),         Address offset: 0x14 */
+  uint16_t      RESERVED5;  /*!< Reserved, 0x16                                                           */
+  __IO uint16_t TXCRCR;     /*!< SPI TX CRC register (not used in I2S mode),         Address offset: 0x18 */
+  uint16_t      RESERVED6;  /*!< Reserved, 0x1A                                                           */
+  __IO uint16_t I2SCFGR;    /*!< SPI_I2S configuration register,                     Address offset: 0x1C */
+  uint16_t      RESERVED7;  /*!< Reserved, 0x1E                                                           */
+  __IO uint16_t I2SPR;      /*!< SPI_I2S prescaler register,                         Address offset: 0x20 */
+  uint16_t      RESERVED8;  /*!< Reserved, 0x22                                                           */
+} SPI_TypeDef;
+
+typedef struct
+{
+  __IO uint16_t CR1;         /*!< TIM control register 1,              Address offset: 0x00 */
+  uint16_t      RESERVED0;   /*!< Reserved, 0x02                                            */
+  __IO uint16_t CR2;         /*!< TIM control register 2,              Address offset: 0x04 */
+  uint16_t      RESERVED1;   /*!< Reserved, 0x06                                            */
+  __IO uint16_t SMCR;        /*!< TIM slave mode control register,     Address offset: 0x08 */
+  uint16_t      RESERVED2;   /*!< Reserved, 0x0A                                            */
+  __IO uint16_t DIER;        /*!< TIM DMA/interrupt enable register,   Address offset: 0x0C */
+  uint16_t      RESERVED3;   /*!< Reserved, 0x0E                                            */
+  __IO uint16_t SR;          /*!< TIM status register,                 Address offset: 0x10 */
+  uint16_t      RESERVED4;   /*!< Reserved, 0x12                                            */
+  __IO uint16_t EGR;         /*!< TIM event generation register,       Address offset: 0x14 */
+  uint16_t      RESERVED5;   /*!< Reserved, 0x16                                            */
+  __IO uint16_t CCMR1;       /*!< TIM capture/compare mode register 1, Address offset: 0x18 */
+  uint16_t      RESERVED6;   /*!< Reserved, 0x1A                                            */
+  __IO uint16_t CCMR2;       /*!< TIM capture/compare mode register 2, Address offset: 0x1C */
+  uint16_t      RESERVED7;   /*!< Reserved, 0x1E                                            */
+  __IO uint16_t CCER;        /*!< TIM capture/compare enable register, Address offset: 0x20 */
+  uint16_t      RESERVED8;   /*!< Reserved, 0x22                                            */
+  __IO uint32_t CNT;         /*!< TIM counter register,                Address offset: 0x24 */
+  __IO uint16_t PSC;         /*!< TIM prescaler,                       Address offset: 0x28 */
+  uint16_t      RESERVED9;   /*!< Reserved, 0x2A                                            */
+  __IO uint32_t ARR;         /*!< TIM auto-reload register,            Address offset: 0x2C */
+  __IO uint16_t RCR;         /*!< TIM repetition counter register,     Address offset: 0x30 */
+  uint16_t      RESERVED10;  /*!< Reserved, 0x32                                            */
+  __IO uint32_t CCR1;        /*!< TIM capture/compare register 1,      Address offset: 0x34 */
+  __IO uint32_t CCR2;        /*!< TIM capture/compare register 2,      Address offset: 0x38 */
+  __IO uint32_t CCR3;        /*!< TIM capture/compare register 3,      Address offset: 0x3C */
+  __IO uint32_t CCR4;        /*!< TIM capture/compare register 4,      Address offset: 0x40 */
+  __IO uint16_t BDTR;        /*!< TIM break and dead-time register,    Address offset: 0x44 */
+  uint16_t      RESERVED11;  /*!< Reserved, 0x46                                            */
+  __IO uint16_t DCR;         /*!< TIM DMA control register,            Address offset: 0x48 */
+  uint16_t      RESERVED12;  /*!< Reserved, 0x4A                                            */
+  __IO uint16_t DMAR;        /*!< TIM DMA address for full transfer,   Address offset: 0x4C */
+  uint16_t      RESERVED13;  /*!< Reserved, 0x4E                                            */
+  __IO uint16_t OR;          /*!< TIM option register,                 Address offset: 0x50 */
+  uint16_t      RESERVED14;  /*!< Reserved, 0x52                                            */
+} TIM_TypeDef;
+
+/** 
+  * @brief Universal Synchronous Asynchronous Receiver Transmitter
+  */
+ 
+typedef struct
+{
+  __IO uint16_t SR;         /*!< USART Status register,                   Address offset: 0x00 */
+  uint16_t      RESERVED0;  /*!< Reserved, 0x02                                                */
+  __IO uint16_t DR;         /*!< USART Data register,                     Address offset: 0x04 */
+  uint16_t      RESERVED1;  /*!< Reserved, 0x06                                                */
+  __IO uint16_t BRR;        /*!< USART Baud rate register,                Address offset: 0x08 */
+  uint16_t      RESERVED2;  /*!< Reserved, 0x0A                                                */
+  __IO uint16_t CR1;        /*!< USART Control register 1,                Address offset: 0x0C */
+  uint16_t      RESERVED3;  /*!< Reserved, 0x0E                                                */
+  __IO uint16_t CR2;        /*!< USART Control register 2,                Address offset: 0x10 */
+  uint16_t      RESERVED4;  /*!< Reserved, 0x12                                                */
+  __IO uint16_t CR3;        /*!< USART Control register 3,                Address offset: 0x14 */
+  uint16_t      RESERVED5;  /*!< Reserved, 0x16                                                */
+  __IO uint16_t GTPR;       /*!< USART Guard time and prescaler register, Address offset: 0x18 */
+  uint16_t      RESERVED6;  /*!< Reserved, 0x1A                                                */
+} USART_TypeDef;
+
+/** 
+  * @brief Window WATCHDOG
+  */
+
+typedef struct
+{
+  __IO uint32_t CR;   /*!< WWDG Control register,       Address offset: 0x00 */
+  __IO uint32_t CFR;  /*!< WWDG Configuration register, Address offset: 0x04 */
+  __IO uint32_t SR;   /*!< WWDG Status register,        Address offset: 0x08 */
+} WWDG_TypeDef;
+
+/** 
+  * @brief Crypto Processor
+  */
+
+typedef struct
+{
+  __IO uint32_t CR;     /*!< CRYP control register,                            Address offset: 0x00 */
+  __IO uint32_t SR;     /*!< CRYP status register,                             Address offset: 0x04 */
+  __IO uint32_t DR;     /*!< CRYP data input register,                         Address offset: 0x08 */
+  __IO uint32_t DOUT;   /*!< CRYP data output register,                        Address offset: 0x0C */
+  __IO uint32_t DMACR;  /*!< CRYP DMA control register,                        Address offset: 0x10 */
+  __IO uint32_t IMSCR;  /*!< CRYP interrupt mask set/clear register,           Address offset: 0x14 */
+  __IO uint32_t RISR;   /*!< CRYP raw interrupt status register,               Address offset: 0x18 */
+  __IO uint32_t MISR;   /*!< CRYP masked interrupt status register,            Address offset: 0x1C */
+  __IO uint32_t K0LR;   /*!< CRYP key left  register 0,                        Address offset: 0x20 */
+  __IO uint32_t K0RR;   /*!< CRYP key right register 0,                        Address offset: 0x24 */
+  __IO uint32_t K1LR;   /*!< CRYP key left  register 1,                        Address offset: 0x28 */
+  __IO uint32_t K1RR;   /*!< CRYP key right register 1,                        Address offset: 0x2C */
+  __IO uint32_t K2LR;   /*!< CRYP key left  register 2,                        Address offset: 0x30 */
+  __IO uint32_t K2RR;   /*!< CRYP key right register 2,                        Address offset: 0x34 */
+  __IO uint32_t K3LR;   /*!< CRYP key left  register 3,                        Address offset: 0x38 */
+  __IO uint32_t K3RR;   /*!< CRYP key right register 3,                        Address offset: 0x3C */
+  __IO uint32_t IV0LR;  /*!< CRYP initialization vector left-word  register 0, Address offset: 0x40 */
+  __IO uint32_t IV0RR;  /*!< CRYP initialization vector right-word register 0, Address offset: 0x44 */
+  __IO uint32_t IV1LR;  /*!< CRYP initialization vector left-word  register 1, Address offset: 0x48 */
+  __IO uint32_t IV1RR;  /*!< CRYP initialization vector right-word register 1, Address offset: 0x4C */
+} CRYP_TypeDef;
+
+typedef struct 
+{
+  __IO uint32_t CR;        /*!< HASH control register,          Address offset: 0x00        */
+  __IO uint32_t DIN;       /*!< HASH data input register,       Address offset: 0x04        */
+  __IO uint32_t STR;       /*!< HASH start register,            Address offset: 0x08        */
+  __IO uint32_t HR[5];     /*!< HASH digest registers,          Address offset: 0x0C-0x1C   */
+  __IO uint32_t IMR;       /*!< HASH interrupt enable register, Address offset: 0x20        */
+  __IO uint32_t SR;        /*!< HASH status register,           Address offset: 0x24        */
+  uint32_t  RESERVED[52];  /*!< Reserved, 0x28-0xF4                                         */
+  __IO uint32_t CSR[51];   /*!< HASH context swap registers,    Address offset: 0x0F8-0x1C0 */  
+} HASH_TypeDef;
+
+typedef struct 
+{
+  __IO uint32_t CR;  /*!< RNG control register, Address offset: 0x00 */
+  __IO uint32_t SR;  /*!< RNG status register,  Address offset: 0x04 */
+  __IO uint32_t DR;  /*!< RNG data register,    Address offset: 0x08 */
+} RNG_TypeDef;
+
+#define FLASH_BASE            ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
+#define SRAM_BASE             ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
+#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
+
+#define SRAM_BB_BASE          ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */
+#define PERIPH_BB_BASE        ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */
+
+#define FSMC_R_BASE           ((uint32_t)0xA0000000) /*!< FSMC registers base address */
+
+/*!< Peripheral memory map */
+#define APB1PERIPH_BASE       PERIPH_BASE
+#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000)
+#define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
+#define AHB2PERIPH_BASE       (PERIPH_BASE + 0x10000000)
+
+/*!< APB1 peripherals */
+#define TIM2_BASE             (APB1PERIPH_BASE + 0x0000)
+#define TIM3_BASE             (APB1PERIPH_BASE + 0x0400)
+#define TIM4_BASE             (APB1PERIPH_BASE + 0x0800)
+#define TIM5_BASE             (APB1PERIPH_BASE + 0x0C00)
+#define TIM6_BASE             (APB1PERIPH_BASE + 0x1000)
+#define TIM7_BASE             (APB1PERIPH_BASE + 0x1400)
+#define TIM12_BASE            (APB1PERIPH_BASE + 0x1800)
+#define TIM13_BASE            (APB1PERIPH_BASE + 0x1C00)
+#define TIM14_BASE            (APB1PERIPH_BASE + 0x2000)
+#define RTC_BASE              (APB1PERIPH_BASE + 0x2800)
+#define WWDG_BASE             (APB1PERIPH_BASE + 0x2C00)
+#define IWDG_BASE             (APB1PERIPH_BASE + 0x3000)
+#define SPI2_BASE             (APB1PERIPH_BASE + 0x3800)
+#define SPI3_BASE             (APB1PERIPH_BASE + 0x3C00)
+#define USART2_BASE           (APB1PERIPH_BASE + 0x4400)
+#define USART3_BASE           (APB1PERIPH_BASE + 0x4800)
+#define UART4_BASE            (APB1PERIPH_BASE + 0x4C00)
+#define UART5_BASE            (APB1PERIPH_BASE + 0x5000)
+#define I2C1_BASE             (APB1PERIPH_BASE + 0x5400)
+#define I2C2_BASE             (APB1PERIPH_BASE + 0x5800)
+#define I2C3_BASE             (APB1PERIPH_BASE + 0x5C00)
+#define CAN1_BASE             (APB1PERIPH_BASE + 0x6400)
+#define CAN2_BASE             (APB1PERIPH_BASE + 0x6800)
+#define PWR_BASE              (APB1PERIPH_BASE + 0x7000)
+#define DAC_BASE              (APB1PERIPH_BASE + 0x7400)
+
+/*!< APB2 peripherals */
+#define TIM1_BASE             (APB2PERIPH_BASE + 0x0000)
+#define TIM8_BASE             (APB2PERIPH_BASE + 0x0400)
+#define USART1_BASE           (APB2PERIPH_BASE + 0x1000)
+#define USART6_BASE           (APB2PERIPH_BASE + 0x1400)
+#define ADC1_BASE             (APB2PERIPH_BASE + 0x2000)
+#define ADC2_BASE             (APB2PERIPH_BASE + 0x2100)
+#define ADC3_BASE             (APB2PERIPH_BASE + 0x2200)
+#define ADC_BASE              (APB2PERIPH_BASE + 0x2300)
+#define SDIO_BASE             (APB2PERIPH_BASE + 0x2C00)
+#define SPI1_BASE             (APB2PERIPH_BASE + 0x3000)
+#define SYSCFG_BASE           (APB2PERIPH_BASE + 0x3800)
+#define EXTI_BASE             (APB2PERIPH_BASE + 0x3C00)
+#define TIM9_BASE             (APB2PERIPH_BASE + 0x4000)
+#define TIM10_BASE            (APB2PERIPH_BASE + 0x4400)
+#define TIM11_BASE            (APB2PERIPH_BASE + 0x4800)
+
+/*!< AHB1 peripherals */
+#define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000)
+#define GPIOB_BASE            (AHB1PERIPH_BASE + 0x0400)
+#define GPIOC_BASE            (AHB1PERIPH_BASE + 0x0800)
+#define GPIOD_BASE            (AHB1PERIPH_BASE + 0x0C00)
+#define GPIOE_BASE            (AHB1PERIPH_BASE + 0x1000)
+#define GPIOF_BASE            (AHB1PERIPH_BASE + 0x1400)
+#define GPIOG_BASE            (AHB1PERIPH_BASE + 0x1800)
+#define GPIOH_BASE            (AHB1PERIPH_BASE + 0x1C00)
+#define GPIOI_BASE            (AHB1PERIPH_BASE + 0x2000)
+#define CRC_BASE              (AHB1PERIPH_BASE + 0x3000)
+#define RCC_BASE              (AHB1PERIPH_BASE + 0x3800)
+#define FLASH_R_BASE          (AHB1PERIPH_BASE + 0x3C00) 
+#define BKPSRAM_BASE          (AHB1PERIPH_BASE + 0x4000)
+#define DMA1_BASE             (AHB1PERIPH_BASE + 0x6000)
+#define DMA1_Stream0_BASE     (DMA1_BASE + 0x010)
+#define DMA1_Stream1_BASE     (DMA1_BASE + 0x028)
+#define DMA1_Stream2_BASE     (DMA1_BASE + 0x040)
+#define DMA1_Stream3_BASE     (DMA1_BASE + 0x058)
+#define DMA1_Stream4_BASE     (DMA1_BASE + 0x070)
+#define DMA1_Stream5_BASE     (DMA1_BASE + 0x088)
+#define DMA1_Stream6_BASE     (DMA1_BASE + 0x0A0)
+#define DMA1_Stream7_BASE     (DMA1_BASE + 0x0B8)
+#define DMA2_BASE             (AHB1PERIPH_BASE + 0x6400)
+#define DMA2_Stream0_BASE     (DMA2_BASE + 0x010)
+#define DMA2_Stream1_BASE     (DMA2_BASE + 0x028)
+#define DMA2_Stream2_BASE     (DMA2_BASE + 0x040)
+#define DMA2_Stream3_BASE     (DMA2_BASE + 0x058)
+#define DMA2_Stream4_BASE     (DMA2_BASE + 0x070)
+#define DMA2_Stream5_BASE     (DMA2_BASE + 0x088)
+#define DMA2_Stream6_BASE     (DMA2_BASE + 0x0A0)
+#define DMA2_Stream7_BASE     (DMA2_BASE + 0x0B8)
+#define ETH_BASE              (AHB1PERIPH_BASE + 0x8000)
+#define ETH_MAC_BASE          (ETH_BASE)
+#define ETH_MMC_BASE          (ETH_BASE + 0x0100)
+#define ETH_PTP_BASE          (ETH_BASE + 0x0700)
+#define ETH_DMA_BASE          (ETH_BASE + 0x1000)
+
+/*!< AHB2 peripherals */
+#define DCMI_BASE             (AHB2PERIPH_BASE + 0x50000)
+#define CRYP_BASE             (AHB2PERIPH_BASE + 0x60000)
+#define HASH_BASE             (AHB2PERIPH_BASE + 0x60400)
+#define RNG_BASE              (AHB2PERIPH_BASE + 0x60800)
+
+/*!< FSMC Bankx registers base address */
+#define FSMC_Bank1_R_BASE     (FSMC_R_BASE + 0x0000)
+#define FSMC_Bank1E_R_BASE    (FSMC_R_BASE + 0x0104)
+#define FSMC_Bank2_R_BASE     (FSMC_R_BASE + 0x0060)
+#define FSMC_Bank3_R_BASE     (FSMC_R_BASE + 0x0080)
+#define FSMC_Bank4_R_BASE     (FSMC_R_BASE + 0x00A0)
+
+/* Debug MCU registers base address */
+#define DBGMCU_BASE           ((uint32_t )0xE0042000)
+
+#define TIM2                ((TIM_TypeDef *) TIM2_BASE)
+#define TIM3                ((TIM_TypeDef *) TIM3_BASE)
+#define TIM4                ((TIM_TypeDef *) TIM4_BASE)
+#define TIM5                ((TIM_TypeDef *) TIM5_BASE)
+#define TIM6                ((TIM_TypeDef *) TIM6_BASE)
+#define TIM7                ((TIM_TypeDef *) TIM7_BASE)
+#define TIM12               ((TIM_TypeDef *) TIM12_BASE)
+#define TIM13               ((TIM_TypeDef *) TIM13_BASE)
+#define TIM14               ((TIM_TypeDef *) TIM14_BASE)
+#define RTC                 ((RTC_TypeDef *) RTC_BASE)
+#define WWDG                ((WWDG_TypeDef *) WWDG_BASE)
+#define IWDG                ((IWDG_TypeDef *) IWDG_BASE)
+#define SPI2                ((SPI_TypeDef *) SPI2_BASE)
+#define SPI3                ((SPI_TypeDef *) SPI3_BASE)
+#define USART2              ((USART_TypeDef *) USART2_BASE)
+#define USART3              ((USART_TypeDef *) USART3_BASE)
+#define UART4               ((USART_TypeDef *) UART4_BASE)
+#define UART5               ((USART_TypeDef *) UART5_BASE)
+#define I2C1                ((I2C_TypeDef *) I2C1_BASE)
+#define I2C2                ((I2C_TypeDef *) I2C2_BASE)
+#define I2C3                ((I2C_TypeDef *) I2C3_BASE)
+#define CAN1                ((CAN_TypeDef *) CAN1_BASE)
+#define CAN2                ((CAN_TypeDef *) CAN2_BASE)
+#define PWR                 ((PWR_TypeDef *) PWR_BASE)
+#define DAC                 ((DAC_TypeDef *) DAC_BASE)
+#define TIM1                ((TIM_TypeDef *) TIM1_BASE)
+#define TIM8                ((TIM_TypeDef *) TIM8_BASE)
+#define USART1              ((USART_TypeDef *) USART1_BASE)
+#define USART6              ((USART_TypeDef *) USART6_BASE)
+#define ADC                 ((ADC_Common_TypeDef *) ADC_BASE)
+#define ADC1                ((ADC_TypeDef *) ADC1_BASE)
+#define ADC2                ((ADC_TypeDef *) ADC2_BASE)
+#define ADC3                ((ADC_TypeDef *) ADC3_BASE)
+#define SDIO                ((SDIO_TypeDef *) SDIO_BASE)
+#define SPI1                ((SPI_TypeDef *) SPI1_BASE)
+#define SYSCFG              ((SYSCFG_TypeDef *) SYSCFG_BASE)
+#define EXTI                ((EXTI_TypeDef *) EXTI_BASE)
+#define TIM9                ((TIM_TypeDef *) TIM9_BASE)
+#define TIM10               ((TIM_TypeDef *) TIM10_BASE)
+#define TIM11               ((TIM_TypeDef *) TIM11_BASE)
+#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
+#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
+#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
+#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
+#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)
+#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
+#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)
+#define GPIOH               ((GPIO_TypeDef *) GPIOH_BASE)
+#define GPIOI               ((GPIO_TypeDef *) GPIOI_BASE)
+#define CRC                 ((CRC_TypeDef *) CRC_BASE)
+#define RCC                 ((RCC_TypeDef *) RCC_BASE)
+#define FLASH               ((FLASH_TypeDef *) FLASH_R_BASE)
+#define DMA1                ((DMA_TypeDef *) DMA1_BASE)
+#define DMA1_Stream0        ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE)
+#define DMA1_Stream1        ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE)
+#define DMA1_Stream2        ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE)
+#define DMA1_Stream3        ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE)
+#define DMA1_Stream4        ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE)
+#define DMA1_Stream5        ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE)
+#define DMA1_Stream6        ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE)
+#define DMA1_Stream7        ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE)
+#define DMA2                ((DMA_TypeDef *) DMA2_BASE)
+#define DMA2_Stream0        ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE)
+#define DMA2_Stream1        ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE)
+#define DMA2_Stream2        ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE)
+#define DMA2_Stream3        ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE)
+#define DMA2_Stream4        ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE)
+#define DMA2_Stream5        ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE)
+#define DMA2_Stream6        ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE)
+#define DMA2_Stream7        ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE)
+#define ETH                 ((ETH_TypeDef *) ETH_BASE)  
+#define DCMI                ((DCMI_TypeDef *) DCMI_BASE)
+#define CRYP                ((CRYP_TypeDef *) CRYP_BASE)
+#define HASH                ((HASH_TypeDef *) HASH_BASE)
+#define RNG                 ((RNG_TypeDef *) RNG_BASE)
+#define FSMC_Bank1          ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)
+#define FSMC_Bank1E         ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE)
+#define FSMC_Bank2          ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE)
+#define FSMC_Bank3          ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE)
+#define FSMC_Bank4          ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE)
+#define DBGMCU              ((DBGMCU_TypeDef *) DBGMCU_BASE)
+
+/******************************************************************************/
+/*                         Peripheral Registers_Bits_Definition               */
+/******************************************************************************/
+
+/******************************************************************************/
+/*                                                                            */
+/*                        Analog to Digital Converter                         */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bit definition for ADC_SR register  ********************/
+#define  ADC_SR_AWD                          ((uint8_t)0x01)               /*!<Analog watchdog flag */
+#define  ADC_SR_EOC                          ((uint8_t)0x02)               /*!<End of conversion */
+#define  ADC_SR_JEOC                         ((uint8_t)0x04)               /*!<Injected channel end of conversion */
+#define  ADC_SR_JSTRT                        ((uint8_t)0x08)               /*!<Injected channel Start flag */
+#define  ADC_SR_STRT                         ((uint8_t)0x10)               /*!<Regular channel Start flag */
+#define  ADC_SR_OVR                          ((uint8_t)0x20)               /*!<Overrun flag */
+
+/*******************  Bit definition for ADC_CR1 register  ********************/
+#define  ADC_CR1_AWDCH                       ((uint32_t)0x0000001F)        /*!<AWDCH[4:0] bits (Analog watchdog channel select bits) */
+#define  ADC_CR1_AWDCH_0                     ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  ADC_CR1_AWDCH_1                     ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  ADC_CR1_AWDCH_2                     ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  ADC_CR1_AWDCH_3                     ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  ADC_CR1_AWDCH_4                     ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  ADC_CR1_EOCIE                       ((uint32_t)0x00000020)        /*!<Interrupt enable for EOC */
+#define  ADC_CR1_AWDIE                       ((uint32_t)0x00000040)        /*!<AAnalog Watchdog interrupt enable */
+#define  ADC_CR1_JEOCIE                      ((uint32_t)0x00000080)        /*!<Interrupt enable for injected channels */
+#define  ADC_CR1_SCAN                        ((uint32_t)0x00000100)        /*!<Scan mode */
+#define  ADC_CR1_AWDSGL                      ((uint32_t)0x00000200)        /*!<Enable the watchdog on a single channel in scan mode */
+#define  ADC_CR1_JAUTO                       ((uint32_t)0x00000400)        /*!<Automatic injected group conversion */
+#define  ADC_CR1_DISCEN                      ((uint32_t)0x00000800)        /*!<Discontinuous mode on regular channels */
+#define  ADC_CR1_JDISCEN                     ((uint32_t)0x00001000)        /*!<Discontinuous mode on injected channels */
+#define  ADC_CR1_DISCNUM                     ((uint32_t)0x0000E000)        /*!<DISCNUM[2:0] bits (Discontinuous mode channel count) */
+#define  ADC_CR1_DISCNUM_0                   ((uint32_t)0x00002000)        /*!<Bit 0 */
+#define  ADC_CR1_DISCNUM_1                   ((uint32_t)0x00004000)        /*!<Bit 1 */
+#define  ADC_CR1_DISCNUM_2                   ((uint32_t)0x00008000)        /*!<Bit 2 */
+#define  ADC_CR1_JAWDEN                      ((uint32_t)0x00400000)        /*!<Analog watchdog enable on injected channels */
+#define  ADC_CR1_AWDEN                       ((uint32_t)0x00800000)        /*!<Analog watchdog enable on regular channels */
+#define  ADC_CR1_RES                         ((uint32_t)0x03000000)        /*!<RES[2:0] bits (Resolution) */
+#define  ADC_CR1_RES_0                       ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  ADC_CR1_RES_1                       ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  ADC_CR1_OVRIE                       ((uint32_t)0x04000000)         /*!<overrun interrupt enable */
+  
+/*******************  Bit definition for ADC_CR2 register  ********************/
+#define  ADC_CR2_ADON                        ((uint32_t)0x00000001)        /*!<A/D Converter ON / OFF */
+#define  ADC_CR2_CONT                        ((uint32_t)0x00000002)        /*!<Continuous Conversion */
+#define  ADC_CR2_DMA                         ((uint32_t)0x00000100)        /*!<Direct Memory access mode */
+#define  ADC_CR2_DDS                         ((uint32_t)0x00000200)        /*!<DMA disable selection (Single ADC) */
+#define  ADC_CR2_EOCS                        ((uint32_t)0x00000400)        /*!<End of conversion selection */
+#define  ADC_CR2_ALIGN                       ((uint32_t)0x00000800)        /*!<Data Alignment */
+#define  ADC_CR2_JEXTSEL                     ((uint32_t)0x000F0000)        /*!<JEXTSEL[3:0] bits (External event select for injected group) */
+#define  ADC_CR2_JEXTSEL_0                   ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  ADC_CR2_JEXTSEL_1                   ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  ADC_CR2_JEXTSEL_2                   ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  ADC_CR2_JEXTSEL_3                   ((uint32_t)0x00080000)        /*!<Bit 3 */
+#define  ADC_CR2_JEXTEN                      ((uint32_t)0x00300000)        /*!<JEXTEN[1:0] bits (External Trigger Conversion mode for injected channelsp) */
+#define  ADC_CR2_JEXTEN_0                    ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  ADC_CR2_JEXTEN_1                    ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  ADC_CR2_JSWSTART                    ((uint32_t)0x00400000)        /*!<Start Conversion of injected channels */
+#define  ADC_CR2_EXTSEL                      ((uint32_t)0x0F000000)        /*!<EXTSEL[3:0] bits (External Event Select for regular group) */
+#define  ADC_CR2_EXTSEL_0                    ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  ADC_CR2_EXTSEL_1                    ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  ADC_CR2_EXTSEL_2                    ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  ADC_CR2_EXTSEL_3                    ((uint32_t)0x08000000)        /*!<Bit 3 */
+#define  ADC_CR2_EXTEN                       ((uint32_t)0x30000000)        /*!<EXTEN[1:0] bits (External Trigger Conversion mode for regular channelsp) */
+#define  ADC_CR2_EXTEN_0                     ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  ADC_CR2_EXTEN_1                     ((uint32_t)0x20000000)        /*!<Bit 1 */
+#define  ADC_CR2_SWSTART                     ((uint32_t)0x40000000)        /*!<Start Conversion of regular channels */
+
+/******************  Bit definition for ADC_SMPR1 register  *******************/
+#define  ADC_SMPR1_SMP10                     ((uint32_t)0x00000007)        /*!<SMP10[2:0] bits (Channel 10 Sample time selection) */
+#define  ADC_SMPR1_SMP10_0                   ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP10_1                   ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP10_2                   ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  ADC_SMPR1_SMP11                     ((uint32_t)0x00000038)        /*!<SMP11[2:0] bits (Channel 11 Sample time selection) */
+#define  ADC_SMPR1_SMP11_0                   ((uint32_t)0x00000008)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP11_1                   ((uint32_t)0x00000010)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP11_2                   ((uint32_t)0x00000020)        /*!<Bit 2 */
+#define  ADC_SMPR1_SMP12                     ((uint32_t)0x000001C0)        /*!<SMP12[2:0] bits (Channel 12 Sample time selection) */
+#define  ADC_SMPR1_SMP12_0                   ((uint32_t)0x00000040)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP12_1                   ((uint32_t)0x00000080)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP12_2                   ((uint32_t)0x00000100)        /*!<Bit 2 */
+#define  ADC_SMPR1_SMP13                     ((uint32_t)0x00000E00)        /*!<SMP13[2:0] bits (Channel 13 Sample time selection) */
+#define  ADC_SMPR1_SMP13_0                   ((uint32_t)0x00000200)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP13_1                   ((uint32_t)0x00000400)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP13_2                   ((uint32_t)0x00000800)        /*!<Bit 2 */
+#define  ADC_SMPR1_SMP14                     ((uint32_t)0x00007000)        /*!<SMP14[2:0] bits (Channel 14 Sample time selection) */
+#define  ADC_SMPR1_SMP14_0                   ((uint32_t)0x00001000)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP14_1                   ((uint32_t)0x00002000)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP14_2                   ((uint32_t)0x00004000)        /*!<Bit 2 */
+#define  ADC_SMPR1_SMP15                     ((uint32_t)0x00038000)        /*!<SMP15[2:0] bits (Channel 15 Sample time selection) */
+#define  ADC_SMPR1_SMP15_0                   ((uint32_t)0x00008000)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP15_1                   ((uint32_t)0x00010000)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP15_2                   ((uint32_t)0x00020000)        /*!<Bit 2 */
+#define  ADC_SMPR1_SMP16                     ((uint32_t)0x001C0000)        /*!<SMP16[2:0] bits (Channel 16 Sample time selection) */
+#define  ADC_SMPR1_SMP16_0                   ((uint32_t)0x00040000)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP16_1                   ((uint32_t)0x00080000)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP16_2                   ((uint32_t)0x00100000)        /*!<Bit 2 */
+#define  ADC_SMPR1_SMP17                     ((uint32_t)0x00E00000)        /*!<SMP17[2:0] bits (Channel 17 Sample time selection) */
+#define  ADC_SMPR1_SMP17_0                   ((uint32_t)0x00200000)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP17_1                   ((uint32_t)0x00400000)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP17_2                   ((uint32_t)0x00800000)        /*!<Bit 2 */
+#define  ADC_SMPR1_SMP18                     ((uint32_t)0x07000000)        /*!<SMP18[2:0] bits (Channel 18 Sample time selection) */
+#define  ADC_SMPR1_SMP18_0                   ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  ADC_SMPR1_SMP18_1                   ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  ADC_SMPR1_SMP18_2                   ((uint32_t)0x04000000)        /*!<Bit 2 */
+
+/******************  Bit definition for ADC_SMPR2 register  *******************/
+#define  ADC_SMPR2_SMP0                      ((uint32_t)0x00000007)        /*!<SMP0[2:0] bits (Channel 0 Sample time selection) */
+#define  ADC_SMPR2_SMP0_0                    ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP0_1                    ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP0_2                    ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP1                      ((uint32_t)0x00000038)        /*!<SMP1[2:0] bits (Channel 1 Sample time selection) */
+#define  ADC_SMPR2_SMP1_0                    ((uint32_t)0x00000008)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP1_1                    ((uint32_t)0x00000010)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP1_2                    ((uint32_t)0x00000020)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP2                      ((uint32_t)0x000001C0)        /*!<SMP2[2:0] bits (Channel 2 Sample time selection) */
+#define  ADC_SMPR2_SMP2_0                    ((uint32_t)0x00000040)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP2_1                    ((uint32_t)0x00000080)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP2_2                    ((uint32_t)0x00000100)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP3                      ((uint32_t)0x00000E00)        /*!<SMP3[2:0] bits (Channel 3 Sample time selection) */
+#define  ADC_SMPR2_SMP3_0                    ((uint32_t)0x00000200)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP3_1                    ((uint32_t)0x00000400)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP3_2                    ((uint32_t)0x00000800)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP4                      ((uint32_t)0x00007000)        /*!<SMP4[2:0] bits (Channel 4 Sample time selection) */
+#define  ADC_SMPR2_SMP4_0                    ((uint32_t)0x00001000)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP4_1                    ((uint32_t)0x00002000)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP4_2                    ((uint32_t)0x00004000)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP5                      ((uint32_t)0x00038000)        /*!<SMP5[2:0] bits (Channel 5 Sample time selection) */
+#define  ADC_SMPR2_SMP5_0                    ((uint32_t)0x00008000)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP5_1                    ((uint32_t)0x00010000)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP5_2                    ((uint32_t)0x00020000)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP6                      ((uint32_t)0x001C0000)        /*!<SMP6[2:0] bits (Channel 6 Sample time selection) */
+#define  ADC_SMPR2_SMP6_0                    ((uint32_t)0x00040000)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP6_1                    ((uint32_t)0x00080000)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP6_2                    ((uint32_t)0x00100000)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP7                      ((uint32_t)0x00E00000)        /*!<SMP7[2:0] bits (Channel 7 Sample time selection) */
+#define  ADC_SMPR2_SMP7_0                    ((uint32_t)0x00200000)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP7_1                    ((uint32_t)0x00400000)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP7_2                    ((uint32_t)0x00800000)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP8                      ((uint32_t)0x07000000)        /*!<SMP8[2:0] bits (Channel 8 Sample time selection) */
+#define  ADC_SMPR2_SMP8_0                    ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP8_1                    ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP8_2                    ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  ADC_SMPR2_SMP9                      ((uint32_t)0x38000000)        /*!<SMP9[2:0] bits (Channel 9 Sample time selection) */
+#define  ADC_SMPR2_SMP9_0                    ((uint32_t)0x08000000)        /*!<Bit 0 */
+#define  ADC_SMPR2_SMP9_1                    ((uint32_t)0x10000000)        /*!<Bit 1 */
+#define  ADC_SMPR2_SMP9_2                    ((uint32_t)0x20000000)        /*!<Bit 2 */
+
+/******************  Bit definition for ADC_JOFR1 register  *******************/
+#define  ADC_JOFR1_JOFFSET1                  ((uint16_t)0x0FFF)            /*!<Data offset for injected channel 1 */
+
+/******************  Bit definition for ADC_JOFR2 register  *******************/
+#define  ADC_JOFR2_JOFFSET2                  ((uint16_t)0x0FFF)            /*!<Data offset for injected channel 2 */
+
+/******************  Bit definition for ADC_JOFR3 register  *******************/
+#define  ADC_JOFR3_JOFFSET3                  ((uint16_t)0x0FFF)            /*!<Data offset for injected channel 3 */
+
+/******************  Bit definition for ADC_JOFR4 register  *******************/
+#define  ADC_JOFR4_JOFFSET4                  ((uint16_t)0x0FFF)            /*!<Data offset for injected channel 4 */
+
+/*******************  Bit definition for ADC_HTR register  ********************/
+#define  ADC_HTR_HT                          ((uint16_t)0x0FFF)            /*!<Analog watchdog high threshold */
+
+/*******************  Bit definition for ADC_LTR register  ********************/
+#define  ADC_LTR_LT                          ((uint16_t)0x0FFF)            /*!<Analog watchdog low threshold */
+
+/*******************  Bit definition for ADC_SQR1 register  *******************/
+#define  ADC_SQR1_SQ13                       ((uint32_t)0x0000001F)        /*!<SQ13[4:0] bits (13th conversion in regular sequence) */
+#define  ADC_SQR1_SQ13_0                     ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  ADC_SQR1_SQ13_1                     ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  ADC_SQR1_SQ13_2                     ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  ADC_SQR1_SQ13_3                     ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  ADC_SQR1_SQ13_4                     ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  ADC_SQR1_SQ14                       ((uint32_t)0x000003E0)        /*!<SQ14[4:0] bits (14th conversion in regular sequence) */
+#define  ADC_SQR1_SQ14_0                     ((uint32_t)0x00000020)        /*!<Bit 0 */
+#define  ADC_SQR1_SQ14_1                     ((uint32_t)0x00000040)        /*!<Bit 1 */
+#define  ADC_SQR1_SQ14_2                     ((uint32_t)0x00000080)        /*!<Bit 2 */
+#define  ADC_SQR1_SQ14_3                     ((uint32_t)0x00000100)        /*!<Bit 3 */
+#define  ADC_SQR1_SQ14_4                     ((uint32_t)0x00000200)        /*!<Bit 4 */
+#define  ADC_SQR1_SQ15                       ((uint32_t)0x00007C00)        /*!<SQ15[4:0] bits (15th conversion in regular sequence) */
+#define  ADC_SQR1_SQ15_0                     ((uint32_t)0x00000400)        /*!<Bit 0 */
+#define  ADC_SQR1_SQ15_1                     ((uint32_t)0x00000800)        /*!<Bit 1 */
+#define  ADC_SQR1_SQ15_2                     ((uint32_t)0x00001000)        /*!<Bit 2 */
+#define  ADC_SQR1_SQ15_3                     ((uint32_t)0x00002000)        /*!<Bit 3 */
+#define  ADC_SQR1_SQ15_4                     ((uint32_t)0x00004000)        /*!<Bit 4 */
+#define  ADC_SQR1_SQ16                       ((uint32_t)0x000F8000)        /*!<SQ16[4:0] bits (16th conversion in regular sequence) */
+#define  ADC_SQR1_SQ16_0                     ((uint32_t)0x00008000)        /*!<Bit 0 */
+#define  ADC_SQR1_SQ16_1                     ((uint32_t)0x00010000)        /*!<Bit 1 */
+#define  ADC_SQR1_SQ16_2                     ((uint32_t)0x00020000)        /*!<Bit 2 */
+#define  ADC_SQR1_SQ16_3                     ((uint32_t)0x00040000)        /*!<Bit 3 */
+#define  ADC_SQR1_SQ16_4                     ((uint32_t)0x00080000)        /*!<Bit 4 */
+#define  ADC_SQR1_L                          ((uint32_t)0x00F00000)        /*!<L[3:0] bits (Regular channel sequence length) */
+#define  ADC_SQR1_L_0                        ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  ADC_SQR1_L_1                        ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  ADC_SQR1_L_2                        ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  ADC_SQR1_L_3                        ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+/*******************  Bit definition for ADC_SQR2 register  *******************/
+#define  ADC_SQR2_SQ7                        ((uint32_t)0x0000001F)        /*!<SQ7[4:0] bits (7th conversion in regular sequence) */
+#define  ADC_SQR2_SQ7_0                      ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  ADC_SQR2_SQ7_1                      ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  ADC_SQR2_SQ7_2                      ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  ADC_SQR2_SQ7_3                      ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  ADC_SQR2_SQ7_4                      ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  ADC_SQR2_SQ8                        ((uint32_t)0x000003E0)        /*!<SQ8[4:0] bits (8th conversion in regular sequence) */
+#define  ADC_SQR2_SQ8_0                      ((uint32_t)0x00000020)        /*!<Bit 0 */
+#define  ADC_SQR2_SQ8_1                      ((uint32_t)0x00000040)        /*!<Bit 1 */
+#define  ADC_SQR2_SQ8_2                      ((uint32_t)0x00000080)        /*!<Bit 2 */
+#define  ADC_SQR2_SQ8_3                      ((uint32_t)0x00000100)        /*!<Bit 3 */
+#define  ADC_SQR2_SQ8_4                      ((uint32_t)0x00000200)        /*!<Bit 4 */
+#define  ADC_SQR2_SQ9                        ((uint32_t)0x00007C00)        /*!<SQ9[4:0] bits (9th conversion in regular sequence) */
+#define  ADC_SQR2_SQ9_0                      ((uint32_t)0x00000400)        /*!<Bit 0 */
+#define  ADC_SQR2_SQ9_1                      ((uint32_t)0x00000800)        /*!<Bit 1 */
+#define  ADC_SQR2_SQ9_2                      ((uint32_t)0x00001000)        /*!<Bit 2 */
+#define  ADC_SQR2_SQ9_3                      ((uint32_t)0x00002000)        /*!<Bit 3 */
+#define  ADC_SQR2_SQ9_4                      ((uint32_t)0x00004000)        /*!<Bit 4 */
+#define  ADC_SQR2_SQ10                       ((uint32_t)0x000F8000)        /*!<SQ10[4:0] bits (10th conversion in regular sequence) */
+#define  ADC_SQR2_SQ10_0                     ((uint32_t)0x00008000)        /*!<Bit 0 */
+#define  ADC_SQR2_SQ10_1                     ((uint32_t)0x00010000)        /*!<Bit 1 */
+#define  ADC_SQR2_SQ10_2                     ((uint32_t)0x00020000)        /*!<Bit 2 */
+#define  ADC_SQR2_SQ10_3                     ((uint32_t)0x00040000)        /*!<Bit 3 */
+#define  ADC_SQR2_SQ10_4                     ((uint32_t)0x00080000)        /*!<Bit 4 */
+#define  ADC_SQR2_SQ11                       ((uint32_t)0x01F00000)        /*!<SQ11[4:0] bits (11th conversion in regular sequence) */
+#define  ADC_SQR2_SQ11_0                     ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  ADC_SQR2_SQ11_1                     ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  ADC_SQR2_SQ11_2                     ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  ADC_SQR2_SQ11_3                     ((uint32_t)0x00800000)        /*!<Bit 3 */
+#define  ADC_SQR2_SQ11_4                     ((uint32_t)0x01000000)        /*!<Bit 4 */
+#define  ADC_SQR2_SQ12                       ((uint32_t)0x3E000000)        /*!<SQ12[4:0] bits (12th conversion in regular sequence) */
+#define  ADC_SQR2_SQ12_0                     ((uint32_t)0x02000000)        /*!<Bit 0 */
+#define  ADC_SQR2_SQ12_1                     ((uint32_t)0x04000000)        /*!<Bit 1 */
+#define  ADC_SQR2_SQ12_2                     ((uint32_t)0x08000000)        /*!<Bit 2 */
+#define  ADC_SQR2_SQ12_3                     ((uint32_t)0x10000000)        /*!<Bit 3 */
+#define  ADC_SQR2_SQ12_4                     ((uint32_t)0x20000000)        /*!<Bit 4 */
+
+/*******************  Bit definition for ADC_SQR3 register  *******************/
+#define  ADC_SQR3_SQ1                        ((uint32_t)0x0000001F)        /*!<SQ1[4:0] bits (1st conversion in regular sequence) */
+#define  ADC_SQR3_SQ1_0                      ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  ADC_SQR3_SQ1_1                      ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  ADC_SQR3_SQ1_2                      ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  ADC_SQR3_SQ1_3                      ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  ADC_SQR3_SQ1_4                      ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  ADC_SQR3_SQ2                        ((uint32_t)0x000003E0)        /*!<SQ2[4:0] bits (2nd conversion in regular sequence) */
+#define  ADC_SQR3_SQ2_0                      ((uint32_t)0x00000020)        /*!<Bit 0 */
+#define  ADC_SQR3_SQ2_1                      ((uint32_t)0x00000040)        /*!<Bit 1 */
+#define  ADC_SQR3_SQ2_2                      ((uint32_t)0x00000080)        /*!<Bit 2 */
+#define  ADC_SQR3_SQ2_3                      ((uint32_t)0x00000100)        /*!<Bit 3 */
+#define  ADC_SQR3_SQ2_4                      ((uint32_t)0x00000200)        /*!<Bit 4 */
+#define  ADC_SQR3_SQ3                        ((uint32_t)0x00007C00)        /*!<SQ3[4:0] bits (3rd conversion in regular sequence) */
+#define  ADC_SQR3_SQ3_0                      ((uint32_t)0x00000400)        /*!<Bit 0 */
+#define  ADC_SQR3_SQ3_1                      ((uint32_t)0x00000800)        /*!<Bit 1 */
+#define  ADC_SQR3_SQ3_2                      ((uint32_t)0x00001000)        /*!<Bit 2 */
+#define  ADC_SQR3_SQ3_3                      ((uint32_t)0x00002000)        /*!<Bit 3 */
+#define  ADC_SQR3_SQ3_4                      ((uint32_t)0x00004000)        /*!<Bit 4 */
+#define  ADC_SQR3_SQ4                        ((uint32_t)0x000F8000)        /*!<SQ4[4:0] bits (4th conversion in regular sequence) */
+#define  ADC_SQR3_SQ4_0                      ((uint32_t)0x00008000)        /*!<Bit 0 */
+#define  ADC_SQR3_SQ4_1                      ((uint32_t)0x00010000)        /*!<Bit 1 */
+#define  ADC_SQR3_SQ4_2                      ((uint32_t)0x00020000)        /*!<Bit 2 */
+#define  ADC_SQR3_SQ4_3                      ((uint32_t)0x00040000)        /*!<Bit 3 */
+#define  ADC_SQR3_SQ4_4                      ((uint32_t)0x00080000)        /*!<Bit 4 */
+#define  ADC_SQR3_SQ5                        ((uint32_t)0x01F00000)        /*!<SQ5[4:0] bits (5th conversion in regular sequence) */
+#define  ADC_SQR3_SQ5_0                      ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  ADC_SQR3_SQ5_1                      ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  ADC_SQR3_SQ5_2                      ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  ADC_SQR3_SQ5_3                      ((uint32_t)0x00800000)        /*!<Bit 3 */
+#define  ADC_SQR3_SQ5_4                      ((uint32_t)0x01000000)        /*!<Bit 4 */
+#define  ADC_SQR3_SQ6                        ((uint32_t)0x3E000000)        /*!<SQ6[4:0] bits (6th conversion in regular sequence) */
+#define  ADC_SQR3_SQ6_0                      ((uint32_t)0x02000000)        /*!<Bit 0 */
+#define  ADC_SQR3_SQ6_1                      ((uint32_t)0x04000000)        /*!<Bit 1 */
+#define  ADC_SQR3_SQ6_2                      ((uint32_t)0x08000000)        /*!<Bit 2 */
+#define  ADC_SQR3_SQ6_3                      ((uint32_t)0x10000000)        /*!<Bit 3 */
+#define  ADC_SQR3_SQ6_4                      ((uint32_t)0x20000000)        /*!<Bit 4 */
+
+/*******************  Bit definition for ADC_JSQR register  *******************/
+#define  ADC_JSQR_JSQ1                       ((uint32_t)0x0000001F)        /*!<JSQ1[4:0] bits (1st conversion in injected sequence) */  
+#define  ADC_JSQR_JSQ1_0                     ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  ADC_JSQR_JSQ1_1                     ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  ADC_JSQR_JSQ1_2                     ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  ADC_JSQR_JSQ1_3                     ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  ADC_JSQR_JSQ1_4                     ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  ADC_JSQR_JSQ2                       ((uint32_t)0x000003E0)        /*!<JSQ2[4:0] bits (2nd conversion in injected sequence) */
+#define  ADC_JSQR_JSQ2_0                     ((uint32_t)0x00000020)        /*!<Bit 0 */
+#define  ADC_JSQR_JSQ2_1                     ((uint32_t)0x00000040)        /*!<Bit 1 */
+#define  ADC_JSQR_JSQ2_2                     ((uint32_t)0x00000080)        /*!<Bit 2 */
+#define  ADC_JSQR_JSQ2_3                     ((uint32_t)0x00000100)        /*!<Bit 3 */
+#define  ADC_JSQR_JSQ2_4                     ((uint32_t)0x00000200)        /*!<Bit 4 */
+#define  ADC_JSQR_JSQ3                       ((uint32_t)0x00007C00)        /*!<JSQ3[4:0] bits (3rd conversion in injected sequence) */
+#define  ADC_JSQR_JSQ3_0                     ((uint32_t)0x00000400)        /*!<Bit 0 */
+#define  ADC_JSQR_JSQ3_1                     ((uint32_t)0x00000800)        /*!<Bit 1 */
+#define  ADC_JSQR_JSQ3_2                     ((uint32_t)0x00001000)        /*!<Bit 2 */
+#define  ADC_JSQR_JSQ3_3                     ((uint32_t)0x00002000)        /*!<Bit 3 */
+#define  ADC_JSQR_JSQ3_4                     ((uint32_t)0x00004000)        /*!<Bit 4 */
+#define  ADC_JSQR_JSQ4                       ((uint32_t)0x000F8000)        /*!<JSQ4[4:0] bits (4th conversion in injected sequence) */
+#define  ADC_JSQR_JSQ4_0                     ((uint32_t)0x00008000)        /*!<Bit 0 */
+#define  ADC_JSQR_JSQ4_1                     ((uint32_t)0x00010000)        /*!<Bit 1 */
+#define  ADC_JSQR_JSQ4_2                     ((uint32_t)0x00020000)        /*!<Bit 2 */
+#define  ADC_JSQR_JSQ4_3                     ((uint32_t)0x00040000)        /*!<Bit 3 */
+#define  ADC_JSQR_JSQ4_4                     ((uint32_t)0x00080000)        /*!<Bit 4 */
+#define  ADC_JSQR_JL                         ((uint32_t)0x00300000)        /*!<JL[1:0] bits (Injected Sequence length) */
+#define  ADC_JSQR_JL_0                       ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  ADC_JSQR_JL_1                       ((uint32_t)0x00200000)        /*!<Bit 1 */
+
+/*******************  Bit definition for ADC_JDR1 register  *******************/
+#define  ADC_JDR1_JDATA                      ((uint16_t)0xFFFF)            /*!<Injected data */
+
+/*******************  Bit definition for ADC_JDR2 register  *******************/
+#define  ADC_JDR2_JDATA                      ((uint16_t)0xFFFF)            /*!<Injected data */
+
+/*******************  Bit definition for ADC_JDR3 register  *******************/
+#define  ADC_JDR3_JDATA                      ((uint16_t)0xFFFF)            /*!<Injected data */
+
+/*******************  Bit definition for ADC_JDR4 register  *******************/
+#define  ADC_JDR4_JDATA                      ((uint16_t)0xFFFF)            /*!<Injected data */
+
+/********************  Bit definition for ADC_DR register  ********************/
+#define  ADC_DR_DATA                         ((uint32_t)0x0000FFFF)        /*!<Regular data */
+#define  ADC_DR_ADC2DATA                     ((uint32_t)0xFFFF0000)        /*!<ADC2 data */
+
+/*******************  Bit definition for ADC_CSR register  ********************/
+#define  ADC_CSR_AWD1                        ((uint32_t)0x00000001)        /*!<ADC1 Analog watchdog flag */
+#define  ADC_CSR_EOC1                        ((uint32_t)0x00000002)        /*!<ADC1 End of conversion */
+#define  ADC_CSR_JEOC1                       ((uint32_t)0x00000004)        /*!<ADC1 Injected channel end of conversion */
+#define  ADC_CSR_JSTRT1                      ((uint32_t)0x00000008)        /*!<ADC1 Injected channel Start flag */
+#define  ADC_CSR_STRT1                       ((uint32_t)0x00000010)        /*!<ADC1 Regular channel Start flag */
+#define  ADC_CSR_DOVR1                       ((uint32_t)0x00000020)        /*!<ADC1 DMA overrun  flag */
+#define  ADC_CSR_AWD2                        ((uint32_t)0x00000100)        /*!<ADC2 Analog watchdog flag */
+#define  ADC_CSR_EOC2                        ((uint32_t)0x00000200)        /*!<ADC2 End of conversion */
+#define  ADC_CSR_JEOC2                       ((uint32_t)0x00000400)        /*!<ADC2 Injected channel end of conversion */
+#define  ADC_CSR_JSTRT2                      ((uint32_t)0x00000800)        /*!<ADC2 Injected channel Start flag */
+#define  ADC_CSR_STRT2                       ((uint32_t)0x00001000)        /*!<ADC2 Regular channel Start flag */
+#define  ADC_CSR_DOVR2                       ((uint32_t)0x00002000)        /*!<ADC2 DMA overrun  flag */
+#define  ADC_CSR_AWD3                        ((uint32_t)0x00010000)        /*!<ADC3 Analog watchdog flag */
+#define  ADC_CSR_EOC3                        ((uint32_t)0x00020000)        /*!<ADC3 End of conversion */
+#define  ADC_CSR_JEOC3                       ((uint32_t)0x00040000)        /*!<ADC3 Injected channel end of conversion */
+#define  ADC_CSR_JSTRT3                      ((uint32_t)0x00080000)        /*!<ADC3 Injected channel Start flag */
+#define  ADC_CSR_STRT3                       ((uint32_t)0x00100000)        /*!<ADC3 Regular channel Start flag */
+#define  ADC_CSR_DOVR3                       ((uint32_t)0x00200000)        /*!<ADC3 DMA overrun  flag */
+
+/*******************  Bit definition for ADC_CCR register  ********************/
+#define  ADC_CCR_MULTI                       ((uint32_t)0x0000001F)        /*!<MULTI[4:0] bits (Multi-ADC mode selection) */  
+#define  ADC_CCR_MULTI_0                     ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  ADC_CCR_MULTI_1                     ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  ADC_CCR_MULTI_2                     ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  ADC_CCR_MULTI_3                     ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  ADC_CCR_MULTI_4                     ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  ADC_CCR_DELAY                       ((uint32_t)0x00000F00)        /*!<DELAY[3:0] bits (Delay between 2 sampling phases) */  
+#define  ADC_CCR_DELAY_0                     ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  ADC_CCR_DELAY_1                     ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  ADC_CCR_DELAY_2                     ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  ADC_CCR_DELAY_3                     ((uint32_t)0x00000800)        /*!<Bit 3 */
+#define  ADC_CCR_DDS                         ((uint32_t)0x00002000)        /*!<DMA disable selection (Multi-ADC mode) */
+#define  ADC_CCR_DMA                         ((uint32_t)0x0000C000)        /*!<DMA[1:0] bits (Direct Memory Access mode for multimode) */  
+#define  ADC_CCR_DMA_0                       ((uint32_t)0x00004000)        /*!<Bit 0 */
+#define  ADC_CCR_DMA_1                       ((uint32_t)0x00008000)        /*!<Bit 1 */
+#define  ADC_CCR_ADCPRE                      ((uint32_t)0x00030000)        /*!<ADCPRE[1:0] bits (ADC prescaler) */  
+#define  ADC_CCR_ADCPRE_0                    ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  ADC_CCR_ADCPRE_1                    ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  ADC_CCR_VBATE                       ((uint32_t)0x00400000)        /*!<VBAT Enable */
+#define  ADC_CCR_TSVREFE                     ((uint32_t)0x00800000)        /*!<Temperature Sensor and VREFINT Enable */
+
+/*******************  Bit definition for ADC_CDR register  ********************/
+#define  ADC_CDR_DATA1                      ((uint32_t)0x0000FFFF)         /*!<1st data of a pair of regular conversions */
+#define  ADC_CDR_DATA2                      ((uint32_t)0xFFFF0000)         /*!<2nd data of a pair of regular conversions */
+
+/******************************************************************************/
+/*                                                                            */
+/*                         Controller Area Network                            */
+/*                                                                            */
+/******************************************************************************/
+/*!<CAN control and status registers */
+/*******************  Bit definition for CAN_MCR register  ********************/
+#define  CAN_MCR_INRQ                        ((uint16_t)0x0001)            /*!<Initialization Request */
+#define  CAN_MCR_SLEEP                       ((uint16_t)0x0002)            /*!<Sleep Mode Request */
+#define  CAN_MCR_TXFP                        ((uint16_t)0x0004)            /*!<Transmit FIFO Priority */
+#define  CAN_MCR_RFLM                        ((uint16_t)0x0008)            /*!<Receive FIFO Locked Mode */
+#define  CAN_MCR_NART                        ((uint16_t)0x0010)            /*!<No Automatic Retransmission */
+#define  CAN_MCR_AWUM                        ((uint16_t)0x0020)            /*!<Automatic Wakeup Mode */
+#define  CAN_MCR_ABOM                        ((uint16_t)0x0040)            /*!<Automatic Bus-Off Management */
+#define  CAN_MCR_TTCM                        ((uint16_t)0x0080)            /*!<Time Triggered Communication Mode */
+#define  CAN_MCR_RESET                       ((uint16_t)0x8000)            /*!<bxCAN software master reset */
+
+/*******************  Bit definition for CAN_MSR register  ********************/
+#define  CAN_MSR_INAK                        ((uint16_t)0x0001)            /*!<Initialization Acknowledge */
+#define  CAN_MSR_SLAK                        ((uint16_t)0x0002)            /*!<Sleep Acknowledge */
+#define  CAN_MSR_ERRI                        ((uint16_t)0x0004)            /*!<Error Interrupt */
+#define  CAN_MSR_WKUI                        ((uint16_t)0x0008)            /*!<Wakeup Interrupt */
+#define  CAN_MSR_SLAKI                       ((uint16_t)0x0010)            /*!<Sleep Acknowledge Interrupt */
+#define  CAN_MSR_TXM                         ((uint16_t)0x0100)            /*!<Transmit Mode */
+#define  CAN_MSR_RXM                         ((uint16_t)0x0200)            /*!<Receive Mode */
+#define  CAN_MSR_SAMP                        ((uint16_t)0x0400)            /*!<Last Sample Point */
+#define  CAN_MSR_RX                          ((uint16_t)0x0800)            /*!<CAN Rx Signal */
+
+/*******************  Bit definition for CAN_TSR register  ********************/
+#define  CAN_TSR_RQCP0                       ((uint32_t)0x00000001)        /*!<Request Completed Mailbox0 */
+#define  CAN_TSR_TXOK0                       ((uint32_t)0x00000002)        /*!<Transmission OK of Mailbox0 */
+#define  CAN_TSR_ALST0                       ((uint32_t)0x00000004)        /*!<Arbitration Lost for Mailbox0 */
+#define  CAN_TSR_TERR0                       ((uint32_t)0x00000008)        /*!<Transmission Error of Mailbox0 */
+#define  CAN_TSR_ABRQ0                       ((uint32_t)0x00000080)        /*!<Abort Request for Mailbox0 */
+#define  CAN_TSR_RQCP1                       ((uint32_t)0x00000100)        /*!<Request Completed Mailbox1 */
+#define  CAN_TSR_TXOK1                       ((uint32_t)0x00000200)        /*!<Transmission OK of Mailbox1 */
+#define  CAN_TSR_ALST1                       ((uint32_t)0x00000400)        /*!<Arbitration Lost for Mailbox1 */
+#define  CAN_TSR_TERR1                       ((uint32_t)0x00000800)        /*!<Transmission Error of Mailbox1 */
+#define  CAN_TSR_ABRQ1                       ((uint32_t)0x00008000)        /*!<Abort Request for Mailbox 1 */
+#define  CAN_TSR_RQCP2                       ((uint32_t)0x00010000)        /*!<Request Completed Mailbox2 */
+#define  CAN_TSR_TXOK2                       ((uint32_t)0x00020000)        /*!<Transmission OK of Mailbox 2 */
+#define  CAN_TSR_ALST2                       ((uint32_t)0x00040000)        /*!<Arbitration Lost for mailbox 2 */
+#define  CAN_TSR_TERR2                       ((uint32_t)0x00080000)        /*!<Transmission Error of Mailbox 2 */
+#define  CAN_TSR_ABRQ2                       ((uint32_t)0x00800000)        /*!<Abort Request for Mailbox 2 */
+#define  CAN_TSR_CODE                        ((uint32_t)0x03000000)        /*!<Mailbox Code */
+
+#define  CAN_TSR_TME                         ((uint32_t)0x1C000000)        /*!<TME[2:0] bits */
+#define  CAN_TSR_TME0                        ((uint32_t)0x04000000)        /*!<Transmit Mailbox 0 Empty */
+#define  CAN_TSR_TME1                        ((uint32_t)0x08000000)        /*!<Transmit Mailbox 1 Empty */
+#define  CAN_TSR_TME2                        ((uint32_t)0x10000000)        /*!<Transmit Mailbox 2 Empty */
+
+#define  CAN_TSR_LOW                         ((uint32_t)0xE0000000)        /*!<LOW[2:0] bits */
+#define  CAN_TSR_LOW0                        ((uint32_t)0x20000000)        /*!<Lowest Priority Flag for Mailbox 0 */
+#define  CAN_TSR_LOW1                        ((uint32_t)0x40000000)        /*!<Lowest Priority Flag for Mailbox 1 */
+#define  CAN_TSR_LOW2                        ((uint32_t)0x80000000)        /*!<Lowest Priority Flag for Mailbox 2 */
+
+/*******************  Bit definition for CAN_RF0R register  *******************/
+#define  CAN_RF0R_FMP0                       ((uint8_t)0x03)               /*!<FIFO 0 Message Pending */
+#define  CAN_RF0R_FULL0                      ((uint8_t)0x08)               /*!<FIFO 0 Full */
+#define  CAN_RF0R_FOVR0                      ((uint8_t)0x10)               /*!<FIFO 0 Overrun */
+#define  CAN_RF0R_RFOM0                      ((uint8_t)0x20)               /*!<Release FIFO 0 Output Mailbox */
+
+/*******************  Bit definition for CAN_RF1R register  *******************/
+#define  CAN_RF1R_FMP1                       ((uint8_t)0x03)               /*!<FIFO 1 Message Pending */
+#define  CAN_RF1R_FULL1                      ((uint8_t)0x08)               /*!<FIFO 1 Full */
+#define  CAN_RF1R_FOVR1                      ((uint8_t)0x10)               /*!<FIFO 1 Overrun */
+#define  CAN_RF1R_RFOM1                      ((uint8_t)0x20)               /*!<Release FIFO 1 Output Mailbox */
+
+/********************  Bit definition for CAN_IER register  *******************/
+#define  CAN_IER_TMEIE                       ((uint32_t)0x00000001)        /*!<Transmit Mailbox Empty Interrupt Enable */
+#define  CAN_IER_FMPIE0                      ((uint32_t)0x00000002)        /*!<FIFO Message Pending Interrupt Enable */
+#define  CAN_IER_FFIE0                       ((uint32_t)0x00000004)        /*!<FIFO Full Interrupt Enable */
+#define  CAN_IER_FOVIE0                      ((uint32_t)0x00000008)        /*!<FIFO Overrun Interrupt Enable */
+#define  CAN_IER_FMPIE1                      ((uint32_t)0x00000010)        /*!<FIFO Message Pending Interrupt Enable */
+#define  CAN_IER_FFIE1                       ((uint32_t)0x00000020)        /*!<FIFO Full Interrupt Enable */
+#define  CAN_IER_FOVIE1                      ((uint32_t)0x00000040)        /*!<FIFO Overrun Interrupt Enable */
+#define  CAN_IER_EWGIE                       ((uint32_t)0x00000100)        /*!<Error Warning Interrupt Enable */
+#define  CAN_IER_EPVIE                       ((uint32_t)0x00000200)        /*!<Error Passive Interrupt Enable */
+#define  CAN_IER_BOFIE                       ((uint32_t)0x00000400)        /*!<Bus-Off Interrupt Enable */
+#define  CAN_IER_LECIE                       ((uint32_t)0x00000800)        /*!<Last Error Code Interrupt Enable */
+#define  CAN_IER_ERRIE                       ((uint32_t)0x00008000)        /*!<Error Interrupt Enable */
+#define  CAN_IER_WKUIE                       ((uint32_t)0x00010000)        /*!<Wakeup Interrupt Enable */
+#define  CAN_IER_SLKIE                       ((uint32_t)0x00020000)        /*!<Sleep Interrupt Enable */
+
+/********************  Bit definition for CAN_ESR register  *******************/
+#define  CAN_ESR_EWGF                        ((uint32_t)0x00000001)        /*!<Error Warning Flag */
+#define  CAN_ESR_EPVF                        ((uint32_t)0x00000002)        /*!<Error Passive Flag */
+#define  CAN_ESR_BOFF                        ((uint32_t)0x00000004)        /*!<Bus-Off Flag */
+
+#define  CAN_ESR_LEC                         ((uint32_t)0x00000070)        /*!<LEC[2:0] bits (Last Error Code) */
+#define  CAN_ESR_LEC_0                       ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  CAN_ESR_LEC_1                       ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  CAN_ESR_LEC_2                       ((uint32_t)0x00000040)        /*!<Bit 2 */
+
+#define  CAN_ESR_TEC                         ((uint32_t)0x00FF0000)        /*!<Least significant byte of the 9-bit Transmit Error Counter */
+#define  CAN_ESR_REC                         ((uint32_t)0xFF000000)        /*!<Receive Error Counter */
+
+/*******************  Bit definition for CAN_BTR register  ********************/
+#define  CAN_BTR_BRP                         ((uint32_t)0x000003FF)        /*!<Baud Rate Prescaler */
+#define  CAN_BTR_TS1                         ((uint32_t)0x000F0000)        /*!<Time Segment 1 */
+#define  CAN_BTR_TS2                         ((uint32_t)0x00700000)        /*!<Time Segment 2 */
+#define  CAN_BTR_SJW                         ((uint32_t)0x03000000)        /*!<Resynchronization Jump Width */
+#define  CAN_BTR_LBKM                        ((uint32_t)0x40000000)        /*!<Loop Back Mode (Debug) */
+#define  CAN_BTR_SILM                        ((uint32_t)0x80000000)        /*!<Silent Mode */
+
+/*!<Mailbox registers */
+/******************  Bit definition for CAN_TI0R register  ********************/
+#define  CAN_TI0R_TXRQ                       ((uint32_t)0x00000001)        /*!<Transmit Mailbox Request */
+#define  CAN_TI0R_RTR                        ((uint32_t)0x00000002)        /*!<Remote Transmission Request */
+#define  CAN_TI0R_IDE                        ((uint32_t)0x00000004)        /*!<Identifier Extension */
+#define  CAN_TI0R_EXID                       ((uint32_t)0x001FFFF8)        /*!<Extended Identifier */
+#define  CAN_TI0R_STID                       ((uint32_t)0xFFE00000)        /*!<Standard Identifier or Extended Identifier */
+
+/******************  Bit definition for CAN_TDT0R register  *******************/
+#define  CAN_TDT0R_DLC                       ((uint32_t)0x0000000F)        /*!<Data Length Code */
+#define  CAN_TDT0R_TGT                       ((uint32_t)0x00000100)        /*!<Transmit Global Time */
+#define  CAN_TDT0R_TIME                      ((uint32_t)0xFFFF0000)        /*!<Message Time Stamp */
+
+/******************  Bit definition for CAN_TDL0R register  *******************/
+#define  CAN_TDL0R_DATA0                     ((uint32_t)0x000000FF)        /*!<Data byte 0 */
+#define  CAN_TDL0R_DATA1                     ((uint32_t)0x0000FF00)        /*!<Data byte 1 */
+#define  CAN_TDL0R_DATA2                     ((uint32_t)0x00FF0000)        /*!<Data byte 2 */
+#define  CAN_TDL0R_DATA3                     ((uint32_t)0xFF000000)        /*!<Data byte 3 */
+
+/******************  Bit definition for CAN_TDH0R register  *******************/
+#define  CAN_TDH0R_DATA4                     ((uint32_t)0x000000FF)        /*!<Data byte 4 */
+#define  CAN_TDH0R_DATA5                     ((uint32_t)0x0000FF00)        /*!<Data byte 5 */
+#define  CAN_TDH0R_DATA6                     ((uint32_t)0x00FF0000)        /*!<Data byte 6 */
+#define  CAN_TDH0R_DATA7                     ((uint32_t)0xFF000000)        /*!<Data byte 7 */
+
+/*******************  Bit definition for CAN_TI1R register  *******************/
+#define  CAN_TI1R_TXRQ                       ((uint32_t)0x00000001)        /*!<Transmit Mailbox Request */
+#define  CAN_TI1R_RTR                        ((uint32_t)0x00000002)        /*!<Remote Transmission Request */
+#define  CAN_TI1R_IDE                        ((uint32_t)0x00000004)        /*!<Identifier Extension */
+#define  CAN_TI1R_EXID                       ((uint32_t)0x001FFFF8)        /*!<Extended Identifier */
+#define  CAN_TI1R_STID                       ((uint32_t)0xFFE00000)        /*!<Standard Identifier or Extended Identifier */
+
+/*******************  Bit definition for CAN_TDT1R register  ******************/
+#define  CAN_TDT1R_DLC                       ((uint32_t)0x0000000F)        /*!<Data Length Code */
+#define  CAN_TDT1R_TGT                       ((uint32_t)0x00000100)        /*!<Transmit Global Time */
+#define  CAN_TDT1R_TIME                      ((uint32_t)0xFFFF0000)        /*!<Message Time Stamp */
+
+/*******************  Bit definition for CAN_TDL1R register  ******************/
+#define  CAN_TDL1R_DATA0                     ((uint32_t)0x000000FF)        /*!<Data byte 0 */
+#define  CAN_TDL1R_DATA1                     ((uint32_t)0x0000FF00)        /*!<Data byte 1 */
+#define  CAN_TDL1R_DATA2                     ((uint32_t)0x00FF0000)        /*!<Data byte 2 */
+#define  CAN_TDL1R_DATA3                     ((uint32_t)0xFF000000)        /*!<Data byte 3 */
+
+/*******************  Bit definition for CAN_TDH1R register  ******************/
+#define  CAN_TDH1R_DATA4                     ((uint32_t)0x000000FF)        /*!<Data byte 4 */
+#define  CAN_TDH1R_DATA5                     ((uint32_t)0x0000FF00)        /*!<Data byte 5 */
+#define  CAN_TDH1R_DATA6                     ((uint32_t)0x00FF0000)        /*!<Data byte 6 */
+#define  CAN_TDH1R_DATA7                     ((uint32_t)0xFF000000)        /*!<Data byte 7 */
+
+/*******************  Bit definition for CAN_TI2R register  *******************/
+#define  CAN_TI2R_TXRQ                       ((uint32_t)0x00000001)        /*!<Transmit Mailbox Request */
+#define  CAN_TI2R_RTR                        ((uint32_t)0x00000002)        /*!<Remote Transmission Request */
+#define  CAN_TI2R_IDE                        ((uint32_t)0x00000004)        /*!<Identifier Extension */
+#define  CAN_TI2R_EXID                       ((uint32_t)0x001FFFF8)        /*!<Extended identifier */
+#define  CAN_TI2R_STID                       ((uint32_t)0xFFE00000)        /*!<Standard Identifier or Extended Identifier */
+
+/*******************  Bit definition for CAN_TDT2R register  ******************/  
+#define  CAN_TDT2R_DLC                       ((uint32_t)0x0000000F)        /*!<Data Length Code */
+#define  CAN_TDT2R_TGT                       ((uint32_t)0x00000100)        /*!<Transmit Global Time */
+#define  CAN_TDT2R_TIME                      ((uint32_t)0xFFFF0000)        /*!<Message Time Stamp */
+
+/*******************  Bit definition for CAN_TDL2R register  ******************/
+#define  CAN_TDL2R_DATA0                     ((uint32_t)0x000000FF)        /*!<Data byte 0 */
+#define  CAN_TDL2R_DATA1                     ((uint32_t)0x0000FF00)        /*!<Data byte 1 */
+#define  CAN_TDL2R_DATA2                     ((uint32_t)0x00FF0000)        /*!<Data byte 2 */
+#define  CAN_TDL2R_DATA3                     ((uint32_t)0xFF000000)        /*!<Data byte 3 */
+
+/*******************  Bit definition for CAN_TDH2R register  ******************/
+#define  CAN_TDH2R_DATA4                     ((uint32_t)0x000000FF)        /*!<Data byte 4 */
+#define  CAN_TDH2R_DATA5                     ((uint32_t)0x0000FF00)        /*!<Data byte 5 */
+#define  CAN_TDH2R_DATA6                     ((uint32_t)0x00FF0000)        /*!<Data byte 6 */
+#define  CAN_TDH2R_DATA7                     ((uint32_t)0xFF000000)        /*!<Data byte 7 */
+
+/*******************  Bit definition for CAN_RI0R register  *******************/
+#define  CAN_RI0R_RTR                        ((uint32_t)0x00000002)        /*!<Remote Transmission Request */
+#define  CAN_RI0R_IDE                        ((uint32_t)0x00000004)        /*!<Identifier Extension */
+#define  CAN_RI0R_EXID                       ((uint32_t)0x001FFFF8)        /*!<Extended Identifier */
+#define  CAN_RI0R_STID                       ((uint32_t)0xFFE00000)        /*!<Standard Identifier or Extended Identifier */
+
+/*******************  Bit definition for CAN_RDT0R register  ******************/
+#define  CAN_RDT0R_DLC                       ((uint32_t)0x0000000F)        /*!<Data Length Code */
+#define  CAN_RDT0R_FMI                       ((uint32_t)0x0000FF00)        /*!<Filter Match Index */
+#define  CAN_RDT0R_TIME                      ((uint32_t)0xFFFF0000)        /*!<Message Time Stamp */
+
+/*******************  Bit definition for CAN_RDL0R register  ******************/
+#define  CAN_RDL0R_DATA0                     ((uint32_t)0x000000FF)        /*!<Data byte 0 */
+#define  CAN_RDL0R_DATA1                     ((uint32_t)0x0000FF00)        /*!<Data byte 1 */
+#define  CAN_RDL0R_DATA2                     ((uint32_t)0x00FF0000)        /*!<Data byte 2 */
+#define  CAN_RDL0R_DATA3                     ((uint32_t)0xFF000000)        /*!<Data byte 3 */
+
+/*******************  Bit definition for CAN_RDH0R register  ******************/
+#define  CAN_RDH0R_DATA4                     ((uint32_t)0x000000FF)        /*!<Data byte 4 */
+#define  CAN_RDH0R_DATA5                     ((uint32_t)0x0000FF00)        /*!<Data byte 5 */
+#define  CAN_RDH0R_DATA6                     ((uint32_t)0x00FF0000)        /*!<Data byte 6 */
+#define  CAN_RDH0R_DATA7                     ((uint32_t)0xFF000000)        /*!<Data byte 7 */
+
+/*******************  Bit definition for CAN_RI1R register  *******************/
+#define  CAN_RI1R_RTR                        ((uint32_t)0x00000002)        /*!<Remote Transmission Request */
+#define  CAN_RI1R_IDE                        ((uint32_t)0x00000004)        /*!<Identifier Extension */
+#define  CAN_RI1R_EXID                       ((uint32_t)0x001FFFF8)        /*!<Extended identifier */
+#define  CAN_RI1R_STID                       ((uint32_t)0xFFE00000)        /*!<Standard Identifier or Extended Identifier */
+
+/*******************  Bit definition for CAN_RDT1R register  ******************/
+#define  CAN_RDT1R_DLC                       ((uint32_t)0x0000000F)        /*!<Data Length Code */
+#define  CAN_RDT1R_FMI                       ((uint32_t)0x0000FF00)        /*!<Filter Match Index */
+#define  CAN_RDT1R_TIME                      ((uint32_t)0xFFFF0000)        /*!<Message Time Stamp */
+
+/*******************  Bit definition for CAN_RDL1R register  ******************/
+#define  CAN_RDL1R_DATA0                     ((uint32_t)0x000000FF)        /*!<Data byte 0 */
+#define  CAN_RDL1R_DATA1                     ((uint32_t)0x0000FF00)        /*!<Data byte 1 */
+#define  CAN_RDL1R_DATA2                     ((uint32_t)0x00FF0000)        /*!<Data byte 2 */
+#define  CAN_RDL1R_DATA3                     ((uint32_t)0xFF000000)        /*!<Data byte 3 */
+
+/*******************  Bit definition for CAN_RDH1R register  ******************/
+#define  CAN_RDH1R_DATA4                     ((uint32_t)0x000000FF)        /*!<Data byte 4 */
+#define  CAN_RDH1R_DATA5                     ((uint32_t)0x0000FF00)        /*!<Data byte 5 */
+#define  CAN_RDH1R_DATA6                     ((uint32_t)0x00FF0000)        /*!<Data byte 6 */
+#define  CAN_RDH1R_DATA7                     ((uint32_t)0xFF000000)        /*!<Data byte 7 */
+
+/*!<CAN filter registers */
+/*******************  Bit definition for CAN_FMR register  ********************/
+#define  CAN_FMR_FINIT                       ((uint8_t)0x01)               /*!<Filter Init Mode */
+
+/*******************  Bit definition for CAN_FM1R register  *******************/
+#define  CAN_FM1R_FBM                        ((uint16_t)0x3FFF)            /*!<Filter Mode */
+#define  CAN_FM1R_FBM0                       ((uint16_t)0x0001)            /*!<Filter Init Mode bit 0 */
+#define  CAN_FM1R_FBM1                       ((uint16_t)0x0002)            /*!<Filter Init Mode bit 1 */
+#define  CAN_FM1R_FBM2                       ((uint16_t)0x0004)            /*!<Filter Init Mode bit 2 */
+#define  CAN_FM1R_FBM3                       ((uint16_t)0x0008)            /*!<Filter Init Mode bit 3 */
+#define  CAN_FM1R_FBM4                       ((uint16_t)0x0010)            /*!<Filter Init Mode bit 4 */
+#define  CAN_FM1R_FBM5                       ((uint16_t)0x0020)            /*!<Filter Init Mode bit 5 */
+#define  CAN_FM1R_FBM6                       ((uint16_t)0x0040)            /*!<Filter Init Mode bit 6 */
+#define  CAN_FM1R_FBM7                       ((uint16_t)0x0080)            /*!<Filter Init Mode bit 7 */
+#define  CAN_FM1R_FBM8                       ((uint16_t)0x0100)            /*!<Filter Init Mode bit 8 */
+#define  CAN_FM1R_FBM9                       ((uint16_t)0x0200)            /*!<Filter Init Mode bit 9 */
+#define  CAN_FM1R_FBM10                      ((uint16_t)0x0400)            /*!<Filter Init Mode bit 10 */
+#define  CAN_FM1R_FBM11                      ((uint16_t)0x0800)            /*!<Filter Init Mode bit 11 */
+#define  CAN_FM1R_FBM12                      ((uint16_t)0x1000)            /*!<Filter Init Mode bit 12 */
+#define  CAN_FM1R_FBM13                      ((uint16_t)0x2000)            /*!<Filter Init Mode bit 13 */
+
+/*******************  Bit definition for CAN_FS1R register  *******************/
+#define  CAN_FS1R_FSC                        ((uint16_t)0x3FFF)            /*!<Filter Scale Configuration */
+#define  CAN_FS1R_FSC0                       ((uint16_t)0x0001)            /*!<Filter Scale Configuration bit 0 */
+#define  CAN_FS1R_FSC1                       ((uint16_t)0x0002)            /*!<Filter Scale Configuration bit 1 */
+#define  CAN_FS1R_FSC2                       ((uint16_t)0x0004)            /*!<Filter Scale Configuration bit 2 */
+#define  CAN_FS1R_FSC3                       ((uint16_t)0x0008)            /*!<Filter Scale Configuration bit 3 */
+#define  CAN_FS1R_FSC4                       ((uint16_t)0x0010)            /*!<Filter Scale Configuration bit 4 */
+#define  CAN_FS1R_FSC5                       ((uint16_t)0x0020)            /*!<Filter Scale Configuration bit 5 */
+#define  CAN_FS1R_FSC6                       ((uint16_t)0x0040)            /*!<Filter Scale Configuration bit 6 */
+#define  CAN_FS1R_FSC7                       ((uint16_t)0x0080)            /*!<Filter Scale Configuration bit 7 */
+#define  CAN_FS1R_FSC8                       ((uint16_t)0x0100)            /*!<Filter Scale Configuration bit 8 */
+#define  CAN_FS1R_FSC9                       ((uint16_t)0x0200)            /*!<Filter Scale Configuration bit 9 */
+#define  CAN_FS1R_FSC10                      ((uint16_t)0x0400)            /*!<Filter Scale Configuration bit 10 */
+#define  CAN_FS1R_FSC11                      ((uint16_t)0x0800)            /*!<Filter Scale Configuration bit 11 */
+#define  CAN_FS1R_FSC12                      ((uint16_t)0x1000)            /*!<Filter Scale Configuration bit 12 */
+#define  CAN_FS1R_FSC13                      ((uint16_t)0x2000)            /*!<Filter Scale Configuration bit 13 */
+
+/******************  Bit definition for CAN_FFA1R register  *******************/
+#define  CAN_FFA1R_FFA                       ((uint16_t)0x3FFF)            /*!<Filter FIFO Assignment */
+#define  CAN_FFA1R_FFA0                      ((uint16_t)0x0001)            /*!<Filter FIFO Assignment for Filter 0 */
+#define  CAN_FFA1R_FFA1                      ((uint16_t)0x0002)            /*!<Filter FIFO Assignment for Filter 1 */
+#define  CAN_FFA1R_FFA2                      ((uint16_t)0x0004)            /*!<Filter FIFO Assignment for Filter 2 */
+#define  CAN_FFA1R_FFA3                      ((uint16_t)0x0008)            /*!<Filter FIFO Assignment for Filter 3 */
+#define  CAN_FFA1R_FFA4                      ((uint16_t)0x0010)            /*!<Filter FIFO Assignment for Filter 4 */
+#define  CAN_FFA1R_FFA5                      ((uint16_t)0x0020)            /*!<Filter FIFO Assignment for Filter 5 */
+#define  CAN_FFA1R_FFA6                      ((uint16_t)0x0040)            /*!<Filter FIFO Assignment for Filter 6 */
+#define  CAN_FFA1R_FFA7                      ((uint16_t)0x0080)            /*!<Filter FIFO Assignment for Filter 7 */
+#define  CAN_FFA1R_FFA8                      ((uint16_t)0x0100)            /*!<Filter FIFO Assignment for Filter 8 */
+#define  CAN_FFA1R_FFA9                      ((uint16_t)0x0200)            /*!<Filter FIFO Assignment for Filter 9 */
+#define  CAN_FFA1R_FFA10                     ((uint16_t)0x0400)            /*!<Filter FIFO Assignment for Filter 10 */
+#define  CAN_FFA1R_FFA11                     ((uint16_t)0x0800)            /*!<Filter FIFO Assignment for Filter 11 */
+#define  CAN_FFA1R_FFA12                     ((uint16_t)0x1000)            /*!<Filter FIFO Assignment for Filter 12 */
+#define  CAN_FFA1R_FFA13                     ((uint16_t)0x2000)            /*!<Filter FIFO Assignment for Filter 13 */
+
+/*******************  Bit definition for CAN_FA1R register  *******************/
+#define  CAN_FA1R_FACT                       ((uint16_t)0x3FFF)            /*!<Filter Active */
+#define  CAN_FA1R_FACT0                      ((uint16_t)0x0001)            /*!<Filter 0 Active */
+#define  CAN_FA1R_FACT1                      ((uint16_t)0x0002)            /*!<Filter 1 Active */
+#define  CAN_FA1R_FACT2                      ((uint16_t)0x0004)            /*!<Filter 2 Active */
+#define  CAN_FA1R_FACT3                      ((uint16_t)0x0008)            /*!<Filter 3 Active */
+#define  CAN_FA1R_FACT4                      ((uint16_t)0x0010)            /*!<Filter 4 Active */
+#define  CAN_FA1R_FACT5                      ((uint16_t)0x0020)            /*!<Filter 5 Active */
+#define  CAN_FA1R_FACT6                      ((uint16_t)0x0040)            /*!<Filter 6 Active */
+#define  CAN_FA1R_FACT7                      ((uint16_t)0x0080)            /*!<Filter 7 Active */
+#define  CAN_FA1R_FACT8                      ((uint16_t)0x0100)            /*!<Filter 8 Active */
+#define  CAN_FA1R_FACT9                      ((uint16_t)0x0200)            /*!<Filter 9 Active */
+#define  CAN_FA1R_FACT10                     ((uint16_t)0x0400)            /*!<Filter 10 Active */
+#define  CAN_FA1R_FACT11                     ((uint16_t)0x0800)            /*!<Filter 11 Active */
+#define  CAN_FA1R_FACT12                     ((uint16_t)0x1000)            /*!<Filter 12 Active */
+#define  CAN_FA1R_FACT13                     ((uint16_t)0x2000)            /*!<Filter 13 Active */
+
+/*******************  Bit definition for CAN_F0R1 register  *******************/
+#define  CAN_F0R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F0R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F0R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F0R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F0R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F0R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F0R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F0R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F0R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F0R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F0R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F0R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F0R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F0R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F0R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F0R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F0R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F0R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F0R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F0R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F0R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F0R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F0R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F0R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F0R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F0R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F0R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F0R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F0R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F0R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F0R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F0R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F1R1 register  *******************/
+#define  CAN_F1R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F1R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F1R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F1R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F1R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F1R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F1R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F1R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F1R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F1R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F1R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F1R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F1R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F1R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F1R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F1R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F1R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F1R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F1R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F1R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F1R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F1R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F1R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F1R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F1R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F1R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F1R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F1R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F1R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F1R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F1R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F1R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F2R1 register  *******************/
+#define  CAN_F2R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F2R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F2R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F2R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F2R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F2R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F2R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F2R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F2R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F2R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F2R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F2R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F2R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F2R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F2R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F2R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F2R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F2R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F2R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F2R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F2R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F2R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F2R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F2R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F2R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F2R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F2R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F2R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F2R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F2R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F2R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F2R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F3R1 register  *******************/
+#define  CAN_F3R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F3R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F3R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F3R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F3R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F3R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F3R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F3R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F3R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F3R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F3R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F3R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F3R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F3R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F3R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F3R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F3R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F3R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F3R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F3R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F3R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F3R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F3R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F3R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F3R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F3R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F3R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F3R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F3R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F3R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F3R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F3R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F4R1 register  *******************/
+#define  CAN_F4R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F4R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F4R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F4R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F4R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F4R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F4R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F4R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F4R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F4R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F4R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F4R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F4R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F4R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F4R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F4R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F4R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F4R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F4R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F4R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F4R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F4R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F4R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F4R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F4R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F4R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F4R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F4R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F4R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F4R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F4R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F4R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F5R1 register  *******************/
+#define  CAN_F5R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F5R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F5R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F5R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F5R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F5R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F5R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F5R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F5R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F5R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F5R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F5R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F5R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F5R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F5R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F5R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F5R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F5R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F5R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F5R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F5R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F5R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F5R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F5R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F5R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F5R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F5R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F5R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F5R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F5R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F5R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F5R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F6R1 register  *******************/
+#define  CAN_F6R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F6R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F6R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F6R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F6R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F6R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F6R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F6R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F6R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F6R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F6R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F6R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F6R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F6R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F6R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F6R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F6R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F6R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F6R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F6R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F6R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F6R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F6R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F6R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F6R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F6R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F6R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F6R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F6R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F6R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F6R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F6R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F7R1 register  *******************/
+#define  CAN_F7R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F7R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F7R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F7R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F7R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F7R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F7R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F7R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F7R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F7R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F7R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F7R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F7R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F7R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F7R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F7R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F7R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F7R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F7R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F7R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F7R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F7R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F7R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F7R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F7R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F7R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F7R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F7R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F7R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F7R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F7R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F7R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F8R1 register  *******************/
+#define  CAN_F8R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F8R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F8R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F8R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F8R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F8R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F8R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F8R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F8R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F8R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F8R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F8R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F8R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F8R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F8R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F8R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F8R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F8R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F8R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F8R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F8R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F8R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F8R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F8R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F8R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F8R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F8R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F8R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F8R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F8R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F8R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F8R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F9R1 register  *******************/
+#define  CAN_F9R1_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F9R1_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F9R1_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F9R1_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F9R1_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F9R1_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F9R1_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F9R1_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F9R1_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F9R1_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F9R1_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F9R1_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F9R1_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F9R1_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F9R1_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F9R1_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F9R1_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F9R1_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F9R1_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F9R1_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F9R1_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F9R1_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F9R1_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F9R1_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F9R1_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F9R1_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F9R1_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F9R1_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F9R1_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F9R1_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F9R1_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F9R1_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F10R1 register  ******************/
+#define  CAN_F10R1_FB0                       ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F10R1_FB1                       ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F10R1_FB2                       ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F10R1_FB3                       ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F10R1_FB4                       ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F10R1_FB5                       ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F10R1_FB6                       ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F10R1_FB7                       ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F10R1_FB8                       ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F10R1_FB9                       ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F10R1_FB10                      ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F10R1_FB11                      ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F10R1_FB12                      ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F10R1_FB13                      ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F10R1_FB14                      ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F10R1_FB15                      ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F10R1_FB16                      ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F10R1_FB17                      ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F10R1_FB18                      ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F10R1_FB19                      ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F10R1_FB20                      ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F10R1_FB21                      ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F10R1_FB22                      ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F10R1_FB23                      ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F10R1_FB24                      ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F10R1_FB25                      ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F10R1_FB26                      ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F10R1_FB27                      ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F10R1_FB28                      ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F10R1_FB29                      ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F10R1_FB30                      ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F10R1_FB31                      ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F11R1 register  ******************/
+#define  CAN_F11R1_FB0                       ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F11R1_FB1                       ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F11R1_FB2                       ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F11R1_FB3                       ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F11R1_FB4                       ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F11R1_FB5                       ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F11R1_FB6                       ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F11R1_FB7                       ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F11R1_FB8                       ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F11R1_FB9                       ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F11R1_FB10                      ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F11R1_FB11                      ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F11R1_FB12                      ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F11R1_FB13                      ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F11R1_FB14                      ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F11R1_FB15                      ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F11R1_FB16                      ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F11R1_FB17                      ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F11R1_FB18                      ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F11R1_FB19                      ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F11R1_FB20                      ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F11R1_FB21                      ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F11R1_FB22                      ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F11R1_FB23                      ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F11R1_FB24                      ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F11R1_FB25                      ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F11R1_FB26                      ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F11R1_FB27                      ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F11R1_FB28                      ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F11R1_FB29                      ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F11R1_FB30                      ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F11R1_FB31                      ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F12R1 register  ******************/
+#define  CAN_F12R1_FB0                       ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F12R1_FB1                       ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F12R1_FB2                       ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F12R1_FB3                       ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F12R1_FB4                       ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F12R1_FB5                       ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F12R1_FB6                       ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F12R1_FB7                       ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F12R1_FB8                       ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F12R1_FB9                       ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F12R1_FB10                      ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F12R1_FB11                      ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F12R1_FB12                      ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F12R1_FB13                      ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F12R1_FB14                      ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F12R1_FB15                      ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F12R1_FB16                      ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F12R1_FB17                      ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F12R1_FB18                      ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F12R1_FB19                      ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F12R1_FB20                      ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F12R1_FB21                      ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F12R1_FB22                      ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F12R1_FB23                      ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F12R1_FB24                      ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F12R1_FB25                      ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F12R1_FB26                      ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F12R1_FB27                      ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F12R1_FB28                      ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F12R1_FB29                      ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F12R1_FB30                      ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F12R1_FB31                      ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F13R1 register  ******************/
+#define  CAN_F13R1_FB0                       ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F13R1_FB1                       ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F13R1_FB2                       ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F13R1_FB3                       ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F13R1_FB4                       ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F13R1_FB5                       ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F13R1_FB6                       ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F13R1_FB7                       ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F13R1_FB8                       ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F13R1_FB9                       ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F13R1_FB10                      ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F13R1_FB11                      ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F13R1_FB12                      ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F13R1_FB13                      ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F13R1_FB14                      ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F13R1_FB15                      ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F13R1_FB16                      ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F13R1_FB17                      ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F13R1_FB18                      ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F13R1_FB19                      ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F13R1_FB20                      ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F13R1_FB21                      ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F13R1_FB22                      ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F13R1_FB23                      ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F13R1_FB24                      ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F13R1_FB25                      ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F13R1_FB26                      ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F13R1_FB27                      ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F13R1_FB28                      ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F13R1_FB29                      ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F13R1_FB30                      ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F13R1_FB31                      ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F0R2 register  *******************/
+#define  CAN_F0R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F0R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F0R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F0R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F0R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F0R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F0R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F0R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F0R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F0R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F0R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F0R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F0R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F0R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F0R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F0R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F0R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F0R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F0R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F0R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F0R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F0R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F0R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F0R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F0R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F0R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F0R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F0R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F0R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F0R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F0R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F0R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F1R2 register  *******************/
+#define  CAN_F1R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F1R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F1R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F1R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F1R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F1R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F1R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F1R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F1R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F1R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F1R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F1R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F1R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F1R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F1R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F1R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F1R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F1R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F1R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F1R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F1R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F1R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F1R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F1R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F1R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F1R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F1R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F1R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F1R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F1R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F1R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F1R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F2R2 register  *******************/
+#define  CAN_F2R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F2R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F2R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F2R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F2R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F2R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F2R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F2R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F2R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F2R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F2R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F2R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F2R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F2R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F2R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F2R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F2R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F2R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F2R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F2R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F2R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F2R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F2R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F2R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F2R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F2R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F2R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F2R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F2R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F2R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F2R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F2R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F3R2 register  *******************/
+#define  CAN_F3R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F3R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F3R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F3R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F3R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F3R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F3R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F3R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F3R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F3R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F3R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F3R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F3R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F3R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F3R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F3R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F3R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F3R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F3R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F3R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F3R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F3R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F3R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F3R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F3R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F3R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F3R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F3R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F3R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F3R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F3R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F3R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F4R2 register  *******************/
+#define  CAN_F4R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F4R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F4R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F4R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F4R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F4R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F4R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F4R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F4R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F4R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F4R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F4R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F4R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F4R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F4R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F4R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F4R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F4R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F4R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F4R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F4R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F4R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F4R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F4R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F4R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F4R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F4R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F4R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F4R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F4R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F4R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F4R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F5R2 register  *******************/
+#define  CAN_F5R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F5R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F5R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F5R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F5R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F5R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F5R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F5R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F5R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F5R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F5R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F5R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F5R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F5R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F5R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F5R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F5R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F5R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F5R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F5R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F5R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F5R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F5R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F5R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F5R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F5R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F5R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F5R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F5R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F5R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F5R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F5R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F6R2 register  *******************/
+#define  CAN_F6R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F6R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F6R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F6R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F6R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F6R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F6R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F6R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F6R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F6R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F6R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F6R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F6R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F6R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F6R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F6R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F6R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F6R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F6R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F6R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F6R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F6R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F6R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F6R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F6R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F6R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F6R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F6R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F6R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F6R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F6R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F6R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F7R2 register  *******************/
+#define  CAN_F7R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F7R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F7R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F7R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F7R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F7R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F7R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F7R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F7R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F7R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F7R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F7R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F7R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F7R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F7R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F7R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F7R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F7R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F7R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F7R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F7R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F7R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F7R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F7R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F7R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F7R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F7R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F7R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F7R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F7R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F7R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F7R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F8R2 register  *******************/
+#define  CAN_F8R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F8R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F8R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F8R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F8R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F8R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F8R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F8R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F8R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F8R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F8R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F8R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F8R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F8R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F8R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F8R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F8R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F8R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F8R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F8R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F8R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F8R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F8R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F8R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F8R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F8R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F8R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F8R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F8R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F8R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F8R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F8R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F9R2 register  *******************/
+#define  CAN_F9R2_FB0                        ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F9R2_FB1                        ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F9R2_FB2                        ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F9R2_FB3                        ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F9R2_FB4                        ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F9R2_FB5                        ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F9R2_FB6                        ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F9R2_FB7                        ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F9R2_FB8                        ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F9R2_FB9                        ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F9R2_FB10                       ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F9R2_FB11                       ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F9R2_FB12                       ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F9R2_FB13                       ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F9R2_FB14                       ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F9R2_FB15                       ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F9R2_FB16                       ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F9R2_FB17                       ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F9R2_FB18                       ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F9R2_FB19                       ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F9R2_FB20                       ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F9R2_FB21                       ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F9R2_FB22                       ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F9R2_FB23                       ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F9R2_FB24                       ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F9R2_FB25                       ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F9R2_FB26                       ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F9R2_FB27                       ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F9R2_FB28                       ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F9R2_FB29                       ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F9R2_FB30                       ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F9R2_FB31                       ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F10R2 register  ******************/
+#define  CAN_F10R2_FB0                       ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F10R2_FB1                       ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F10R2_FB2                       ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F10R2_FB3                       ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F10R2_FB4                       ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F10R2_FB5                       ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F10R2_FB6                       ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F10R2_FB7                       ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F10R2_FB8                       ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F10R2_FB9                       ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F10R2_FB10                      ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F10R2_FB11                      ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F10R2_FB12                      ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F10R2_FB13                      ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F10R2_FB14                      ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F10R2_FB15                      ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F10R2_FB16                      ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F10R2_FB17                      ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F10R2_FB18                      ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F10R2_FB19                      ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F10R2_FB20                      ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F10R2_FB21                      ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F10R2_FB22                      ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F10R2_FB23                      ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F10R2_FB24                      ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F10R2_FB25                      ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F10R2_FB26                      ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F10R2_FB27                      ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F10R2_FB28                      ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F10R2_FB29                      ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F10R2_FB30                      ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F10R2_FB31                      ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F11R2 register  ******************/
+#define  CAN_F11R2_FB0                       ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F11R2_FB1                       ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F11R2_FB2                       ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F11R2_FB3                       ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F11R2_FB4                       ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F11R2_FB5                       ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F11R2_FB6                       ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F11R2_FB7                       ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F11R2_FB8                       ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F11R2_FB9                       ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F11R2_FB10                      ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F11R2_FB11                      ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F11R2_FB12                      ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F11R2_FB13                      ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F11R2_FB14                      ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F11R2_FB15                      ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F11R2_FB16                      ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F11R2_FB17                      ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F11R2_FB18                      ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F11R2_FB19                      ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F11R2_FB20                      ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F11R2_FB21                      ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F11R2_FB22                      ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F11R2_FB23                      ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F11R2_FB24                      ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F11R2_FB25                      ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F11R2_FB26                      ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F11R2_FB27                      ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F11R2_FB28                      ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F11R2_FB29                      ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F11R2_FB30                      ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F11R2_FB31                      ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F12R2 register  ******************/
+#define  CAN_F12R2_FB0                       ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F12R2_FB1                       ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F12R2_FB2                       ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F12R2_FB3                       ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F12R2_FB4                       ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F12R2_FB5                       ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F12R2_FB6                       ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F12R2_FB7                       ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F12R2_FB8                       ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F12R2_FB9                       ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F12R2_FB10                      ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F12R2_FB11                      ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F12R2_FB12                      ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F12R2_FB13                      ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F12R2_FB14                      ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F12R2_FB15                      ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F12R2_FB16                      ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F12R2_FB17                      ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F12R2_FB18                      ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F12R2_FB19                      ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F12R2_FB20                      ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F12R2_FB21                      ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F12R2_FB22                      ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F12R2_FB23                      ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F12R2_FB24                      ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F12R2_FB25                      ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F12R2_FB26                      ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F12R2_FB27                      ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F12R2_FB28                      ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F12R2_FB29                      ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F12R2_FB30                      ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F12R2_FB31                      ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/*******************  Bit definition for CAN_F13R2 register  ******************/
+#define  CAN_F13R2_FB0                       ((uint32_t)0x00000001)        /*!<Filter bit 0 */
+#define  CAN_F13R2_FB1                       ((uint32_t)0x00000002)        /*!<Filter bit 1 */
+#define  CAN_F13R2_FB2                       ((uint32_t)0x00000004)        /*!<Filter bit 2 */
+#define  CAN_F13R2_FB3                       ((uint32_t)0x00000008)        /*!<Filter bit 3 */
+#define  CAN_F13R2_FB4                       ((uint32_t)0x00000010)        /*!<Filter bit 4 */
+#define  CAN_F13R2_FB5                       ((uint32_t)0x00000020)        /*!<Filter bit 5 */
+#define  CAN_F13R2_FB6                       ((uint32_t)0x00000040)        /*!<Filter bit 6 */
+#define  CAN_F13R2_FB7                       ((uint32_t)0x00000080)        /*!<Filter bit 7 */
+#define  CAN_F13R2_FB8                       ((uint32_t)0x00000100)        /*!<Filter bit 8 */
+#define  CAN_F13R2_FB9                       ((uint32_t)0x00000200)        /*!<Filter bit 9 */
+#define  CAN_F13R2_FB10                      ((uint32_t)0x00000400)        /*!<Filter bit 10 */
+#define  CAN_F13R2_FB11                      ((uint32_t)0x00000800)        /*!<Filter bit 11 */
+#define  CAN_F13R2_FB12                      ((uint32_t)0x00001000)        /*!<Filter bit 12 */
+#define  CAN_F13R2_FB13                      ((uint32_t)0x00002000)        /*!<Filter bit 13 */
+#define  CAN_F13R2_FB14                      ((uint32_t)0x00004000)        /*!<Filter bit 14 */
+#define  CAN_F13R2_FB15                      ((uint32_t)0x00008000)        /*!<Filter bit 15 */
+#define  CAN_F13R2_FB16                      ((uint32_t)0x00010000)        /*!<Filter bit 16 */
+#define  CAN_F13R2_FB17                      ((uint32_t)0x00020000)        /*!<Filter bit 17 */
+#define  CAN_F13R2_FB18                      ((uint32_t)0x00040000)        /*!<Filter bit 18 */
+#define  CAN_F13R2_FB19                      ((uint32_t)0x00080000)        /*!<Filter bit 19 */
+#define  CAN_F13R2_FB20                      ((uint32_t)0x00100000)        /*!<Filter bit 20 */
+#define  CAN_F13R2_FB21                      ((uint32_t)0x00200000)        /*!<Filter bit 21 */
+#define  CAN_F13R2_FB22                      ((uint32_t)0x00400000)        /*!<Filter bit 22 */
+#define  CAN_F13R2_FB23                      ((uint32_t)0x00800000)        /*!<Filter bit 23 */
+#define  CAN_F13R2_FB24                      ((uint32_t)0x01000000)        /*!<Filter bit 24 */
+#define  CAN_F13R2_FB25                      ((uint32_t)0x02000000)        /*!<Filter bit 25 */
+#define  CAN_F13R2_FB26                      ((uint32_t)0x04000000)        /*!<Filter bit 26 */
+#define  CAN_F13R2_FB27                      ((uint32_t)0x08000000)        /*!<Filter bit 27 */
+#define  CAN_F13R2_FB28                      ((uint32_t)0x10000000)        /*!<Filter bit 28 */
+#define  CAN_F13R2_FB29                      ((uint32_t)0x20000000)        /*!<Filter bit 29 */
+#define  CAN_F13R2_FB30                      ((uint32_t)0x40000000)        /*!<Filter bit 30 */
+#define  CAN_F13R2_FB31                      ((uint32_t)0x80000000)        /*!<Filter bit 31 */
+
+/******************************************************************************/
+/*                                                                            */
+/*                          CRC calculation unit                              */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bit definition for CRC_DR register  *********************/
+#define  CRC_DR_DR                           ((uint32_t)0xFFFFFFFF) /*!< Data register bits */
+
+
+/*******************  Bit definition for CRC_IDR register  ********************/
+#define  CRC_IDR_IDR                         ((uint8_t)0xFF)        /*!< General-purpose 8-bit data register bits */
+
+
+/********************  Bit definition for CRC_CR register  ********************/
+#define  CRC_CR_RESET                        ((uint8_t)0x01)        /*!< RESET bit */
+
+/******************************************************************************/
+/*                                                                            */
+/*                            Crypto Processor                                */
+/*                                                                            */
+/******************************************************************************/
+/******************* Bits definition for CRYP_CR register  ********************/
+#define CRYP_CR_ALGODIR                      ((uint32_t)0x00000004)
+
+#define CRYP_CR_ALGOMODE                     ((uint32_t)0x00000038)
+#define CRYP_CR_ALGOMODE_0                   ((uint32_t)0x00000008)
+#define CRYP_CR_ALGOMODE_1                   ((uint32_t)0x00000010)
+#define CRYP_CR_ALGOMODE_2                   ((uint32_t)0x00000020)
+#define CRYP_CR_ALGOMODE_TDES_ECB            ((uint32_t)0x00000000)
+#define CRYP_CR_ALGOMODE_TDES_CBC            ((uint32_t)0x00000008)
+#define CRYP_CR_ALGOMODE_DES_ECB             ((uint32_t)0x00000010)
+#define CRYP_CR_ALGOMODE_DES_CBC             ((uint32_t)0x00000018)
+#define CRYP_CR_ALGOMODE_AES_ECB             ((uint32_t)0x00000020)
+#define CRYP_CR_ALGOMODE_AES_CBC             ((uint32_t)0x00000028)
+#define CRYP_CR_ALGOMODE_AES_CTR             ((uint32_t)0x00000030)
+#define CRYP_CR_ALGOMODE_AES_KEY             ((uint32_t)0x00000038)
+
+#define CRYP_CR_DATATYPE                     ((uint32_t)0x000000C0)
+#define CRYP_CR_DATATYPE_0                   ((uint32_t)0x00000040)
+#define CRYP_CR_DATATYPE_1                   ((uint32_t)0x00000080)
+#define CRYP_CR_KEYSIZE                      ((uint32_t)0x00000300)
+#define CRYP_CR_KEYSIZE_0                    ((uint32_t)0x00000100)
+#define CRYP_CR_KEYSIZE_1                    ((uint32_t)0x00000200)
+#define CRYP_CR_FFLUSH                       ((uint32_t)0x00004000)
+#define CRYP_CR_CRYPEN                       ((uint32_t)0x00008000)
+/****************** Bits definition for CRYP_SR register  *********************/
+#define CRYP_SR_IFEM                         ((uint32_t)0x00000001)
+#define CRYP_SR_IFNF                         ((uint32_t)0x00000002)
+#define CRYP_SR_OFNE                         ((uint32_t)0x00000004)
+#define CRYP_SR_OFFU                         ((uint32_t)0x00000008)
+#define CRYP_SR_BUSY                         ((uint32_t)0x00000010)
+/****************** Bits definition for CRYP_DMACR register  ******************/
+#define CRYP_DMACR_DIEN                      ((uint32_t)0x00000001)
+#define CRYP_DMACR_DOEN                      ((uint32_t)0x00000002)
+/*****************  Bits definition for CRYP_IMSCR register  ******************/
+#define CRYP_IMSCR_INIM                      ((uint32_t)0x00000001)
+#define CRYP_IMSCR_OUTIM                     ((uint32_t)0x00000002)
+/****************** Bits definition for CRYP_RISR register  *******************/
+#define CRYP_RISR_OUTRIS                     ((uint32_t)0x00000001)
+#define CRYP_RISR_INRIS                      ((uint32_t)0x00000002)
+/****************** Bits definition for CRYP_MISR register  *******************/
+#define CRYP_MISR_INMIS                      ((uint32_t)0x00000001)
+#define CRYP_MISR_OUTMIS                     ((uint32_t)0x00000002)
+
+/******************************************************************************/
+/*                                                                            */
+/*                      Digital to Analog Converter                           */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bit definition for DAC_CR register  ********************/
+#define  DAC_CR_EN1                          ((uint32_t)0x00000001)        /*!<DAC channel1 enable */
+#define  DAC_CR_BOFF1                        ((uint32_t)0x00000002)        /*!<DAC channel1 output buffer disable */
+#define  DAC_CR_TEN1                         ((uint32_t)0x00000004)        /*!<DAC channel1 Trigger enable */
+
+#define  DAC_CR_TSEL1                        ((uint32_t)0x00000038)        /*!<TSEL1[2:0] (DAC channel1 Trigger selection) */
+#define  DAC_CR_TSEL1_0                      ((uint32_t)0x00000008)        /*!<Bit 0 */
+#define  DAC_CR_TSEL1_1                      ((uint32_t)0x00000010)        /*!<Bit 1 */
+#define  DAC_CR_TSEL1_2                      ((uint32_t)0x00000020)        /*!<Bit 2 */
+
+#define  DAC_CR_WAVE1                        ((uint32_t)0x000000C0)        /*!<WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable) */
+#define  DAC_CR_WAVE1_0                      ((uint32_t)0x00000040)        /*!<Bit 0 */
+#define  DAC_CR_WAVE1_1                      ((uint32_t)0x00000080)        /*!<Bit 1 */
+
+#define  DAC_CR_MAMP1                        ((uint32_t)0x00000F00)        /*!<MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) */
+#define  DAC_CR_MAMP1_0                      ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  DAC_CR_MAMP1_1                      ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  DAC_CR_MAMP1_2                      ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  DAC_CR_MAMP1_3                      ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  DAC_CR_DMAEN1                       ((uint32_t)0x00001000)        /*!<DAC channel1 DMA enable */
+#define  DAC_CR_EN2                          ((uint32_t)0x00010000)        /*!<DAC channel2 enable */
+#define  DAC_CR_BOFF2                        ((uint32_t)0x00020000)        /*!<DAC channel2 output buffer disable */
+#define  DAC_CR_TEN2                         ((uint32_t)0x00040000)        /*!<DAC channel2 Trigger enable */
+
+#define  DAC_CR_TSEL2                        ((uint32_t)0x00380000)        /*!<TSEL2[2:0] (DAC channel2 Trigger selection) */
+#define  DAC_CR_TSEL2_0                      ((uint32_t)0x00080000)        /*!<Bit 0 */
+#define  DAC_CR_TSEL2_1                      ((uint32_t)0x00100000)        /*!<Bit 1 */
+#define  DAC_CR_TSEL2_2                      ((uint32_t)0x00200000)        /*!<Bit 2 */
+
+#define  DAC_CR_WAVE2                        ((uint32_t)0x00C00000)        /*!<WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */
+#define  DAC_CR_WAVE2_0                      ((uint32_t)0x00400000)        /*!<Bit 0 */
+#define  DAC_CR_WAVE2_1                      ((uint32_t)0x00800000)        /*!<Bit 1 */
+
+#define  DAC_CR_MAMP2                        ((uint32_t)0x0F000000)        /*!<MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */
+#define  DAC_CR_MAMP2_0                      ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  DAC_CR_MAMP2_1                      ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  DAC_CR_MAMP2_2                      ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  DAC_CR_MAMP2_3                      ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  DAC_CR_DMAEN2                       ((uint32_t)0x10000000)        /*!<DAC channel2 DMA enabled */
+
+/*****************  Bit definition for DAC_SWTRIGR register  ******************/
+#define  DAC_SWTRIGR_SWTRIG1                 ((uint8_t)0x01)               /*!<DAC channel1 software trigger */
+#define  DAC_SWTRIGR_SWTRIG2                 ((uint8_t)0x02)               /*!<DAC channel2 software trigger */
+
+/*****************  Bit definition for DAC_DHR12R1 register  ******************/
+#define  DAC_DHR12R1_DACC1DHR                ((uint16_t)0x0FFF)            /*!<DAC channel1 12-bit Right aligned data */
+
+/*****************  Bit definition for DAC_DHR12L1 register  ******************/
+#define  DAC_DHR12L1_DACC1DHR                ((uint16_t)0xFFF0)            /*!<DAC channel1 12-bit Left aligned data */
+
+/******************  Bit definition for DAC_DHR8R1 register  ******************/
+#define  DAC_DHR8R1_DACC1DHR                 ((uint8_t)0xFF)               /*!<DAC channel1 8-bit Right aligned data */
+
+/*****************  Bit definition for DAC_DHR12R2 register  ******************/
+#define  DAC_DHR12R2_DACC2DHR                ((uint16_t)0x0FFF)            /*!<DAC channel2 12-bit Right aligned data */
+
+/*****************  Bit definition for DAC_DHR12L2 register  ******************/
+#define  DAC_DHR12L2_DACC2DHR                ((uint16_t)0xFFF0)            /*!<DAC channel2 12-bit Left aligned data */
+
+/******************  Bit definition for DAC_DHR8R2 register  ******************/
+#define  DAC_DHR8R2_DACC2DHR                 ((uint8_t)0xFF)               /*!<DAC channel2 8-bit Right aligned data */
+
+/*****************  Bit definition for DAC_DHR12RD register  ******************/
+#define  DAC_DHR12RD_DACC1DHR                ((uint32_t)0x00000FFF)        /*!<DAC channel1 12-bit Right aligned data */
+#define  DAC_DHR12RD_DACC2DHR                ((uint32_t)0x0FFF0000)        /*!<DAC channel2 12-bit Right aligned data */
+
+/*****************  Bit definition for DAC_DHR12LD register  ******************/
+#define  DAC_DHR12LD_DACC1DHR                ((uint32_t)0x0000FFF0)        /*!<DAC channel1 12-bit Left aligned data */
+#define  DAC_DHR12LD_DACC2DHR                ((uint32_t)0xFFF00000)        /*!<DAC channel2 12-bit Left aligned data */
+
+/******************  Bit definition for DAC_DHR8RD register  ******************/
+#define  DAC_DHR8RD_DACC1DHR                 ((uint16_t)0x00FF)            /*!<DAC channel1 8-bit Right aligned data */
+#define  DAC_DHR8RD_DACC2DHR                 ((uint16_t)0xFF00)            /*!<DAC channel2 8-bit Right aligned data */
+
+/*******************  Bit definition for DAC_DOR1 register  *******************/
+#define  DAC_DOR1_DACC1DOR                   ((uint16_t)0x0FFF)            /*!<DAC channel1 data output */
+
+/*******************  Bit definition for DAC_DOR2 register  *******************/
+#define  DAC_DOR2_DACC2DOR                   ((uint16_t)0x0FFF)            /*!<DAC channel2 data output */
+
+/********************  Bit definition for DAC_SR register  ********************/
+#define  DAC_SR_DMAUDR1                      ((uint32_t)0x00002000)        /*!<DAC channel1 DMA underrun flag */
+#define  DAC_SR_DMAUDR2                      ((uint32_t)0x20000000)        /*!<DAC channel2 DMA underrun flag */
+
+/******************************************************************************/
+/*                                                                            */
+/*                                 Debug MCU                                  */
+/*                                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/*                                                                            */
+/*                                    DCMI                                    */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bits definition for DCMI_CR register  ******************/
+#define DCMI_CR_CAPTURE                      ((uint32_t)0x00000001)
+#define DCMI_CR_CM                           ((uint32_t)0x00000002)
+#define DCMI_CR_CROP                         ((uint32_t)0x00000004)
+#define DCMI_CR_JPEG                         ((uint32_t)0x00000008)
+#define DCMI_CR_ESS                          ((uint32_t)0x00000010)
+#define DCMI_CR_PCKPOL                       ((uint32_t)0x00000020)
+#define DCMI_CR_HSPOL                        ((uint32_t)0x00000040)
+#define DCMI_CR_VSPOL                        ((uint32_t)0x00000080)
+#define DCMI_CR_FCRC_0                       ((uint32_t)0x00000100)
+#define DCMI_CR_FCRC_1                       ((uint32_t)0x00000200)
+#define DCMI_CR_EDM_0                        ((uint32_t)0x00000400)
+#define DCMI_CR_EDM_1                        ((uint32_t)0x00000800)
+#define DCMI_CR_CRE                          ((uint32_t)0x00001000)
+#define DCMI_CR_ENABLE                       ((uint32_t)0x00004000)
+
+/********************  Bits definition for DCMI_SR register  ******************/
+#define DCMI_SR_HSYNC                        ((uint32_t)0x00000001)
+#define DCMI_SR_VSYNC                        ((uint32_t)0x00000002)
+#define DCMI_SR_FNE                          ((uint32_t)0x00000004)
+
+/********************  Bits definition for DCMI_RISR register  ****************/
+#define DCMI_RISR_FRAME_RIS                  ((uint32_t)0x00000001)
+#define DCMI_RISR_OVF_RIS                    ((uint32_t)0x00000002)
+#define DCMI_RISR_ERR_RIS                    ((uint32_t)0x00000004)
+#define DCMI_RISR_VSYNC_RIS                  ((uint32_t)0x00000008)
+#define DCMI_RISR_LINE_RIS                   ((uint32_t)0x00000010)
+
+/********************  Bits definition for DCMI_IER register  *****************/
+#define DCMI_IER_FRAME_IE                    ((uint32_t)0x00000001)
+#define DCMI_IER_OVF_IE                      ((uint32_t)0x00000002)
+#define DCMI_IER_ERR_IE                      ((uint32_t)0x00000004)
+#define DCMI_IER_VSYNC_IE                    ((uint32_t)0x00000008)
+#define DCMI_IER_LINE_IE                     ((uint32_t)0x00000010)
+
+/********************  Bits definition for DCMI_MISR register  ****************/
+#define DCMI_MISR_FRAME_MIS                  ((uint32_t)0x00000001)
+#define DCMI_MISR_OVF_MIS                    ((uint32_t)0x00000002)
+#define DCMI_MISR_ERR_MIS                    ((uint32_t)0x00000004)
+#define DCMI_MISR_VSYNC_MIS                  ((uint32_t)0x00000008)
+#define DCMI_MISR_LINE_MIS                   ((uint32_t)0x00000010)
+
+/********************  Bits definition for DCMI_ICR register  *****************/
+#define DCMI_ICR_FRAME_ISC                   ((uint32_t)0x00000001)
+#define DCMI_ICR_OVF_ISC                     ((uint32_t)0x00000002)
+#define DCMI_ICR_ERR_ISC                     ((uint32_t)0x00000004)
+#define DCMI_ICR_VSYNC_ISC                   ((uint32_t)0x00000008)
+#define DCMI_ICR_LINE_ISC                    ((uint32_t)0x00000010)
+
+/******************************************************************************/
+/*                                                                            */
+/*                             DMA Controller                                 */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bits definition for DMA_SxCR register  *****************/ 
+#define DMA_SxCR_CHSEL                       ((uint32_t)0x0E000000)
+#define DMA_SxCR_CHSEL_0                     ((uint32_t)0x02000000)
+#define DMA_SxCR_CHSEL_1                     ((uint32_t)0x04000000)
+#define DMA_SxCR_CHSEL_2                     ((uint32_t)0x08000000) 
+#define DMA_SxCR_MBURST                      ((uint32_t)0x01800000)
+#define DMA_SxCR_MBURST_0                    ((uint32_t)0x00800000)
+#define DMA_SxCR_MBURST_1                    ((uint32_t)0x01000000)
+#define DMA_SxCR_PBURST                      ((uint32_t)0x00600000)
+#define DMA_SxCR_PBURST_0                    ((uint32_t)0x00200000)
+#define DMA_SxCR_PBURST_1                    ((uint32_t)0x00400000)
+#define DMA_SxCR_ACK                         ((uint32_t)0x00100000)
+#define DMA_SxCR_CT                          ((uint32_t)0x00080000)  
+#define DMA_SxCR_DBM                         ((uint32_t)0x00040000)
+#define DMA_SxCR_PL                          ((uint32_t)0x00030000)
+#define DMA_SxCR_PL_0                        ((uint32_t)0x00010000)
+#define DMA_SxCR_PL_1                        ((uint32_t)0x00020000)
+#define DMA_SxCR_PINCOS                      ((uint32_t)0x00008000)
+#define DMA_SxCR_MSIZE                       ((uint32_t)0x00006000)
+#define DMA_SxCR_MSIZE_0                     ((uint32_t)0x00002000)
+#define DMA_SxCR_MSIZE_1                     ((uint32_t)0x00004000)
+#define DMA_SxCR_PSIZE                       ((uint32_t)0x00001800)
+#define DMA_SxCR_PSIZE_0                     ((uint32_t)0x00000800)
+#define DMA_SxCR_PSIZE_1                     ((uint32_t)0x00001000)
+#define DMA_SxCR_MINC                        ((uint32_t)0x00000400)
+#define DMA_SxCR_PINC                        ((uint32_t)0x00000200)
+#define DMA_SxCR_CIRC                        ((uint32_t)0x00000100)
+#define DMA_SxCR_DIR                         ((uint32_t)0x000000C0)
+#define DMA_SxCR_DIR_0                       ((uint32_t)0x00000040)
+#define DMA_SxCR_DIR_1                       ((uint32_t)0x00000080)
+#define DMA_SxCR_PFCTRL                      ((uint32_t)0x00000020)
+#define DMA_SxCR_TCIE                        ((uint32_t)0x00000010)
+#define DMA_SxCR_HTIE                        ((uint32_t)0x00000008)
+#define DMA_SxCR_TEIE                        ((uint32_t)0x00000004)
+#define DMA_SxCR_DMEIE                       ((uint32_t)0x00000002)
+#define DMA_SxCR_EN                          ((uint32_t)0x00000001)
+
+/********************  Bits definition for DMA_SxCNDTR register  **************/
+#define DMA_SxNDT                            ((uint32_t)0x0000FFFF)
+#define DMA_SxNDT_0                          ((uint32_t)0x00000001)
+#define DMA_SxNDT_1                          ((uint32_t)0x00000002)
+#define DMA_SxNDT_2                          ((uint32_t)0x00000004)
+#define DMA_SxNDT_3                          ((uint32_t)0x00000008)
+#define DMA_SxNDT_4                          ((uint32_t)0x00000010)
+#define DMA_SxNDT_5                          ((uint32_t)0x00000020)
+#define DMA_SxNDT_6                          ((uint32_t)0x00000040)
+#define DMA_SxNDT_7                          ((uint32_t)0x00000080)
+#define DMA_SxNDT_8                          ((uint32_t)0x00000100)
+#define DMA_SxNDT_9                          ((uint32_t)0x00000200)
+#define DMA_SxNDT_10                         ((uint32_t)0x00000400)
+#define DMA_SxNDT_11                         ((uint32_t)0x00000800)
+#define DMA_SxNDT_12                         ((uint32_t)0x00001000)
+#define DMA_SxNDT_13                         ((uint32_t)0x00002000)
+#define DMA_SxNDT_14                         ((uint32_t)0x00004000)
+#define DMA_SxNDT_15                         ((uint32_t)0x00008000)
+
+/********************  Bits definition for DMA_SxFCR register  ****************/ 
+#define DMA_SxFCR_FEIE                       ((uint32_t)0x00000080)
+#define DMA_SxFCR_FS                         ((uint32_t)0x00000038)
+#define DMA_SxFCR_FS_0                       ((uint32_t)0x00000008)
+#define DMA_SxFCR_FS_1                       ((uint32_t)0x00000010)
+#define DMA_SxFCR_FS_2                       ((uint32_t)0x00000020)
+#define DMA_SxFCR_DMDIS                      ((uint32_t)0x00000004)
+#define DMA_SxFCR_FTH                        ((uint32_t)0x00000003)
+#define DMA_SxFCR_FTH_0                      ((uint32_t)0x00000001)
+#define DMA_SxFCR_FTH_1                      ((uint32_t)0x00000002)
+
+/********************  Bits definition for DMA_LISR register  *****************/ 
+#define DMA_LISR_TCIF3                       ((uint32_t)0x08000000)
+#define DMA_LISR_HTIF3                       ((uint32_t)0x04000000)
+#define DMA_LISR_TEIF3                       ((uint32_t)0x02000000)
+#define DMA_LISR_DMEIF3                      ((uint32_t)0x01000000)
+#define DMA_LISR_FEIF3                       ((uint32_t)0x00400000)
+#define DMA_LISR_TCIF2                       ((uint32_t)0x00200000)
+#define DMA_LISR_HTIF2                       ((uint32_t)0x00100000)
+#define DMA_LISR_TEIF2                       ((uint32_t)0x00080000)
+#define DMA_LISR_DMEIF2                      ((uint32_t)0x00040000)
+#define DMA_LISR_FEIF2                       ((uint32_t)0x00010000)
+#define DMA_LISR_TCIF1                       ((uint32_t)0x00000800)
+#define DMA_LISR_HTIF1                       ((uint32_t)0x00000400)
+#define DMA_LISR_TEIF1                       ((uint32_t)0x00000200)
+#define DMA_LISR_DMEIF1                      ((uint32_t)0x00000100)
+#define DMA_LISR_FEIF1                       ((uint32_t)0x00000040)
+#define DMA_LISR_TCIF0                       ((uint32_t)0x00000020)
+#define DMA_LISR_HTIF0                       ((uint32_t)0x00000010)
+#define DMA_LISR_TEIF0                       ((uint32_t)0x00000008)
+#define DMA_LISR_DMEIF0                      ((uint32_t)0x00000004)
+#define DMA_LISR_FEIF0                       ((uint32_t)0x00000001)
+
+/********************  Bits definition for DMA_HISR register  *****************/ 
+#define DMA_HISR_TCIF7                       ((uint32_t)0x08000000)
+#define DMA_HISR_HTIF7                       ((uint32_t)0x04000000)
+#define DMA_HISR_TEIF7                       ((uint32_t)0x02000000)
+#define DMA_HISR_DMEIF7                      ((uint32_t)0x01000000)
+#define DMA_HISR_FEIF7                       ((uint32_t)0x00400000)
+#define DMA_HISR_TCIF6                       ((uint32_t)0x00200000)
+#define DMA_HISR_HTIF6                       ((uint32_t)0x00100000)
+#define DMA_HISR_TEIF6                       ((uint32_t)0x00080000)
+#define DMA_HISR_DMEIF6                      ((uint32_t)0x00040000)
+#define DMA_HISR_FEIF6                       ((uint32_t)0x00010000)
+#define DMA_HISR_TCIF5                       ((uint32_t)0x00000800)
+#define DMA_HISR_HTIF5                       ((uint32_t)0x00000400)
+#define DMA_HISR_TEIF5                       ((uint32_t)0x00000200)
+#define DMA_HISR_DMEIF5                      ((uint32_t)0x00000100)
+#define DMA_HISR_FEIF5                       ((uint32_t)0x00000040)
+#define DMA_HISR_TCIF4                       ((uint32_t)0x00000020)
+#define DMA_HISR_HTIF4                       ((uint32_t)0x00000010)
+#define DMA_HISR_TEIF4                       ((uint32_t)0x00000008)
+#define DMA_HISR_DMEIF4                      ((uint32_t)0x00000004)
+#define DMA_HISR_FEIF4                       ((uint32_t)0x00000001)
+
+/********************  Bits definition for DMA_LIFCR register  ****************/ 
+#define DMA_LIFCR_CTCIF3                     ((uint32_t)0x08000000)
+#define DMA_LIFCR_CHTIF3                     ((uint32_t)0x04000000)
+#define DMA_LIFCR_CTEIF3                     ((uint32_t)0x02000000)
+#define DMA_LIFCR_CDMEIF3                    ((uint32_t)0x01000000)
+#define DMA_LIFCR_CFEIF3                     ((uint32_t)0x00400000)
+#define DMA_LIFCR_CTCIF2                     ((uint32_t)0x00200000)
+#define DMA_LIFCR_CHTIF2                     ((uint32_t)0x00100000)
+#define DMA_LIFCR_CTEIF2                     ((uint32_t)0x00080000)
+#define DMA_LIFCR_CDMEIF2                    ((uint32_t)0x00040000)
+#define DMA_LIFCR_CFEIF2                     ((uint32_t)0x00010000)
+#define DMA_LIFCR_CTCIF1                     ((uint32_t)0x00000800)
+#define DMA_LIFCR_CHTIF1                     ((uint32_t)0x00000400)
+#define DMA_LIFCR_CTEIF1                     ((uint32_t)0x00000200)
+#define DMA_LIFCR_CDMEIF1                    ((uint32_t)0x00000100)
+#define DMA_LIFCR_CFEIF1                     ((uint32_t)0x00000040)
+#define DMA_LIFCR_CTCIF0                     ((uint32_t)0x00000020)
+#define DMA_LIFCR_CHTIF0                     ((uint32_t)0x00000010)
+#define DMA_LIFCR_CTEIF0                     ((uint32_t)0x00000008)
+#define DMA_LIFCR_CDMEIF0                    ((uint32_t)0x00000004)
+#define DMA_LIFCR_CFEIF0                     ((uint32_t)0x00000001)
+
+/********************  Bits definition for DMA_HIFCR  register  ****************/ 
+#define DMA_HIFCR_CTCIF7                     ((uint32_t)0x08000000)
+#define DMA_HIFCR_CHTIF7                     ((uint32_t)0x04000000)
+#define DMA_HIFCR_CTEIF7                     ((uint32_t)0x02000000)
+#define DMA_HIFCR_CDMEIF7                    ((uint32_t)0x01000000)
+#define DMA_HIFCR_CFEIF7                     ((uint32_t)0x00400000)
+#define DMA_HIFCR_CTCIF6                     ((uint32_t)0x00200000)
+#define DMA_HIFCR_CHTIF6                     ((uint32_t)0x00100000)
+#define DMA_HIFCR_CTEIF6                     ((uint32_t)0x00080000)
+#define DMA_HIFCR_CDMEIF6                    ((uint32_t)0x00040000)
+#define DMA_HIFCR_CFEIF6                     ((uint32_t)0x00010000)
+#define DMA_HIFCR_CTCIF5                     ((uint32_t)0x00000800)
+#define DMA_HIFCR_CHTIF5                     ((uint32_t)0x00000400)
+#define DMA_HIFCR_CTEIF5                     ((uint32_t)0x00000200)
+#define DMA_HIFCR_CDMEIF5                    ((uint32_t)0x00000100)
+#define DMA_HIFCR_CFEIF5                     ((uint32_t)0x00000040)
+#define DMA_HIFCR_CTCIF4                     ((uint32_t)0x00000020)
+#define DMA_HIFCR_CHTIF4                     ((uint32_t)0x00000010)
+#define DMA_HIFCR_CTEIF4                     ((uint32_t)0x00000008)
+#define DMA_HIFCR_CDMEIF4                    ((uint32_t)0x00000004)
+#define DMA_HIFCR_CFEIF4                     ((uint32_t)0x00000001)
+
+/******************************************************************************/
+/*                                                                            */
+/*                    External Interrupt/Event Controller                     */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bit definition for EXTI_IMR register  *******************/
+#define  EXTI_IMR_MR0                        ((uint32_t)0x00000001)        /*!< Interrupt Mask on line 0 */
+#define  EXTI_IMR_MR1                        ((uint32_t)0x00000002)        /*!< Interrupt Mask on line 1 */
+#define  EXTI_IMR_MR2                        ((uint32_t)0x00000004)        /*!< Interrupt Mask on line 2 */
+#define  EXTI_IMR_MR3                        ((uint32_t)0x00000008)        /*!< Interrupt Mask on line 3 */
+#define  EXTI_IMR_MR4                        ((uint32_t)0x00000010)        /*!< Interrupt Mask on line 4 */
+#define  EXTI_IMR_MR5                        ((uint32_t)0x00000020)        /*!< Interrupt Mask on line 5 */
+#define  EXTI_IMR_MR6                        ((uint32_t)0x00000040)        /*!< Interrupt Mask on line 6 */
+#define  EXTI_IMR_MR7                        ((uint32_t)0x00000080)        /*!< Interrupt Mask on line 7 */
+#define  EXTI_IMR_MR8                        ((uint32_t)0x00000100)        /*!< Interrupt Mask on line 8 */
+#define  EXTI_IMR_MR9                        ((uint32_t)0x00000200)        /*!< Interrupt Mask on line 9 */
+#define  EXTI_IMR_MR10                       ((uint32_t)0x00000400)        /*!< Interrupt Mask on line 10 */
+#define  EXTI_IMR_MR11                       ((uint32_t)0x00000800)        /*!< Interrupt Mask on line 11 */
+#define  EXTI_IMR_MR12                       ((uint32_t)0x00001000)        /*!< Interrupt Mask on line 12 */
+#define  EXTI_IMR_MR13                       ((uint32_t)0x00002000)        /*!< Interrupt Mask on line 13 */
+#define  EXTI_IMR_MR14                       ((uint32_t)0x00004000)        /*!< Interrupt Mask on line 14 */
+#define  EXTI_IMR_MR15                       ((uint32_t)0x00008000)        /*!< Interrupt Mask on line 15 */
+#define  EXTI_IMR_MR16                       ((uint32_t)0x00010000)        /*!< Interrupt Mask on line 16 */
+#define  EXTI_IMR_MR17                       ((uint32_t)0x00020000)        /*!< Interrupt Mask on line 17 */
+#define  EXTI_IMR_MR18                       ((uint32_t)0x00040000)        /*!< Interrupt Mask on line 18 */
+#define  EXTI_IMR_MR19                       ((uint32_t)0x00080000)        /*!< Interrupt Mask on line 19 */
+
+/*******************  Bit definition for EXTI_EMR register  *******************/
+#define  EXTI_EMR_MR0                        ((uint32_t)0x00000001)        /*!< Event Mask on line 0 */
+#define  EXTI_EMR_MR1                        ((uint32_t)0x00000002)        /*!< Event Mask on line 1 */
+#define  EXTI_EMR_MR2                        ((uint32_t)0x00000004)        /*!< Event Mask on line 2 */
+#define  EXTI_EMR_MR3                        ((uint32_t)0x00000008)        /*!< Event Mask on line 3 */
+#define  EXTI_EMR_MR4                        ((uint32_t)0x00000010)        /*!< Event Mask on line 4 */
+#define  EXTI_EMR_MR5                        ((uint32_t)0x00000020)        /*!< Event Mask on line 5 */
+#define  EXTI_EMR_MR6                        ((uint32_t)0x00000040)        /*!< Event Mask on line 6 */
+#define  EXTI_EMR_MR7                        ((uint32_t)0x00000080)        /*!< Event Mask on line 7 */
+#define  EXTI_EMR_MR8                        ((uint32_t)0x00000100)        /*!< Event Mask on line 8 */
+#define  EXTI_EMR_MR9                        ((uint32_t)0x00000200)        /*!< Event Mask on line 9 */
+#define  EXTI_EMR_MR10                       ((uint32_t)0x00000400)        /*!< Event Mask on line 10 */
+#define  EXTI_EMR_MR11                       ((uint32_t)0x00000800)        /*!< Event Mask on line 11 */
+#define  EXTI_EMR_MR12                       ((uint32_t)0x00001000)        /*!< Event Mask on line 12 */
+#define  EXTI_EMR_MR13                       ((uint32_t)0x00002000)        /*!< Event Mask on line 13 */
+#define  EXTI_EMR_MR14                       ((uint32_t)0x00004000)        /*!< Event Mask on line 14 */
+#define  EXTI_EMR_MR15                       ((uint32_t)0x00008000)        /*!< Event Mask on line 15 */
+#define  EXTI_EMR_MR16                       ((uint32_t)0x00010000)        /*!< Event Mask on line 16 */
+#define  EXTI_EMR_MR17                       ((uint32_t)0x00020000)        /*!< Event Mask on line 17 */
+#define  EXTI_EMR_MR18                       ((uint32_t)0x00040000)        /*!< Event Mask on line 18 */
+#define  EXTI_EMR_MR19                       ((uint32_t)0x00080000)        /*!< Event Mask on line 19 */
+
+/******************  Bit definition for EXTI_RTSR register  *******************/
+#define  EXTI_RTSR_TR0                       ((uint32_t)0x00000001)        /*!< Rising trigger event configuration bit of line 0 */
+#define  EXTI_RTSR_TR1                       ((uint32_t)0x00000002)        /*!< Rising trigger event configuration bit of line 1 */
+#define  EXTI_RTSR_TR2                       ((uint32_t)0x00000004)        /*!< Rising trigger event configuration bit of line 2 */
+#define  EXTI_RTSR_TR3                       ((uint32_t)0x00000008)        /*!< Rising trigger event configuration bit of line 3 */
+#define  EXTI_RTSR_TR4                       ((uint32_t)0x00000010)        /*!< Rising trigger event configuration bit of line 4 */
+#define  EXTI_RTSR_TR5                       ((uint32_t)0x00000020)        /*!< Rising trigger event configuration bit of line 5 */
+#define  EXTI_RTSR_TR6                       ((uint32_t)0x00000040)        /*!< Rising trigger event configuration bit of line 6 */
+#define  EXTI_RTSR_TR7                       ((uint32_t)0x00000080)        /*!< Rising trigger event configuration bit of line 7 */
+#define  EXTI_RTSR_TR8                       ((uint32_t)0x00000100)        /*!< Rising trigger event configuration bit of line 8 */
+#define  EXTI_RTSR_TR9                       ((uint32_t)0x00000200)        /*!< Rising trigger event configuration bit of line 9 */
+#define  EXTI_RTSR_TR10                      ((uint32_t)0x00000400)        /*!< Rising trigger event configuration bit of line 10 */
+#define  EXTI_RTSR_TR11                      ((uint32_t)0x00000800)        /*!< Rising trigger event configuration bit of line 11 */
+#define  EXTI_RTSR_TR12                      ((uint32_t)0x00001000)        /*!< Rising trigger event configuration bit of line 12 */
+#define  EXTI_RTSR_TR13                      ((uint32_t)0x00002000)        /*!< Rising trigger event configuration bit of line 13 */
+#define  EXTI_RTSR_TR14                      ((uint32_t)0x00004000)        /*!< Rising trigger event configuration bit of line 14 */
+#define  EXTI_RTSR_TR15                      ((uint32_t)0x00008000)        /*!< Rising trigger event configuration bit of line 15 */
+#define  EXTI_RTSR_TR16                      ((uint32_t)0x00010000)        /*!< Rising trigger event configuration bit of line 16 */
+#define  EXTI_RTSR_TR17                      ((uint32_t)0x00020000)        /*!< Rising trigger event configuration bit of line 17 */
+#define  EXTI_RTSR_TR18                      ((uint32_t)0x00040000)        /*!< Rising trigger event configuration bit of line 18 */
+#define  EXTI_RTSR_TR19                      ((uint32_t)0x00080000)        /*!< Rising trigger event configuration bit of line 19 */
+
+/******************  Bit definition for EXTI_FTSR register  *******************/
+#define  EXTI_FTSR_TR0                       ((uint32_t)0x00000001)        /*!< Falling trigger event configuration bit of line 0 */
+#define  EXTI_FTSR_TR1                       ((uint32_t)0x00000002)        /*!< Falling trigger event configuration bit of line 1 */
+#define  EXTI_FTSR_TR2                       ((uint32_t)0x00000004)        /*!< Falling trigger event configuration bit of line 2 */
+#define  EXTI_FTSR_TR3                       ((uint32_t)0x00000008)        /*!< Falling trigger event configuration bit of line 3 */
+#define  EXTI_FTSR_TR4                       ((uint32_t)0x00000010)        /*!< Falling trigger event configuration bit of line 4 */
+#define  EXTI_FTSR_TR5                       ((uint32_t)0x00000020)        /*!< Falling trigger event configuration bit of line 5 */
+#define  EXTI_FTSR_TR6                       ((uint32_t)0x00000040)        /*!< Falling trigger event configuration bit of line 6 */
+#define  EXTI_FTSR_TR7                       ((uint32_t)0x00000080)        /*!< Falling trigger event configuration bit of line 7 */
+#define  EXTI_FTSR_TR8                       ((uint32_t)0x00000100)        /*!< Falling trigger event configuration bit of line 8 */
+#define  EXTI_FTSR_TR9                       ((uint32_t)0x00000200)        /*!< Falling trigger event configuration bit of line 9 */
+#define  EXTI_FTSR_TR10                      ((uint32_t)0x00000400)        /*!< Falling trigger event configuration bit of line 10 */
+#define  EXTI_FTSR_TR11                      ((uint32_t)0x00000800)        /*!< Falling trigger event configuration bit of line 11 */
+#define  EXTI_FTSR_TR12                      ((uint32_t)0x00001000)        /*!< Falling trigger event configuration bit of line 12 */
+#define  EXTI_FTSR_TR13                      ((uint32_t)0x00002000)        /*!< Falling trigger event configuration bit of line 13 */
+#define  EXTI_FTSR_TR14                      ((uint32_t)0x00004000)        /*!< Falling trigger event configuration bit of line 14 */
+#define  EXTI_FTSR_TR15                      ((uint32_t)0x00008000)        /*!< Falling trigger event configuration bit of line 15 */
+#define  EXTI_FTSR_TR16                      ((uint32_t)0x00010000)        /*!< Falling trigger event configuration bit of line 16 */
+#define  EXTI_FTSR_TR17                      ((uint32_t)0x00020000)        /*!< Falling trigger event configuration bit of line 17 */
+#define  EXTI_FTSR_TR18                      ((uint32_t)0x00040000)        /*!< Falling trigger event configuration bit of line 18 */
+#define  EXTI_FTSR_TR19                      ((uint32_t)0x00080000)        /*!< Falling trigger event configuration bit of line 19 */
+
+/******************  Bit definition for EXTI_SWIER register  ******************/
+#define  EXTI_SWIER_SWIER0                   ((uint32_t)0x00000001)        /*!< Software Interrupt on line 0 */
+#define  EXTI_SWIER_SWIER1                   ((uint32_t)0x00000002)        /*!< Software Interrupt on line 1 */
+#define  EXTI_SWIER_SWIER2                   ((uint32_t)0x00000004)        /*!< Software Interrupt on line 2 */
+#define  EXTI_SWIER_SWIER3                   ((uint32_t)0x00000008)        /*!< Software Interrupt on line 3 */
+#define  EXTI_SWIER_SWIER4                   ((uint32_t)0x00000010)        /*!< Software Interrupt on line 4 */
+#define  EXTI_SWIER_SWIER5                   ((uint32_t)0x00000020)        /*!< Software Interrupt on line 5 */
+#define  EXTI_SWIER_SWIER6                   ((uint32_t)0x00000040)        /*!< Software Interrupt on line 6 */
+#define  EXTI_SWIER_SWIER7                   ((uint32_t)0x00000080)        /*!< Software Interrupt on line 7 */
+#define  EXTI_SWIER_SWIER8                   ((uint32_t)0x00000100)        /*!< Software Interrupt on line 8 */
+#define  EXTI_SWIER_SWIER9                   ((uint32_t)0x00000200)        /*!< Software Interrupt on line 9 */
+#define  EXTI_SWIER_SWIER10                  ((uint32_t)0x00000400)        /*!< Software Interrupt on line 10 */
+#define  EXTI_SWIER_SWIER11                  ((uint32_t)0x00000800)        /*!< Software Interrupt on line 11 */
+#define  EXTI_SWIER_SWIER12                  ((uint32_t)0x00001000)        /*!< Software Interrupt on line 12 */
+#define  EXTI_SWIER_SWIER13                  ((uint32_t)0x00002000)        /*!< Software Interrupt on line 13 */
+#define  EXTI_SWIER_SWIER14                  ((uint32_t)0x00004000)        /*!< Software Interrupt on line 14 */
+#define  EXTI_SWIER_SWIER15                  ((uint32_t)0x00008000)        /*!< Software Interrupt on line 15 */
+#define  EXTI_SWIER_SWIER16                  ((uint32_t)0x00010000)        /*!< Software Interrupt on line 16 */
+#define  EXTI_SWIER_SWIER17                  ((uint32_t)0x00020000)        /*!< Software Interrupt on line 17 */
+#define  EXTI_SWIER_SWIER18                  ((uint32_t)0x00040000)        /*!< Software Interrupt on line 18 */
+#define  EXTI_SWIER_SWIER19                  ((uint32_t)0x00080000)        /*!< Software Interrupt on line 19 */
+
+/*******************  Bit definition for EXTI_PR register  ********************/
+#define  EXTI_PR_PR0                         ((uint32_t)0x00000001)        /*!< Pending bit for line 0 */
+#define  EXTI_PR_PR1                         ((uint32_t)0x00000002)        /*!< Pending bit for line 1 */
+#define  EXTI_PR_PR2                         ((uint32_t)0x00000004)        /*!< Pending bit for line 2 */
+#define  EXTI_PR_PR3                         ((uint32_t)0x00000008)        /*!< Pending bit for line 3 */
+#define  EXTI_PR_PR4                         ((uint32_t)0x00000010)        /*!< Pending bit for line 4 */
+#define  EXTI_PR_PR5                         ((uint32_t)0x00000020)        /*!< Pending bit for line 5 */
+#define  EXTI_PR_PR6                         ((uint32_t)0x00000040)        /*!< Pending bit for line 6 */
+#define  EXTI_PR_PR7                         ((uint32_t)0x00000080)        /*!< Pending bit for line 7 */
+#define  EXTI_PR_PR8                         ((uint32_t)0x00000100)        /*!< Pending bit for line 8 */
+#define  EXTI_PR_PR9                         ((uint32_t)0x00000200)        /*!< Pending bit for line 9 */
+#define  EXTI_PR_PR10                        ((uint32_t)0x00000400)        /*!< Pending bit for line 10 */
+#define  EXTI_PR_PR11                        ((uint32_t)0x00000800)        /*!< Pending bit for line 11 */
+#define  EXTI_PR_PR12                        ((uint32_t)0x00001000)        /*!< Pending bit for line 12 */
+#define  EXTI_PR_PR13                        ((uint32_t)0x00002000)        /*!< Pending bit for line 13 */
+#define  EXTI_PR_PR14                        ((uint32_t)0x00004000)        /*!< Pending bit for line 14 */
+#define  EXTI_PR_PR15                        ((uint32_t)0x00008000)        /*!< Pending bit for line 15 */
+#define  EXTI_PR_PR16                        ((uint32_t)0x00010000)        /*!< Pending bit for line 16 */
+#define  EXTI_PR_PR17                        ((uint32_t)0x00020000)        /*!< Pending bit for line 17 */
+#define  EXTI_PR_PR18                        ((uint32_t)0x00040000)        /*!< Pending bit for line 18 */
+#define  EXTI_PR_PR19                        ((uint32_t)0x00080000)        /*!< Pending bit for line 19 */
+
+/******************************************************************************/
+/*                                                                            */
+/*                                    FLASH                                   */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bits definition for FLASH_ACR register  *****************/
+#define FLASH_ACR_LATENCY                    ((uint32_t)0x00000007)
+#define FLASH_ACR_LATENCY_0WS                ((uint32_t)0x00000000)
+#define FLASH_ACR_LATENCY_1WS                ((uint32_t)0x00000001)
+#define FLASH_ACR_LATENCY_2WS                ((uint32_t)0x00000002)
+#define FLASH_ACR_LATENCY_3WS                ((uint32_t)0x00000003)
+#define FLASH_ACR_LATENCY_4WS                ((uint32_t)0x00000004)
+#define FLASH_ACR_LATENCY_5WS                ((uint32_t)0x00000005)
+#define FLASH_ACR_LATENCY_6WS                ((uint32_t)0x00000006)
+#define FLASH_ACR_LATENCY_7WS                ((uint32_t)0x00000007)
+
+#define FLASH_ACR_PRFTEN                     ((uint32_t)0x00000100)
+#define FLASH_ACR_ICEN                       ((uint32_t)0x00000200)
+#define FLASH_ACR_DCEN                       ((uint32_t)0x00000400)
+#define FLASH_ACR_ICRST                      ((uint32_t)0x00000800)
+#define FLASH_ACR_DCRST                      ((uint32_t)0x00001000)
+#define FLASH_ACR_BYTE0_ADDRESS              ((uint32_t)0x40023C00)
+#define FLASH_ACR_BYTE2_ADDRESS              ((uint32_t)0x40023C03)
+
+/*******************  Bits definition for FLASH_SR register  ******************/
+#define FLASH_SR_EOP                         ((uint32_t)0x00000001)
+#define FLASH_SR_SOP                         ((uint32_t)0x00000002)
+#define FLASH_SR_WRPERR                      ((uint32_t)0x00000010)
+#define FLASH_SR_PGAERR                      ((uint32_t)0x00000020)
+#define FLASH_SR_PGPERR                      ((uint32_t)0x00000040)
+#define FLASH_SR_PGSERR                      ((uint32_t)0x00000080)
+#define FLASH_SR_BSY                         ((uint32_t)0x00010000)
+
+/*******************  Bits definition for FLASH_CR register  ******************/
+#define FLASH_CR_PG                          ((uint32_t)0x00000001)
+#define FLASH_CR_SER                         ((uint32_t)0x00000002)
+#define FLASH_CR_MER                         ((uint32_t)0x00000004)
+#define FLASH_CR_SNB_0                       ((uint32_t)0x00000008)
+#define FLASH_CR_SNB_1                       ((uint32_t)0x00000010)
+#define FLASH_CR_SNB_2                       ((uint32_t)0x00000020)
+#define FLASH_CR_SNB_3                       ((uint32_t)0x00000040)
+#define FLASH_CR_PSIZE_0                     ((uint32_t)0x00000100)
+#define FLASH_CR_PSIZE_1                     ((uint32_t)0x00000200)
+#define FLASH_CR_STRT                        ((uint32_t)0x00010000)
+#define FLASH_CR_EOPIE                       ((uint32_t)0x01000000)
+#define FLASH_CR_LOCK                        ((uint32_t)0x80000000)
+
+/*******************  Bits definition for FLASH_OPTCR register  ***************/
+#define FLASH_OPTCR_OPTLOCK                  ((uint32_t)0x00000001)
+#define FLASH_OPTCR_OPTSTRT                  ((uint32_t)0x00000002)
+#define FLASH_OPTCR_BOR_LEV_0                ((uint32_t)0x00000004)
+#define FLASH_OPTCR_BOR_LEV_1                ((uint32_t)0x00000008)
+#define FLASH_OPTCR_BOR_LEV                  ((uint32_t)0x0000000C)
+#define FLASH_OPTCR_WDG_SW                   ((uint32_t)0x00000020)
+#define FLASH_OPTCR_nRST_STOP                ((uint32_t)0x00000040)
+#define FLASH_OPTCR_nRST_STDBY               ((uint32_t)0x00000080)
+#define FLASH_OPTCR_RDP_0                    ((uint32_t)0x00000100)
+#define FLASH_OPTCR_RDP_1                    ((uint32_t)0x00000200)
+#define FLASH_OPTCR_RDP_2                    ((uint32_t)0x00000400)
+#define FLASH_OPTCR_RDP_3                    ((uint32_t)0x00000800)
+#define FLASH_OPTCR_RDP_4                    ((uint32_t)0x00001000)
+#define FLASH_OPTCR_RDP_5                    ((uint32_t)0x00002000)
+#define FLASH_OPTCR_RDP_6                    ((uint32_t)0x00004000)
+#define FLASH_OPTCR_RDP_7                    ((uint32_t)0x00008000)
+#define FLASH_OPTCR_nWRP_0                   ((uint32_t)0x00010000)
+#define FLASH_OPTCR_nWRP_1                   ((uint32_t)0x00020000)
+#define FLASH_OPTCR_nWRP_2                   ((uint32_t)0x00040000)
+#define FLASH_OPTCR_nWRP_3                   ((uint32_t)0x00080000)
+#define FLASH_OPTCR_nWRP_4                   ((uint32_t)0x00100000)
+#define FLASH_OPTCR_nWRP_5                   ((uint32_t)0x00200000)
+#define FLASH_OPTCR_nWRP_6                   ((uint32_t)0x00400000)
+#define FLASH_OPTCR_nWRP_7                   ((uint32_t)0x00800000)
+#define FLASH_OPTCR_nWRP_8                   ((uint32_t)0x01000000)
+#define FLASH_OPTCR_nWRP_9                   ((uint32_t)0x02000000)
+#define FLASH_OPTCR_nWRP_10                  ((uint32_t)0x04000000)
+#define FLASH_OPTCR_nWRP_11                  ((uint32_t)0x08000000)
+
+/******************************************************************************/
+/*                                                                            */
+/*                       Flexible Static Memory Controller                    */
+/*                                                                            */
+/******************************************************************************/
+/******************  Bit definition for FSMC_BCR1 register  *******************/
+#define  FSMC_BCR1_MBKEN                     ((uint32_t)0x00000001)        /*!<Memory bank enable bit */
+#define  FSMC_BCR1_MUXEN                     ((uint32_t)0x00000002)        /*!<Address/data multiplexing enable bit */
+
+#define  FSMC_BCR1_MTYP                      ((uint32_t)0x0000000C)        /*!<MTYP[1:0] bits (Memory type) */
+#define  FSMC_BCR1_MTYP_0                    ((uint32_t)0x00000004)        /*!<Bit 0 */
+#define  FSMC_BCR1_MTYP_1                    ((uint32_t)0x00000008)        /*!<Bit 1 */
+
+#define  FSMC_BCR1_MWID                      ((uint32_t)0x00000030)        /*!<MWID[1:0] bits (Memory data bus width) */
+#define  FSMC_BCR1_MWID_0                    ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BCR1_MWID_1                    ((uint32_t)0x00000020)        /*!<Bit 1 */
+
+#define  FSMC_BCR1_FACCEN                    ((uint32_t)0x00000040)        /*!<Flash access enable */
+#define  FSMC_BCR1_BURSTEN                   ((uint32_t)0x00000100)        /*!<Burst enable bit */
+#define  FSMC_BCR1_WAITPOL                   ((uint32_t)0x00000200)        /*!<Wait signal polarity bit */
+#define  FSMC_BCR1_WRAPMOD                   ((uint32_t)0x00000400)        /*!<Wrapped burst mode support */
+#define  FSMC_BCR1_WAITCFG                   ((uint32_t)0x00000800)        /*!<Wait timing configuration */
+#define  FSMC_BCR1_WREN                      ((uint32_t)0x00001000)        /*!<Write enable bit */
+#define  FSMC_BCR1_WAITEN                    ((uint32_t)0x00002000)        /*!<Wait enable bit */
+#define  FSMC_BCR1_EXTMOD                    ((uint32_t)0x00004000)        /*!<Extended mode enable */
+#define  FSMC_BCR1_ASYNCWAIT                 ((uint32_t)0x00008000)        /*!<Asynchronous wait */
+#define  FSMC_BCR1_CBURSTRW                  ((uint32_t)0x00080000)        /*!<Write burst enable */
+
+/******************  Bit definition for FSMC_BCR2 register  *******************/
+#define  FSMC_BCR2_MBKEN                     ((uint32_t)0x00000001)        /*!<Memory bank enable bit */
+#define  FSMC_BCR2_MUXEN                     ((uint32_t)0x00000002)        /*!<Address/data multiplexing enable bit */
+
+#define  FSMC_BCR2_MTYP                      ((uint32_t)0x0000000C)        /*!<MTYP[1:0] bits (Memory type) */
+#define  FSMC_BCR2_MTYP_0                    ((uint32_t)0x00000004)        /*!<Bit 0 */
+#define  FSMC_BCR2_MTYP_1                    ((uint32_t)0x00000008)        /*!<Bit 1 */
+
+#define  FSMC_BCR2_MWID                      ((uint32_t)0x00000030)        /*!<MWID[1:0] bits (Memory data bus width) */
+#define  FSMC_BCR2_MWID_0                    ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BCR2_MWID_1                    ((uint32_t)0x00000020)        /*!<Bit 1 */
+
+#define  FSMC_BCR2_FACCEN                    ((uint32_t)0x00000040)        /*!<Flash access enable */
+#define  FSMC_BCR2_BURSTEN                   ((uint32_t)0x00000100)        /*!<Burst enable bit */
+#define  FSMC_BCR2_WAITPOL                   ((uint32_t)0x00000200)        /*!<Wait signal polarity bit */
+#define  FSMC_BCR2_WRAPMOD                   ((uint32_t)0x00000400)        /*!<Wrapped burst mode support */
+#define  FSMC_BCR2_WAITCFG                   ((uint32_t)0x00000800)        /*!<Wait timing configuration */
+#define  FSMC_BCR2_WREN                      ((uint32_t)0x00001000)        /*!<Write enable bit */
+#define  FSMC_BCR2_WAITEN                    ((uint32_t)0x00002000)        /*!<Wait enable bit */
+#define  FSMC_BCR2_EXTMOD                    ((uint32_t)0x00004000)        /*!<Extended mode enable */
+#define  FSMC_BCR2_ASYNCWAIT                 ((uint32_t)0x00008000)        /*!<Asynchronous wait */
+#define  FSMC_BCR2_CBURSTRW                  ((uint32_t)0x00080000)        /*!<Write burst enable */
+
+/******************  Bit definition for FSMC_BCR3 register  *******************/
+#define  FSMC_BCR3_MBKEN                     ((uint32_t)0x00000001)        /*!<Memory bank enable bit */
+#define  FSMC_BCR3_MUXEN                     ((uint32_t)0x00000002)        /*!<Address/data multiplexing enable bit */
+
+#define  FSMC_BCR3_MTYP                      ((uint32_t)0x0000000C)        /*!<MTYP[1:0] bits (Memory type) */
+#define  FSMC_BCR3_MTYP_0                    ((uint32_t)0x00000004)        /*!<Bit 0 */
+#define  FSMC_BCR3_MTYP_1                    ((uint32_t)0x00000008)        /*!<Bit 1 */
+
+#define  FSMC_BCR3_MWID                      ((uint32_t)0x00000030)        /*!<MWID[1:0] bits (Memory data bus width) */
+#define  FSMC_BCR3_MWID_0                    ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BCR3_MWID_1                    ((uint32_t)0x00000020)        /*!<Bit 1 */
+
+#define  FSMC_BCR3_FACCEN                    ((uint32_t)0x00000040)        /*!<Flash access enable */
+#define  FSMC_BCR3_BURSTEN                   ((uint32_t)0x00000100)        /*!<Burst enable bit */
+#define  FSMC_BCR3_WAITPOL                   ((uint32_t)0x00000200)        /*!<Wait signal polarity bit. */
+#define  FSMC_BCR3_WRAPMOD                   ((uint32_t)0x00000400)        /*!<Wrapped burst mode support */
+#define  FSMC_BCR3_WAITCFG                   ((uint32_t)0x00000800)        /*!<Wait timing configuration */
+#define  FSMC_BCR3_WREN                      ((uint32_t)0x00001000)        /*!<Write enable bit */
+#define  FSMC_BCR3_WAITEN                    ((uint32_t)0x00002000)        /*!<Wait enable bit */
+#define  FSMC_BCR3_EXTMOD                    ((uint32_t)0x00004000)        /*!<Extended mode enable */
+#define  FSMC_BCR3_ASYNCWAIT                 ((uint32_t)0x00008000)        /*!<Asynchronous wait */
+#define  FSMC_BCR3_CBURSTRW                  ((uint32_t)0x00080000)        /*!<Write burst enable */
+
+/******************  Bit definition for FSMC_BCR4 register  *******************/
+#define  FSMC_BCR4_MBKEN                     ((uint32_t)0x00000001)        /*!<Memory bank enable bit */
+#define  FSMC_BCR4_MUXEN                     ((uint32_t)0x00000002)        /*!<Address/data multiplexing enable bit */
+
+#define  FSMC_BCR4_MTYP                      ((uint32_t)0x0000000C)        /*!<MTYP[1:0] bits (Memory type) */
+#define  FSMC_BCR4_MTYP_0                    ((uint32_t)0x00000004)        /*!<Bit 0 */
+#define  FSMC_BCR4_MTYP_1                    ((uint32_t)0x00000008)        /*!<Bit 1 */
+
+#define  FSMC_BCR4_MWID                      ((uint32_t)0x00000030)        /*!<MWID[1:0] bits (Memory data bus width) */
+#define  FSMC_BCR4_MWID_0                    ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BCR4_MWID_1                    ((uint32_t)0x00000020)        /*!<Bit 1 */
+
+#define  FSMC_BCR4_FACCEN                    ((uint32_t)0x00000040)        /*!<Flash access enable */
+#define  FSMC_BCR4_BURSTEN                   ((uint32_t)0x00000100)        /*!<Burst enable bit */
+#define  FSMC_BCR4_WAITPOL                   ((uint32_t)0x00000200)        /*!<Wait signal polarity bit */
+#define  FSMC_BCR4_WRAPMOD                   ((uint32_t)0x00000400)        /*!<Wrapped burst mode support */
+#define  FSMC_BCR4_WAITCFG                   ((uint32_t)0x00000800)        /*!<Wait timing configuration */
+#define  FSMC_BCR4_WREN                      ((uint32_t)0x00001000)        /*!<Write enable bit */
+#define  FSMC_BCR4_WAITEN                    ((uint32_t)0x00002000)        /*!<Wait enable bit */
+#define  FSMC_BCR4_EXTMOD                    ((uint32_t)0x00004000)        /*!<Extended mode enable */
+#define  FSMC_BCR4_ASYNCWAIT                 ((uint32_t)0x00008000)        /*!<Asynchronous wait */
+#define  FSMC_BCR4_CBURSTRW                  ((uint32_t)0x00080000)        /*!<Write burst enable */
+
+/******************  Bit definition for FSMC_BTR1 register  ******************/
+#define  FSMC_BTR1_ADDSET                    ((uint32_t)0x0000000F)        /*!<ADDSET[3:0] bits (Address setup phase duration) */
+#define  FSMC_BTR1_ADDSET_0                  ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_BTR1_ADDSET_1                  ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_BTR1_ADDSET_2                  ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_BTR1_ADDSET_3                  ((uint32_t)0x00000008)        /*!<Bit 3 */
+
+#define  FSMC_BTR1_ADDHLD                    ((uint32_t)0x000000F0)        /*!<ADDHLD[3:0] bits (Address-hold phase duration) */
+#define  FSMC_BTR1_ADDHLD_0                  ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BTR1_ADDHLD_1                  ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  FSMC_BTR1_ADDHLD_2                  ((uint32_t)0x00000040)        /*!<Bit 2 */
+#define  FSMC_BTR1_ADDHLD_3                  ((uint32_t)0x00000080)        /*!<Bit 3 */
+
+#define  FSMC_BTR1_DATAST                    ((uint32_t)0x0000FF00)        /*!<DATAST [3:0] bits (Data-phase duration) */
+#define  FSMC_BTR1_DATAST_0                  ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_BTR1_DATAST_1                  ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_BTR1_DATAST_2                  ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_BTR1_DATAST_3                  ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  FSMC_BTR1_BUSTURN                   ((uint32_t)0x000F0000)        /*!<BUSTURN[3:0] bits (Bus turnaround phase duration) */
+#define  FSMC_BTR1_BUSTURN_0                 ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_BTR1_BUSTURN_1                 ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_BTR1_BUSTURN_2                 ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_BTR1_BUSTURN_3                 ((uint32_t)0x00080000)        /*!<Bit 3 */
+
+#define  FSMC_BTR1_CLKDIV                    ((uint32_t)0x00F00000)        /*!<CLKDIV[3:0] bits (Clock divide ratio) */
+#define  FSMC_BTR1_CLKDIV_0                  ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  FSMC_BTR1_CLKDIV_1                  ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  FSMC_BTR1_CLKDIV_2                  ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  FSMC_BTR1_CLKDIV_3                  ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+#define  FSMC_BTR1_DATLAT                    ((uint32_t)0x0F000000)        /*!<DATLA[3:0] bits (Data latency) */
+#define  FSMC_BTR1_DATLAT_0                  ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_BTR1_DATLAT_1                  ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_BTR1_DATLAT_2                  ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_BTR1_DATLAT_3                  ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  FSMC_BTR1_ACCMOD                    ((uint32_t)0x30000000)        /*!<ACCMOD[1:0] bits (Access mode) */
+#define  FSMC_BTR1_ACCMOD_0                  ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  FSMC_BTR1_ACCMOD_1                  ((uint32_t)0x20000000)        /*!<Bit 1 */
+
+/******************  Bit definition for FSMC_BTR2 register  *******************/
+#define  FSMC_BTR2_ADDSET                    ((uint32_t)0x0000000F)        /*!<ADDSET[3:0] bits (Address setup phase duration) */
+#define  FSMC_BTR2_ADDSET_0                  ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_BTR2_ADDSET_1                  ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_BTR2_ADDSET_2                  ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_BTR2_ADDSET_3                  ((uint32_t)0x00000008)        /*!<Bit 3 */
+
+#define  FSMC_BTR2_ADDHLD                    ((uint32_t)0x000000F0)        /*!<ADDHLD[3:0] bits (Address-hold phase duration) */
+#define  FSMC_BTR2_ADDHLD_0                  ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BTR2_ADDHLD_1                  ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  FSMC_BTR2_ADDHLD_2                  ((uint32_t)0x00000040)        /*!<Bit 2 */
+#define  FSMC_BTR2_ADDHLD_3                  ((uint32_t)0x00000080)        /*!<Bit 3 */
+
+#define  FSMC_BTR2_DATAST                    ((uint32_t)0x0000FF00)        /*!<DATAST [3:0] bits (Data-phase duration) */
+#define  FSMC_BTR2_DATAST_0                  ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_BTR2_DATAST_1                  ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_BTR2_DATAST_2                  ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_BTR2_DATAST_3                  ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  FSMC_BTR2_BUSTURN                   ((uint32_t)0x000F0000)        /*!<BUSTURN[3:0] bits (Bus turnaround phase duration) */
+#define  FSMC_BTR2_BUSTURN_0                 ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_BTR2_BUSTURN_1                 ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_BTR2_BUSTURN_2                 ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_BTR2_BUSTURN_3                 ((uint32_t)0x00080000)        /*!<Bit 3 */
+
+#define  FSMC_BTR2_CLKDIV                    ((uint32_t)0x00F00000)        /*!<CLKDIV[3:0] bits (Clock divide ratio) */
+#define  FSMC_BTR2_CLKDIV_0                  ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  FSMC_BTR2_CLKDIV_1                  ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  FSMC_BTR2_CLKDIV_2                  ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  FSMC_BTR2_CLKDIV_3                  ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+#define  FSMC_BTR2_DATLAT                    ((uint32_t)0x0F000000)        /*!<DATLA[3:0] bits (Data latency) */
+#define  FSMC_BTR2_DATLAT_0                  ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_BTR2_DATLAT_1                  ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_BTR2_DATLAT_2                  ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_BTR2_DATLAT_3                  ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  FSMC_BTR2_ACCMOD                    ((uint32_t)0x30000000)        /*!<ACCMOD[1:0] bits (Access mode) */
+#define  FSMC_BTR2_ACCMOD_0                  ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  FSMC_BTR2_ACCMOD_1                  ((uint32_t)0x20000000)        /*!<Bit 1 */
+
+/*******************  Bit definition for FSMC_BTR3 register  *******************/
+#define  FSMC_BTR3_ADDSET                    ((uint32_t)0x0000000F)        /*!<ADDSET[3:0] bits (Address setup phase duration) */
+#define  FSMC_BTR3_ADDSET_0                  ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_BTR3_ADDSET_1                  ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_BTR3_ADDSET_2                  ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_BTR3_ADDSET_3                  ((uint32_t)0x00000008)        /*!<Bit 3 */
+
+#define  FSMC_BTR3_ADDHLD                    ((uint32_t)0x000000F0)        /*!<ADDHLD[3:0] bits (Address-hold phase duration) */
+#define  FSMC_BTR3_ADDHLD_0                  ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BTR3_ADDHLD_1                  ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  FSMC_BTR3_ADDHLD_2                  ((uint32_t)0x00000040)        /*!<Bit 2 */
+#define  FSMC_BTR3_ADDHLD_3                  ((uint32_t)0x00000080)        /*!<Bit 3 */
+
+#define  FSMC_BTR3_DATAST                    ((uint32_t)0x0000FF00)        /*!<DATAST [3:0] bits (Data-phase duration) */
+#define  FSMC_BTR3_DATAST_0                  ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_BTR3_DATAST_1                  ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_BTR3_DATAST_2                  ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_BTR3_DATAST_3                  ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  FSMC_BTR3_BUSTURN                   ((uint32_t)0x000F0000)        /*!<BUSTURN[3:0] bits (Bus turnaround phase duration) */
+#define  FSMC_BTR3_BUSTURN_0                 ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_BTR3_BUSTURN_1                 ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_BTR3_BUSTURN_2                 ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_BTR3_BUSTURN_3                 ((uint32_t)0x00080000)        /*!<Bit 3 */
+
+#define  FSMC_BTR3_CLKDIV                    ((uint32_t)0x00F00000)        /*!<CLKDIV[3:0] bits (Clock divide ratio) */
+#define  FSMC_BTR3_CLKDIV_0                  ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  FSMC_BTR3_CLKDIV_1                  ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  FSMC_BTR3_CLKDIV_2                  ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  FSMC_BTR3_CLKDIV_3                  ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+#define  FSMC_BTR3_DATLAT                    ((uint32_t)0x0F000000)        /*!<DATLA[3:0] bits (Data latency) */
+#define  FSMC_BTR3_DATLAT_0                  ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_BTR3_DATLAT_1                  ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_BTR3_DATLAT_2                  ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_BTR3_DATLAT_3                  ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  FSMC_BTR3_ACCMOD                    ((uint32_t)0x30000000)        /*!<ACCMOD[1:0] bits (Access mode) */
+#define  FSMC_BTR3_ACCMOD_0                  ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  FSMC_BTR3_ACCMOD_1                  ((uint32_t)0x20000000)        /*!<Bit 1 */
+
+/******************  Bit definition for FSMC_BTR4 register  *******************/
+#define  FSMC_BTR4_ADDSET                    ((uint32_t)0x0000000F)        /*!<ADDSET[3:0] bits (Address setup phase duration) */
+#define  FSMC_BTR4_ADDSET_0                  ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_BTR4_ADDSET_1                  ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_BTR4_ADDSET_2                  ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_BTR4_ADDSET_3                  ((uint32_t)0x00000008)        /*!<Bit 3 */
+
+#define  FSMC_BTR4_ADDHLD                    ((uint32_t)0x000000F0)        /*!<ADDHLD[3:0] bits (Address-hold phase duration) */
+#define  FSMC_BTR4_ADDHLD_0                  ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BTR4_ADDHLD_1                  ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  FSMC_BTR4_ADDHLD_2                  ((uint32_t)0x00000040)        /*!<Bit 2 */
+#define  FSMC_BTR4_ADDHLD_3                  ((uint32_t)0x00000080)        /*!<Bit 3 */
+
+#define  FSMC_BTR4_DATAST                    ((uint32_t)0x0000FF00)        /*!<DATAST [3:0] bits (Data-phase duration) */
+#define  FSMC_BTR4_DATAST_0                  ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_BTR4_DATAST_1                  ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_BTR4_DATAST_2                  ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_BTR4_DATAST_3                  ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  FSMC_BTR4_BUSTURN                   ((uint32_t)0x000F0000)        /*!<BUSTURN[3:0] bits (Bus turnaround phase duration) */
+#define  FSMC_BTR4_BUSTURN_0                 ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_BTR4_BUSTURN_1                 ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_BTR4_BUSTURN_2                 ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_BTR4_BUSTURN_3                 ((uint32_t)0x00080000)        /*!<Bit 3 */
+
+#define  FSMC_BTR4_CLKDIV                    ((uint32_t)0x00F00000)        /*!<CLKDIV[3:0] bits (Clock divide ratio) */
+#define  FSMC_BTR4_CLKDIV_0                  ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  FSMC_BTR4_CLKDIV_1                  ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  FSMC_BTR4_CLKDIV_2                  ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  FSMC_BTR4_CLKDIV_3                  ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+#define  FSMC_BTR4_DATLAT                    ((uint32_t)0x0F000000)        /*!<DATLA[3:0] bits (Data latency) */
+#define  FSMC_BTR4_DATLAT_0                  ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_BTR4_DATLAT_1                  ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_BTR4_DATLAT_2                  ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_BTR4_DATLAT_3                  ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  FSMC_BTR4_ACCMOD                    ((uint32_t)0x30000000)        /*!<ACCMOD[1:0] bits (Access mode) */
+#define  FSMC_BTR4_ACCMOD_0                  ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  FSMC_BTR4_ACCMOD_1                  ((uint32_t)0x20000000)        /*!<Bit 1 */
+
+/******************  Bit definition for FSMC_BWTR1 register  ******************/
+#define  FSMC_BWTR1_ADDSET                   ((uint32_t)0x0000000F)        /*!<ADDSET[3:0] bits (Address setup phase duration) */
+#define  FSMC_BWTR1_ADDSET_0                 ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_BWTR1_ADDSET_1                 ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_BWTR1_ADDSET_2                 ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_BWTR1_ADDSET_3                 ((uint32_t)0x00000008)        /*!<Bit 3 */
+
+#define  FSMC_BWTR1_ADDHLD                   ((uint32_t)0x000000F0)        /*!<ADDHLD[3:0] bits (Address-hold phase duration) */
+#define  FSMC_BWTR1_ADDHLD_0                 ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BWTR1_ADDHLD_1                 ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  FSMC_BWTR1_ADDHLD_2                 ((uint32_t)0x00000040)        /*!<Bit 2 */
+#define  FSMC_BWTR1_ADDHLD_3                 ((uint32_t)0x00000080)        /*!<Bit 3 */
+
+#define  FSMC_BWTR1_DATAST                   ((uint32_t)0x0000FF00)        /*!<DATAST [3:0] bits (Data-phase duration) */
+#define  FSMC_BWTR1_DATAST_0                 ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_BWTR1_DATAST_1                 ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_BWTR1_DATAST_2                 ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_BWTR1_DATAST_3                 ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  FSMC_BWTR1_CLKDIV                   ((uint32_t)0x00F00000)        /*!<CLKDIV[3:0] bits (Clock divide ratio) */
+#define  FSMC_BWTR1_CLKDIV_0                 ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  FSMC_BWTR1_CLKDIV_1                 ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  FSMC_BWTR1_CLKDIV_2                 ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  FSMC_BWTR1_CLKDIV_3                 ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+#define  FSMC_BWTR1_DATLAT                   ((uint32_t)0x0F000000)        /*!<DATLA[3:0] bits (Data latency) */
+#define  FSMC_BWTR1_DATLAT_0                 ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_BWTR1_DATLAT_1                 ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_BWTR1_DATLAT_2                 ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_BWTR1_DATLAT_3                 ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  FSMC_BWTR1_ACCMOD                   ((uint32_t)0x30000000)        /*!<ACCMOD[1:0] bits (Access mode) */
+#define  FSMC_BWTR1_ACCMOD_0                 ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  FSMC_BWTR1_ACCMOD_1                 ((uint32_t)0x20000000)        /*!<Bit 1 */
+
+/******************  Bit definition for FSMC_BWTR2 register  ******************/
+#define  FSMC_BWTR2_ADDSET                   ((uint32_t)0x0000000F)        /*!<ADDSET[3:0] bits (Address setup phase duration) */
+#define  FSMC_BWTR2_ADDSET_0                 ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_BWTR2_ADDSET_1                 ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_BWTR2_ADDSET_2                 ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_BWTR2_ADDSET_3                 ((uint32_t)0x00000008)        /*!<Bit 3 */
+
+#define  FSMC_BWTR2_ADDHLD                   ((uint32_t)0x000000F0)        /*!<ADDHLD[3:0] bits (Address-hold phase duration) */
+#define  FSMC_BWTR2_ADDHLD_0                 ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BWTR2_ADDHLD_1                 ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  FSMC_BWTR2_ADDHLD_2                 ((uint32_t)0x00000040)        /*!<Bit 2 */
+#define  FSMC_BWTR2_ADDHLD_3                 ((uint32_t)0x00000080)        /*!<Bit 3 */
+
+#define  FSMC_BWTR2_DATAST                   ((uint32_t)0x0000FF00)        /*!<DATAST [3:0] bits (Data-phase duration) */
+#define  FSMC_BWTR2_DATAST_0                 ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_BWTR2_DATAST_1                 ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_BWTR2_DATAST_2                 ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_BWTR2_DATAST_3                 ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  FSMC_BWTR2_CLKDIV                   ((uint32_t)0x00F00000)        /*!<CLKDIV[3:0] bits (Clock divide ratio) */
+#define  FSMC_BWTR2_CLKDIV_0                 ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  FSMC_BWTR2_CLKDIV_1                 ((uint32_t)0x00200000)        /*!<Bit 1*/
+#define  FSMC_BWTR2_CLKDIV_2                 ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  FSMC_BWTR2_CLKDIV_3                 ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+#define  FSMC_BWTR2_DATLAT                   ((uint32_t)0x0F000000)        /*!<DATLA[3:0] bits (Data latency) */
+#define  FSMC_BWTR2_DATLAT_0                 ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_BWTR2_DATLAT_1                 ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_BWTR2_DATLAT_2                 ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_BWTR2_DATLAT_3                 ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  FSMC_BWTR2_ACCMOD                   ((uint32_t)0x30000000)        /*!<ACCMOD[1:0] bits (Access mode) */
+#define  FSMC_BWTR2_ACCMOD_0                 ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  FSMC_BWTR2_ACCMOD_1                 ((uint32_t)0x20000000)        /*!<Bit 1 */
+
+/******************  Bit definition for FSMC_BWTR3 register  ******************/
+#define  FSMC_BWTR3_ADDSET                   ((uint32_t)0x0000000F)        /*!<ADDSET[3:0] bits (Address setup phase duration) */
+#define  FSMC_BWTR3_ADDSET_0                 ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_BWTR3_ADDSET_1                 ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_BWTR3_ADDSET_2                 ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_BWTR3_ADDSET_3                 ((uint32_t)0x00000008)        /*!<Bit 3 */
+
+#define  FSMC_BWTR3_ADDHLD                   ((uint32_t)0x000000F0)        /*!<ADDHLD[3:0] bits (Address-hold phase duration) */
+#define  FSMC_BWTR3_ADDHLD_0                 ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BWTR3_ADDHLD_1                 ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  FSMC_BWTR3_ADDHLD_2                 ((uint32_t)0x00000040)        /*!<Bit 2 */
+#define  FSMC_BWTR3_ADDHLD_3                 ((uint32_t)0x00000080)        /*!<Bit 3 */
+
+#define  FSMC_BWTR3_DATAST                   ((uint32_t)0x0000FF00)        /*!<DATAST [3:0] bits (Data-phase duration) */
+#define  FSMC_BWTR3_DATAST_0                 ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_BWTR3_DATAST_1                 ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_BWTR3_DATAST_2                 ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_BWTR3_DATAST_3                 ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  FSMC_BWTR3_CLKDIV                   ((uint32_t)0x00F00000)        /*!<CLKDIV[3:0] bits (Clock divide ratio) */
+#define  FSMC_BWTR3_CLKDIV_0                 ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  FSMC_BWTR3_CLKDIV_1                 ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  FSMC_BWTR3_CLKDIV_2                 ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  FSMC_BWTR3_CLKDIV_3                 ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+#define  FSMC_BWTR3_DATLAT                   ((uint32_t)0x0F000000)        /*!<DATLA[3:0] bits (Data latency) */
+#define  FSMC_BWTR3_DATLAT_0                 ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_BWTR3_DATLAT_1                 ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_BWTR3_DATLAT_2                 ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_BWTR3_DATLAT_3                 ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  FSMC_BWTR3_ACCMOD                   ((uint32_t)0x30000000)        /*!<ACCMOD[1:0] bits (Access mode) */
+#define  FSMC_BWTR3_ACCMOD_0                 ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  FSMC_BWTR3_ACCMOD_1                 ((uint32_t)0x20000000)        /*!<Bit 1 */
+
+/******************  Bit definition for FSMC_BWTR4 register  ******************/
+#define  FSMC_BWTR4_ADDSET                   ((uint32_t)0x0000000F)        /*!<ADDSET[3:0] bits (Address setup phase duration) */
+#define  FSMC_BWTR4_ADDSET_0                 ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_BWTR4_ADDSET_1                 ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_BWTR4_ADDSET_2                 ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_BWTR4_ADDSET_3                 ((uint32_t)0x00000008)        /*!<Bit 3 */
+
+#define  FSMC_BWTR4_ADDHLD                   ((uint32_t)0x000000F0)        /*!<ADDHLD[3:0] bits (Address-hold phase duration) */
+#define  FSMC_BWTR4_ADDHLD_0                 ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_BWTR4_ADDHLD_1                 ((uint32_t)0x00000020)        /*!<Bit 1 */
+#define  FSMC_BWTR4_ADDHLD_2                 ((uint32_t)0x00000040)        /*!<Bit 2 */
+#define  FSMC_BWTR4_ADDHLD_3                 ((uint32_t)0x00000080)        /*!<Bit 3 */
+
+#define  FSMC_BWTR4_DATAST                   ((uint32_t)0x0000FF00)        /*!<DATAST [3:0] bits (Data-phase duration) */
+#define  FSMC_BWTR4_DATAST_0                 ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_BWTR4_DATAST_1                 ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_BWTR4_DATAST_2                 ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_BWTR4_DATAST_3                 ((uint32_t)0x00000800)        /*!<Bit 3 */
+
+#define  FSMC_BWTR4_CLKDIV                   ((uint32_t)0x00F00000)        /*!<CLKDIV[3:0] bits (Clock divide ratio) */
+#define  FSMC_BWTR4_CLKDIV_0                 ((uint32_t)0x00100000)        /*!<Bit 0 */
+#define  FSMC_BWTR4_CLKDIV_1                 ((uint32_t)0x00200000)        /*!<Bit 1 */
+#define  FSMC_BWTR4_CLKDIV_2                 ((uint32_t)0x00400000)        /*!<Bit 2 */
+#define  FSMC_BWTR4_CLKDIV_3                 ((uint32_t)0x00800000)        /*!<Bit 3 */
+
+#define  FSMC_BWTR4_DATLAT                   ((uint32_t)0x0F000000)        /*!<DATLA[3:0] bits (Data latency) */
+#define  FSMC_BWTR4_DATLAT_0                 ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_BWTR4_DATLAT_1                 ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_BWTR4_DATLAT_2                 ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_BWTR4_DATLAT_3                 ((uint32_t)0x08000000)        /*!<Bit 3 */
+
+#define  FSMC_BWTR4_ACCMOD                   ((uint32_t)0x30000000)        /*!<ACCMOD[1:0] bits (Access mode) */
+#define  FSMC_BWTR4_ACCMOD_0                 ((uint32_t)0x10000000)        /*!<Bit 0 */
+#define  FSMC_BWTR4_ACCMOD_1                 ((uint32_t)0x20000000)        /*!<Bit 1 */
+
+/******************  Bit definition for FSMC_PCR2 register  *******************/
+#define  FSMC_PCR2_PWAITEN                   ((uint32_t)0x00000002)        /*!<Wait feature enable bit */
+#define  FSMC_PCR2_PBKEN                     ((uint32_t)0x00000004)        /*!<PC Card/NAND Flash memory bank enable bit */
+#define  FSMC_PCR2_PTYP                      ((uint32_t)0x00000008)        /*!<Memory type */
+
+#define  FSMC_PCR2_PWID                      ((uint32_t)0x00000030)        /*!<PWID[1:0] bits (NAND Flash databus width) */
+#define  FSMC_PCR2_PWID_0                    ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_PCR2_PWID_1                    ((uint32_t)0x00000020)        /*!<Bit 1 */
+
+#define  FSMC_PCR2_ECCEN                     ((uint32_t)0x00000040)        /*!<ECC computation logic enable bit */
+
+#define  FSMC_PCR2_TCLR                      ((uint32_t)0x00001E00)        /*!<TCLR[3:0] bits (CLE to RE delay) */
+#define  FSMC_PCR2_TCLR_0                    ((uint32_t)0x00000200)        /*!<Bit 0 */
+#define  FSMC_PCR2_TCLR_1                    ((uint32_t)0x00000400)        /*!<Bit 1 */
+#define  FSMC_PCR2_TCLR_2                    ((uint32_t)0x00000800)        /*!<Bit 2 */
+#define  FSMC_PCR2_TCLR_3                    ((uint32_t)0x00001000)        /*!<Bit 3 */
+
+#define  FSMC_PCR2_TAR                       ((uint32_t)0x0001E000)        /*!<TAR[3:0] bits (ALE to RE delay) */
+#define  FSMC_PCR2_TAR_0                     ((uint32_t)0x00002000)        /*!<Bit 0 */
+#define  FSMC_PCR2_TAR_1                     ((uint32_t)0x00004000)        /*!<Bit 1 */
+#define  FSMC_PCR2_TAR_2                     ((uint32_t)0x00008000)        /*!<Bit 2 */
+#define  FSMC_PCR2_TAR_3                     ((uint32_t)0x00010000)        /*!<Bit 3 */
+
+#define  FSMC_PCR2_ECCPS                     ((uint32_t)0x000E0000)        /*!<ECCPS[1:0] bits (ECC page size) */
+#define  FSMC_PCR2_ECCPS_0                   ((uint32_t)0x00020000)        /*!<Bit 0 */
+#define  FSMC_PCR2_ECCPS_1                   ((uint32_t)0x00040000)        /*!<Bit 1 */
+#define  FSMC_PCR2_ECCPS_2                   ((uint32_t)0x00080000)        /*!<Bit 2 */
+
+/******************  Bit definition for FSMC_PCR3 register  *******************/
+#define  FSMC_PCR3_PWAITEN                   ((uint32_t)0x00000002)        /*!<Wait feature enable bit */
+#define  FSMC_PCR3_PBKEN                     ((uint32_t)0x00000004)        /*!<PC Card/NAND Flash memory bank enable bit */
+#define  FSMC_PCR3_PTYP                      ((uint32_t)0x00000008)        /*!<Memory type */
+
+#define  FSMC_PCR3_PWID                      ((uint32_t)0x00000030)        /*!<PWID[1:0] bits (NAND Flash databus width) */
+#define  FSMC_PCR3_PWID_0                    ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_PCR3_PWID_1                    ((uint32_t)0x00000020)        /*!<Bit 1 */
+
+#define  FSMC_PCR3_ECCEN                     ((uint32_t)0x00000040)        /*!<ECC computation logic enable bit */
+
+#define  FSMC_PCR3_TCLR                      ((uint32_t)0x00001E00)        /*!<TCLR[3:0] bits (CLE to RE delay) */
+#define  FSMC_PCR3_TCLR_0                    ((uint32_t)0x00000200)        /*!<Bit 0 */
+#define  FSMC_PCR3_TCLR_1                    ((uint32_t)0x00000400)        /*!<Bit 1 */
+#define  FSMC_PCR3_TCLR_2                    ((uint32_t)0x00000800)        /*!<Bit 2 */
+#define  FSMC_PCR3_TCLR_3                    ((uint32_t)0x00001000)        /*!<Bit 3 */
+
+#define  FSMC_PCR3_TAR                       ((uint32_t)0x0001E000)        /*!<TAR[3:0] bits (ALE to RE delay) */
+#define  FSMC_PCR3_TAR_0                     ((uint32_t)0x00002000)        /*!<Bit 0 */
+#define  FSMC_PCR3_TAR_1                     ((uint32_t)0x00004000)        /*!<Bit 1 */
+#define  FSMC_PCR3_TAR_2                     ((uint32_t)0x00008000)        /*!<Bit 2 */
+#define  FSMC_PCR3_TAR_3                     ((uint32_t)0x00010000)        /*!<Bit 3 */
+
+#define  FSMC_PCR3_ECCPS                     ((uint32_t)0x000E0000)        /*!<ECCPS[2:0] bits (ECC page size) */
+#define  FSMC_PCR3_ECCPS_0                   ((uint32_t)0x00020000)        /*!<Bit 0 */
+#define  FSMC_PCR3_ECCPS_1                   ((uint32_t)0x00040000)        /*!<Bit 1 */
+#define  FSMC_PCR3_ECCPS_2                   ((uint32_t)0x00080000)        /*!<Bit 2 */
+
+/******************  Bit definition for FSMC_PCR4 register  *******************/
+#define  FSMC_PCR4_PWAITEN                   ((uint32_t)0x00000002)        /*!<Wait feature enable bit */
+#define  FSMC_PCR4_PBKEN                     ((uint32_t)0x00000004)        /*!<PC Card/NAND Flash memory bank enable bit */
+#define  FSMC_PCR4_PTYP                      ((uint32_t)0x00000008)        /*!<Memory type */
+
+#define  FSMC_PCR4_PWID                      ((uint32_t)0x00000030)        /*!<PWID[1:0] bits (NAND Flash databus width) */
+#define  FSMC_PCR4_PWID_0                    ((uint32_t)0x00000010)        /*!<Bit 0 */
+#define  FSMC_PCR4_PWID_1                    ((uint32_t)0x00000020)        /*!<Bit 1 */
+
+#define  FSMC_PCR4_ECCEN                     ((uint32_t)0x00000040)        /*!<ECC computation logic enable bit */
+
+#define  FSMC_PCR4_TCLR                      ((uint32_t)0x00001E00)        /*!<TCLR[3:0] bits (CLE to RE delay) */
+#define  FSMC_PCR4_TCLR_0                    ((uint32_t)0x00000200)        /*!<Bit 0 */
+#define  FSMC_PCR4_TCLR_1                    ((uint32_t)0x00000400)        /*!<Bit 1 */
+#define  FSMC_PCR4_TCLR_2                    ((uint32_t)0x00000800)        /*!<Bit 2 */
+#define  FSMC_PCR4_TCLR_3                    ((uint32_t)0x00001000)        /*!<Bit 3 */
+
+#define  FSMC_PCR4_TAR                       ((uint32_t)0x0001E000)        /*!<TAR[3:0] bits (ALE to RE delay) */
+#define  FSMC_PCR4_TAR_0                     ((uint32_t)0x00002000)        /*!<Bit 0 */
+#define  FSMC_PCR4_TAR_1                     ((uint32_t)0x00004000)        /*!<Bit 1 */
+#define  FSMC_PCR4_TAR_2                     ((uint32_t)0x00008000)        /*!<Bit 2 */
+#define  FSMC_PCR4_TAR_3                     ((uint32_t)0x00010000)        /*!<Bit 3 */
+
+#define  FSMC_PCR4_ECCPS                     ((uint32_t)0x000E0000)        /*!<ECCPS[2:0] bits (ECC page size) */
+#define  FSMC_PCR4_ECCPS_0                   ((uint32_t)0x00020000)        /*!<Bit 0 */
+#define  FSMC_PCR4_ECCPS_1                   ((uint32_t)0x00040000)        /*!<Bit 1 */
+#define  FSMC_PCR4_ECCPS_2                   ((uint32_t)0x00080000)        /*!<Bit 2 */
+
+/*******************  Bit definition for FSMC_SR2 register  *******************/
+#define  FSMC_SR2_IRS                        ((uint8_t)0x01)               /*!<Interrupt Rising Edge status */
+#define  FSMC_SR2_ILS                        ((uint8_t)0x02)               /*!<Interrupt Level status */
+#define  FSMC_SR2_IFS                        ((uint8_t)0x04)               /*!<Interrupt Falling Edge status */
+#define  FSMC_SR2_IREN                       ((uint8_t)0x08)               /*!<Interrupt Rising Edge detection Enable bit */
+#define  FSMC_SR2_ILEN                       ((uint8_t)0x10)               /*!<Interrupt Level detection Enable bit */
+#define  FSMC_SR2_IFEN                       ((uint8_t)0x20)               /*!<Interrupt Falling Edge detection Enable bit */
+#define  FSMC_SR2_FEMPT                      ((uint8_t)0x40)               /*!<FIFO empty */
+
+/*******************  Bit definition for FSMC_SR3 register  *******************/
+#define  FSMC_SR3_IRS                        ((uint8_t)0x01)               /*!<Interrupt Rising Edge status */
+#define  FSMC_SR3_ILS                        ((uint8_t)0x02)               /*!<Interrupt Level status */
+#define  FSMC_SR3_IFS                        ((uint8_t)0x04)               /*!<Interrupt Falling Edge status */
+#define  FSMC_SR3_IREN                       ((uint8_t)0x08)               /*!<Interrupt Rising Edge detection Enable bit */
+#define  FSMC_SR3_ILEN                       ((uint8_t)0x10)               /*!<Interrupt Level detection Enable bit */
+#define  FSMC_SR3_IFEN                       ((uint8_t)0x20)               /*!<Interrupt Falling Edge detection Enable bit */
+#define  FSMC_SR3_FEMPT                      ((uint8_t)0x40)               /*!<FIFO empty */
+
+/*******************  Bit definition for FSMC_SR4 register  *******************/
+#define  FSMC_SR4_IRS                        ((uint8_t)0x01)               /*!<Interrupt Rising Edge status */
+#define  FSMC_SR4_ILS                        ((uint8_t)0x02)               /*!<Interrupt Level status */
+#define  FSMC_SR4_IFS                        ((uint8_t)0x04)               /*!<Interrupt Falling Edge status */
+#define  FSMC_SR4_IREN                       ((uint8_t)0x08)               /*!<Interrupt Rising Edge detection Enable bit */
+#define  FSMC_SR4_ILEN                       ((uint8_t)0x10)               /*!<Interrupt Level detection Enable bit */
+#define  FSMC_SR4_IFEN                       ((uint8_t)0x20)               /*!<Interrupt Falling Edge detection Enable bit */
+#define  FSMC_SR4_FEMPT                      ((uint8_t)0x40)               /*!<FIFO empty */
+
+/******************  Bit definition for FSMC_PMEM2 register  ******************/
+#define  FSMC_PMEM2_MEMSET2                  ((uint32_t)0x000000FF)        /*!<MEMSET2[7:0] bits (Common memory 2 setup time) */
+#define  FSMC_PMEM2_MEMSET2_0                ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_PMEM2_MEMSET2_1                ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_PMEM2_MEMSET2_2                ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_PMEM2_MEMSET2_3                ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  FSMC_PMEM2_MEMSET2_4                ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  FSMC_PMEM2_MEMSET2_5                ((uint32_t)0x00000020)        /*!<Bit 5 */
+#define  FSMC_PMEM2_MEMSET2_6                ((uint32_t)0x00000040)        /*!<Bit 6 */
+#define  FSMC_PMEM2_MEMSET2_7                ((uint32_t)0x00000080)        /*!<Bit 7 */
+
+#define  FSMC_PMEM2_MEMWAIT2                 ((uint32_t)0x0000FF00)        /*!<MEMWAIT2[7:0] bits (Common memory 2 wait time) */
+#define  FSMC_PMEM2_MEMWAIT2_0               ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_PMEM2_MEMWAIT2_1               ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_PMEM2_MEMWAIT2_2               ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_PMEM2_MEMWAIT2_3               ((uint32_t)0x00000800)        /*!<Bit 3 */
+#define  FSMC_PMEM2_MEMWAIT2_4               ((uint32_t)0x00001000)        /*!<Bit 4 */
+#define  FSMC_PMEM2_MEMWAIT2_5               ((uint32_t)0x00002000)        /*!<Bit 5 */
+#define  FSMC_PMEM2_MEMWAIT2_6               ((uint32_t)0x00004000)        /*!<Bit 6 */
+#define  FSMC_PMEM2_MEMWAIT2_7               ((uint32_t)0x00008000)        /*!<Bit 7 */
+
+#define  FSMC_PMEM2_MEMHOLD2                 ((uint32_t)0x00FF0000)        /*!<MEMHOLD2[7:0] bits (Common memory 2 hold time) */
+#define  FSMC_PMEM2_MEMHOLD2_0               ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_PMEM2_MEMHOLD2_1               ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_PMEM2_MEMHOLD2_2               ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_PMEM2_MEMHOLD2_3               ((uint32_t)0x00080000)        /*!<Bit 3 */
+#define  FSMC_PMEM2_MEMHOLD2_4               ((uint32_t)0x00100000)        /*!<Bit 4 */
+#define  FSMC_PMEM2_MEMHOLD2_5               ((uint32_t)0x00200000)        /*!<Bit 5 */
+#define  FSMC_PMEM2_MEMHOLD2_6               ((uint32_t)0x00400000)        /*!<Bit 6 */
+#define  FSMC_PMEM2_MEMHOLD2_7               ((uint32_t)0x00800000)        /*!<Bit 7 */
+
+#define  FSMC_PMEM2_MEMHIZ2                  ((uint32_t)0xFF000000)        /*!<MEMHIZ2[7:0] bits (Common memory 2 databus HiZ time) */
+#define  FSMC_PMEM2_MEMHIZ2_0                ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_PMEM2_MEMHIZ2_1                ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_PMEM2_MEMHIZ2_2                ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_PMEM2_MEMHIZ2_3                ((uint32_t)0x08000000)        /*!<Bit 3 */
+#define  FSMC_PMEM2_MEMHIZ2_4                ((uint32_t)0x10000000)        /*!<Bit 4 */
+#define  FSMC_PMEM2_MEMHIZ2_5                ((uint32_t)0x20000000)        /*!<Bit 5 */
+#define  FSMC_PMEM2_MEMHIZ2_6                ((uint32_t)0x40000000)        /*!<Bit 6 */
+#define  FSMC_PMEM2_MEMHIZ2_7                ((uint32_t)0x80000000)        /*!<Bit 7 */
+
+/******************  Bit definition for FSMC_PMEM3 register  ******************/
+#define  FSMC_PMEM3_MEMSET3                  ((uint32_t)0x000000FF)        /*!<MEMSET3[7:0] bits (Common memory 3 setup time) */
+#define  FSMC_PMEM3_MEMSET3_0                ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_PMEM3_MEMSET3_1                ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_PMEM3_MEMSET3_2                ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_PMEM3_MEMSET3_3                ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  FSMC_PMEM3_MEMSET3_4                ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  FSMC_PMEM3_MEMSET3_5                ((uint32_t)0x00000020)        /*!<Bit 5 */
+#define  FSMC_PMEM3_MEMSET3_6                ((uint32_t)0x00000040)        /*!<Bit 6 */
+#define  FSMC_PMEM3_MEMSET3_7                ((uint32_t)0x00000080)        /*!<Bit 7 */
+
+#define  FSMC_PMEM3_MEMWAIT3                 ((uint32_t)0x0000FF00)        /*!<MEMWAIT3[7:0] bits (Common memory 3 wait time) */
+#define  FSMC_PMEM3_MEMWAIT3_0               ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_PMEM3_MEMWAIT3_1               ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_PMEM3_MEMWAIT3_2               ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_PMEM3_MEMWAIT3_3               ((uint32_t)0x00000800)        /*!<Bit 3 */
+#define  FSMC_PMEM3_MEMWAIT3_4               ((uint32_t)0x00001000)        /*!<Bit 4 */
+#define  FSMC_PMEM3_MEMWAIT3_5               ((uint32_t)0x00002000)        /*!<Bit 5 */
+#define  FSMC_PMEM3_MEMWAIT3_6               ((uint32_t)0x00004000)        /*!<Bit 6 */
+#define  FSMC_PMEM3_MEMWAIT3_7               ((uint32_t)0x00008000)        /*!<Bit 7 */
+
+#define  FSMC_PMEM3_MEMHOLD3                 ((uint32_t)0x00FF0000)        /*!<MEMHOLD3[7:0] bits (Common memory 3 hold time) */
+#define  FSMC_PMEM3_MEMHOLD3_0               ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_PMEM3_MEMHOLD3_1               ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_PMEM3_MEMHOLD3_2               ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_PMEM3_MEMHOLD3_3               ((uint32_t)0x00080000)        /*!<Bit 3 */
+#define  FSMC_PMEM3_MEMHOLD3_4               ((uint32_t)0x00100000)        /*!<Bit 4 */
+#define  FSMC_PMEM3_MEMHOLD3_5               ((uint32_t)0x00200000)        /*!<Bit 5 */
+#define  FSMC_PMEM3_MEMHOLD3_6               ((uint32_t)0x00400000)        /*!<Bit 6 */
+#define  FSMC_PMEM3_MEMHOLD3_7               ((uint32_t)0x00800000)        /*!<Bit 7 */
+
+#define  FSMC_PMEM3_MEMHIZ3                  ((uint32_t)0xFF000000)        /*!<MEMHIZ3[7:0] bits (Common memory 3 databus HiZ time) */
+#define  FSMC_PMEM3_MEMHIZ3_0                ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_PMEM3_MEMHIZ3_1                ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_PMEM3_MEMHIZ3_2                ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_PMEM3_MEMHIZ3_3                ((uint32_t)0x08000000)        /*!<Bit 3 */
+#define  FSMC_PMEM3_MEMHIZ3_4                ((uint32_t)0x10000000)        /*!<Bit 4 */
+#define  FSMC_PMEM3_MEMHIZ3_5                ((uint32_t)0x20000000)        /*!<Bit 5 */
+#define  FSMC_PMEM3_MEMHIZ3_6                ((uint32_t)0x40000000)        /*!<Bit 6 */
+#define  FSMC_PMEM3_MEMHIZ3_7                ((uint32_t)0x80000000)        /*!<Bit 7 */
+
+/******************  Bit definition for FSMC_PMEM4 register  ******************/
+#define  FSMC_PMEM4_MEMSET4                  ((uint32_t)0x000000FF)        /*!<MEMSET4[7:0] bits (Common memory 4 setup time) */
+#define  FSMC_PMEM4_MEMSET4_0                ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_PMEM4_MEMSET4_1                ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_PMEM4_MEMSET4_2                ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_PMEM4_MEMSET4_3                ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  FSMC_PMEM4_MEMSET4_4                ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  FSMC_PMEM4_MEMSET4_5                ((uint32_t)0x00000020)        /*!<Bit 5 */
+#define  FSMC_PMEM4_MEMSET4_6                ((uint32_t)0x00000040)        /*!<Bit 6 */
+#define  FSMC_PMEM4_MEMSET4_7                ((uint32_t)0x00000080)        /*!<Bit 7 */
+
+#define  FSMC_PMEM4_MEMWAIT4                 ((uint32_t)0x0000FF00)        /*!<MEMWAIT4[7:0] bits (Common memory 4 wait time) */
+#define  FSMC_PMEM4_MEMWAIT4_0               ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_PMEM4_MEMWAIT4_1               ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_PMEM4_MEMWAIT4_2               ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_PMEM4_MEMWAIT4_3               ((uint32_t)0x00000800)        /*!<Bit 3 */
+#define  FSMC_PMEM4_MEMWAIT4_4               ((uint32_t)0x00001000)        /*!<Bit 4 */
+#define  FSMC_PMEM4_MEMWAIT4_5               ((uint32_t)0x00002000)        /*!<Bit 5 */
+#define  FSMC_PMEM4_MEMWAIT4_6               ((uint32_t)0x00004000)        /*!<Bit 6 */
+#define  FSMC_PMEM4_MEMWAIT4_7               ((uint32_t)0x00008000)        /*!<Bit 7 */
+
+#define  FSMC_PMEM4_MEMHOLD4                 ((uint32_t)0x00FF0000)        /*!<MEMHOLD4[7:0] bits (Common memory 4 hold time) */
+#define  FSMC_PMEM4_MEMHOLD4_0               ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_PMEM4_MEMHOLD4_1               ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_PMEM4_MEMHOLD4_2               ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_PMEM4_MEMHOLD4_3               ((uint32_t)0x00080000)        /*!<Bit 3 */
+#define  FSMC_PMEM4_MEMHOLD4_4               ((uint32_t)0x00100000)        /*!<Bit 4 */
+#define  FSMC_PMEM4_MEMHOLD4_5               ((uint32_t)0x00200000)        /*!<Bit 5 */
+#define  FSMC_PMEM4_MEMHOLD4_6               ((uint32_t)0x00400000)        /*!<Bit 6 */
+#define  FSMC_PMEM4_MEMHOLD4_7               ((uint32_t)0x00800000)        /*!<Bit 7 */
+
+#define  FSMC_PMEM4_MEMHIZ4                  ((uint32_t)0xFF000000)        /*!<MEMHIZ4[7:0] bits (Common memory 4 databus HiZ time) */
+#define  FSMC_PMEM4_MEMHIZ4_0                ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_PMEM4_MEMHIZ4_1                ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_PMEM4_MEMHIZ4_2                ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_PMEM4_MEMHIZ4_3                ((uint32_t)0x08000000)        /*!<Bit 3 */
+#define  FSMC_PMEM4_MEMHIZ4_4                ((uint32_t)0x10000000)        /*!<Bit 4 */
+#define  FSMC_PMEM4_MEMHIZ4_5                ((uint32_t)0x20000000)        /*!<Bit 5 */
+#define  FSMC_PMEM4_MEMHIZ4_6                ((uint32_t)0x40000000)        /*!<Bit 6 */
+#define  FSMC_PMEM4_MEMHIZ4_7                ((uint32_t)0x80000000)        /*!<Bit 7 */
+
+/******************  Bit definition for FSMC_PATT2 register  ******************/
+#define  FSMC_PATT2_ATTSET2                  ((uint32_t)0x000000FF)        /*!<ATTSET2[7:0] bits (Attribute memory 2 setup time) */
+#define  FSMC_PATT2_ATTSET2_0                ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_PATT2_ATTSET2_1                ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_PATT2_ATTSET2_2                ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_PATT2_ATTSET2_3                ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  FSMC_PATT2_ATTSET2_4                ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  FSMC_PATT2_ATTSET2_5                ((uint32_t)0x00000020)        /*!<Bit 5 */
+#define  FSMC_PATT2_ATTSET2_6                ((uint32_t)0x00000040)        /*!<Bit 6 */
+#define  FSMC_PATT2_ATTSET2_7                ((uint32_t)0x00000080)        /*!<Bit 7 */
+
+#define  FSMC_PATT2_ATTWAIT2                 ((uint32_t)0x0000FF00)        /*!<ATTWAIT2[7:0] bits (Attribute memory 2 wait time) */
+#define  FSMC_PATT2_ATTWAIT2_0               ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_PATT2_ATTWAIT2_1               ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_PATT2_ATTWAIT2_2               ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_PATT2_ATTWAIT2_3               ((uint32_t)0x00000800)        /*!<Bit 3 */
+#define  FSMC_PATT2_ATTWAIT2_4               ((uint32_t)0x00001000)        /*!<Bit 4 */
+#define  FSMC_PATT2_ATTWAIT2_5               ((uint32_t)0x00002000)        /*!<Bit 5 */
+#define  FSMC_PATT2_ATTWAIT2_6               ((uint32_t)0x00004000)        /*!<Bit 6 */
+#define  FSMC_PATT2_ATTWAIT2_7               ((uint32_t)0x00008000)        /*!<Bit 7 */
+
+#define  FSMC_PATT2_ATTHOLD2                 ((uint32_t)0x00FF0000)        /*!<ATTHOLD2[7:0] bits (Attribute memory 2 hold time) */
+#define  FSMC_PATT2_ATTHOLD2_0               ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_PATT2_ATTHOLD2_1               ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_PATT2_ATTHOLD2_2               ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_PATT2_ATTHOLD2_3               ((uint32_t)0x00080000)        /*!<Bit 3 */
+#define  FSMC_PATT2_ATTHOLD2_4               ((uint32_t)0x00100000)        /*!<Bit 4 */
+#define  FSMC_PATT2_ATTHOLD2_5               ((uint32_t)0x00200000)        /*!<Bit 5 */
+#define  FSMC_PATT2_ATTHOLD2_6               ((uint32_t)0x00400000)        /*!<Bit 6 */
+#define  FSMC_PATT2_ATTHOLD2_7               ((uint32_t)0x00800000)        /*!<Bit 7 */
+
+#define  FSMC_PATT2_ATTHIZ2                  ((uint32_t)0xFF000000)        /*!<ATTHIZ2[7:0] bits (Attribute memory 2 databus HiZ time) */
+#define  FSMC_PATT2_ATTHIZ2_0                ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_PATT2_ATTHIZ2_1                ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_PATT2_ATTHIZ2_2                ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_PATT2_ATTHIZ2_3                ((uint32_t)0x08000000)        /*!<Bit 3 */
+#define  FSMC_PATT2_ATTHIZ2_4                ((uint32_t)0x10000000)        /*!<Bit 4 */
+#define  FSMC_PATT2_ATTHIZ2_5                ((uint32_t)0x20000000)        /*!<Bit 5 */
+#define  FSMC_PATT2_ATTHIZ2_6                ((uint32_t)0x40000000)        /*!<Bit 6 */
+#define  FSMC_PATT2_ATTHIZ2_7                ((uint32_t)0x80000000)        /*!<Bit 7 */
+
+/******************  Bit definition for FSMC_PATT3 register  ******************/
+#define  FSMC_PATT3_ATTSET3                  ((uint32_t)0x000000FF)        /*!<ATTSET3[7:0] bits (Attribute memory 3 setup time) */
+#define  FSMC_PATT3_ATTSET3_0                ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_PATT3_ATTSET3_1                ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_PATT3_ATTSET3_2                ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_PATT3_ATTSET3_3                ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  FSMC_PATT3_ATTSET3_4                ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  FSMC_PATT3_ATTSET3_5                ((uint32_t)0x00000020)        /*!<Bit 5 */
+#define  FSMC_PATT3_ATTSET3_6                ((uint32_t)0x00000040)        /*!<Bit 6 */
+#define  FSMC_PATT3_ATTSET3_7                ((uint32_t)0x00000080)        /*!<Bit 7 */
+
+#define  FSMC_PATT3_ATTWAIT3                 ((uint32_t)0x0000FF00)        /*!<ATTWAIT3[7:0] bits (Attribute memory 3 wait time) */
+#define  FSMC_PATT3_ATTWAIT3_0               ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_PATT3_ATTWAIT3_1               ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_PATT3_ATTWAIT3_2               ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_PATT3_ATTWAIT3_3               ((uint32_t)0x00000800)        /*!<Bit 3 */
+#define  FSMC_PATT3_ATTWAIT3_4               ((uint32_t)0x00001000)        /*!<Bit 4 */
+#define  FSMC_PATT3_ATTWAIT3_5               ((uint32_t)0x00002000)        /*!<Bit 5 */
+#define  FSMC_PATT3_ATTWAIT3_6               ((uint32_t)0x00004000)        /*!<Bit 6 */
+#define  FSMC_PATT3_ATTWAIT3_7               ((uint32_t)0x00008000)        /*!<Bit 7 */
+
+#define  FSMC_PATT3_ATTHOLD3                 ((uint32_t)0x00FF0000)        /*!<ATTHOLD3[7:0] bits (Attribute memory 3 hold time) */
+#define  FSMC_PATT3_ATTHOLD3_0               ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_PATT3_ATTHOLD3_1               ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_PATT3_ATTHOLD3_2               ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_PATT3_ATTHOLD3_3               ((uint32_t)0x00080000)        /*!<Bit 3 */
+#define  FSMC_PATT3_ATTHOLD3_4               ((uint32_t)0x00100000)        /*!<Bit 4 */
+#define  FSMC_PATT3_ATTHOLD3_5               ((uint32_t)0x00200000)        /*!<Bit 5 */
+#define  FSMC_PATT3_ATTHOLD3_6               ((uint32_t)0x00400000)        /*!<Bit 6 */
+#define  FSMC_PATT3_ATTHOLD3_7               ((uint32_t)0x00800000)        /*!<Bit 7 */
+
+#define  FSMC_PATT3_ATTHIZ3                  ((uint32_t)0xFF000000)        /*!<ATTHIZ3[7:0] bits (Attribute memory 3 databus HiZ time) */
+#define  FSMC_PATT3_ATTHIZ3_0                ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_PATT3_ATTHIZ3_1                ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_PATT3_ATTHIZ3_2                ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_PATT3_ATTHIZ3_3                ((uint32_t)0x08000000)        /*!<Bit 3 */
+#define  FSMC_PATT3_ATTHIZ3_4                ((uint32_t)0x10000000)        /*!<Bit 4 */
+#define  FSMC_PATT3_ATTHIZ3_5                ((uint32_t)0x20000000)        /*!<Bit 5 */
+#define  FSMC_PATT3_ATTHIZ3_6                ((uint32_t)0x40000000)        /*!<Bit 6 */
+#define  FSMC_PATT3_ATTHIZ3_7                ((uint32_t)0x80000000)        /*!<Bit 7 */
+
+/******************  Bit definition for FSMC_PATT4 register  ******************/
+#define  FSMC_PATT4_ATTSET4                  ((uint32_t)0x000000FF)        /*!<ATTSET4[7:0] bits (Attribute memory 4 setup time) */
+#define  FSMC_PATT4_ATTSET4_0                ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_PATT4_ATTSET4_1                ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_PATT4_ATTSET4_2                ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_PATT4_ATTSET4_3                ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  FSMC_PATT4_ATTSET4_4                ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  FSMC_PATT4_ATTSET4_5                ((uint32_t)0x00000020)        /*!<Bit 5 */
+#define  FSMC_PATT4_ATTSET4_6                ((uint32_t)0x00000040)        /*!<Bit 6 */
+#define  FSMC_PATT4_ATTSET4_7                ((uint32_t)0x00000080)        /*!<Bit 7 */
+
+#define  FSMC_PATT4_ATTWAIT4                 ((uint32_t)0x0000FF00)        /*!<ATTWAIT4[7:0] bits (Attribute memory 4 wait time) */
+#define  FSMC_PATT4_ATTWAIT4_0               ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_PATT4_ATTWAIT4_1               ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_PATT4_ATTWAIT4_2               ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_PATT4_ATTWAIT4_3               ((uint32_t)0x00000800)        /*!<Bit 3 */
+#define  FSMC_PATT4_ATTWAIT4_4               ((uint32_t)0x00001000)        /*!<Bit 4 */
+#define  FSMC_PATT4_ATTWAIT4_5               ((uint32_t)0x00002000)        /*!<Bit 5 */
+#define  FSMC_PATT4_ATTWAIT4_6               ((uint32_t)0x00004000)        /*!<Bit 6 */
+#define  FSMC_PATT4_ATTWAIT4_7               ((uint32_t)0x00008000)        /*!<Bit 7 */
+
+#define  FSMC_PATT4_ATTHOLD4                 ((uint32_t)0x00FF0000)        /*!<ATTHOLD4[7:0] bits (Attribute memory 4 hold time) */
+#define  FSMC_PATT4_ATTHOLD4_0               ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_PATT4_ATTHOLD4_1               ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_PATT4_ATTHOLD4_2               ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_PATT4_ATTHOLD4_3               ((uint32_t)0x00080000)        /*!<Bit 3 */
+#define  FSMC_PATT4_ATTHOLD4_4               ((uint32_t)0x00100000)        /*!<Bit 4 */
+#define  FSMC_PATT4_ATTHOLD4_5               ((uint32_t)0x00200000)        /*!<Bit 5 */
+#define  FSMC_PATT4_ATTHOLD4_6               ((uint32_t)0x00400000)        /*!<Bit 6 */
+#define  FSMC_PATT4_ATTHOLD4_7               ((uint32_t)0x00800000)        /*!<Bit 7 */
+
+#define  FSMC_PATT4_ATTHIZ4                  ((uint32_t)0xFF000000)        /*!<ATTHIZ4[7:0] bits (Attribute memory 4 databus HiZ time) */
+#define  FSMC_PATT4_ATTHIZ4_0                ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_PATT4_ATTHIZ4_1                ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_PATT4_ATTHIZ4_2                ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_PATT4_ATTHIZ4_3                ((uint32_t)0x08000000)        /*!<Bit 3 */
+#define  FSMC_PATT4_ATTHIZ4_4                ((uint32_t)0x10000000)        /*!<Bit 4 */
+#define  FSMC_PATT4_ATTHIZ4_5                ((uint32_t)0x20000000)        /*!<Bit 5 */
+#define  FSMC_PATT4_ATTHIZ4_6                ((uint32_t)0x40000000)        /*!<Bit 6 */
+#define  FSMC_PATT4_ATTHIZ4_7                ((uint32_t)0x80000000)        /*!<Bit 7 */
+
+/******************  Bit definition for FSMC_PIO4 register  *******************/
+#define  FSMC_PIO4_IOSET4                    ((uint32_t)0x000000FF)        /*!<IOSET4[7:0] bits (I/O 4 setup time) */
+#define  FSMC_PIO4_IOSET4_0                  ((uint32_t)0x00000001)        /*!<Bit 0 */
+#define  FSMC_PIO4_IOSET4_1                  ((uint32_t)0x00000002)        /*!<Bit 1 */
+#define  FSMC_PIO4_IOSET4_2                  ((uint32_t)0x00000004)        /*!<Bit 2 */
+#define  FSMC_PIO4_IOSET4_3                  ((uint32_t)0x00000008)        /*!<Bit 3 */
+#define  FSMC_PIO4_IOSET4_4                  ((uint32_t)0x00000010)        /*!<Bit 4 */
+#define  FSMC_PIO4_IOSET4_5                  ((uint32_t)0x00000020)        /*!<Bit 5 */
+#define  FSMC_PIO4_IOSET4_6                  ((uint32_t)0x00000040)        /*!<Bit 6 */
+#define  FSMC_PIO4_IOSET4_7                  ((uint32_t)0x00000080)        /*!<Bit 7 */
+
+#define  FSMC_PIO4_IOWAIT4                   ((uint32_t)0x0000FF00)        /*!<IOWAIT4[7:0] bits (I/O 4 wait time) */
+#define  FSMC_PIO4_IOWAIT4_0                 ((uint32_t)0x00000100)        /*!<Bit 0 */
+#define  FSMC_PIO4_IOWAIT4_1                 ((uint32_t)0x00000200)        /*!<Bit 1 */
+#define  FSMC_PIO4_IOWAIT4_2                 ((uint32_t)0x00000400)        /*!<Bit 2 */
+#define  FSMC_PIO4_IOWAIT4_3                 ((uint32_t)0x00000800)        /*!<Bit 3 */
+#define  FSMC_PIO4_IOWAIT4_4                 ((uint32_t)0x00001000)        /*!<Bit 4 */
+#define  FSMC_PIO4_IOWAIT4_5                 ((uint32_t)0x00002000)        /*!<Bit 5 */
+#define  FSMC_PIO4_IOWAIT4_6                 ((uint32_t)0x00004000)        /*!<Bit 6 */
+#define  FSMC_PIO4_IOWAIT4_7                 ((uint32_t)0x00008000)        /*!<Bit 7 */
+
+#define  FSMC_PIO4_IOHOLD4                   ((uint32_t)0x00FF0000)        /*!<IOHOLD4[7:0] bits (I/O 4 hold time) */
+#define  FSMC_PIO4_IOHOLD4_0                 ((uint32_t)0x00010000)        /*!<Bit 0 */
+#define  FSMC_PIO4_IOHOLD4_1                 ((uint32_t)0x00020000)        /*!<Bit 1 */
+#define  FSMC_PIO4_IOHOLD4_2                 ((uint32_t)0x00040000)        /*!<Bit 2 */
+#define  FSMC_PIO4_IOHOLD4_3                 ((uint32_t)0x00080000)        /*!<Bit 3 */
+#define  FSMC_PIO4_IOHOLD4_4                 ((uint32_t)0x00100000)        /*!<Bit 4 */
+#define  FSMC_PIO4_IOHOLD4_5                 ((uint32_t)0x00200000)        /*!<Bit 5 */
+#define  FSMC_PIO4_IOHOLD4_6                 ((uint32_t)0x00400000)        /*!<Bit 6 */
+#define  FSMC_PIO4_IOHOLD4_7                 ((uint32_t)0x00800000)        /*!<Bit 7 */
+
+#define  FSMC_PIO4_IOHIZ4                    ((uint32_t)0xFF000000)        /*!<IOHIZ4[7:0] bits (I/O 4 databus HiZ time) */
+#define  FSMC_PIO4_IOHIZ4_0                  ((uint32_t)0x01000000)        /*!<Bit 0 */
+#define  FSMC_PIO4_IOHIZ4_1                  ((uint32_t)0x02000000)        /*!<Bit 1 */
+#define  FSMC_PIO4_IOHIZ4_2                  ((uint32_t)0x04000000)        /*!<Bit 2 */
+#define  FSMC_PIO4_IOHIZ4_3                  ((uint32_t)0x08000000)        /*!<Bit 3 */
+#define  FSMC_PIO4_IOHIZ4_4                  ((uint32_t)0x10000000)        /*!<Bit 4 */
+#define  FSMC_PIO4_IOHIZ4_5                  ((uint32_t)0x20000000)        /*!<Bit 5 */
+#define  FSMC_PIO4_IOHIZ4_6                  ((uint32_t)0x40000000)        /*!<Bit 6 */
+#define  FSMC_PIO4_IOHIZ4_7                  ((uint32_t)0x80000000)        /*!<Bit 7 */
+
+/******************  Bit definition for FSMC_ECCR2 register  ******************/
+#define  FSMC_ECCR2_ECC2                     ((uint32_t)0xFFFFFFFF)        /*!<ECC result */
+
+/******************  Bit definition for FSMC_ECCR3 register  ******************/
+#define  FSMC_ECCR3_ECC3                     ((uint32_t)0xFFFFFFFF)        /*!<ECC result */
+
+/******************************************************************************/
+/*                                                                            */
+/*                            General Purpose I/O                             */
+/*                                                                            */
+/******************************************************************************/
+/******************  Bits definition for GPIO_MODER register  *****************/
+#define GPIO_MODER_MODER0                    ((uint32_t)0x00000003)
+#define GPIO_MODER_MODER0_0                  ((uint32_t)0x00000001)
+#define GPIO_MODER_MODER0_1                  ((uint32_t)0x00000002)
+
+#define GPIO_MODER_MODER1                    ((uint32_t)0x0000000C)
+#define GPIO_MODER_MODER1_0                  ((uint32_t)0x00000004)
+#define GPIO_MODER_MODER1_1                  ((uint32_t)0x00000008)
+
+#define GPIO_MODER_MODER2                    ((uint32_t)0x00000030)
+#define GPIO_MODER_MODER2_0                  ((uint32_t)0x00000010)
+#define GPIO_MODER_MODER2_1                  ((uint32_t)0x00000020)
+
+#define GPIO_MODER_MODER3                    ((uint32_t)0x000000C0)
+#define GPIO_MODER_MODER3_0                  ((uint32_t)0x00000040)
+#define GPIO_MODER_MODER3_1                  ((uint32_t)0x00000080)
+
+#define GPIO_MODER_MODER4                    ((uint32_t)0x00000300)
+#define GPIO_MODER_MODER4_0                  ((uint32_t)0x00000100)
+#define GPIO_MODER_MODER4_1                  ((uint32_t)0x00000200)
+
+#define GPIO_MODER_MODER5                    ((uint32_t)0x00000C00)
+#define GPIO_MODER_MODER5_0                  ((uint32_t)0x00000400)
+#define GPIO_MODER_MODER5_1                  ((uint32_t)0x00000800)
+
+#define GPIO_MODER_MODER6                    ((uint32_t)0x00003000)
+#define GPIO_MODER_MODER6_0                  ((uint32_t)0x00001000)
+#define GPIO_MODER_MODER6_1                  ((uint32_t)0x00002000)
+
+#define GPIO_MODER_MODER7                    ((uint32_t)0x0000C000)
+#define GPIO_MODER_MODER7_0                  ((uint32_t)0x00004000)
+#define GPIO_MODER_MODER7_1                  ((uint32_t)0x00008000)
+
+#define GPIO_MODER_MODER8                    ((uint32_t)0x00030000)
+#define GPIO_MODER_MODER8_0                  ((uint32_t)0x00010000)
+#define GPIO_MODER_MODER8_1                  ((uint32_t)0x00020000)
+
+#define GPIO_MODER_MODER9                    ((uint32_t)0x000C0000)
+#define GPIO_MODER_MODER9_0                  ((uint32_t)0x00040000)
+#define GPIO_MODER_MODER9_1                  ((uint32_t)0x00080000)
+
+#define GPIO_MODER_MODER10                   ((uint32_t)0x00300000)
+#define GPIO_MODER_MODER10_0                 ((uint32_t)0x00100000)
+#define GPIO_MODER_MODER10_1                 ((uint32_t)0x00200000)
+
+#define GPIO_MODER_MODER11                   ((uint32_t)0x00C00000)
+#define GPIO_MODER_MODER11_0                 ((uint32_t)0x00400000)
+#define GPIO_MODER_MODER11_1                 ((uint32_t)0x00800000)
+
+#define GPIO_MODER_MODER12                   ((uint32_t)0x03000000)
+#define GPIO_MODER_MODER12_0                 ((uint32_t)0x01000000)
+#define GPIO_MODER_MODER12_1                 ((uint32_t)0x02000000)
+
+#define GPIO_MODER_MODER13                   ((uint32_t)0x0C000000)
+#define GPIO_MODER_MODER13_0                 ((uint32_t)0x04000000)
+#define GPIO_MODER_MODER13_1                 ((uint32_t)0x08000000)
+
+#define GPIO_MODER_MODER14                   ((uint32_t)0x30000000)
+#define GPIO_MODER_MODER14_0                 ((uint32_t)0x10000000)
+#define GPIO_MODER_MODER14_1                 ((uint32_t)0x20000000)
+
+#define GPIO_MODER_MODER15                   ((uint32_t)0xC0000000)
+#define GPIO_MODER_MODER15_0                 ((uint32_t)0x40000000)
+#define GPIO_MODER_MODER15_1                 ((uint32_t)0x80000000)
+
+/******************  Bits definition for GPIO_OTYPER register  ****************/
+#define GPIO_OTYPER_OT_0                     ((uint32_t)0x00000001)
+#define GPIO_OTYPER_OT_1                     ((uint32_t)0x00000002)
+#define GPIO_OTYPER_OT_2                     ((uint32_t)0x00000004)
+#define GPIO_OTYPER_OT_3                     ((uint32_t)0x00000008)
+#define GPIO_OTYPER_OT_4                     ((uint32_t)0x00000010)
+#define GPIO_OTYPER_OT_5                     ((uint32_t)0x00000020)
+#define GPIO_OTYPER_OT_6                     ((uint32_t)0x00000040)
+#define GPIO_OTYPER_OT_7                     ((uint32_t)0x00000080)
+#define GPIO_OTYPER_OT_8                     ((uint32_t)0x00000100)
+#define GPIO_OTYPER_OT_9                     ((uint32_t)0x00000200)
+#define GPIO_OTYPER_OT_10                    ((uint32_t)0x00000400)
+#define GPIO_OTYPER_OT_11                    ((uint32_t)0x00000800)
+#define GPIO_OTYPER_OT_12                    ((uint32_t)0x00001000)
+#define GPIO_OTYPER_OT_13                    ((uint32_t)0x00002000)
+#define GPIO_OTYPER_OT_14                    ((uint32_t)0x00004000)
+#define GPIO_OTYPER_OT_15                    ((uint32_t)0x00008000)
+
+/******************  Bits definition for GPIO_OSPEEDR register  ***************/
+#define GPIO_OSPEEDER_OSPEEDR0               ((uint32_t)0x00000003)
+#define GPIO_OSPEEDER_OSPEEDR0_0             ((uint32_t)0x00000001)
+#define GPIO_OSPEEDER_OSPEEDR0_1             ((uint32_t)0x00000002)
+
+#define GPIO_OSPEEDER_OSPEEDR1               ((uint32_t)0x0000000C)
+#define GPIO_OSPEEDER_OSPEEDR1_0             ((uint32_t)0x00000004)
+#define GPIO_OSPEEDER_OSPEEDR1_1             ((uint32_t)0x00000008)
+
+#define GPIO_OSPEEDER_OSPEEDR2               ((uint32_t)0x00000030)
+#define GPIO_OSPEEDER_OSPEEDR2_0             ((uint32_t)0x00000010)
+#define GPIO_OSPEEDER_OSPEEDR2_1             ((uint32_t)0x00000020)
+
+#define GPIO_OSPEEDER_OSPEEDR3               ((uint32_t)0x000000C0)
+#define GPIO_OSPEEDER_OSPEEDR3_0             ((uint32_t)0x00000040)
+#define GPIO_OSPEEDER_OSPEEDR3_1             ((uint32_t)0x00000080)
+
+#define GPIO_OSPEEDER_OSPEEDR4               ((uint32_t)0x00000300)
+#define GPIO_OSPEEDER_OSPEEDR4_0             ((uint32_t)0x00000100)
+#define GPIO_OSPEEDER_OSPEEDR4_1             ((uint32_t)0x00000200)
+
+#define GPIO_OSPEEDER_OSPEEDR5               ((uint32_t)0x00000C00)
+#define GPIO_OSPEEDER_OSPEEDR5_0             ((uint32_t)0x00000400)
+#define GPIO_OSPEEDER_OSPEEDR5_1             ((uint32_t)0x00000800)
+
+#define GPIO_OSPEEDER_OSPEEDR6               ((uint32_t)0x00003000)
+#define GPIO_OSPEEDER_OSPEEDR6_0             ((uint32_t)0x00001000)
+#define GPIO_OSPEEDER_OSPEEDR6_1             ((uint32_t)0x00002000)
+
+#define GPIO_OSPEEDER_OSPEEDR7               ((uint32_t)0x0000C000)
+#define GPIO_OSPEEDER_OSPEEDR7_0             ((uint32_t)0x00004000)
+#define GPIO_OSPEEDER_OSPEEDR7_1             ((uint32_t)0x00008000)
+
+#define GPIO_OSPEEDER_OSPEEDR8               ((uint32_t)0x00030000)
+#define GPIO_OSPEEDER_OSPEEDR8_0             ((uint32_t)0x00010000)
+#define GPIO_OSPEEDER_OSPEEDR8_1             ((uint32_t)0x00020000)
+
+#define GPIO_OSPEEDER_OSPEEDR9               ((uint32_t)0x000C0000)
+#define GPIO_OSPEEDER_OSPEEDR9_0             ((uint32_t)0x00040000)
+#define GPIO_OSPEEDER_OSPEEDR9_1             ((uint32_t)0x00080000)
+
+#define GPIO_OSPEEDER_OSPEEDR10              ((uint32_t)0x00300000)
+#define GPIO_OSPEEDER_OSPEEDR10_0            ((uint32_t)0x00100000)
+#define GPIO_OSPEEDER_OSPEEDR10_1            ((uint32_t)0x00200000)
+
+#define GPIO_OSPEEDER_OSPEEDR11              ((uint32_t)0x00C00000)
+#define GPIO_OSPEEDER_OSPEEDR11_0            ((uint32_t)0x00400000)
+#define GPIO_OSPEEDER_OSPEEDR11_1            ((uint32_t)0x00800000)
+
+#define GPIO_OSPEEDER_OSPEEDR12              ((uint32_t)0x03000000)
+#define GPIO_OSPEEDER_OSPEEDR12_0            ((uint32_t)0x01000000)
+#define GPIO_OSPEEDER_OSPEEDR12_1            ((uint32_t)0x02000000)
+
+#define GPIO_OSPEEDER_OSPEEDR13              ((uint32_t)0x0C000000)
+#define GPIO_OSPEEDER_OSPEEDR13_0            ((uint32_t)0x04000000)
+#define GPIO_OSPEEDER_OSPEEDR13_1            ((uint32_t)0x08000000)
+
+#define GPIO_OSPEEDER_OSPEEDR14              ((uint32_t)0x30000000)
+#define GPIO_OSPEEDER_OSPEEDR14_0            ((uint32_t)0x10000000)
+#define GPIO_OSPEEDER_OSPEEDR14_1            ((uint32_t)0x20000000)
+
+#define GPIO_OSPEEDER_OSPEEDR15              ((uint32_t)0xC0000000)
+#define GPIO_OSPEEDER_OSPEEDR15_0            ((uint32_t)0x40000000)
+#define GPIO_OSPEEDER_OSPEEDR15_1            ((uint32_t)0x80000000)
+
+/******************  Bits definition for GPIO_PUPDR register  *****************/
+#define GPIO_PUPDR_PUPDR0                    ((uint32_t)0x00000003)
+#define GPIO_PUPDR_PUPDR0_0                  ((uint32_t)0x00000001)
+#define GPIO_PUPDR_PUPDR0_1                  ((uint32_t)0x00000002)
+
+#define GPIO_PUPDR_PUPDR1                    ((uint32_t)0x0000000C)
+#define GPIO_PUPDR_PUPDR1_0                  ((uint32_t)0x00000004)
+#define GPIO_PUPDR_PUPDR1_1                  ((uint32_t)0x00000008)
+
+#define GPIO_PUPDR_PUPDR2                    ((uint32_t)0x00000030)
+#define GPIO_PUPDR_PUPDR2_0                  ((uint32_t)0x00000010)
+#define GPIO_PUPDR_PUPDR2_1                  ((uint32_t)0x00000020)
+
+#define GPIO_PUPDR_PUPDR3                    ((uint32_t)0x000000C0)
+#define GPIO_PUPDR_PUPDR3_0                  ((uint32_t)0x00000040)
+#define GPIO_PUPDR_PUPDR3_1                  ((uint32_t)0x00000080)
+
+#define GPIO_PUPDR_PUPDR4                    ((uint32_t)0x00000300)
+#define GPIO_PUPDR_PUPDR4_0                  ((uint32_t)0x00000100)
+#define GPIO_PUPDR_PUPDR4_1                  ((uint32_t)0x00000200)
+
+#define GPIO_PUPDR_PUPDR5                    ((uint32_t)0x00000C00)
+#define GPIO_PUPDR_PUPDR5_0                  ((uint32_t)0x00000400)
+#define GPIO_PUPDR_PUPDR5_1                  ((uint32_t)0x00000800)
+
+#define GPIO_PUPDR_PUPDR6                    ((uint32_t)0x00003000)
+#define GPIO_PUPDR_PUPDR6_0                  ((uint32_t)0x00001000)
+#define GPIO_PUPDR_PUPDR6_1                  ((uint32_t)0x00002000)
+
+#define GPIO_PUPDR_PUPDR7                    ((uint32_t)0x0000C000)
+#define GPIO_PUPDR_PUPDR7_0                  ((uint32_t)0x00004000)
+#define GPIO_PUPDR_PUPDR7_1                  ((uint32_t)0x00008000)
+
+#define GPIO_PUPDR_PUPDR8                    ((uint32_t)0x00030000)
+#define GPIO_PUPDR_PUPDR8_0                  ((uint32_t)0x00010000)
+#define GPIO_PUPDR_PUPDR8_1                  ((uint32_t)0x00020000)
+
+#define GPIO_PUPDR_PUPDR9                    ((uint32_t)0x000C0000)
+#define GPIO_PUPDR_PUPDR9_0                  ((uint32_t)0x00040000)
+#define GPIO_PUPDR_PUPDR9_1                  ((uint32_t)0x00080000)
+
+#define GPIO_PUPDR_PUPDR10                   ((uint32_t)0x00300000)
+#define GPIO_PUPDR_PUPDR10_0                 ((uint32_t)0x00100000)
+#define GPIO_PUPDR_PUPDR10_1                 ((uint32_t)0x00200000)
+
+#define GPIO_PUPDR_PUPDR11                   ((uint32_t)0x00C00000)
+#define GPIO_PUPDR_PUPDR11_0                 ((uint32_t)0x00400000)
+#define GPIO_PUPDR_PUPDR11_1                 ((uint32_t)0x00800000)
+
+#define GPIO_PUPDR_PUPDR12                   ((uint32_t)0x03000000)
+#define GPIO_PUPDR_PUPDR12_0                 ((uint32_t)0x01000000)
+#define GPIO_PUPDR_PUPDR12_1                 ((uint32_t)0x02000000)
+
+#define GPIO_PUPDR_PUPDR13                   ((uint32_t)0x0C000000)
+#define GPIO_PUPDR_PUPDR13_0                 ((uint32_t)0x04000000)
+#define GPIO_PUPDR_PUPDR13_1                 ((uint32_t)0x08000000)
+
+#define GPIO_PUPDR_PUPDR14                   ((uint32_t)0x30000000)
+#define GPIO_PUPDR_PUPDR14_0                 ((uint32_t)0x10000000)
+#define GPIO_PUPDR_PUPDR14_1                 ((uint32_t)0x20000000)
+
+#define GPIO_PUPDR_PUPDR15                   ((uint32_t)0xC0000000)
+#define GPIO_PUPDR_PUPDR15_0                 ((uint32_t)0x40000000)
+#define GPIO_PUPDR_PUPDR15_1                 ((uint32_t)0x80000000)
+
+/******************  Bits definition for GPIO_IDR register  *******************/
+#define GPIO_OTYPER_IDR_0                    ((uint32_t)0x00000001)
+#define GPIO_OTYPER_IDR_1                    ((uint32_t)0x00000002)
+#define GPIO_OTYPER_IDR_2                    ((uint32_t)0x00000004)
+#define GPIO_OTYPER_IDR_3                    ((uint32_t)0x00000008)
+#define GPIO_OTYPER_IDR_4                    ((uint32_t)0x00000010)
+#define GPIO_OTYPER_IDR_5                    ((uint32_t)0x00000020)
+#define GPIO_OTYPER_IDR_6                    ((uint32_t)0x00000040)
+#define GPIO_OTYPER_IDR_7                    ((uint32_t)0x00000080)
+#define GPIO_OTYPER_IDR_8                    ((uint32_t)0x00000100)
+#define GPIO_OTYPER_IDR_9                    ((uint32_t)0x00000200)
+#define GPIO_OTYPER_IDR_10                   ((uint32_t)0x00000400)
+#define GPIO_OTYPER_IDR_11                   ((uint32_t)0x00000800)
+#define GPIO_OTYPER_IDR_12                   ((uint32_t)0x00001000)
+#define GPIO_OTYPER_IDR_13                   ((uint32_t)0x00002000)
+#define GPIO_OTYPER_IDR_14                   ((uint32_t)0x00004000)
+#define GPIO_OTYPER_IDR_15                   ((uint32_t)0x00008000)
+
+/******************  Bits definition for GPIO_ODR register  *******************/
+#define GPIO_OTYPER_ODR_0                    ((uint32_t)0x00000001)
+#define GPIO_OTYPER_ODR_1                    ((uint32_t)0x00000002)
+#define GPIO_OTYPER_ODR_2                    ((uint32_t)0x00000004)
+#define GPIO_OTYPER_ODR_3                    ((uint32_t)0x00000008)
+#define GPIO_OTYPER_ODR_4                    ((uint32_t)0x00000010)
+#define GPIO_OTYPER_ODR_5                    ((uint32_t)0x00000020)
+#define GPIO_OTYPER_ODR_6                    ((uint32_t)0x00000040)
+#define GPIO_OTYPER_ODR_7                    ((uint32_t)0x00000080)
+#define GPIO_OTYPER_ODR_8                    ((uint32_t)0x00000100)
+#define GPIO_OTYPER_ODR_9                    ((uint32_t)0x00000200)
+#define GPIO_OTYPER_ODR_10                   ((uint32_t)0x00000400)
+#define GPIO_OTYPER_ODR_11                   ((uint32_t)0x00000800)
+#define GPIO_OTYPER_ODR_12                   ((uint32_t)0x00001000)
+#define GPIO_OTYPER_ODR_13                   ((uint32_t)0x00002000)
+#define GPIO_OTYPER_ODR_14                   ((uint32_t)0x00004000)
+#define GPIO_OTYPER_ODR_15                   ((uint32_t)0x00008000)
+
+/******************  Bits definition for GPIO_BSRR register  ******************/
+#define GPIO_BSRR_BS_0                       ((uint32_t)0x00000001)
+#define GPIO_BSRR_BS_1                       ((uint32_t)0x00000002)
+#define GPIO_BSRR_BS_2                       ((uint32_t)0x00000004)
+#define GPIO_BSRR_BS_3                       ((uint32_t)0x00000008)
+#define GPIO_BSRR_BS_4                       ((uint32_t)0x00000010)
+#define GPIO_BSRR_BS_5                       ((uint32_t)0x00000020)
+#define GPIO_BSRR_BS_6                       ((uint32_t)0x00000040)
+#define GPIO_BSRR_BS_7                       ((uint32_t)0x00000080)
+#define GPIO_BSRR_BS_8                       ((uint32_t)0x00000100)
+#define GPIO_BSRR_BS_9                       ((uint32_t)0x00000200)
+#define GPIO_BSRR_BS_10                      ((uint32_t)0x00000400)
+#define GPIO_BSRR_BS_11                      ((uint32_t)0x00000800)
+#define GPIO_BSRR_BS_12                      ((uint32_t)0x00001000)
+#define GPIO_BSRR_BS_13                      ((uint32_t)0x00002000)
+#define GPIO_BSRR_BS_14                      ((uint32_t)0x00004000)
+#define GPIO_BSRR_BS_15                      ((uint32_t)0x00008000)
+#define GPIO_BSRR_BR_0                       ((uint32_t)0x00010000)
+#define GPIO_BSRR_BR_1                       ((uint32_t)0x00020000)
+#define GPIO_BSRR_BR_2                       ((uint32_t)0x00040000)
+#define GPIO_BSRR_BR_3                       ((uint32_t)0x00080000)
+#define GPIO_BSRR_BR_4                       ((uint32_t)0x00100000)
+#define GPIO_BSRR_BR_5                       ((uint32_t)0x00200000)
+#define GPIO_BSRR_BR_6                       ((uint32_t)0x00400000)
+#define GPIO_BSRR_BR_7                       ((uint32_t)0x00800000)
+#define GPIO_BSRR_BR_8                       ((uint32_t)0x01000000)
+#define GPIO_BSRR_BR_9                       ((uint32_t)0x02000000)
+#define GPIO_BSRR_BR_10                      ((uint32_t)0x04000000)
+#define GPIO_BSRR_BR_11                      ((uint32_t)0x08000000)
+#define GPIO_BSRR_BR_12                      ((uint32_t)0x10000000)
+#define GPIO_BSRR_BR_13                      ((uint32_t)0x20000000)
+#define GPIO_BSRR_BR_14                      ((uint32_t)0x40000000)
+#define GPIO_BSRR_BR_15                      ((uint32_t)0x80000000)
+
+/******************************************************************************/
+/*                                                                            */
+/*                                    HASH                                    */
+/*                                                                            */
+/******************************************************************************/
+/******************  Bits definition for HASH_CR register  ********************/
+#define HASH_CR_INIT                         ((uint32_t)0x00000004)
+#define HASH_CR_DMAE                         ((uint32_t)0x00000008)
+#define HASH_CR_DATATYPE                     ((uint32_t)0x00000030)
+#define HASH_CR_DATATYPE_0                   ((uint32_t)0x00000010)
+#define HASH_CR_DATATYPE_1                   ((uint32_t)0x00000020)
+#define HASH_CR_MODE                         ((uint32_t)0x00000040)
+#define HASH_CR_ALGO                         ((uint32_t)0x00000080)
+#define HASH_CR_NBW                          ((uint32_t)0x00000F00)
+#define HASH_CR_NBW_0                        ((uint32_t)0x00000100)
+#define HASH_CR_NBW_1                        ((uint32_t)0x00000200)
+#define HASH_CR_NBW_2                        ((uint32_t)0x00000400)
+#define HASH_CR_NBW_3                        ((uint32_t)0x00000800)
+#define HASH_CR_DINNE                        ((uint32_t)0x00001000)
+#define HASH_CR_LKEY                         ((uint32_t)0x00010000)
+
+/******************  Bits definition for HASH_STR register  *******************/
+#define HASH_STR_NBW                         ((uint32_t)0x0000001F)
+#define HASH_STR_NBW_0                       ((uint32_t)0x00000001)
+#define HASH_STR_NBW_1                       ((uint32_t)0x00000002)
+#define HASH_STR_NBW_2                       ((uint32_t)0x00000004)
+#define HASH_STR_NBW_3                       ((uint32_t)0x00000008)
+#define HASH_STR_NBW_4                       ((uint32_t)0x00000010)
+#define HASH_STR_DCAL                        ((uint32_t)0x00000100)
+
+/******************  Bits definition for HASH_IMR register  *******************/
+#define HASH_IMR_DINIM                       ((uint32_t)0x00000001)
+#define HASH_IMR_DCIM                        ((uint32_t)0x00000002)
+
+/******************  Bits definition for HASH_SR register  ********************/
+#define HASH_SR_DINIS                        ((uint32_t)0x00000001)
+#define HASH_SR_DCIS                         ((uint32_t)0x00000002)
+#define HASH_SR_DMAS                         ((uint32_t)0x00000004)
+#define HASH_SR_BUSY                         ((uint32_t)0x00000008)
+
+/******************************************************************************/
+/*                                                                            */
+/*                      Inter-integrated Circuit Interface                    */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bit definition for I2C_CR1 register  ********************/
+#define  I2C_CR1_PE                          ((uint16_t)0x0001)            /*!<Peripheral Enable */
+#define  I2C_CR1_SMBUS                       ((uint16_t)0x0002)            /*!<SMBus Mode */
+#define  I2C_CR1_SMBTYPE                     ((uint16_t)0x0008)            /*!<SMBus Type */
+#define  I2C_CR1_ENARP                       ((uint16_t)0x0010)            /*!<ARP Enable */
+#define  I2C_CR1_ENPEC                       ((uint16_t)0x0020)            /*!<PEC Enable */
+#define  I2C_CR1_ENGC                        ((uint16_t)0x0040)            /*!<General Call Enable */
+#define  I2C_CR1_NOSTRETCH                   ((uint16_t)0x0080)            /*!<Clock Stretching Disable (Slave mode) */
+#define  I2C_CR1_START                       ((uint16_t)0x0100)            /*!<Start Generation */
+#define  I2C_CR1_STOP                        ((uint16_t)0x0200)            /*!<Stop Generation */
+#define  I2C_CR1_ACK                         ((uint16_t)0x0400)            /*!<Acknowledge Enable */
+#define  I2C_CR1_POS                         ((uint16_t)0x0800)            /*!<Acknowledge/PEC Position (for data reception) */
+#define  I2C_CR1_PEC                         ((uint16_t)0x1000)            /*!<Packet Error Checking */
+#define  I2C_CR1_ALERT                       ((uint16_t)0x2000)            /*!<SMBus Alert */
+#define  I2C_CR1_SWRST                       ((uint16_t)0x8000)            /*!<Software Reset */
+
+/*******************  Bit definition for I2C_CR2 register  ********************/
+#define  I2C_CR2_FREQ                        ((uint16_t)0x003F)            /*!<FREQ[5:0] bits (Peripheral Clock Frequency) */
+#define  I2C_CR2_FREQ_0                      ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  I2C_CR2_FREQ_1                      ((uint16_t)0x0002)            /*!<Bit 1 */
+#define  I2C_CR2_FREQ_2                      ((uint16_t)0x0004)            /*!<Bit 2 */
+#define  I2C_CR2_FREQ_3                      ((uint16_t)0x0008)            /*!<Bit 3 */
+#define  I2C_CR2_FREQ_4                      ((uint16_t)0x0010)            /*!<Bit 4 */
+#define  I2C_CR2_FREQ_5                      ((uint16_t)0x0020)            /*!<Bit 5 */
+
+#define  I2C_CR2_ITERREN                     ((uint16_t)0x0100)            /*!<Error Interrupt Enable */
+#define  I2C_CR2_ITEVTEN                     ((uint16_t)0x0200)            /*!<Event Interrupt Enable */
+#define  I2C_CR2_ITBUFEN                     ((uint16_t)0x0400)            /*!<Buffer Interrupt Enable */
+#define  I2C_CR2_DMAEN                       ((uint16_t)0x0800)            /*!<DMA Requests Enable */
+#define  I2C_CR2_LAST                        ((uint16_t)0x1000)            /*!<DMA Last Transfer */
+
+/*******************  Bit definition for I2C_OAR1 register  *******************/
+#define  I2C_OAR1_ADD1_7                     ((uint16_t)0x00FE)            /*!<Interface Address */
+#define  I2C_OAR1_ADD8_9                     ((uint16_t)0x0300)            /*!<Interface Address */
+
+#define  I2C_OAR1_ADD0                       ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  I2C_OAR1_ADD1                       ((uint16_t)0x0002)            /*!<Bit 1 */
+#define  I2C_OAR1_ADD2                       ((uint16_t)0x0004)            /*!<Bit 2 */
+#define  I2C_OAR1_ADD3                       ((uint16_t)0x0008)            /*!<Bit 3 */
+#define  I2C_OAR1_ADD4                       ((uint16_t)0x0010)            /*!<Bit 4 */
+#define  I2C_OAR1_ADD5                       ((uint16_t)0x0020)            /*!<Bit 5 */
+#define  I2C_OAR1_ADD6                       ((uint16_t)0x0040)            /*!<Bit 6 */
+#define  I2C_OAR1_ADD7                       ((uint16_t)0x0080)            /*!<Bit 7 */
+#define  I2C_OAR1_ADD8                       ((uint16_t)0x0100)            /*!<Bit 8 */
+#define  I2C_OAR1_ADD9                       ((uint16_t)0x0200)            /*!<Bit 9 */
+
+#define  I2C_OAR1_ADDMODE                    ((uint16_t)0x8000)            /*!<Addressing Mode (Slave mode) */
+
+/*******************  Bit definition for I2C_OAR2 register  *******************/
+#define  I2C_OAR2_ENDUAL                     ((uint8_t)0x01)               /*!<Dual addressing mode enable */
+#define  I2C_OAR2_ADD2                       ((uint8_t)0xFE)               /*!<Interface address */
+
+/********************  Bit definition for I2C_DR register  ********************/
+#define  I2C_DR_DR                           ((uint8_t)0xFF)               /*!<8-bit Data Register */
+
+/*******************  Bit definition for I2C_SR1 register  ********************/
+#define  I2C_SR1_SB                          ((uint16_t)0x0001)            /*!<Start Bit (Master mode) */
+#define  I2C_SR1_ADDR                        ((uint16_t)0x0002)            /*!<Address sent (master mode)/matched (slave mode) */
+#define  I2C_SR1_BTF                         ((uint16_t)0x0004)            /*!<Byte Transfer Finished */
+#define  I2C_SR1_ADD10                       ((uint16_t)0x0008)            /*!<10-bit header sent (Master mode) */
+#define  I2C_SR1_STOPF                       ((uint16_t)0x0010)            /*!<Stop detection (Slave mode) */
+#define  I2C_SR1_RXNE                        ((uint16_t)0x0040)            /*!<Data Register not Empty (receivers) */
+#define  I2C_SR1_TXE                         ((uint16_t)0x0080)            /*!<Data Register Empty (transmitters) */
+#define  I2C_SR1_BERR                        ((uint16_t)0x0100)            /*!<Bus Error */
+#define  I2C_SR1_ARLO                        ((uint16_t)0x0200)            /*!<Arbitration Lost (master mode) */
+#define  I2C_SR1_AF                          ((uint16_t)0x0400)            /*!<Acknowledge Failure */
+#define  I2C_SR1_OVR                         ((uint16_t)0x0800)            /*!<Overrun/Underrun */
+#define  I2C_SR1_PECERR                      ((uint16_t)0x1000)            /*!<PEC Error in reception */
+#define  I2C_SR1_TIMEOUT                     ((uint16_t)0x4000)            /*!<Timeout or Tlow Error */
+#define  I2C_SR1_SMBALERT                    ((uint16_t)0x8000)            /*!<SMBus Alert */
+
+/*******************  Bit definition for I2C_SR2 register  ********************/
+#define  I2C_SR2_MSL                         ((uint16_t)0x0001)            /*!<Master/Slave */
+#define  I2C_SR2_BUSY                        ((uint16_t)0x0002)            /*!<Bus Busy */
+#define  I2C_SR2_TRA                         ((uint16_t)0x0004)            /*!<Transmitter/Receiver */
+#define  I2C_SR2_GENCALL                     ((uint16_t)0x0010)            /*!<General Call Address (Slave mode) */
+#define  I2C_SR2_SMBDEFAULT                  ((uint16_t)0x0020)            /*!<SMBus Device Default Address (Slave mode) */
+#define  I2C_SR2_SMBHOST                     ((uint16_t)0x0040)            /*!<SMBus Host Header (Slave mode) */
+#define  I2C_SR2_DUALF                       ((uint16_t)0x0080)            /*!<Dual Flag (Slave mode) */
+#define  I2C_SR2_PEC                         ((uint16_t)0xFF00)            /*!<Packet Error Checking Register */
+
+/*******************  Bit definition for I2C_CCR register  ********************/
+#define  I2C_CCR_CCR                         ((uint16_t)0x0FFF)            /*!<Clock Control Register in Fast/Standard mode (Master mode) */
+#define  I2C_CCR_DUTY                        ((uint16_t)0x4000)            /*!<Fast Mode Duty Cycle */
+#define  I2C_CCR_FS                          ((uint16_t)0x8000)            /*!<I2C Master Mode Selection */
+
+/******************  Bit definition for I2C_TRISE register  *******************/
+#define  I2C_TRISE_TRISE                     ((uint8_t)0x3F)               /*!<Maximum Rise Time in Fast/Standard mode (Master mode) */
+
+/******************************************************************************/
+/*                                                                            */
+/*                           Independent WATCHDOG                             */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bit definition for IWDG_KR register  ********************/
+#define  IWDG_KR_KEY                         ((uint16_t)0xFFFF)            /*!<Key value (write only, read 0000h) */
+
+/*******************  Bit definition for IWDG_PR register  ********************/
+#define  IWDG_PR_PR                          ((uint8_t)0x07)               /*!<PR[2:0] (Prescaler divider) */
+#define  IWDG_PR_PR_0                        ((uint8_t)0x01)               /*!<Bit 0 */
+#define  IWDG_PR_PR_1                        ((uint8_t)0x02)               /*!<Bit 1 */
+#define  IWDG_PR_PR_2                        ((uint8_t)0x04)               /*!<Bit 2 */
+
+/*******************  Bit definition for IWDG_RLR register  *******************/
+#define  IWDG_RLR_RL                         ((uint16_t)0x0FFF)            /*!<Watchdog counter reload value */
+
+/*******************  Bit definition for IWDG_SR register  ********************/
+#define  IWDG_SR_PVU                         ((uint8_t)0x01)               /*!<Watchdog prescaler value update */
+#define  IWDG_SR_RVU                         ((uint8_t)0x02)               /*!<Watchdog counter reload value update */
+
+/******************************************************************************/
+/*                                                                            */
+/*                             Power Control                                  */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bit definition for PWR_CR register  ********************/
+#define  PWR_CR_LPDS                         ((uint16_t)0x0001)     /*!< Low-Power Deepsleep */
+#define  PWR_CR_PDDS                         ((uint16_t)0x0002)     /*!< Power Down Deepsleep */
+#define  PWR_CR_CWUF                         ((uint16_t)0x0004)     /*!< Clear Wakeup Flag */
+#define  PWR_CR_CSBF                         ((uint16_t)0x0008)     /*!< Clear Standby Flag */
+#define  PWR_CR_PVDE                         ((uint16_t)0x0010)     /*!< Power Voltage Detector Enable */
+
+#define  PWR_CR_PLS                          ((uint16_t)0x00E0)     /*!< PLS[2:0] bits (PVD Level Selection) */
+#define  PWR_CR_PLS_0                        ((uint16_t)0x0020)     /*!< Bit 0 */
+#define  PWR_CR_PLS_1                        ((uint16_t)0x0040)     /*!< Bit 1 */
+#define  PWR_CR_PLS_2                        ((uint16_t)0x0080)     /*!< Bit 2 */
+
+/*!< PVD level configuration */
+#define  PWR_CR_PLS_LEV0                     ((uint16_t)0x0000)     /*!< PVD level 0 */
+#define  PWR_CR_PLS_LEV1                     ((uint16_t)0x0020)     /*!< PVD level 1 */
+#define  PWR_CR_PLS_LEV2                     ((uint16_t)0x0040)     /*!< PVD level 2 */
+#define  PWR_CR_PLS_LEV3                     ((uint16_t)0x0060)     /*!< PVD level 3 */
+#define  PWR_CR_PLS_LEV4                     ((uint16_t)0x0080)     /*!< PVD level 4 */
+#define  PWR_CR_PLS_LEV5                     ((uint16_t)0x00A0)     /*!< PVD level 5 */
+#define  PWR_CR_PLS_LEV6                     ((uint16_t)0x00C0)     /*!< PVD level 6 */
+#define  PWR_CR_PLS_LEV7                     ((uint16_t)0x00E0)     /*!< PVD level 7 */
+
+#define  PWR_CR_DBP                          ((uint16_t)0x0100)     /*!< Disable Backup Domain write protection */
+#define  PWR_CR_FPDS                         ((uint16_t)0x0200)     /*!< Flash power down in Stop mode */
+
+
+/*******************  Bit definition for PWR_CSR register  ********************/
+#define  PWR_CSR_WUF                         ((uint16_t)0x0001)     /*!< Wakeup Flag */
+#define  PWR_CSR_SBF                         ((uint16_t)0x0002)     /*!< Standby Flag */
+#define  PWR_CSR_PVDO                        ((uint16_t)0x0004)     /*!< PVD Output */
+#define  PWR_CSR_BRR                         ((uint16_t)0x0008)     /*!< Backup regulator ready */
+#define  PWR_CSR_EWUP                        ((uint16_t)0x0100)     /*!< Enable WKUP pin */
+#define  PWR_CSR_BRE                         ((uint16_t)0x0200)     /*!< Backup regulator enable */
+
+/******************************************************************************/
+/*                                                                            */
+/*                         Reset and Clock Control                            */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bit definition for RCC_CR register  ********************/
+#define  RCC_CR_HSION                        ((uint32_t)0x00000001)
+#define  RCC_CR_HSIRDY                       ((uint32_t)0x00000002)
+
+#define  RCC_CR_HSITRIM                      ((uint32_t)0x000000F8)
+#define  RCC_CR_HSITRIM_0                    ((uint32_t)0x00000008)/*!<Bit 0 */
+#define  RCC_CR_HSITRIM_1                    ((uint32_t)0x00000010)/*!<Bit 1 */
+#define  RCC_CR_HSITRIM_2                    ((uint32_t)0x00000020)/*!<Bit 2 */
+#define  RCC_CR_HSITRIM_3                    ((uint32_t)0x00000040)/*!<Bit 3 */
+#define  RCC_CR_HSITRIM_4                    ((uint32_t)0x00000080)/*!<Bit 4 */
+
+#define  RCC_CR_HSICAL                       ((uint32_t)0x0000FF00)
+#define  RCC_CR_HSICAL_0                     ((uint32_t)0x00000100)/*!<Bit 0 */
+#define  RCC_CR_HSICAL_1                     ((uint32_t)0x00000200)/*!<Bit 1 */
+#define  RCC_CR_HSICAL_2                     ((uint32_t)0x00000400)/*!<Bit 2 */
+#define  RCC_CR_HSICAL_3                     ((uint32_t)0x00000800)/*!<Bit 3 */
+#define  RCC_CR_HSICAL_4                     ((uint32_t)0x00001000)/*!<Bit 4 */
+#define  RCC_CR_HSICAL_5                     ((uint32_t)0x00002000)/*!<Bit 5 */
+#define  RCC_CR_HSICAL_6                     ((uint32_t)0x00004000)/*!<Bit 6 */
+#define  RCC_CR_HSICAL_7                     ((uint32_t)0x00008000)/*!<Bit 7 */
+
+#define  RCC_CR_HSEON                        ((uint32_t)0x00010000)
+#define  RCC_CR_HSERDY                       ((uint32_t)0x00020000)
+#define  RCC_CR_HSEBYP                       ((uint32_t)0x00040000)
+#define  RCC_CR_CSSON                        ((uint32_t)0x00080000)
+#define  RCC_CR_PLLON                        ((uint32_t)0x01000000)
+#define  RCC_CR_PLLRDY                       ((uint32_t)0x02000000)
+#define  RCC_CR_PLLI2SON                     ((uint32_t)0x04000000)
+#define  RCC_CR_PLLI2SRDY                    ((uint32_t)0x08000000)
+
+/********************  Bit definition for RCC_PLLCFGR register  ***************/
+#define  RCC_PLLCFGR_PLLM                    ((uint32_t)0x0000003F)
+#define  RCC_PLLCFGR_PLLM_0                  ((uint32_t)0x00000001)
+#define  RCC_PLLCFGR_PLLM_1                  ((uint32_t)0x00000002)
+#define  RCC_PLLCFGR_PLLM_2                  ((uint32_t)0x00000004)
+#define  RCC_PLLCFGR_PLLM_3                  ((uint32_t)0x00000008)
+#define  RCC_PLLCFGR_PLLM_4                  ((uint32_t)0x00000010)
+#define  RCC_PLLCFGR_PLLM_5                  ((uint32_t)0x00000020)
+
+#define  RCC_PLLCFGR_PLLN                     ((uint32_t)0x00007FC0)
+#define  RCC_PLLCFGR_PLLN_0                   ((uint32_t)0x00000040)
+#define  RCC_PLLCFGR_PLLN_1                   ((uint32_t)0x00000080)
+#define  RCC_PLLCFGR_PLLN_2                   ((uint32_t)0x00000100)
+#define  RCC_PLLCFGR_PLLN_3                   ((uint32_t)0x00000200)
+#define  RCC_PLLCFGR_PLLN_4                   ((uint32_t)0x00000400)
+#define  RCC_PLLCFGR_PLLN_5                   ((uint32_t)0x00000800)
+#define  RCC_PLLCFGR_PLLN_6                   ((uint32_t)0x00001000)
+#define  RCC_PLLCFGR_PLLN_7                   ((uint32_t)0x00002000)
+#define  RCC_PLLCFGR_PLLN_8                   ((uint32_t)0x00004000)
+
+#define  RCC_PLLCFGR_PLLP                    ((uint32_t)0x00030000)
+#define  RCC_PLLCFGR_PLLP_0                  ((uint32_t)0x00010000)
+#define  RCC_PLLCFGR_PLLP_1                  ((uint32_t)0x00020000)
+
+#define  RCC_PLLCFGR_PLLSRC                  ((uint32_t)0x00400000)
+#define  RCC_PLLCFGR_PLLSRC_HSE              ((uint32_t)0x00400000)
+#define  RCC_PLLCFGR_PLLSRC_HSI              ((uint32_t)0x00000000)
+
+#define  RCC_PLLCFGR_PLLQ                    ((uint32_t)0x0F000000)
+#define  RCC_PLLCFGR_PLLQ_0                  ((uint32_t)0x01000000)
+#define  RCC_PLLCFGR_PLLQ_1                  ((uint32_t)0x02000000)
+#define  RCC_PLLCFGR_PLLQ_2                  ((uint32_t)0x04000000)
+#define  RCC_PLLCFGR_PLLQ_3                  ((uint32_t)0x08000000)
+
+/********************  Bit definition for RCC_CFGR register  ******************/
+/*!< SW configuration */
+#define  RCC_CFGR_SW                         ((uint32_t)0x00000003)        /*!< SW[1:0] bits (System clock Switch) */
+#define  RCC_CFGR_SW_0                       ((uint32_t)0x00000001)        /*!< Bit 0 */
+#define  RCC_CFGR_SW_1                       ((uint32_t)0x00000002)        /*!< Bit 1 */
+
+#define  RCC_CFGR_SW_HSI                     ((uint32_t)0x00000000)        /*!< HSI selected as system clock */
+#define  RCC_CFGR_SW_HSE                     ((uint32_t)0x00000001)        /*!< HSE selected as system clock */
+#define  RCC_CFGR_SW_PLL                     ((uint32_t)0x00000002)        /*!< PLL selected as system clock */
+
+/*!< SWS configuration */
+#define  RCC_CFGR_SWS                        ((uint32_t)0x0000000C)        /*!< SWS[1:0] bits (System Clock Switch Status) */
+#define  RCC_CFGR_SWS_0                      ((uint32_t)0x00000004)        /*!< Bit 0 */
+#define  RCC_CFGR_SWS_1                      ((uint32_t)0x00000008)        /*!< Bit 1 */
+
+#define  RCC_CFGR_SWS_HSI                    ((uint32_t)0x00000000)        /*!< HSI oscillator used as system clock */
+#define  RCC_CFGR_SWS_HSE                    ((uint32_t)0x00000004)        /*!< HSE oscillator used as system clock */
+#define  RCC_CFGR_SWS_PLL                    ((uint32_t)0x00000008)        /*!< PLL used as system clock */
+
+/*!< HPRE configuration */
+#define  RCC_CFGR_HPRE                       ((uint32_t)0x000000F0)        /*!< HPRE[3:0] bits (AHB prescaler) */
+#define  RCC_CFGR_HPRE_0                     ((uint32_t)0x00000010)        /*!< Bit 0 */
+#define  RCC_CFGR_HPRE_1                     ((uint32_t)0x00000020)        /*!< Bit 1 */
+#define  RCC_CFGR_HPRE_2                     ((uint32_t)0x00000040)        /*!< Bit 2 */
+#define  RCC_CFGR_HPRE_3                     ((uint32_t)0x00000080)        /*!< Bit 3 */
+
+#define  RCC_CFGR_HPRE_DIV1                  ((uint32_t)0x00000000)        /*!< SYSCLK not divided */
+#define  RCC_CFGR_HPRE_DIV2                  ((uint32_t)0x00000080)        /*!< SYSCLK divided by 2 */
+#define  RCC_CFGR_HPRE_DIV4                  ((uint32_t)0x00000090)        /*!< SYSCLK divided by 4 */
+#define  RCC_CFGR_HPRE_DIV8                  ((uint32_t)0x000000A0)        /*!< SYSCLK divided by 8 */
+#define  RCC_CFGR_HPRE_DIV16                 ((uint32_t)0x000000B0)        /*!< SYSCLK divided by 16 */
+#define  RCC_CFGR_HPRE_DIV64                 ((uint32_t)0x000000C0)        /*!< SYSCLK divided by 64 */
+#define  RCC_CFGR_HPRE_DIV128                ((uint32_t)0x000000D0)        /*!< SYSCLK divided by 128 */
+#define  RCC_CFGR_HPRE_DIV256                ((uint32_t)0x000000E0)        /*!< SYSCLK divided by 256 */
+#define  RCC_CFGR_HPRE_DIV512                ((uint32_t)0x000000F0)        /*!< SYSCLK divided by 512 */
+
+/*!< PPRE1 configuration */
+#define  RCC_CFGR_PPRE1                      ((uint32_t)0x00001C00)        /*!< PRE1[2:0] bits (APB1 prescaler) */
+#define  RCC_CFGR_PPRE1_0                    ((uint32_t)0x00000400)        /*!< Bit 0 */
+#define  RCC_CFGR_PPRE1_1                    ((uint32_t)0x00000800)        /*!< Bit 1 */
+#define  RCC_CFGR_PPRE1_2                    ((uint32_t)0x00001000)        /*!< Bit 2 */
+
+#define  RCC_CFGR_PPRE1_DIV1                 ((uint32_t)0x00000000)        /*!< HCLK not divided */
+#define  RCC_CFGR_PPRE1_DIV2                 ((uint32_t)0x00001000)        /*!< HCLK divided by 2 */
+#define  RCC_CFGR_PPRE1_DIV4                 ((uint32_t)0x00001400)        /*!< HCLK divided by 4 */
+#define  RCC_CFGR_PPRE1_DIV8                 ((uint32_t)0x00001800)        /*!< HCLK divided by 8 */
+#define  RCC_CFGR_PPRE1_DIV16                ((uint32_t)0x00001C00)        /*!< HCLK divided by 16 */
+
+/*!< PPRE2 configuration */
+#define  RCC_CFGR_PPRE2                      ((uint32_t)0x0000E000)        /*!< PRE2[2:0] bits (APB2 prescaler) */
+#define  RCC_CFGR_PPRE2_0                    ((uint32_t)0x00002000)        /*!< Bit 0 */
+#define  RCC_CFGR_PPRE2_1                    ((uint32_t)0x00004000)        /*!< Bit 1 */
+#define  RCC_CFGR_PPRE2_2                    ((uint32_t)0x00008000)        /*!< Bit 2 */
+
+#define  RCC_CFGR_PPRE2_DIV1                 ((uint32_t)0x00000000)        /*!< HCLK not divided */
+#define  RCC_CFGR_PPRE2_DIV2                 ((uint32_t)0x00008000)        /*!< HCLK divided by 2 */
+#define  RCC_CFGR_PPRE2_DIV4                 ((uint32_t)0x0000A000)        /*!< HCLK divided by 4 */
+#define  RCC_CFGR_PPRE2_DIV8                 ((uint32_t)0x0000C000)        /*!< HCLK divided by 8 */
+#define  RCC_CFGR_PPRE2_DIV16                ((uint32_t)0x0000E00)         /*!< HCLK divided by 16 */
+
+/*!< RTCPRE configuration */
+#define  RCC_CFGR_RTCPRE                     ((uint32_t)0x001F0000)
+#define  RCC_CFGR_RTCPRE_0                   ((uint32_t)0x00010000)
+#define  RCC_CFGR_RTCPRE_1                   ((uint32_t)0x00020000)
+#define  RCC_CFGR_RTCPRE_2                   ((uint32_t)0x00040000)
+#define  RCC_CFGR_RTCPRE_3                   ((uint32_t)0x00080000)
+#define  RCC_CFGR_RTCPRE_4                   ((uint32_t)0x00100000)
+
+/*!< MCO1 configuration */
+#define  RCC_CFGR_MCO1                       ((uint32_t)0x00600000)
+#define  RCC_CFGR_MCO1_0                     ((uint32_t)0x00200000)
+#define  RCC_CFGR_MCO1_1                     ((uint32_t)0x00400000)
+
+#define  RCC_CFGR_I2SSRC                     ((uint32_t)0x00800000)
+
+#define  RCC_CFGR_MCO1PRE                    ((uint32_t)0x07000000)
+#define  RCC_CFGR_MCO1PRE_0                  ((uint32_t)0x01000000)
+#define  RCC_CFGR_MCO1PRE_1                  ((uint32_t)0x02000000)
+#define  RCC_CFGR_MCO1PRE_2                  ((uint32_t)0x04000000)
+
+#define  RCC_CFGR_MCO2PRE                    ((uint32_t)0x38000000)
+#define  RCC_CFGR_MCO2PRE_0                  ((uint32_t)0x08000000)
+#define  RCC_CFGR_MCO2PRE_1                  ((uint32_t)0x10000000)
+#define  RCC_CFGR_MCO2PRE_2                  ((uint32_t)0x20000000)
+
+#define  RCC_CFGR_MCO2                       ((uint32_t)0xC0000000)
+#define  RCC_CFGR_MCO2_0                     ((uint32_t)0x40000000)
+#define  RCC_CFGR_MCO2_1                     ((uint32_t)0x80000000)
+
+/********************  Bit definition for RCC_CIR register  *******************/
+#define  RCC_CIR_LSIRDYF                     ((uint32_t)0x00000001)
+#define  RCC_CIR_LSERDYF                     ((uint32_t)0x00000002)
+#define  RCC_CIR_HSIRDYF                     ((uint32_t)0x00000004)
+#define  RCC_CIR_HSERDYF                     ((uint32_t)0x00000008)
+#define  RCC_CIR_PLLRDYF                     ((uint32_t)0x00000010)
+#define  RCC_CIR_PLLI2SRDYF                  ((uint32_t)0x00000020)
+#define  RCC_CIR_CSSF                        ((uint32_t)0x00000080)
+#define  RCC_CIR_LSIRDYIE                    ((uint32_t)0x00000100)
+#define  RCC_CIR_LSERDYIE                    ((uint32_t)0x00000200)
+#define  RCC_CIR_HSIRDYIE                    ((uint32_t)0x00000400)
+#define  RCC_CIR_HSERDYIE                    ((uint32_t)0x00000800)
+#define  RCC_CIR_PLLRDYIE                    ((uint32_t)0x00001000)
+#define  RCC_CIR_PLLI2SRDYIE                 ((uint32_t)0x00002000)
+#define  RCC_CIR_LSIRDYC                     ((uint32_t)0x00010000)
+#define  RCC_CIR_LSERDYC                     ((uint32_t)0x00020000)
+#define  RCC_CIR_HSIRDYC                     ((uint32_t)0x00040000)
+#define  RCC_CIR_HSERDYC                     ((uint32_t)0x00080000)
+#define  RCC_CIR_PLLRDYC                     ((uint32_t)0x00100000)
+#define  RCC_CIR_PLLI2SRDYC                  ((uint32_t)0x00200000)
+#define  RCC_CIR_CSSC                        ((uint32_t)0x00800000)
+
+/********************  Bit definition for RCC_AHB1RSTR register  **************/
+#define  RCC_AHB1RSTR_GPIOARST               ((uint32_t)0x00000001)
+#define  RCC_AHB1RSTR_GPIOBRST               ((uint32_t)0x00000002)
+#define  RCC_AHB1RSTR_GPIOCRST               ((uint32_t)0x00000004)
+#define  RCC_AHB1RSTR_GPIODRST               ((uint32_t)0x00000008)
+#define  RCC_AHB1RSTR_GPIOERST               ((uint32_t)0x00000010)
+#define  RCC_AHB1RSTR_GPIOFRST               ((uint32_t)0x00000020)
+#define  RCC_AHB1RSTR_GPIOGRST               ((uint32_t)0x00000040)
+#define  RCC_AHB1RSTR_GPIOHRST               ((uint32_t)0x00000080)
+#define  RCC_AHB1RSTR_GPIOIRST               ((uint32_t)0x00000100)
+#define  RCC_AHB1RSTR_CRCRST                 ((uint32_t)0x00001000)
+#define  RCC_AHB1RSTR_DMA1RST                ((uint32_t)0x00200000)
+#define  RCC_AHB1RSTR_DMA2RST                ((uint32_t)0x00400000)
+#define  RCC_AHB1RSTR_ETHMACRST              ((uint32_t)0x02000000)
+#define  RCC_AHB1RSTR_OTGHRST                ((uint32_t)0x10000000)
+
+/********************  Bit definition for RCC_AHB2RSTR register  **************/
+#define  RCC_AHB2RSTR_DCMIRST                ((uint32_t)0x00000001)
+#define  RCC_AHB2RSTR_CRYPRST                ((uint32_t)0x00000010)
+#define  RCC_AHB2RSTR_HSAHRST                ((uint32_t)0x00000020)
+#define  RCC_AHB2RSTR_RNGRST                 ((uint32_t)0x00000040)
+#define  RCC_AHB2RSTR_OTGFSRST               ((uint32_t)0x00000080)
+
+/********************  Bit definition for RCC_AHB3RSTR register  **************/
+#define  RCC_AHB3RSTR_FSMCRST                ((uint32_t)0x00000001)
+
+/********************  Bit definition for RCC_APB1RSTR register  **************/
+#define  RCC_APB1RSTR_TIM2RST                ((uint32_t)0x00000001)
+#define  RCC_APB1RSTR_TIM3RST                ((uint32_t)0x00000002)
+#define  RCC_APB1RSTR_TIM4RST                ((uint32_t)0x00000004)
+#define  RCC_APB1RSTR_TIM5RST                ((uint32_t)0x00000008)
+#define  RCC_APB1RSTR_TIM6RST                ((uint32_t)0x00000010)
+#define  RCC_APB1RSTR_TIM7RST                ((uint32_t)0x00000020)
+#define  RCC_APB1RSTR_TIM12RST               ((uint32_t)0x00000040)
+#define  RCC_APB1RSTR_TIM13RST               ((uint32_t)0x00000080)
+#define  RCC_APB1RSTR_TIM14RST               ((uint32_t)0x00000100)
+#define  RCC_APB1RSTR_WWDGEN                 ((uint32_t)0x00000800)
+#define  RCC_APB1RSTR_SPI2RST                ((uint32_t)0x00008000)
+#define  RCC_APB1RSTR_SPI3RST                ((uint32_t)0x00010000)
+#define  RCC_APB1RSTR_USART2RST              ((uint32_t)0x00020000)
+#define  RCC_APB1RSTR_USART3RST              ((uint32_t)0x00040000)
+#define  RCC_APB1RSTR_UART4RST               ((uint32_t)0x00080000)
+#define  RCC_APB1RSTR_UART5RST               ((uint32_t)0x00100000)
+#define  RCC_APB1RSTR_I2C1RST                ((uint32_t)0x00200000)
+#define  RCC_APB1RSTR_I2C2RST                ((uint32_t)0x00400000)
+#define  RCC_APB1RSTR_I2C3RST                ((uint32_t)0x00800000)
+#define  RCC_APB1RSTR_CAN1RST                ((uint32_t)0x02000000)
+#define  RCC_APB1RSTR_CAN2RST                ((uint32_t)0x04000000)
+#define  RCC_APB1RSTR_PWRRST                 ((uint32_t)0x10000000)
+#define  RCC_APB1RSTR_DACRST                 ((uint32_t)0x20000000)
+
+/********************  Bit definition for RCC_APB2RSTR register  **************/
+#define  RCC_APB2RSTR_TIM1RST                ((uint32_t)0x00000001)
+#define  RCC_APB2RSTR_TIM8RST                ((uint32_t)0x00000002)
+#define  RCC_APB2RSTR_USART1RST              ((uint32_t)0x00000010)
+#define  RCC_APB2RSTR_USART6RST              ((uint32_t)0x00000020)
+#define  RCC_APB2RSTR_ADCRST                 ((uint32_t)0x00000100)
+#define  RCC_APB2RSTR_SDIORST                ((uint32_t)0x00000800)
+#define  RCC_APB2RSTR_SPI1RST                ((uint32_t)0x00001000)
+#define  RCC_APB2RSTR_SYSCFGRST              ((uint32_t)0x00004000)
+#define  RCC_APB2RSTR_TIM9RST                ((uint32_t)0x00010000)
+#define  RCC_APB2RSTR_TIM10RST               ((uint32_t)0x00020000)
+#define  RCC_APB2RSTR_TIM11RST               ((uint32_t)0x00040000)
+
+/********************  Bit definition for RCC_AHB1ENR register  ***************/
+#define  RCC_AHB1ENR_GPIOAEN                 ((uint32_t)0x00000001)
+#define  RCC_AHB1ENR_GPIOBEN                 ((uint32_t)0x00000002)
+#define  RCC_AHB1ENR_GPIOCEN                 ((uint32_t)0x00000004)
+#define  RCC_AHB1ENR_GPIODEN                 ((uint32_t)0x00000008)
+#define  RCC_AHB1ENR_GPIOEEN                 ((uint32_t)0x00000010)
+#define  RCC_AHB1ENR_GPIOFEN                 ((uint32_t)0x00000020)
+#define  RCC_AHB1ENR_GPIOGEN                 ((uint32_t)0x00000040)
+#define  RCC_AHB1ENR_GPIOHEN                 ((uint32_t)0x00000080)
+#define  RCC_AHB1ENR_GPIOIEN                 ((uint32_t)0x00000100)
+#define  RCC_AHB1ENR_CRCEN                   ((uint32_t)0x00001000)
+#define  RCC_AHB1ENR_BKPSRAMEN               ((uint32_t)0x00040000)
+#define  RCC_AHB1ENR_DMA1EN                  ((uint32_t)0x00200000)
+#define  RCC_AHB1ENR_DMA2EN                  ((uint32_t)0x00400000)
+#define  RCC_AHB1ENR_ETHMACEN                ((uint32_t)0x02000000)
+#define  RCC_AHB1ENR_ETHMACTXEN              ((uint32_t)0x04000000)
+#define  RCC_AHB1ENR_ETHMACRXEN              ((uint32_t)0x08000000)
+#define  RCC_AHB1ENR_ETHMACPTPEN             ((uint32_t)0x10000000)
+#define  RCC_AHB1ENR_OTGHSEN                 ((uint32_t)0x20000000)
+#define  RCC_AHB1ENR_OTGHSULPIEN             ((uint32_t)0x40000000)
+
+/********************  Bit definition for RCC_AHB2ENR register  ***************/
+#define  RCC_AHB2ENR_DCMIEN                  ((uint32_t)0x00000001)
+#define  RCC_AHB2ENR_CRYPEN                  ((uint32_t)0x00000010)
+#define  RCC_AHB2ENR_HASHEN                  ((uint32_t)0x00000020)
+#define  RCC_AHB2ENR_RNGEN                   ((uint32_t)0x00000040)
+#define  RCC_AHB2ENR_OTGFSEN                 ((uint32_t)0x00000080)
+
+/********************  Bit definition for RCC_AHB3ENR register  ***************/
+#define  RCC_AHB3ENR_FSMCEN                  ((uint32_t)0x00000001)
+
+/********************  Bit definition for RCC_APB1ENR register  ***************/
+#define  RCC_APB1ENR_TIM2EN                  ((uint32_t)0x00000001)
+#define  RCC_APB1ENR_TIM3EN                  ((uint32_t)0x00000002)
+#define  RCC_APB1ENR_TIM4EN                  ((uint32_t)0x00000004)
+#define  RCC_APB1ENR_TIM5EN                  ((uint32_t)0x00000008)
+#define  RCC_APB1ENR_TIM6EN                  ((uint32_t)0x00000010)
+#define  RCC_APB1ENR_TIM7EN                  ((uint32_t)0x00000020)
+#define  RCC_APB1ENR_TIM12EN                 ((uint32_t)0x00000040)
+#define  RCC_APB1ENR_TIM13EN                 ((uint32_t)0x00000080)
+#define  RCC_APB1ENR_TIM14EN                 ((uint32_t)0x00000100)
+#define  RCC_APB1ENR_WWDGEN                  ((uint32_t)0x00000800)
+#define  RCC_APB1ENR_SPI2EN                  ((uint32_t)0x00004000)
+#define  RCC_APB1ENR_SPI3EN                  ((uint32_t)0x00008000)
+#define  RCC_APB1ENR_USART2EN                ((uint32_t)0x00020000)
+#define  RCC_APB1ENR_USART3EN                ((uint32_t)0x00040000)
+#define  RCC_APB1ENR_UART4EN                 ((uint32_t)0x00080000)
+#define  RCC_APB1ENR_UART5EN                 ((uint32_t)0x00100000)
+#define  RCC_APB1ENR_I2C1EN                  ((uint32_t)0x00200000)
+#define  RCC_APB1ENR_I2C2EN                  ((uint32_t)0x00400000)
+#define  RCC_APB1ENR_I2C3EN                  ((uint32_t)0x00800000)
+#define  RCC_APB1ENR_CAN1EN                  ((uint32_t)0x02000000)
+#define  RCC_APB1ENR_CAN2EN                  ((uint32_t)0x04000000)
+#define  RCC_APB1ENR_PWREN                   ((uint32_t)0x10000000)
+#define  RCC_APB1ENR_DACEN                   ((uint32_t)0x20000000)
+
+/********************  Bit definition for RCC_APB2ENR register  ***************/
+#define  RCC_APB2ENR_TIM1EN                  ((uint32_t)0x00000001)
+#define  RCC_APB2ENR_TIM8EN                  ((uint32_t)0x00000002)
+#define  RCC_APB2ENR_USART1EN                ((uint32_t)0x00000010)
+#define  RCC_APB2ENR_USART6EN                ((uint32_t)0x00000020)
+#define  RCC_APB2ENR_ADC1EN                  ((uint32_t)0x00000100)
+#define  RCC_APB2ENR_ADC2EN                  ((uint32_t)0x00000200)
+#define  RCC_APB2ENR_ADC3EN                  ((uint32_t)0x00000400)
+#define  RCC_APB2ENR_SDIOEN                  ((uint32_t)0x00000800)
+#define  RCC_APB2ENR_SPI1EN                  ((uint32_t)0x00001000)
+#define  RCC_APB2ENR_SYSCFGEN                ((uint32_t)0x00004000)
+#define  RCC_APB2ENR_TIM11EN                 ((uint32_t)0x00040000)
+#define  RCC_APB2ENR_TIM10EN                 ((uint32_t)0x00020000)
+#define  RCC_APB2ENR_TIM9EN                  ((uint32_t)0x00010000)
+
+/********************  Bit definition for RCC_AHB1LPENR register  *************/
+#define  RCC_AHB1LPENR_GPIOALPEN             ((uint32_t)0x00000001)
+#define  RCC_AHB1LPENR_GPIOBLPEN             ((uint32_t)0x00000002)
+#define  RCC_AHB1LPENR_GPIOCLPEN             ((uint32_t)0x00000004)
+#define  RCC_AHB1LPENR_GPIODLPEN             ((uint32_t)0x00000008)
+#define  RCC_AHB1LPENR_GPIOELPEN             ((uint32_t)0x00000010)
+#define  RCC_AHB1LPENR_GPIOFLPEN             ((uint32_t)0x00000020)
+#define  RCC_AHB1LPENR_GPIOGLPEN             ((uint32_t)0x00000040)
+#define  RCC_AHB1LPENR_GPIOHLPEN             ((uint32_t)0x00000080)
+#define  RCC_AHB1LPENR_GPIOILPEN             ((uint32_t)0x00000100)
+#define  RCC_AHB1LPENR_CRCLPEN               ((uint32_t)0x00001000)
+#define  RCC_AHB1LPENR_FLITFLPEN             ((uint32_t)0x00008000)
+#define  RCC_AHB1LPENR_SRAM1LPEN             ((uint32_t)0x00010000)
+#define  RCC_AHB1LPENR_SRAM2LPEN             ((uint32_t)0x00020000)
+#define  RCC_AHB1LPENR_BKPSRAMLPEN           ((uint32_t)0x00040000)
+#define  RCC_AHB1LPENR_DMA1LPEN              ((uint32_t)0x00200000)
+#define  RCC_AHB1LPENR_DMA2LPEN              ((uint32_t)0x00400000)
+#define  RCC_AHB1LPENR_ETHMACLPEN            ((uint32_t)0x02000000)
+#define  RCC_AHB1LPENR_ETHMACTXLPEN          ((uint32_t)0x04000000)
+#define  RCC_AHB1LPENR_ETHMACRXLPEN          ((uint32_t)0x08000000)
+#define  RCC_AHB1LPENR_ETHMACPTPLPEN         ((uint32_t)0x10000000)
+#define  RCC_AHB1LPENR_OTGHSLPEN             ((uint32_t)0x20000000)
+#define  RCC_AHB1LPENR_OTGHSULPILPEN         ((uint32_t)0x40000000)
+
+/********************  Bit definition for RCC_AHB2LPENR register  *************/
+#define  RCC_AHB2LPENR_DCMILPEN              ((uint32_t)0x00000001)
+#define  RCC_AHB2LPENR_CRYPLPEN              ((uint32_t)0x00000010)
+#define  RCC_AHB2LPENR_HASHLPEN              ((uint32_t)0x00000020)
+#define  RCC_AHB2LPENR_RNGLPEN               ((uint32_t)0x00000040)
+#define  RCC_AHB2LPENR_OTGFSLPEN             ((uint32_t)0x00000080)
+
+/********************  Bit definition for RCC_AHB3LPENR register  *************/
+#define  RCC_AHB3LPENR_FSMCLPEN              ((uint32_t)0x00000001)
+
+/********************  Bit definition for RCC_APB1LPENR register  *************/
+#define  RCC_APB1LPENR_TIM2LPEN              ((uint32_t)0x00000001)
+#define  RCC_APB1LPENR_TIM3LPEN              ((uint32_t)0x00000002)
+#define  RCC_APB1LPENR_TIM4LPEN              ((uint32_t)0x00000004)
+#define  RCC_APB1LPENR_TIM5LPEN              ((uint32_t)0x00000008)
+#define  RCC_APB1LPENR_TIM6LPEN              ((uint32_t)0x00000010)
+#define  RCC_APB1LPENR_TIM7LPEN              ((uint32_t)0x00000020)
+#define  RCC_APB1LPENR_TIM12LPEN             ((uint32_t)0x00000040)
+#define  RCC_APB1LPENR_TIM13LPEN             ((uint32_t)0x00000080)
+#define  RCC_APB1LPENR_TIM14LPEN             ((uint32_t)0x00000100)
+#define  RCC_APB1LPENR_WWDGLPEN              ((uint32_t)0x00000800)
+#define  RCC_APB1LPENR_SPI2LPEN              ((uint32_t)0x00004000)
+#define  RCC_APB1LPENR_SPI3LPEN              ((uint32_t)0x00008000)
+#define  RCC_APB1LPENR_USART2LPEN            ((uint32_t)0x00020000)
+#define  RCC_APB1LPENR_USART3LPEN            ((uint32_t)0x00040000)
+#define  RCC_APB1LPENR_UART4LPEN             ((uint32_t)0x00080000)
+#define  RCC_APB1LPENR_UART5LPEN             ((uint32_t)0x00100000)
+#define  RCC_APB1LPENR_I2C1LPEN              ((uint32_t)0x00200000)
+#define  RCC_APB1LPENR_I2C2LPEN              ((uint32_t)0x00400000)
+#define  RCC_APB1LPENR_I2C3LPEN              ((uint32_t)0x00800000)
+#define  RCC_APB1LPENR_CAN1LPEN              ((uint32_t)0x02000000)
+#define  RCC_APB1LPENR_CAN2LPEN              ((uint32_t)0x04000000)
+#define  RCC_APB1LPENR_PWRLPEN               ((uint32_t)0x10000000)
+#define  RCC_APB1LPENR_DACLPEN               ((uint32_t)0x20000000)
+
+/********************  Bit definition for RCC_APB2LPENR register  *************/
+#define  RCC_APB2LPENR_TIM1LPEN              ((uint32_t)0x00000001)
+#define  RCC_APB2LPENR_TIM8LPEN              ((uint32_t)0x00000002)
+#define  RCC_APB2LPENR_USART1LPEN            ((uint32_t)0x00000010)
+#define  RCC_APB2LPENR_USART6LPEN            ((uint32_t)0x00000020)
+#define  RCC_APB2LPENR_ADC1LPEN              ((uint32_t)0x00000100)
+#define  RCC_APB2LPENR_ADC2PEN               ((uint32_t)0x00000200)
+#define  RCC_APB2LPENR_ADC3LPEN              ((uint32_t)0x00000400)
+#define  RCC_APB2LPENR_SDIOLPEN              ((uint32_t)0x00000800)
+#define  RCC_APB2LPENR_SPI1LPEN              ((uint32_t)0x00001000)
+#define  RCC_APB2LPENR_SYSCFGLPEN            ((uint32_t)0x00004000)
+#define  RCC_APB2LPENR_TIM9LPEN              ((uint32_t)0x00010000)
+#define  RCC_APB2LPENR_TIM10LPEN             ((uint32_t)0x00020000)
+#define  RCC_APB2LPENR_TIM11LPEN             ((uint32_t)0x00040000)
+
+/********************  Bit definition for RCC_BDCR register  ******************/
+#define  RCC_BDCR_LSEON                      ((uint32_t)0x00000001)
+#define  RCC_BDCR_LSERDY                     ((uint32_t)0x00000002)
+#define  RCC_BDCR_LSEBYP                     ((uint32_t)0x00000004)
+
+#define  RCC_BDCR_RTCSEL                    ((uint32_t)0x00000300)
+#define  RCC_BDCR_RTCSEL_0                  ((uint32_t)0x00000100)
+#define  RCC_BDCR_RTCSEL_1                  ((uint32_t)0x00000200)
+
+#define  RCC_BDCR_RTCEN                      ((uint32_t)0x00008000)
+#define  RCC_BDCR_BDRST                      ((uint32_t)0x00010000)
+
+/********************  Bit definition for RCC_CSR register  *******************/
+#define  RCC_CSR_LSION                       ((uint32_t)0x00000001)
+#define  RCC_CSR_LSIRDY                      ((uint32_t)0x00000002)
+#define  RCC_CSR_RMVF                        ((uint32_t)0x01000000)
+#define  RCC_CSR_BORRSTF                     ((uint32_t)0x02000000)
+#define  RCC_CSR_PADRSTF                     ((uint32_t)0x04000000)
+#define  RCC_CSR_PORRSTF                     ((uint32_t)0x08000000)
+#define  RCC_CSR_SFTRSTF                     ((uint32_t)0x10000000)
+#define  RCC_CSR_WDGRSTF                     ((uint32_t)0x20000000)
+#define  RCC_CSR_WWDGRSTF                    ((uint32_t)0x40000000)
+#define  RCC_CSR_LPWRRSTF                    ((uint32_t)0x80000000)
+
+/********************  Bit definition for RCC_SSCGR register  *****************/
+#define  RCC_SSCGR_MODPER                    ((uint32_t)0x00001FFF)
+#define  RCC_SSCGR_INCSTEP                   ((uint32_t)0x0FFFE000)
+#define  RCC_SSCGR_SPREADSEL                 ((uint32_t)0x40000000)
+#define  RCC_SSCGR_SSCGEN                    ((uint32_t)0x80000000)
+
+/********************  Bit definition for RCC_PLLI2SCFGR register  ************/
+#define  RCC_PLLI2SCFGR_PLLI2SN              ((uint32_t)0x00007FC0)
+#define  RCC_PLLI2SCFGR_PLLI2SR              ((uint32_t)0x70000000)
+
+/******************************************************************************/
+/*                                                                            */
+/*                                    RNG                                     */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bits definition for RNG_CR register  *******************/
+#define RNG_CR_RNGEN                         ((uint32_t)0x00000004)
+#define RNG_CR_IE                            ((uint32_t)0x00000008)
+
+/********************  Bits definition for RNG_SR register  *******************/
+#define RNG_SR_DRDY                          ((uint32_t)0x00000001)
+#define RNG_SR_CECS                          ((uint32_t)0x00000002)
+#define RNG_SR_SECS                          ((uint32_t)0x00000004)
+#define RNG_SR_CEIS                          ((uint32_t)0x00000020)
+#define RNG_SR_SEIS                          ((uint32_t)0x00000040)
+
+/******************************************************************************/
+/*                                                                            */
+/*                           Real-Time Clock (RTC)                            */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bits definition for RTC_TR register  *******************/
+#define RTC_TR_PM                            ((uint32_t)0x00400000)
+#define RTC_TR_HT                            ((uint32_t)0x00300000)
+#define RTC_TR_HT_0                          ((uint32_t)0x00100000)
+#define RTC_TR_HT_1                          ((uint32_t)0x00200000)
+#define RTC_TR_HU                            ((uint32_t)0x000F0000)
+#define RTC_TR_HU_0                          ((uint32_t)0x00010000)
+#define RTC_TR_HU_1                          ((uint32_t)0x00020000)
+#define RTC_TR_HU_2                          ((uint32_t)0x00040000)
+#define RTC_TR_HU_3                          ((uint32_t)0x00080000)
+#define RTC_TR_MNT                           ((uint32_t)0x00007000)
+#define RTC_TR_MNT_0                         ((uint32_t)0x00001000)
+#define RTC_TR_MNT_1                         ((uint32_t)0x00002000)
+#define RTC_TR_MNT_2                         ((uint32_t)0x00004000)
+#define RTC_TR_MNU                           ((uint32_t)0x00000F00)
+#define RTC_TR_MNU_0                         ((uint32_t)0x00000100)
+#define RTC_TR_MNU_1                         ((uint32_t)0x00000200)
+#define RTC_TR_MNU_2                         ((uint32_t)0x00000400)
+#define RTC_TR_MNU_3                         ((uint32_t)0x00000800)
+#define RTC_TR_ST                            ((uint32_t)0x00000070)
+#define RTC_TR_ST_0                          ((uint32_t)0x00000010)
+#define RTC_TR_ST_1                          ((uint32_t)0x00000020)
+#define RTC_TR_ST_2                          ((uint32_t)0x00000040)
+#define RTC_TR_SU                            ((uint32_t)0x0000000F)
+#define RTC_TR_SU_0                          ((uint32_t)0x00000001)
+#define RTC_TR_SU_1                          ((uint32_t)0x00000002)
+#define RTC_TR_SU_2                          ((uint32_t)0x00000004)
+#define RTC_TR_SU_3                          ((uint32_t)0x00000008)
+
+/********************  Bits definition for RTC_DR register  *******************/
+#define RTC_DR_YT                            ((uint32_t)0x00F00000)
+#define RTC_DR_YT_0                          ((uint32_t)0x00100000)
+#define RTC_DR_YT_1                          ((uint32_t)0x00200000)
+#define RTC_DR_YT_2                          ((uint32_t)0x00400000)
+#define RTC_DR_YT_3                          ((uint32_t)0x00800000)
+#define RTC_DR_YU                            ((uint32_t)0x000F0000)
+#define RTC_DR_YU_0                          ((uint32_t)0x00010000)
+#define RTC_DR_YU_1                          ((uint32_t)0x00020000)
+#define RTC_DR_YU_2                          ((uint32_t)0x00040000)
+#define RTC_DR_YU_3                          ((uint32_t)0x00080000)
+#define RTC_DR_WDU                           ((uint32_t)0x0000E000)
+#define RTC_DR_WDU_0                         ((uint32_t)0x00002000)
+#define RTC_DR_WDU_1                         ((uint32_t)0x00004000)
+#define RTC_DR_WDU_2                         ((uint32_t)0x00008000)
+#define RTC_DR_MT                            ((uint32_t)0x00001000)
+#define RTC_DR_MU                            ((uint32_t)0x00000F00)
+#define RTC_DR_MU_0                          ((uint32_t)0x00000100)
+#define RTC_DR_MU_1                          ((uint32_t)0x00000200)
+#define RTC_DR_MU_2                          ((uint32_t)0x00000400)
+#define RTC_DR_MU_3                          ((uint32_t)0x00000800)
+#define RTC_DR_DT                            ((uint32_t)0x00000030)
+#define RTC_DR_DT_0                          ((uint32_t)0x00000010)
+#define RTC_DR_DT_1                          ((uint32_t)0x00000020)
+#define RTC_DR_DU                            ((uint32_t)0x0000000F)
+#define RTC_DR_DU_0                          ((uint32_t)0x00000001)
+#define RTC_DR_DU_1                          ((uint32_t)0x00000002)
+#define RTC_DR_DU_2                          ((uint32_t)0x00000004)
+#define RTC_DR_DU_3                          ((uint32_t)0x00000008)
+
+/********************  Bits definition for RTC_CR register  *******************/
+#define RTC_CR_COE                           ((uint32_t)0x00800000)
+#define RTC_CR_OSEL                          ((uint32_t)0x00600000)
+#define RTC_CR_OSEL_0                        ((uint32_t)0x00200000)
+#define RTC_CR_OSEL_1                        ((uint32_t)0x00400000)
+#define RTC_CR_POL                           ((uint32_t)0x00100000)
+#define RTC_CR_BCK                           ((uint32_t)0x00040000)
+#define RTC_CR_SUB1H                         ((uint32_t)0x00020000)
+#define RTC_CR_ADD1H                         ((uint32_t)0x00010000)
+#define RTC_CR_TSIE                          ((uint32_t)0x00008000)
+#define RTC_CR_WUTIE                         ((uint32_t)0x00004000)
+#define RTC_CR_ALRBIE                        ((uint32_t)0x00002000)
+#define RTC_CR_ALRAIE                        ((uint32_t)0x00001000)
+#define RTC_CR_TSE                           ((uint32_t)0x00000800)
+#define RTC_CR_WUTE                          ((uint32_t)0x00000400)
+#define RTC_CR_ALRBE                         ((uint32_t)0x00000200)
+#define RTC_CR_ALRAE                         ((uint32_t)0x00000100)
+#define RTC_CR_DCE                           ((uint32_t)0x00000080)
+#define RTC_CR_FMT                           ((uint32_t)0x00000040)
+#define RTC_CR_REFCKON                       ((uint32_t)0x00000010)
+#define RTC_CR_TSEDGE                        ((uint32_t)0x00000008)
+#define RTC_CR_WUCKSEL                       ((uint32_t)0x00000007)
+#define RTC_CR_WUCKSEL_0                     ((uint32_t)0x00000001)
+#define RTC_CR_WUCKSEL_1                     ((uint32_t)0x00000002)
+#define RTC_CR_WUCKSEL_2                     ((uint32_t)0x00000004)
+
+/********************  Bits definition for RTC_ISR register  ******************/
+#define RTC_ISR_TAMP1F                       ((uint32_t)0x00002000)
+#define RTC_ISR_TSOVF                        ((uint32_t)0x00001000)
+#define RTC_ISR_TSF                          ((uint32_t)0x00000800)
+#define RTC_ISR_WUTF                         ((uint32_t)0x00000400)
+#define RTC_ISR_ALRBF                        ((uint32_t)0x00000200)
+#define RTC_ISR_ALRAF                        ((uint32_t)0x00000100)
+#define RTC_ISR_INIT                         ((uint32_t)0x00000080)
+#define RTC_ISR_INITF                        ((uint32_t)0x00000040)
+#define RTC_ISR_RSF                          ((uint32_t)0x00000020)
+#define RTC_ISR_INITS                        ((uint32_t)0x00000010)
+#define RTC_ISR_WUTWF                        ((uint32_t)0x00000004)
+#define RTC_ISR_ALRBWF                       ((uint32_t)0x00000002)
+#define RTC_ISR_ALRAWF                       ((uint32_t)0x00000001)
+
+/********************  Bits definition for RTC_PRER register  *****************/
+#define RTC_PRER_PREDIV_A                    ((uint32_t)0x007F0000)
+#define RTC_PRER_PREDIV_S                    ((uint32_t)0x00001FFF)
+
+/********************  Bits definition for RTC_WUTR register  *****************/
+#define RTC_WUTR_WUT                         ((uint32_t)0x0000FFFF)
+
+/********************  Bits definition for RTC_CALIBR register  ***************/
+#define RTC_CALIBR_DCS                       ((uint32_t)0x00000080)
+#define RTC_CALIBR_DC                        ((uint32_t)0x0000001F)
+
+/********************  Bits definition for RTC_ALRMAR register  ***************/
+#define RTC_ALRMAR_MSK4                      ((uint32_t)0x80000000)
+#define RTC_ALRMAR_WDSEL                     ((uint32_t)0x40000000)
+#define RTC_ALRMAR_DT                        ((uint32_t)0x30000000)
+#define RTC_ALRMAR_DT_0                      ((uint32_t)0x10000000)
+#define RTC_ALRMAR_DT_1                      ((uint32_t)0x20000000)
+#define RTC_ALRMAR_DU                        ((uint32_t)0x0F000000)
+#define RTC_ALRMAR_DU_0                      ((uint32_t)0x01000000)
+#define RTC_ALRMAR_DU_1                      ((uint32_t)0x02000000)
+#define RTC_ALRMAR_DU_2                      ((uint32_t)0x04000000)
+#define RTC_ALRMAR_DU_3                      ((uint32_t)0x08000000)
+#define RTC_ALRMAR_MSK3                      ((uint32_t)0x00800000)
+#define RTC_ALRMAR_PM                        ((uint32_t)0x00400000)
+#define RTC_ALRMAR_HT                        ((uint32_t)0x00300000)
+#define RTC_ALRMAR_HT_0                      ((uint32_t)0x00100000)
+#define RTC_ALRMAR_HT_1                      ((uint32_t)0x00200000)
+#define RTC_ALRMAR_HU                        ((uint32_t)0x000F0000)
+#define RTC_ALRMAR_HU_0                      ((uint32_t)0x00010000)
+#define RTC_ALRMAR_HU_1                      ((uint32_t)0x00020000)
+#define RTC_ALRMAR_HU_2                      ((uint32_t)0x00040000)
+#define RTC_ALRMAR_HU_3                      ((uint32_t)0x00080000)
+#define RTC_ALRMAR_MSK2                      ((uint32_t)0x00008000)
+#define RTC_ALRMAR_MNT                       ((uint32_t)0x00007000)
+#define RTC_ALRMAR_MNT_0                     ((uint32_t)0x00001000)
+#define RTC_ALRMAR_MNT_1                     ((uint32_t)0x00002000)
+#define RTC_ALRMAR_MNT_2                     ((uint32_t)0x00004000)
+#define RTC_ALRMAR_MNU                       ((uint32_t)0x00000F00)
+#define RTC_ALRMAR_MNU_0                     ((uint32_t)0x00000100)
+#define RTC_ALRMAR_MNU_1                     ((uint32_t)0x00000200)
+#define RTC_ALRMAR_MNU_2                     ((uint32_t)0x00000400)
+#define RTC_ALRMAR_MNU_3                     ((uint32_t)0x00000800)
+#define RTC_ALRMAR_MSK1                      ((uint32_t)0x00000080)
+#define RTC_ALRMAR_ST                        ((uint32_t)0x00000070)
+#define RTC_ALRMAR_ST_0                      ((uint32_t)0x00000010)
+#define RTC_ALRMAR_ST_1                      ((uint32_t)0x00000020)
+#define RTC_ALRMAR_ST_2                      ((uint32_t)0x00000040)
+#define RTC_ALRMAR_SU                        ((uint32_t)0x0000000F)
+#define RTC_ALRMAR_SU_0                      ((uint32_t)0x00000001)
+#define RTC_ALRMAR_SU_1                      ((uint32_t)0x00000002)
+#define RTC_ALRMAR_SU_2                      ((uint32_t)0x00000004)
+#define RTC_ALRMAR_SU_3                      ((uint32_t)0x00000008)
+
+/********************  Bits definition for RTC_ALRMBR register  ***************/
+#define RTC_ALRMBR_MSK4                      ((uint32_t)0x80000000)
+#define RTC_ALRMBR_WDSEL                     ((uint32_t)0x40000000)
+#define RTC_ALRMBR_DT                        ((uint32_t)0x30000000)
+#define RTC_ALRMBR_DT_0                      ((uint32_t)0x10000000)
+#define RTC_ALRMBR_DT_1                      ((uint32_t)0x20000000)
+#define RTC_ALRMBR_DU                        ((uint32_t)0x0F000000)
+#define RTC_ALRMBR_DU_0                      ((uint32_t)0x01000000)
+#define RTC_ALRMBR_DU_1                      ((uint32_t)0x02000000)
+#define RTC_ALRMBR_DU_2                      ((uint32_t)0x04000000)
+#define RTC_ALRMBR_DU_3                      ((uint32_t)0x08000000)
+#define RTC_ALRMBR_MSK3                      ((uint32_t)0x00800000)
+#define RTC_ALRMBR_PM                        ((uint32_t)0x00400000)
+#define RTC_ALRMBR_HT                        ((uint32_t)0x00300000)
+#define RTC_ALRMBR_HT_0                      ((uint32_t)0x00100000)
+#define RTC_ALRMBR_HT_1                      ((uint32_t)0x00200000)
+#define RTC_ALRMBR_HU                        ((uint32_t)0x000F0000)
+#define RTC_ALRMBR_HU_0                      ((uint32_t)0x00010000)
+#define RTC_ALRMBR_HU_1                      ((uint32_t)0x00020000)
+#define RTC_ALRMBR_HU_2                      ((uint32_t)0x00040000)
+#define RTC_ALRMBR_HU_3                      ((uint32_t)0x00080000)
+#define RTC_ALRMBR_MSK2                      ((uint32_t)0x00008000)
+#define RTC_ALRMBR_MNT                       ((uint32_t)0x00007000)
+#define RTC_ALRMBR_MNT_0                     ((uint32_t)0x00001000)
+#define RTC_ALRMBR_MNT_1                     ((uint32_t)0x00002000)
+#define RTC_ALRMBR_MNT_2                     ((uint32_t)0x00004000)
+#define RTC_ALRMBR_MNU                       ((uint32_t)0x00000F00)
+#define RTC_ALRMBR_MNU_0                     ((uint32_t)0x00000100)
+#define RTC_ALRMBR_MNU_1                     ((uint32_t)0x00000200)
+#define RTC_ALRMBR_MNU_2                     ((uint32_t)0x00000400)
+#define RTC_ALRMBR_MNU_3                     ((uint32_t)0x00000800)
+#define RTC_ALRMBR_MSK1                      ((uint32_t)0x00000080)
+#define RTC_ALRMBR_ST                        ((uint32_t)0x00000070)
+#define RTC_ALRMBR_ST_0                      ((uint32_t)0x00000010)
+#define RTC_ALRMBR_ST_1                      ((uint32_t)0x00000020)
+#define RTC_ALRMBR_ST_2                      ((uint32_t)0x00000040)
+#define RTC_ALRMBR_SU                        ((uint32_t)0x0000000F)
+#define RTC_ALRMBR_SU_0                      ((uint32_t)0x00000001)
+#define RTC_ALRMBR_SU_1                      ((uint32_t)0x00000002)
+#define RTC_ALRMBR_SU_2                      ((uint32_t)0x00000004)
+#define RTC_ALRMBR_SU_3                      ((uint32_t)0x00000008)
+
+/********************  Bits definition for RTC_WPR register  ******************/
+#define RTC_WPR_KEY                          ((uint32_t)0x000000FF)
+
+/********************  Bits definition for RTC_TSTR register  *****************/
+#define RTC_TSTR_PM                          ((uint32_t)0x00400000)
+#define RTC_TSTR_HT                          ((uint32_t)0x00300000)
+#define RTC_TSTR_HT_0                        ((uint32_t)0x00100000)
+#define RTC_TSTR_HT_1                        ((uint32_t)0x00200000)
+#define RTC_TSTR_HU                          ((uint32_t)0x000F0000)
+#define RTC_TSTR_HU_0                        ((uint32_t)0x00010000)
+#define RTC_TSTR_HU_1                        ((uint32_t)0x00020000)
+#define RTC_TSTR_HU_2                        ((uint32_t)0x00040000)
+#define RTC_TSTR_HU_3                        ((uint32_t)0x00080000)
+#define RTC_TSTR_MNT                         ((uint32_t)0x00007000)
+#define RTC_TSTR_MNT_0                       ((uint32_t)0x00001000)
+#define RTC_TSTR_MNT_1                       ((uint32_t)0x00002000)
+#define RTC_TSTR_MNT_2                       ((uint32_t)0x00004000)
+#define RTC_TSTR_MNU                         ((uint32_t)0x00000F00)
+#define RTC_TSTR_MNU_0                       ((uint32_t)0x00000100)
+#define RTC_TSTR_MNU_1                       ((uint32_t)0x00000200)
+#define RTC_TSTR_MNU_2                       ((uint32_t)0x00000400)
+#define RTC_TSTR_MNU_3                       ((uint32_t)0x00000800)
+#define RTC_TSTR_ST                          ((uint32_t)0x00000070)
+#define RTC_TSTR_ST_0                        ((uint32_t)0x00000010)
+#define RTC_TSTR_ST_1                        ((uint32_t)0x00000020)
+#define RTC_TSTR_ST_2                        ((uint32_t)0x00000040)
+#define RTC_TSTR_SU                          ((uint32_t)0x0000000F)
+#define RTC_TSTR_SU_0                        ((uint32_t)0x00000001)
+#define RTC_TSTR_SU_1                        ((uint32_t)0x00000002)
+#define RTC_TSTR_SU_2                        ((uint32_t)0x00000004)
+#define RTC_TSTR_SU_3                        ((uint32_t)0x00000008)
+
+/********************  Bits definition for RTC_TSDR register  *****************/
+#define RTC_TSDR_WDU                         ((uint32_t)0x0000E000)
+#define RTC_TSDR_WDU_0                       ((uint32_t)0x00002000)
+#define RTC_TSDR_WDU_1                       ((uint32_t)0x00004000)
+#define RTC_TSDR_WDU_2                       ((uint32_t)0x00008000)
+#define RTC_TSDR_MT                          ((uint32_t)0x00001000)
+#define RTC_TSDR_MU                          ((uint32_t)0x00000F00)
+#define RTC_TSDR_MU_0                        ((uint32_t)0x00000100)
+#define RTC_TSDR_MU_1                        ((uint32_t)0x00000200)
+#define RTC_TSDR_MU_2                        ((uint32_t)0x00000400)
+#define RTC_TSDR_MU_3                        ((uint32_t)0x00000800)
+#define RTC_TSDR_DT                          ((uint32_t)0x00000030)
+#define RTC_TSDR_DT_0                        ((uint32_t)0x00000010)
+#define RTC_TSDR_DT_1                        ((uint32_t)0x00000020)
+#define RTC_TSDR_DU                          ((uint32_t)0x0000000F)
+#define RTC_TSDR_DU_0                        ((uint32_t)0x00000001)
+#define RTC_TSDR_DU_1                        ((uint32_t)0x00000002)
+#define RTC_TSDR_DU_2                        ((uint32_t)0x00000004)
+#define RTC_TSDR_DU_3                        ((uint32_t)0x00000008)
+
+/********************  Bits definition for RTC_TAFCR register  ****************/
+#define RTC_TAFCR_ALARMOUTTYPE               ((uint32_t)0x00040000)
+#define RTC_TAFCR_TSINSEL                    ((uint32_t)0x00020000)
+#define RTC_TAFCR_TAMPINSEL                  ((uint32_t)0x00010000)
+#define RTC_TAFCR_TAMPIE                     ((uint32_t)0x00000004)
+#define RTC_TAFCR_TAMP1TRG                   ((uint32_t)0x00000002)
+#define RTC_TAFCR_TAMP1E                     ((uint32_t)0x00000001)
+
+/********************  Bits definition for RTC_BKP0R register  ****************/
+#define RTC_BKP0R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP1R register  ****************/
+#define RTC_BKP1R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP2R register  ****************/
+#define RTC_BKP2R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP3R register  ****************/
+#define RTC_BKP3R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP4R register  ****************/
+#define RTC_BKP4R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP5R register  ****************/
+#define RTC_BKP5R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP6R register  ****************/
+#define RTC_BKP6R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP7R register  ****************/
+#define RTC_BKP7R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP8R register  ****************/
+#define RTC_BKP8R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP9R register  ****************/
+#define RTC_BKP9R                            ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP10R register  ***************/
+#define RTC_BKP10R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP11R register  ***************/
+#define RTC_BKP11R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP12R register  ***************/
+#define RTC_BKP12R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP13R register  ***************/
+#define RTC_BKP13R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP14R register  ***************/
+#define RTC_BKP14R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP15R register  ***************/
+#define RTC_BKP15R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP16R register  ***************/
+#define RTC_BKP16R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP17R register  ***************/
+#define RTC_BKP17R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP18R register  ***************/
+#define RTC_BKP18R                           ((uint32_t)0xFFFFFFFF)
+
+/********************  Bits definition for RTC_BKP19R register  ***************/
+#define RTC_BKP19R                           ((uint32_t)0xFFFFFFFF)
+
+/******************************************************************************/
+/*                                                                            */
+/*                          SD host Interface                                 */
+/*                                                                            */
+/******************************************************************************/
+/******************  Bit definition for SDIO_POWER register  ******************/
+#define  SDIO_POWER_PWRCTRL                  ((uint8_t)0x03)               /*!<PWRCTRL[1:0] bits (Power supply control bits) */
+#define  SDIO_POWER_PWRCTRL_0                ((uint8_t)0x01)               /*!<Bit 0 */
+#define  SDIO_POWER_PWRCTRL_1                ((uint8_t)0x02)               /*!<Bit 1 */
+
+/******************  Bit definition for SDIO_CLKCR register  ******************/
+#define  SDIO_CLKCR_CLKDIV                   ((uint16_t)0x00FF)            /*!<Clock divide factor */
+#define  SDIO_CLKCR_CLKEN                    ((uint16_t)0x0100)            /*!<Clock enable bit */
+#define  SDIO_CLKCR_PWRSAV                   ((uint16_t)0x0200)            /*!<Power saving configuration bit */
+#define  SDIO_CLKCR_BYPASS                   ((uint16_t)0x0400)            /*!<Clock divider bypass enable bit */
+
+#define  SDIO_CLKCR_WIDBUS                   ((uint16_t)0x1800)            /*!<WIDBUS[1:0] bits (Wide bus mode enable bit) */
+#define  SDIO_CLKCR_WIDBUS_0                 ((uint16_t)0x0800)            /*!<Bit 0 */
+#define  SDIO_CLKCR_WIDBUS_1                 ((uint16_t)0x1000)            /*!<Bit 1 */
+
+#define  SDIO_CLKCR_NEGEDGE                  ((uint16_t)0x2000)            /*!<SDIO_CK dephasing selection bit */
+#define  SDIO_CLKCR_HWFC_EN                  ((uint16_t)0x4000)            /*!<HW Flow Control enable */
+
+/*******************  Bit definition for SDIO_ARG register  *******************/
+#define  SDIO_ARG_CMDARG                     ((uint32_t)0xFFFFFFFF)            /*!<Command argument */
+
+/*******************  Bit definition for SDIO_CMD register  *******************/
+#define  SDIO_CMD_CMDINDEX                   ((uint16_t)0x003F)            /*!<Command Index */
+
+#define  SDIO_CMD_WAITRESP                   ((uint16_t)0x00C0)            /*!<WAITRESP[1:0] bits (Wait for response bits) */
+#define  SDIO_CMD_WAITRESP_0                 ((uint16_t)0x0040)            /*!< Bit 0 */
+#define  SDIO_CMD_WAITRESP_1                 ((uint16_t)0x0080)            /*!< Bit 1 */
+
+#define  SDIO_CMD_WAITINT                    ((uint16_t)0x0100)            /*!<CPSM Waits for Interrupt Request */
+#define  SDIO_CMD_WAITPEND                   ((uint16_t)0x0200)            /*!<CPSM Waits for ends of data transfer (CmdPend internal signal) */
+#define  SDIO_CMD_CPSMEN                     ((uint16_t)0x0400)            /*!<Command path state machine (CPSM) Enable bit */
+#define  SDIO_CMD_SDIOSUSPEND                ((uint16_t)0x0800)            /*!<SD I/O suspend command */
+#define  SDIO_CMD_ENCMDCOMPL                 ((uint16_t)0x1000)            /*!<Enable CMD completion */
+#define  SDIO_CMD_NIEN                       ((uint16_t)0x2000)            /*!<Not Interrupt Enable */
+#define  SDIO_CMD_CEATACMD                   ((uint16_t)0x4000)            /*!<CE-ATA command */
+
+/*****************  Bit definition for SDIO_RESPCMD register  *****************/
+#define  SDIO_RESPCMD_RESPCMD                ((uint8_t)0x3F)               /*!<Response command index */
+
+/******************  Bit definition for SDIO_RESP0 register  ******************/
+#define  SDIO_RESP0_CARDSTATUS0              ((uint32_t)0xFFFFFFFF)        /*!<Card Status */
+
+/******************  Bit definition for SDIO_RESP1 register  ******************/
+#define  SDIO_RESP1_CARDSTATUS1              ((uint32_t)0xFFFFFFFF)        /*!<Card Status */
+
+/******************  Bit definition for SDIO_RESP2 register  ******************/
+#define  SDIO_RESP2_CARDSTATUS2              ((uint32_t)0xFFFFFFFF)        /*!<Card Status */
+
+/******************  Bit definition for SDIO_RESP3 register  ******************/
+#define  SDIO_RESP3_CARDSTATUS3              ((uint32_t)0xFFFFFFFF)        /*!<Card Status */
+
+/******************  Bit definition for SDIO_RESP4 register  ******************/
+#define  SDIO_RESP4_CARDSTATUS4              ((uint32_t)0xFFFFFFFF)        /*!<Card Status */
+
+/******************  Bit definition for SDIO_DTIMER register  *****************/
+#define  SDIO_DTIMER_DATATIME                ((uint32_t)0xFFFFFFFF)        /*!<Data timeout period. */
+
+/******************  Bit definition for SDIO_DLEN register  *******************/
+#define  SDIO_DLEN_DATALENGTH                ((uint32_t)0x01FFFFFF)        /*!<Data length value */
+
+/******************  Bit definition for SDIO_DCTRL register  ******************/
+#define  SDIO_DCTRL_DTEN                     ((uint16_t)0x0001)            /*!<Data transfer enabled bit */
+#define  SDIO_DCTRL_DTDIR                    ((uint16_t)0x0002)            /*!<Data transfer direction selection */
+#define  SDIO_DCTRL_DTMODE                   ((uint16_t)0x0004)            /*!<Data transfer mode selection */
+#define  SDIO_DCTRL_DMAEN                    ((uint16_t)0x0008)            /*!<DMA enabled bit */
+
+#define  SDIO_DCTRL_DBLOCKSIZE               ((uint16_t)0x00F0)            /*!<DBLOCKSIZE[3:0] bits (Data block size) */
+#define  SDIO_DCTRL_DBLOCKSIZE_0             ((uint16_t)0x0010)            /*!<Bit 0 */
+#define  SDIO_DCTRL_DBLOCKSIZE_1             ((uint16_t)0x0020)            /*!<Bit 1 */
+#define  SDIO_DCTRL_DBLOCKSIZE_2             ((uint16_t)0x0040)            /*!<Bit 2 */
+#define  SDIO_DCTRL_DBLOCKSIZE_3             ((uint16_t)0x0080)            /*!<Bit 3 */
+
+#define  SDIO_DCTRL_RWSTART                  ((uint16_t)0x0100)            /*!<Read wait start */
+#define  SDIO_DCTRL_RWSTOP                   ((uint16_t)0x0200)            /*!<Read wait stop */
+#define  SDIO_DCTRL_RWMOD                    ((uint16_t)0x0400)            /*!<Read wait mode */
+#define  SDIO_DCTRL_SDIOEN                   ((uint16_t)0x0800)            /*!<SD I/O enable functions */
+
+/******************  Bit definition for SDIO_DCOUNT register  *****************/
+#define  SDIO_DCOUNT_DATACOUNT               ((uint32_t)0x01FFFFFF)        /*!<Data count value */
+
+/******************  Bit definition for SDIO_STA register  ********************/
+#define  SDIO_STA_CCRCFAIL                   ((uint32_t)0x00000001)        /*!<Command response received (CRC check failed) */
+#define  SDIO_STA_DCRCFAIL                   ((uint32_t)0x00000002)        /*!<Data block sent/received (CRC check failed) */
+#define  SDIO_STA_CTIMEOUT                   ((uint32_t)0x00000004)        /*!<Command response timeout */
+#define  SDIO_STA_DTIMEOUT                   ((uint32_t)0x00000008)        /*!<Data timeout */
+#define  SDIO_STA_TXUNDERR                   ((uint32_t)0x00000010)        /*!<Transmit FIFO underrun error */
+#define  SDIO_STA_RXOVERR                    ((uint32_t)0x00000020)        /*!<Received FIFO overrun error */
+#define  SDIO_STA_CMDREND                    ((uint32_t)0x00000040)        /*!<Command response received (CRC check passed) */
+#define  SDIO_STA_CMDSENT                    ((uint32_t)0x00000080)        /*!<Command sent (no response required) */
+#define  SDIO_STA_DATAEND                    ((uint32_t)0x00000100)        /*!<Data end (data counter, SDIDCOUNT, is zero) */
+#define  SDIO_STA_STBITERR                   ((uint32_t)0x00000200)        /*!<Start bit not detected on all data signals in wide bus mode */
+#define  SDIO_STA_DBCKEND                    ((uint32_t)0x00000400)        /*!<Data block sent/received (CRC check passed) */
+#define  SDIO_STA_CMDACT                     ((uint32_t)0x00000800)        /*!<Command transfer in progress */
+#define  SDIO_STA_TXACT                      ((uint32_t)0x00001000)        /*!<Data transmit in progress */
+#define  SDIO_STA_RXACT                      ((uint32_t)0x00002000)        /*!<Data receive in progress */
+#define  SDIO_STA_TXFIFOHE                   ((uint32_t)0x00004000)        /*!<Transmit FIFO Half Empty: at least 8 words can be written into the FIFO */
+#define  SDIO_STA_RXFIFOHF                   ((uint32_t)0x00008000)        /*!<Receive FIFO Half Full: there are at least 8 words in the FIFO */
+#define  SDIO_STA_TXFIFOF                    ((uint32_t)0x00010000)        /*!<Transmit FIFO full */
+#define  SDIO_STA_RXFIFOF                    ((uint32_t)0x00020000)        /*!<Receive FIFO full */
+#define  SDIO_STA_TXFIFOE                    ((uint32_t)0x00040000)        /*!<Transmit FIFO empty */
+#define  SDIO_STA_RXFIFOE                    ((uint32_t)0x00080000)        /*!<Receive FIFO empty */
+#define  SDIO_STA_TXDAVL                     ((uint32_t)0x00100000)        /*!<Data available in transmit FIFO */
+#define  SDIO_STA_RXDAVL                     ((uint32_t)0x00200000)        /*!<Data available in receive FIFO */
+#define  SDIO_STA_SDIOIT                     ((uint32_t)0x00400000)        /*!<SDIO interrupt received */
+#define  SDIO_STA_CEATAEND                   ((uint32_t)0x00800000)        /*!<CE-ATA command completion signal received for CMD61 */
+
+/*******************  Bit definition for SDIO_ICR register  *******************/
+#define  SDIO_ICR_CCRCFAILC                  ((uint32_t)0x00000001)        /*!<CCRCFAIL flag clear bit */
+#define  SDIO_ICR_DCRCFAILC                  ((uint32_t)0x00000002)        /*!<DCRCFAIL flag clear bit */
+#define  SDIO_ICR_CTIMEOUTC                  ((uint32_t)0x00000004)        /*!<CTIMEOUT flag clear bit */
+#define  SDIO_ICR_DTIMEOUTC                  ((uint32_t)0x00000008)        /*!<DTIMEOUT flag clear bit */
+#define  SDIO_ICR_TXUNDERRC                  ((uint32_t)0x00000010)        /*!<TXUNDERR flag clear bit */
+#define  SDIO_ICR_RXOVERRC                   ((uint32_t)0x00000020)        /*!<RXOVERR flag clear bit */
+#define  SDIO_ICR_CMDRENDC                   ((uint32_t)0x00000040)        /*!<CMDREND flag clear bit */
+#define  SDIO_ICR_CMDSENTC                   ((uint32_t)0x00000080)        /*!<CMDSENT flag clear bit */
+#define  SDIO_ICR_DATAENDC                   ((uint32_t)0x00000100)        /*!<DATAEND flag clear bit */
+#define  SDIO_ICR_STBITERRC                  ((uint32_t)0x00000200)        /*!<STBITERR flag clear bit */
+#define  SDIO_ICR_DBCKENDC                   ((uint32_t)0x00000400)        /*!<DBCKEND flag clear bit */
+#define  SDIO_ICR_SDIOITC                    ((uint32_t)0x00400000)        /*!<SDIOIT flag clear bit */
+#define  SDIO_ICR_CEATAENDC                  ((uint32_t)0x00800000)        /*!<CEATAEND flag clear bit */
+
+/******************  Bit definition for SDIO_MASK register  *******************/
+#define  SDIO_MASK_CCRCFAILIE                ((uint32_t)0x00000001)        /*!<Command CRC Fail Interrupt Enable */
+#define  SDIO_MASK_DCRCFAILIE                ((uint32_t)0x00000002)        /*!<Data CRC Fail Interrupt Enable */
+#define  SDIO_MASK_CTIMEOUTIE                ((uint32_t)0x00000004)        /*!<Command TimeOut Interrupt Enable */
+#define  SDIO_MASK_DTIMEOUTIE                ((uint32_t)0x00000008)        /*!<Data TimeOut Interrupt Enable */
+#define  SDIO_MASK_TXUNDERRIE                ((uint32_t)0x00000010)        /*!<Tx FIFO UnderRun Error Interrupt Enable */
+#define  SDIO_MASK_RXOVERRIE                 ((uint32_t)0x00000020)        /*!<Rx FIFO OverRun Error Interrupt Enable */
+#define  SDIO_MASK_CMDRENDIE                 ((uint32_t)0x00000040)        /*!<Command Response Received Interrupt Enable */
+#define  SDIO_MASK_CMDSENTIE                 ((uint32_t)0x00000080)        /*!<Command Sent Interrupt Enable */
+#define  SDIO_MASK_DATAENDIE                 ((uint32_t)0x00000100)        /*!<Data End Interrupt Enable */
+#define  SDIO_MASK_STBITERRIE                ((uint32_t)0x00000200)        /*!<Start Bit Error Interrupt Enable */
+#define  SDIO_MASK_DBCKENDIE                 ((uint32_t)0x00000400)        /*!<Data Block End Interrupt Enable */
+#define  SDIO_MASK_CMDACTIE                  ((uint32_t)0x00000800)        /*!<CCommand Acting Interrupt Enable */
+#define  SDIO_MASK_TXACTIE                   ((uint32_t)0x00001000)        /*!<Data Transmit Acting Interrupt Enable */
+#define  SDIO_MASK_RXACTIE                   ((uint32_t)0x00002000)        /*!<Data receive acting interrupt enabled */
+#define  SDIO_MASK_TXFIFOHEIE                ((uint32_t)0x00004000)        /*!<Tx FIFO Half Empty interrupt Enable */
+#define  SDIO_MASK_RXFIFOHFIE                ((uint32_t)0x00008000)        /*!<Rx FIFO Half Full interrupt Enable */
+#define  SDIO_MASK_TXFIFOFIE                 ((uint32_t)0x00010000)        /*!<Tx FIFO Full interrupt Enable */
+#define  SDIO_MASK_RXFIFOFIE                 ((uint32_t)0x00020000)        /*!<Rx FIFO Full interrupt Enable */
+#define  SDIO_MASK_TXFIFOEIE                 ((uint32_t)0x00040000)        /*!<Tx FIFO Empty interrupt Enable */
+#define  SDIO_MASK_RXFIFOEIE                 ((uint32_t)0x00080000)        /*!<Rx FIFO Empty interrupt Enable */
+#define  SDIO_MASK_TXDAVLIE                  ((uint32_t)0x00100000)        /*!<Data available in Tx FIFO interrupt Enable */
+#define  SDIO_MASK_RXDAVLIE                  ((uint32_t)0x00200000)        /*!<Data available in Rx FIFO interrupt Enable */
+#define  SDIO_MASK_SDIOITIE                  ((uint32_t)0x00400000)        /*!<SDIO Mode Interrupt Received interrupt Enable */
+#define  SDIO_MASK_CEATAENDIE                ((uint32_t)0x00800000)        /*!<CE-ATA command completion signal received Interrupt Enable */
+
+/*****************  Bit definition for SDIO_FIFOCNT register  *****************/
+#define  SDIO_FIFOCNT_FIFOCOUNT              ((uint32_t)0x00FFFFFF)        /*!<Remaining number of words to be written to or read from the FIFO */
+
+/******************  Bit definition for SDIO_FIFO register  *******************/
+#define  SDIO_FIFO_FIFODATA                  ((uint32_t)0xFFFFFFFF)        /*!<Receive and transmit FIFO data */
+
+/******************************************************************************/
+/*                                                                            */
+/*                        Serial Peripheral Interface                         */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bit definition for SPI_CR1 register  ********************/
+#define  SPI_CR1_CPHA                        ((uint16_t)0x0001)            /*!<Clock Phase */
+#define  SPI_CR1_CPOL                        ((uint16_t)0x0002)            /*!<Clock Polarity */
+#define  SPI_CR1_MSTR                        ((uint16_t)0x0004)            /*!<Master Selection */
+
+#define  SPI_CR1_BR                          ((uint16_t)0x0038)            /*!<BR[2:0] bits (Baud Rate Control) */
+#define  SPI_CR1_BR_0                        ((uint16_t)0x0008)            /*!<Bit 0 */
+#define  SPI_CR1_BR_1                        ((uint16_t)0x0010)            /*!<Bit 1 */
+#define  SPI_CR1_BR_2                        ((uint16_t)0x0020)            /*!<Bit 2 */
+
+#define  SPI_CR1_SPE                         ((uint16_t)0x0040)            /*!<SPI Enable */
+#define  SPI_CR1_LSBFIRST                    ((uint16_t)0x0080)            /*!<Frame Format */
+#define  SPI_CR1_SSI                         ((uint16_t)0x0100)            /*!<Internal slave select */
+#define  SPI_CR1_SSM                         ((uint16_t)0x0200)            /*!<Software slave management */
+#define  SPI_CR1_RXONLY                      ((uint16_t)0x0400)            /*!<Receive only */
+#define  SPI_CR1_DFF                         ((uint16_t)0x0800)            /*!<Data Frame Format */
+#define  SPI_CR1_CRCNEXT                     ((uint16_t)0x1000)            /*!<Transmit CRC next */
+#define  SPI_CR1_CRCEN                       ((uint16_t)0x2000)            /*!<Hardware CRC calculation enable */
+#define  SPI_CR1_BIDIOE                      ((uint16_t)0x4000)            /*!<Output enable in bidirectional mode */
+#define  SPI_CR1_BIDIMODE                    ((uint16_t)0x8000)            /*!<Bidirectional data mode enable */
+
+/*******************  Bit definition for SPI_CR2 register  ********************/
+#define  SPI_CR2_RXDMAEN                     ((uint8_t)0x01)               /*!<Rx Buffer DMA Enable */
+#define  SPI_CR2_TXDMAEN                     ((uint8_t)0x02)               /*!<Tx Buffer DMA Enable */
+#define  SPI_CR2_SSOE                        ((uint8_t)0x04)               /*!<SS Output Enable */
+#define  SPI_CR2_ERRIE                       ((uint8_t)0x20)               /*!<Error Interrupt Enable */
+#define  SPI_CR2_RXNEIE                      ((uint8_t)0x40)               /*!<RX buffer Not Empty Interrupt Enable */
+#define  SPI_CR2_TXEIE                       ((uint8_t)0x80)               /*!<Tx buffer Empty Interrupt Enable */
+
+/********************  Bit definition for SPI_SR register  ********************/
+#define  SPI_SR_RXNE                         ((uint8_t)0x01)               /*!<Receive buffer Not Empty */
+#define  SPI_SR_TXE                          ((uint8_t)0x02)               /*!<Transmit buffer Empty */
+#define  SPI_SR_CHSIDE                       ((uint8_t)0x04)               /*!<Channel side */
+#define  SPI_SR_UDR                          ((uint8_t)0x08)               /*!<Underrun flag */
+#define  SPI_SR_CRCERR                       ((uint8_t)0x10)               /*!<CRC Error flag */
+#define  SPI_SR_MODF                         ((uint8_t)0x20)               /*!<Mode fault */
+#define  SPI_SR_OVR                          ((uint8_t)0x40)               /*!<Overrun flag */
+#define  SPI_SR_BSY                          ((uint8_t)0x80)               /*!<Busy flag */
+
+/********************  Bit definition for SPI_DR register  ********************/
+#define  SPI_DR_DR                           ((uint16_t)0xFFFF)            /*!<Data Register */
+
+/*******************  Bit definition for SPI_CRCPR register  ******************/
+#define  SPI_CRCPR_CRCPOLY                   ((uint16_t)0xFFFF)            /*!<CRC polynomial register */
+
+/******************  Bit definition for SPI_RXCRCR register  ******************/
+#define  SPI_RXCRCR_RXCRC                    ((uint16_t)0xFFFF)            /*!<Rx CRC Register */
+
+/******************  Bit definition for SPI_TXCRCR register  ******************/
+#define  SPI_TXCRCR_TXCRC                    ((uint16_t)0xFFFF)            /*!<Tx CRC Register */
+
+/******************  Bit definition for SPI_I2SCFGR register  *****************/
+#define  SPI_I2SCFGR_CHLEN                   ((uint16_t)0x0001)            /*!<Channel length (number of bits per audio channel) */
+
+#define  SPI_I2SCFGR_DATLEN                  ((uint16_t)0x0006)            /*!<DATLEN[1:0] bits (Data length to be transferred) */
+#define  SPI_I2SCFGR_DATLEN_0                ((uint16_t)0x0002)            /*!<Bit 0 */
+#define  SPI_I2SCFGR_DATLEN_1                ((uint16_t)0x0004)            /*!<Bit 1 */
+
+#define  SPI_I2SCFGR_CKPOL                   ((uint16_t)0x0008)            /*!<steady state clock polarity */
+
+#define  SPI_I2SCFGR_I2SSTD                  ((uint16_t)0x0030)            /*!<I2SSTD[1:0] bits (I2S standard selection) */
+#define  SPI_I2SCFGR_I2SSTD_0                ((uint16_t)0x0010)            /*!<Bit 0 */
+#define  SPI_I2SCFGR_I2SSTD_1                ((uint16_t)0x0020)            /*!<Bit 1 */
+
+#define  SPI_I2SCFGR_PCMSYNC                 ((uint16_t)0x0080)            /*!<PCM frame synchronization */
+
+#define  SPI_I2SCFGR_I2SCFG                  ((uint16_t)0x0300)            /*!<I2SCFG[1:0] bits (I2S configuration mode) */
+#define  SPI_I2SCFGR_I2SCFG_0                ((uint16_t)0x0100)            /*!<Bit 0 */
+#define  SPI_I2SCFGR_I2SCFG_1                ((uint16_t)0x0200)            /*!<Bit 1 */
+
+#define  SPI_I2SCFGR_I2SE                    ((uint16_t)0x0400)            /*!<I2S Enable */
+#define  SPI_I2SCFGR_I2SMOD                  ((uint16_t)0x0800)            /*!<I2S mode selection */
+
+/******************  Bit definition for SPI_I2SPR register  *******************/
+#define  SPI_I2SPR_I2SDIV                    ((uint16_t)0x00FF)            /*!<I2S Linear prescaler */
+#define  SPI_I2SPR_ODD                       ((uint16_t)0x0100)            /*!<Odd factor for the prescaler */
+#define  SPI_I2SPR_MCKOE                     ((uint16_t)0x0200)            /*!<Master Clock Output Enable */
+
+/******************************************************************************/
+/*                                                                            */
+/*                                 SYSCFG                                     */
+/*                                                                            */
+/******************************************************************************/
+/******************  Bit definition for SYSCFG_MEMRMP register  ***************/  
+#define SYSCFG_MEMRMP_MEM_MODE          ((uint32_t)0x00000003) /*!<SYSCFG_Memory Remap Config */
+#define SYSCFG_MEMRMP_MEM_MODE_0        ((uint32_t)0x00000001)
+#define SYSCFG_MEMRMP_MEM_MODE_1        ((uint32_t)0x00000002)
+
+/******************  Bit definition for SYSCFG_PMC register  ******************/
+#define SYSCFG_PMC_MII_RMII            ((uint16_t)0x0080) /*!<Ethernet PHY interface selection */
+
+/*****************  Bit definition for SYSCFG_EXTICR1 register  ***************/
+#define SYSCFG_EXTICR1_EXTI0            ((uint16_t)0x000F) /*!<EXTI 0 configuration */
+#define SYSCFG_EXTICR1_EXTI1            ((uint16_t)0x00F0) /*!<EXTI 1 configuration */
+#define SYSCFG_EXTICR1_EXTI2            ((uint16_t)0x0F00) /*!<EXTI 2 configuration */
+#define SYSCFG_EXTICR1_EXTI3            ((uint16_t)0xF000) /*!<EXTI 3 configuration */
+/** 
+  * @brief   EXTI0 configuration  
+  */ 
+#define SYSCFG_EXTICR1_EXTI0_PA         ((uint16_t)0x0000) /*!<PA[0] pin */
+#define SYSCFG_EXTICR1_EXTI0_PB         ((uint16_t)0x0001) /*!<PB[0] pin */
+#define SYSCFG_EXTICR1_EXTI0_PC         ((uint16_t)0x0002) /*!<PC[0] pin */
+#define SYSCFG_EXTICR1_EXTI0_PD         ((uint16_t)0x0003) /*!<PD[0] pin */
+#define SYSCFG_EXTICR1_EXTI0_PE         ((uint16_t)0x0004) /*!<PE[0] pin */
+#define SYSCFG_EXTICR1_EXTI0_PF         ((uint16_t)0x0005) /*!<PF[0] pin */
+#define SYSCFG_EXTICR1_EXTI0_PG         ((uint16_t)0x0006) /*!<PG[0] pin */
+#define SYSCFG_EXTICR1_EXTI0_PH         ((uint16_t)0x0007) /*!<PH[0] pin */
+#define SYSCFG_EXTICR1_EXTI0_PI         ((uint16_t)0x0008) /*!<PI[0] pin */
+/** 
+  * @brief   EXTI1 configuration  
+  */ 
+#define SYSCFG_EXTICR1_EXTI1_PA         ((uint16_t)0x0000) /*!<PA[1] pin */
+#define SYSCFG_EXTICR1_EXTI1_PB         ((uint16_t)0x0010) /*!<PB[1] pin */
+#define SYSCFG_EXTICR1_EXTI1_PC         ((uint16_t)0x0020) /*!<PC[1] pin */
+#define SYSCFG_EXTICR1_EXTI1_PD         ((uint16_t)0x0030) /*!<PD[1] pin */
+#define SYSCFG_EXTICR1_EXTI1_PE         ((uint16_t)0x0040) /*!<PE[1] pin */
+#define SYSCFG_EXTICR1_EXTI1_PF         ((uint16_t)0x0050) /*!<PF[1] pin */
+#define SYSCFG_EXTICR1_EXTI1_PG         ((uint16_t)0x0060) /*!<PG[1] pin */
+#define SYSCFG_EXTICR1_EXTI1_PH         ((uint16_t)0x0070) /*!<PH[1] pin */
+#define SYSCFG_EXTICR1_EXTI1_PI         ((uint16_t)0x0080) /*!<PI[1] pin */
+/** 
+  * @brief   EXTI2 configuration  
+  */ 
+#define SYSCFG_EXTICR1_EXTI2_PA         ((uint16_t)0x0000) /*!<PA[2] pin */
+#define SYSCFG_EXTICR1_EXTI2_PB         ((uint16_t)0x0100) /*!<PB[2] pin */
+#define SYSCFG_EXTICR1_EXTI2_PC         ((uint16_t)0x0200) /*!<PC[2] pin */
+#define SYSCFG_EXTICR1_EXTI2_PD         ((uint16_t)0x0300) /*!<PD[2] pin */
+#define SYSCFG_EXTICR1_EXTI2_PE         ((uint16_t)0x0400) /*!<PE[2] pin */
+#define SYSCFG_EXTICR1_EXTI2_PF         ((uint16_t)0x0500) /*!<PF[2] pin */
+#define SYSCFG_EXTICR1_EXTI2_PG         ((uint16_t)0x0600) /*!<PG[2] pin */
+#define SYSCFG_EXTICR1_EXTI2_PH         ((uint16_t)0x0700) /*!<PH[2] pin */
+#define SYSCFG_EXTICR1_EXTI2_PI         ((uint16_t)0x0800) /*!<PI[2] pin */
+/** 
+  * @brief   EXTI3 configuration  
+  */ 
+#define SYSCFG_EXTICR1_EXTI3_PA         ((uint16_t)0x0000) /*!<PA[3] pin */
+#define SYSCFG_EXTICR1_EXTI3_PB         ((uint16_t)0x1000) /*!<PB[3] pin */
+#define SYSCFG_EXTICR1_EXTI3_PC         ((uint16_t)0x2000) /*!<PC[3] pin */
+#define SYSCFG_EXTICR1_EXTI3_PD         ((uint16_t)0x3000) /*!<PD[3] pin */
+#define SYSCFG_EXTICR1_EXTI3_PE         ((uint16_t)0x4000) /*!<PE[3] pin */
+#define SYSCFG_EXTICR1_EXTI3_PF         ((uint16_t)0x5000) /*!<PF[3] pin */
+#define SYSCFG_EXTICR1_EXTI3_PG         ((uint16_t)0x6000) /*!<PG[3] pin */
+#define SYSCFG_EXTICR1_EXTI3_PH         ((uint16_t)0x7000) /*!<PH[3] pin */
+#define SYSCFG_EXTICR1_EXTI3_PI         ((uint16_t)0x8000) /*!<PI[3] pin */
+
+/*****************  Bit definition for SYSCFG_EXTICR2 register  ***************/
+#define SYSCFG_EXTICR2_EXTI4            ((uint16_t)0x000F) /*!<EXTI 4 configuration */
+#define SYSCFG_EXTICR2_EXTI5            ((uint16_t)0x00F0) /*!<EXTI 5 configuration */
+#define SYSCFG_EXTICR2_EXTI6            ((uint16_t)0x0F00) /*!<EXTI 6 configuration */
+#define SYSCFG_EXTICR2_EXTI7            ((uint16_t)0xF000) /*!<EXTI 7 configuration */
+/** 
+  * @brief   EXTI4 configuration  
+  */ 
+#define SYSCFG_EXTICR2_EXTI4_PA         ((uint16_t)0x0000) /*!<PA[4] pin */
+#define SYSCFG_EXTICR2_EXTI4_PB         ((uint16_t)0x0001) /*!<PB[4] pin */
+#define SYSCFG_EXTICR2_EXTI4_PC         ((uint16_t)0x0002) /*!<PC[4] pin */
+#define SYSCFG_EXTICR2_EXTI4_PD         ((uint16_t)0x0003) /*!<PD[4] pin */
+#define SYSCFG_EXTICR2_EXTI4_PE         ((uint16_t)0x0004) /*!<PE[4] pin */
+#define SYSCFG_EXTICR2_EXTI4_PF         ((uint16_t)0x0005) /*!<PF[4] pin */
+#define SYSCFG_EXTICR2_EXTI4_PG         ((uint16_t)0x0006) /*!<PG[4] pin */
+#define SYSCFG_EXTICR2_EXTI4_PH         ((uint16_t)0x0007) /*!<PH[4] pin */
+#define SYSCFG_EXTICR2_EXTI4_PI         ((uint16_t)0x0008) /*!<PI[4] pin */
+/** 
+  * @brief   EXTI5 configuration  
+  */ 
+#define SYSCFG_EXTICR2_EXTI5_PA         ((uint16_t)0x0000) /*!<PA[5] pin */
+#define SYSCFG_EXTICR2_EXTI5_PB         ((uint16_t)0x0010) /*!<PB[5] pin */
+#define SYSCFG_EXTICR2_EXTI5_PC         ((uint16_t)0x0020) /*!<PC[5] pin */
+#define SYSCFG_EXTICR2_EXTI5_PD         ((uint16_t)0x0030) /*!<PD[5] pin */
+#define SYSCFG_EXTICR2_EXTI5_PE         ((uint16_t)0x0040) /*!<PE[5] pin */
+#define SYSCFG_EXTICR2_EXTI5_PF         ((uint16_t)0x0050) /*!<PF[5] pin */
+#define SYSCFG_EXTICR2_EXTI5_PG         ((uint16_t)0x0060) /*!<PG[5] pin */
+#define SYSCFG_EXTICR2_EXTI5_PH         ((uint16_t)0x0070) /*!<PH[5] pin */
+#define SYSCFG_EXTICR2_EXTI5_PI         ((uint16_t)0x0080) /*!<PI[5] pin */
+/** 
+  * @brief   EXTI6 configuration  
+  */ 
+#define SYSCFG_EXTICR2_EXTI6_PA         ((uint16_t)0x0000) /*!<PA[6] pin */
+#define SYSCFG_EXTICR2_EXTI6_PB         ((uint16_t)0x0100) /*!<PB[6] pin */
+#define SYSCFG_EXTICR2_EXTI6_PC         ((uint16_t)0x0200) /*!<PC[6] pin */
+#define SYSCFG_EXTICR2_EXTI6_PD         ((uint16_t)0x0300) /*!<PD[6] pin */
+#define SYSCFG_EXTICR2_EXTI6_PE         ((uint16_t)0x0400) /*!<PE[6] pin */
+#define SYSCFG_EXTICR2_EXTI6_PF         ((uint16_t)0x0500) /*!<PF[6] pin */
+#define SYSCFG_EXTICR2_EXTI6_PG         ((uint16_t)0x0600) /*!<PG[6] pin */
+#define SYSCFG_EXTICR2_EXTI6_PH         ((uint16_t)0x0700) /*!<PH[6] pin */
+#define SYSCFG_EXTICR2_EXTI6_PI         ((uint16_t)0x0800) /*!<PI[6] pin */
+/** 
+  * @brief   EXTI7 configuration  
+  */ 
+#define SYSCFG_EXTICR2_EXTI7_PA         ((uint16_t)0x0000) /*!<PA[7] pin */
+#define SYSCFG_EXTICR2_EXTI7_PB         ((uint16_t)0x1000) /*!<PB[7] pin */
+#define SYSCFG_EXTICR2_EXTI7_PC         ((uint16_t)0x2000) /*!<PC[7] pin */
+#define SYSCFG_EXTICR2_EXTI7_PD         ((uint16_t)0x3000) /*!<PD[7] pin */
+#define SYSCFG_EXTICR2_EXTI7_PE         ((uint16_t)0x4000) /*!<PE[7] pin */
+#define SYSCFG_EXTICR2_EXTI7_PF         ((uint16_t)0x5000) /*!<PF[7] pin */
+#define SYSCFG_EXTICR2_EXTI7_PG         ((uint16_t)0x6000) /*!<PG[7] pin */
+#define SYSCFG_EXTICR2_EXTI7_PH         ((uint16_t)0x7000) /*!<PH[7] pin */
+#define SYSCFG_EXTICR2_EXTI7_PI         ((uint16_t)0x8000) /*!<PI[7] pin */
+
+/*****************  Bit definition for SYSCFG_EXTICR3 register  ***************/
+#define SYSCFG_EXTICR3_EXTI8            ((uint16_t)0x000F) /*!<EXTI 8 configuration */
+#define SYSCFG_EXTICR3_EXTI9            ((uint16_t)0x00F0) /*!<EXTI 9 configuration */
+#define SYSCFG_EXTICR3_EXTI10           ((uint16_t)0x0F00) /*!<EXTI 10 configuration */
+#define SYSCFG_EXTICR3_EXTI11           ((uint16_t)0xF000) /*!<EXTI 11 configuration */
+           
+/** 
+  * @brief   EXTI8 configuration  
+  */ 
+#define SYSCFG_EXTICR3_EXTI8_PA         ((uint16_t)0x0000) /*!<PA[8] pin */
+#define SYSCFG_EXTICR3_EXTI8_PB         ((uint16_t)0x0001) /*!<PB[8] pin */
+#define SYSCFG_EXTICR3_EXTI8_PC         ((uint16_t)0x0002) /*!<PC[8] pin */
+#define SYSCFG_EXTICR3_EXTI8_PD         ((uint16_t)0x0003) /*!<PD[8] pin */
+#define SYSCFG_EXTICR3_EXTI8_PE         ((uint16_t)0x0004) /*!<PE[8] pin */
+#define SYSCFG_EXTICR3_EXTI8_PF         ((uint16_t)0x0005) /*!<PF[8] pin */
+#define SYSCFG_EXTICR3_EXTI8_PG         ((uint16_t)0x0006) /*!<PG[8] pin */
+#define SYSCFG_EXTICR3_EXTI8_PH         ((uint16_t)0x0007) /*!<PH[8] pin */
+#define SYSCFG_EXTICR3_EXTI8_PI         ((uint16_t)0x0008) /*!<PI[8] pin */
+/** 
+  * @brief   EXTI9 configuration  
+  */ 
+#define SYSCFG_EXTICR3_EXTI9_PA         ((uint16_t)0x0000) /*!<PA[9] pin */
+#define SYSCFG_EXTICR3_EXTI9_PB         ((uint16_t)0x0010) /*!<PB[9] pin */
+#define SYSCFG_EXTICR3_EXTI9_PC         ((uint16_t)0x0020) /*!<PC[9] pin */
+#define SYSCFG_EXTICR3_EXTI9_PD         ((uint16_t)0x0030) /*!<PD[9] pin */
+#define SYSCFG_EXTICR3_EXTI9_PE         ((uint16_t)0x0040) /*!<PE[9] pin */
+#define SYSCFG_EXTICR3_EXTI9_PF         ((uint16_t)0x0050) /*!<PF[9] pin */
+#define SYSCFG_EXTICR3_EXTI9_PG         ((uint16_t)0x0060) /*!<PG[9] pin */
+#define SYSCFG_EXTICR3_EXTI9_PH         ((uint16_t)0x0070) /*!<PH[9] pin */
+#define SYSCFG_EXTICR3_EXTI9_PI         ((uint16_t)0x0080) /*!<PI[9] pin */
+/** 
+  * @brief   EXTI10 configuration  
+  */ 
+#define SYSCFG_EXTICR3_EXTI10_PA        ((uint16_t)0x0000) /*!<PA[10] pin */
+#define SYSCFG_EXTICR3_EXTI10_PB        ((uint16_t)0x0100) /*!<PB[10] pin */
+#define SYSCFG_EXTICR3_EXTI10_PC        ((uint16_t)0x0200) /*!<PC[10] pin */
+#define SYSCFG_EXTICR3_EXTI10_PD        ((uint16_t)0x0300) /*!<PD[10] pin */
+#define SYSCFG_EXTICR3_EXTI10_PE        ((uint16_t)0x0400) /*!<PE[10] pin */
+#define SYSCFG_EXTICR3_EXTI10_PF        ((uint16_t)0x0500) /*!<PF[10] pin */
+#define SYSCFG_EXTICR3_EXTI10_PG        ((uint16_t)0x0600) /*!<PG[10] pin */
+#define SYSCFG_EXTICR3_EXTI10_PH        ((uint16_t)0x0700) /*!<PH[10] pin */
+#define SYSCFG_EXTICR3_EXTI10_PI        ((uint16_t)0x0800) /*!<PI[10] pin */
+/** 
+  * @brief   EXTI11 configuration  
+  */ 
+#define SYSCFG_EXTICR3_EXTI11_PA        ((uint16_t)0x0000) /*!<PA[11] pin */
+#define SYSCFG_EXTICR3_EXTI11_PB        ((uint16_t)0x1000) /*!<PB[11] pin */
+#define SYSCFG_EXTICR3_EXTI11_PC        ((uint16_t)0x2000) /*!<PC[11] pin */
+#define SYSCFG_EXTICR3_EXTI11_PD        ((uint16_t)0x3000) /*!<PD[11] pin */
+#define SYSCFG_EXTICR3_EXTI11_PE        ((uint16_t)0x4000) /*!<PE[11] pin */
+#define SYSCFG_EXTICR3_EXTI11_PF        ((uint16_t)0x5000) /*!<PF[11] pin */
+#define SYSCFG_EXTICR3_EXTI11_PG        ((uint16_t)0x6000) /*!<PG[11] pin */
+#define SYSCFG_EXTICR3_EXTI11_PH        ((uint16_t)0x7000) /*!<PH[11] pin */
+#define SYSCFG_EXTICR3_EXTI11_PI        ((uint16_t)0x8000) /*!<PI[11] pin */
+
+/*****************  Bit definition for SYSCFG_EXTICR4 register  ***************/
+#define SYSCFG_EXTICR4_EXTI12           ((uint16_t)0x000F) /*!<EXTI 12 configuration */
+#define SYSCFG_EXTICR4_EXTI13           ((uint16_t)0x00F0) /*!<EXTI 13 configuration */
+#define SYSCFG_EXTICR4_EXTI14           ((uint16_t)0x0F00) /*!<EXTI 14 configuration */
+#define SYSCFG_EXTICR4_EXTI15           ((uint16_t)0xF000) /*!<EXTI 15 configuration */
+/** 
+  * @brief   EXTI12 configuration  
+  */ 
+#define SYSCFG_EXTICR4_EXTI12_PA        ((uint16_t)0x0000) /*!<PA[12] pin */
+#define SYSCFG_EXTICR4_EXTI12_PB        ((uint16_t)0x0001) /*!<PB[12] pin */
+#define SYSCFG_EXTICR4_EXTI12_PC        ((uint16_t)0x0002) /*!<PC[12] pin */
+#define SYSCFG_EXTICR4_EXTI12_PD        ((uint16_t)0x0003) /*!<PD[12] pin */
+#define SYSCFG_EXTICR4_EXTI12_PE        ((uint16_t)0x0004) /*!<PE[12] pin */
+#define SYSCFG_EXTICR4_EXTI12_PF        ((uint16_t)0x0005) /*!<PF[12] pin */
+#define SYSCFG_EXTICR4_EXTI12_PG        ((uint16_t)0x0006) /*!<PG[12] pin */
+#define SYSCFG_EXTICR3_EXTI12_PH        ((uint16_t)0x0007) /*!<PH[12] pin */
+/** 
+  * @brief   EXTI13 configuration  
+  */ 
+#define SYSCFG_EXTICR4_EXTI13_PA        ((uint16_t)0x0000) /*!<PA[13] pin */
+#define SYSCFG_EXTICR4_EXTI13_PB        ((uint16_t)0x0010) /*!<PB[13] pin */
+#define SYSCFG_EXTICR4_EXTI13_PC        ((uint16_t)0x0020) /*!<PC[13] pin */
+#define SYSCFG_EXTICR4_EXTI13_PD        ((uint16_t)0x0030) /*!<PD[13] pin */
+#define SYSCFG_EXTICR4_EXTI13_PE        ((uint16_t)0x0040) /*!<PE[13] pin */
+#define SYSCFG_EXTICR4_EXTI13_PF        ((uint16_t)0x0050) /*!<PF[13] pin */
+#define SYSCFG_EXTICR4_EXTI13_PG        ((uint16_t)0x0060) /*!<PG[13] pin */
+#define SYSCFG_EXTICR3_EXTI13_PH        ((uint16_t)0x0070) /*!<PH[13] pin */
+/** 
+  * @brief   EXTI14 configuration  
+  */ 
+#define SYSCFG_EXTICR4_EXTI14_PA        ((uint16_t)0x0000) /*!<PA[14] pin */
+#define SYSCFG_EXTICR4_EXTI14_PB        ((uint16_t)0x0100) /*!<PB[14] pin */
+#define SYSCFG_EXTICR4_EXTI14_PC        ((uint16_t)0x0200) /*!<PC[14] pin */
+#define SYSCFG_EXTICR4_EXTI14_PD        ((uint16_t)0x0300) /*!<PD[14] pin */
+#define SYSCFG_EXTICR4_EXTI14_PE        ((uint16_t)0x0400) /*!<PE[14] pin */
+#define SYSCFG_EXTICR4_EXTI14_PF        ((uint16_t)0x0500) /*!<PF[14] pin */
+#define SYSCFG_EXTICR4_EXTI14_PG        ((uint16_t)0x0600) /*!<PG[14] pin */
+#define SYSCFG_EXTICR3_EXTI14_PH        ((uint16_t)0x0700) /*!<PH[14] pin */
+/** 
+  * @brief   EXTI15 configuration  
+  */ 
+#define SYSCFG_EXTICR4_EXTI15_PA        ((uint16_t)0x0000) /*!<PA[15] pin */
+#define SYSCFG_EXTICR4_EXTI15_PB        ((uint16_t)0x1000) /*!<PB[15] pin */
+#define SYSCFG_EXTICR4_EXTI15_PC        ((uint16_t)0x2000) /*!<PC[15] pin */
+#define SYSCFG_EXTICR4_EXTI15_PD        ((uint16_t)0x3000) /*!<PD[15] pin */
+#define SYSCFG_EXTICR4_EXTI15_PE        ((uint16_t)0x4000) /*!<PE[15] pin */
+#define SYSCFG_EXTICR4_EXTI15_PF        ((uint16_t)0x5000) /*!<PF[15] pin */
+#define SYSCFG_EXTICR4_EXTI15_PG        ((uint16_t)0x6000) /*!<PG[15] pin */
+#define SYSCFG_EXTICR3_EXTI15_PH        ((uint16_t)0x7000) /*!<PH[15] pin */
+
+/******************  Bit definition for SYSCFG_CMPCR register  ****************/  
+#define SYSCFG_CMPCR_CMP_PD             ((uint32_t)0x00000001) /*!<Compensation cell ready flag */
+#define SYSCFG_CMPCR_READY              ((uint32_t)0x00000100) /*!<Compensation cell power-down */
+
+/******************************************************************************/
+/*                                                                            */
+/*                                    TIM                                     */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bit definition for TIM_CR1 register  ********************/
+#define  TIM_CR1_CEN                         ((uint16_t)0x0001)            /*!<Counter enable */
+#define  TIM_CR1_UDIS                        ((uint16_t)0x0002)            /*!<Update disable */
+#define  TIM_CR1_URS                         ((uint16_t)0x0004)            /*!<Update request source */
+#define  TIM_CR1_OPM                         ((uint16_t)0x0008)            /*!<One pulse mode */
+#define  TIM_CR1_DIR                         ((uint16_t)0x0010)            /*!<Direction */
+
+#define  TIM_CR1_CMS                         ((uint16_t)0x0060)            /*!<CMS[1:0] bits (Center-aligned mode selection) */
+#define  TIM_CR1_CMS_0                       ((uint16_t)0x0020)            /*!<Bit 0 */
+#define  TIM_CR1_CMS_1                       ((uint16_t)0x0040)            /*!<Bit 1 */
+
+#define  TIM_CR1_ARPE                        ((uint16_t)0x0080)            /*!<Auto-reload preload enable */
+
+#define  TIM_CR1_CKD                         ((uint16_t)0x0300)            /*!<CKD[1:0] bits (clock division) */
+#define  TIM_CR1_CKD_0                       ((uint16_t)0x0100)            /*!<Bit 0 */
+#define  TIM_CR1_CKD_1                       ((uint16_t)0x0200)            /*!<Bit 1 */
+
+/*******************  Bit definition for TIM_CR2 register  ********************/
+#define  TIM_CR2_CCPC                        ((uint16_t)0x0001)            /*!<Capture/Compare Preloaded Control */
+#define  TIM_CR2_CCUS                        ((uint16_t)0x0004)            /*!<Capture/Compare Control Update Selection */
+#define  TIM_CR2_CCDS                        ((uint16_t)0x0008)            /*!<Capture/Compare DMA Selection */
+
+#define  TIM_CR2_MMS                         ((uint16_t)0x0070)            /*!<MMS[2:0] bits (Master Mode Selection) */
+#define  TIM_CR2_MMS_0                       ((uint16_t)0x0010)            /*!<Bit 0 */
+#define  TIM_CR2_MMS_1                       ((uint16_t)0x0020)            /*!<Bit 1 */
+#define  TIM_CR2_MMS_2                       ((uint16_t)0x0040)            /*!<Bit 2 */
+
+#define  TIM_CR2_TI1S                        ((uint16_t)0x0080)            /*!<TI1 Selection */
+#define  TIM_CR2_OIS1                        ((uint16_t)0x0100)            /*!<Output Idle state 1 (OC1 output) */
+#define  TIM_CR2_OIS1N                       ((uint16_t)0x0200)            /*!<Output Idle state 1 (OC1N output) */
+#define  TIM_CR2_OIS2                        ((uint16_t)0x0400)            /*!<Output Idle state 2 (OC2 output) */
+#define  TIM_CR2_OIS2N                       ((uint16_t)0x0800)            /*!<Output Idle state 2 (OC2N output) */
+#define  TIM_CR2_OIS3                        ((uint16_t)0x1000)            /*!<Output Idle state 3 (OC3 output) */
+#define  TIM_CR2_OIS3N                       ((uint16_t)0x2000)            /*!<Output Idle state 3 (OC3N output) */
+#define  TIM_CR2_OIS4                        ((uint16_t)0x4000)            /*!<Output Idle state 4 (OC4 output) */
+
+/*******************  Bit definition for TIM_SMCR register  *******************/
+#define  TIM_SMCR_SMS                        ((uint16_t)0x0007)            /*!<SMS[2:0] bits (Slave mode selection) */
+#define  TIM_SMCR_SMS_0                      ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  TIM_SMCR_SMS_1                      ((uint16_t)0x0002)            /*!<Bit 1 */
+#define  TIM_SMCR_SMS_2                      ((uint16_t)0x0004)            /*!<Bit 2 */
+
+#define  TIM_SMCR_TS                         ((uint16_t)0x0070)            /*!<TS[2:0] bits (Trigger selection) */
+#define  TIM_SMCR_TS_0                       ((uint16_t)0x0010)            /*!<Bit 0 */
+#define  TIM_SMCR_TS_1                       ((uint16_t)0x0020)            /*!<Bit 1 */
+#define  TIM_SMCR_TS_2                       ((uint16_t)0x0040)            /*!<Bit 2 */
+
+#define  TIM_SMCR_MSM                        ((uint16_t)0x0080)            /*!<Master/slave mode */
+
+#define  TIM_SMCR_ETF                        ((uint16_t)0x0F00)            /*!<ETF[3:0] bits (External trigger filter) */
+#define  TIM_SMCR_ETF_0                      ((uint16_t)0x0100)            /*!<Bit 0 */
+#define  TIM_SMCR_ETF_1                      ((uint16_t)0x0200)            /*!<Bit 1 */
+#define  TIM_SMCR_ETF_2                      ((uint16_t)0x0400)            /*!<Bit 2 */
+#define  TIM_SMCR_ETF_3                      ((uint16_t)0x0800)            /*!<Bit 3 */
+
+#define  TIM_SMCR_ETPS                       ((uint16_t)0x3000)            /*!<ETPS[1:0] bits (External trigger prescaler) */
+#define  TIM_SMCR_ETPS_0                     ((uint16_t)0x1000)            /*!<Bit 0 */
+#define  TIM_SMCR_ETPS_1                     ((uint16_t)0x2000)            /*!<Bit 1 */
+
+#define  TIM_SMCR_ECE                        ((uint16_t)0x4000)            /*!<External clock enable */
+#define  TIM_SMCR_ETP                        ((uint16_t)0x8000)            /*!<External trigger polarity */
+
+/*******************  Bit definition for TIM_DIER register  *******************/
+#define  TIM_DIER_UIE                        ((uint16_t)0x0001)            /*!<Update interrupt enable */
+#define  TIM_DIER_CC1IE                      ((uint16_t)0x0002)            /*!<Capture/Compare 1 interrupt enable */
+#define  TIM_DIER_CC2IE                      ((uint16_t)0x0004)            /*!<Capture/Compare 2 interrupt enable */
+#define  TIM_DIER_CC3IE                      ((uint16_t)0x0008)            /*!<Capture/Compare 3 interrupt enable */
+#define  TIM_DIER_CC4IE                      ((uint16_t)0x0010)            /*!<Capture/Compare 4 interrupt enable */
+#define  TIM_DIER_COMIE                      ((uint16_t)0x0020)            /*!<COM interrupt enable */
+#define  TIM_DIER_TIE                        ((uint16_t)0x0040)            /*!<Trigger interrupt enable */
+#define  TIM_DIER_BIE                        ((uint16_t)0x0080)            /*!<Break interrupt enable */
+#define  TIM_DIER_UDE                        ((uint16_t)0x0100)            /*!<Update DMA request enable */
+#define  TIM_DIER_CC1DE                      ((uint16_t)0x0200)            /*!<Capture/Compare 1 DMA request enable */
+#define  TIM_DIER_CC2DE                      ((uint16_t)0x0400)            /*!<Capture/Compare 2 DMA request enable */
+#define  TIM_DIER_CC3DE                      ((uint16_t)0x0800)            /*!<Capture/Compare 3 DMA request enable */
+#define  TIM_DIER_CC4DE                      ((uint16_t)0x1000)            /*!<Capture/Compare 4 DMA request enable */
+#define  TIM_DIER_COMDE                      ((uint16_t)0x2000)            /*!<COM DMA request enable */
+#define  TIM_DIER_TDE                        ((uint16_t)0x4000)            /*!<Trigger DMA request enable */
+
+/********************  Bit definition for TIM_SR register  ********************/
+#define  TIM_SR_UIF                          ((uint16_t)0x0001)            /*!<Update interrupt Flag */
+#define  TIM_SR_CC1IF                        ((uint16_t)0x0002)            /*!<Capture/Compare 1 interrupt Flag */
+#define  TIM_SR_CC2IF                        ((uint16_t)0x0004)            /*!<Capture/Compare 2 interrupt Flag */
+#define  TIM_SR_CC3IF                        ((uint16_t)0x0008)            /*!<Capture/Compare 3 interrupt Flag */
+#define  TIM_SR_CC4IF                        ((uint16_t)0x0010)            /*!<Capture/Compare 4 interrupt Flag */
+#define  TIM_SR_COMIF                        ((uint16_t)0x0020)            /*!<COM interrupt Flag */
+#define  TIM_SR_TIF                          ((uint16_t)0x0040)            /*!<Trigger interrupt Flag */
+#define  TIM_SR_BIF                          ((uint16_t)0x0080)            /*!<Break interrupt Flag */
+#define  TIM_SR_CC1OF                        ((uint16_t)0x0200)            /*!<Capture/Compare 1 Overcapture Flag */
+#define  TIM_SR_CC2OF                        ((uint16_t)0x0400)            /*!<Capture/Compare 2 Overcapture Flag */
+#define  TIM_SR_CC3OF                        ((uint16_t)0x0800)            /*!<Capture/Compare 3 Overcapture Flag */
+#define  TIM_SR_CC4OF                        ((uint16_t)0x1000)            /*!<Capture/Compare 4 Overcapture Flag */
+
+/*******************  Bit definition for TIM_EGR register  ********************/
+#define  TIM_EGR_UG                          ((uint8_t)0x01)               /*!<Update Generation */
+#define  TIM_EGR_CC1G                        ((uint8_t)0x02)               /*!<Capture/Compare 1 Generation */
+#define  TIM_EGR_CC2G                        ((uint8_t)0x04)               /*!<Capture/Compare 2 Generation */
+#define  TIM_EGR_CC3G                        ((uint8_t)0x08)               /*!<Capture/Compare 3 Generation */
+#define  TIM_EGR_CC4G                        ((uint8_t)0x10)               /*!<Capture/Compare 4 Generation */
+#define  TIM_EGR_COMG                        ((uint8_t)0x20)               /*!<Capture/Compare Control Update Generation */
+#define  TIM_EGR_TG                          ((uint8_t)0x40)               /*!<Trigger Generation */
+#define  TIM_EGR_BG                          ((uint8_t)0x80)               /*!<Break Generation */
+
+/******************  Bit definition for TIM_CCMR1 register  *******************/
+#define  TIM_CCMR1_CC1S                      ((uint16_t)0x0003)            /*!<CC1S[1:0] bits (Capture/Compare 1 Selection) */
+#define  TIM_CCMR1_CC1S_0                    ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  TIM_CCMR1_CC1S_1                    ((uint16_t)0x0002)            /*!<Bit 1 */
+
+#define  TIM_CCMR1_OC1FE                     ((uint16_t)0x0004)            /*!<Output Compare 1 Fast enable */
+#define  TIM_CCMR1_OC1PE                     ((uint16_t)0x0008)            /*!<Output Compare 1 Preload enable */
+
+#define  TIM_CCMR1_OC1M                      ((uint16_t)0x0070)            /*!<OC1M[2:0] bits (Output Compare 1 Mode) */
+#define  TIM_CCMR1_OC1M_0                    ((uint16_t)0x0010)            /*!<Bit 0 */
+#define  TIM_CCMR1_OC1M_1                    ((uint16_t)0x0020)            /*!<Bit 1 */
+#define  TIM_CCMR1_OC1M_2                    ((uint16_t)0x0040)            /*!<Bit 2 */
+
+#define  TIM_CCMR1_OC1CE                     ((uint16_t)0x0080)            /*!<Output Compare 1Clear Enable */
+
+#define  TIM_CCMR1_CC2S                      ((uint16_t)0x0300)            /*!<CC2S[1:0] bits (Capture/Compare 2 Selection) */
+#define  TIM_CCMR1_CC2S_0                    ((uint16_t)0x0100)            /*!<Bit 0 */
+#define  TIM_CCMR1_CC2S_1                    ((uint16_t)0x0200)            /*!<Bit 1 */
+
+#define  TIM_CCMR1_OC2FE                     ((uint16_t)0x0400)            /*!<Output Compare 2 Fast enable */
+#define  TIM_CCMR1_OC2PE                     ((uint16_t)0x0800)            /*!<Output Compare 2 Preload enable */
+
+#define  TIM_CCMR1_OC2M                      ((uint16_t)0x7000)            /*!<OC2M[2:0] bits (Output Compare 2 Mode) */
+#define  TIM_CCMR1_OC2M_0                    ((uint16_t)0x1000)            /*!<Bit 0 */
+#define  TIM_CCMR1_OC2M_1                    ((uint16_t)0x2000)            /*!<Bit 1 */
+#define  TIM_CCMR1_OC2M_2                    ((uint16_t)0x4000)            /*!<Bit 2 */
+
+#define  TIM_CCMR1_OC2CE                     ((uint16_t)0x8000)            /*!<Output Compare 2 Clear Enable */
+
+/*----------------------------------------------------------------------------*/
+
+#define  TIM_CCMR1_IC1PSC                    ((uint16_t)0x000C)            /*!<IC1PSC[1:0] bits (Input Capture 1 Prescaler) */
+#define  TIM_CCMR1_IC1PSC_0                  ((uint16_t)0x0004)            /*!<Bit 0 */
+#define  TIM_CCMR1_IC1PSC_1                  ((uint16_t)0x0008)            /*!<Bit 1 */
+
+#define  TIM_CCMR1_IC1F                      ((uint16_t)0x00F0)            /*!<IC1F[3:0] bits (Input Capture 1 Filter) */
+#define  TIM_CCMR1_IC1F_0                    ((uint16_t)0x0010)            /*!<Bit 0 */
+#define  TIM_CCMR1_IC1F_1                    ((uint16_t)0x0020)            /*!<Bit 1 */
+#define  TIM_CCMR1_IC1F_2                    ((uint16_t)0x0040)            /*!<Bit 2 */
+#define  TIM_CCMR1_IC1F_3                    ((uint16_t)0x0080)            /*!<Bit 3 */
+
+#define  TIM_CCMR1_IC2PSC                    ((uint16_t)0x0C00)            /*!<IC2PSC[1:0] bits (Input Capture 2 Prescaler) */
+#define  TIM_CCMR1_IC2PSC_0                  ((uint16_t)0x0400)            /*!<Bit 0 */
+#define  TIM_CCMR1_IC2PSC_1                  ((uint16_t)0x0800)            /*!<Bit 1 */
+
+#define  TIM_CCMR1_IC2F                      ((uint16_t)0xF000)            /*!<IC2F[3:0] bits (Input Capture 2 Filter) */
+#define  TIM_CCMR1_IC2F_0                    ((uint16_t)0x1000)            /*!<Bit 0 */
+#define  TIM_CCMR1_IC2F_1                    ((uint16_t)0x2000)            /*!<Bit 1 */
+#define  TIM_CCMR1_IC2F_2                    ((uint16_t)0x4000)            /*!<Bit 2 */
+#define  TIM_CCMR1_IC2F_3                    ((uint16_t)0x8000)            /*!<Bit 3 */
+
+/******************  Bit definition for TIM_CCMR2 register  *******************/
+#define  TIM_CCMR2_CC3S                      ((uint16_t)0x0003)            /*!<CC3S[1:0] bits (Capture/Compare 3 Selection) */
+#define  TIM_CCMR2_CC3S_0                    ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  TIM_CCMR2_CC3S_1                    ((uint16_t)0x0002)            /*!<Bit 1 */
+
+#define  TIM_CCMR2_OC3FE                     ((uint16_t)0x0004)            /*!<Output Compare 3 Fast enable */
+#define  TIM_CCMR2_OC3PE                     ((uint16_t)0x0008)            /*!<Output Compare 3 Preload enable */
+
+#define  TIM_CCMR2_OC3M                      ((uint16_t)0x0070)            /*!<OC3M[2:0] bits (Output Compare 3 Mode) */
+#define  TIM_CCMR2_OC3M_0                    ((uint16_t)0x0010)            /*!<Bit 0 */
+#define  TIM_CCMR2_OC3M_1                    ((uint16_t)0x0020)            /*!<Bit 1 */
+#define  TIM_CCMR2_OC3M_2                    ((uint16_t)0x0040)            /*!<Bit 2 */
+
+#define  TIM_CCMR2_OC3CE                     ((uint16_t)0x0080)            /*!<Output Compare 3 Clear Enable */
+
+#define  TIM_CCMR2_CC4S                      ((uint16_t)0x0300)            /*!<CC4S[1:0] bits (Capture/Compare 4 Selection) */
+#define  TIM_CCMR2_CC4S_0                    ((uint16_t)0x0100)            /*!<Bit 0 */
+#define  TIM_CCMR2_CC4S_1                    ((uint16_t)0x0200)            /*!<Bit 1 */
+
+#define  TIM_CCMR2_OC4FE                     ((uint16_t)0x0400)            /*!<Output Compare 4 Fast enable */
+#define  TIM_CCMR2_OC4PE                     ((uint16_t)0x0800)            /*!<Output Compare 4 Preload enable */
+
+#define  TIM_CCMR2_OC4M                      ((uint16_t)0x7000)            /*!<OC4M[2:0] bits (Output Compare 4 Mode) */
+#define  TIM_CCMR2_OC4M_0                    ((uint16_t)0x1000)            /*!<Bit 0 */
+#define  TIM_CCMR2_OC4M_1                    ((uint16_t)0x2000)            /*!<Bit 1 */
+#define  TIM_CCMR2_OC4M_2                    ((uint16_t)0x4000)            /*!<Bit 2 */
+
+#define  TIM_CCMR2_OC4CE                     ((uint16_t)0x8000)            /*!<Output Compare 4 Clear Enable */
+
+/*----------------------------------------------------------------------------*/
+
+#define  TIM_CCMR2_IC3PSC                    ((uint16_t)0x000C)            /*!<IC3PSC[1:0] bits (Input Capture 3 Prescaler) */
+#define  TIM_CCMR2_IC3PSC_0                  ((uint16_t)0x0004)            /*!<Bit 0 */
+#define  TIM_CCMR2_IC3PSC_1                  ((uint16_t)0x0008)            /*!<Bit 1 */
+
+#define  TIM_CCMR2_IC3F                      ((uint16_t)0x00F0)            /*!<IC3F[3:0] bits (Input Capture 3 Filter) */
+#define  TIM_CCMR2_IC3F_0                    ((uint16_t)0x0010)            /*!<Bit 0 */
+#define  TIM_CCMR2_IC3F_1                    ((uint16_t)0x0020)            /*!<Bit 1 */
+#define  TIM_CCMR2_IC3F_2                    ((uint16_t)0x0040)            /*!<Bit 2 */
+#define  TIM_CCMR2_IC3F_3                    ((uint16_t)0x0080)            /*!<Bit 3 */
+
+#define  TIM_CCMR2_IC4PSC                    ((uint16_t)0x0C00)            /*!<IC4PSC[1:0] bits (Input Capture 4 Prescaler) */
+#define  TIM_CCMR2_IC4PSC_0                  ((uint16_t)0x0400)            /*!<Bit 0 */
+#define  TIM_CCMR2_IC4PSC_1                  ((uint16_t)0x0800)            /*!<Bit 1 */
+
+#define  TIM_CCMR2_IC4F                      ((uint16_t)0xF000)            /*!<IC4F[3:0] bits (Input Capture 4 Filter) */
+#define  TIM_CCMR2_IC4F_0                    ((uint16_t)0x1000)            /*!<Bit 0 */
+#define  TIM_CCMR2_IC4F_1                    ((uint16_t)0x2000)            /*!<Bit 1 */
+#define  TIM_CCMR2_IC4F_2                    ((uint16_t)0x4000)            /*!<Bit 2 */
+#define  TIM_CCMR2_IC4F_3                    ((uint16_t)0x8000)            /*!<Bit 3 */
+
+/*******************  Bit definition for TIM_CCER register  *******************/
+#define  TIM_CCER_CC1E                       ((uint16_t)0x0001)            /*!<Capture/Compare 1 output enable */
+#define  TIM_CCER_CC1P                       ((uint16_t)0x0002)            /*!<Capture/Compare 1 output Polarity */
+#define  TIM_CCER_CC1NE                      ((uint16_t)0x0004)            /*!<Capture/Compare 1 Complementary output enable */
+#define  TIM_CCER_CC1NP                      ((uint16_t)0x0008)            /*!<Capture/Compare 1 Complementary output Polarity */
+#define  TIM_CCER_CC2E                       ((uint16_t)0x0010)            /*!<Capture/Compare 2 output enable */
+#define  TIM_CCER_CC2P                       ((uint16_t)0x0020)            /*!<Capture/Compare 2 output Polarity */
+#define  TIM_CCER_CC2NE                      ((uint16_t)0x0040)            /*!<Capture/Compare 2 Complementary output enable */
+#define  TIM_CCER_CC2NP                      ((uint16_t)0x0080)            /*!<Capture/Compare 2 Complementary output Polarity */
+#define  TIM_CCER_CC3E                       ((uint16_t)0x0100)            /*!<Capture/Compare 3 output enable */
+#define  TIM_CCER_CC3P                       ((uint16_t)0x0200)            /*!<Capture/Compare 3 output Polarity */
+#define  TIM_CCER_CC3NE                      ((uint16_t)0x0400)            /*!<Capture/Compare 3 Complementary output enable */
+#define  TIM_CCER_CC3NP                      ((uint16_t)0x0800)            /*!<Capture/Compare 3 Complementary output Polarity */
+#define  TIM_CCER_CC4E                       ((uint16_t)0x1000)            /*!<Capture/Compare 4 output enable */
+#define  TIM_CCER_CC4P                       ((uint16_t)0x2000)            /*!<Capture/Compare 4 output Polarity */
+#define  TIM_CCER_CC4NP                      ((uint16_t)0x8000)            /*!<Capture/Compare 4 Complementary output Polarity */
+
+/*******************  Bit definition for TIM_CNT register  ********************/
+#define  TIM_CNT_CNT                         ((uint16_t)0xFFFF)            /*!<Counter Value */
+
+/*******************  Bit definition for TIM_PSC register  ********************/
+#define  TIM_PSC_PSC                         ((uint16_t)0xFFFF)            /*!<Prescaler Value */
+
+/*******************  Bit definition for TIM_ARR register  ********************/
+#define  TIM_ARR_ARR                         ((uint16_t)0xFFFF)            /*!<actual auto-reload Value */
+
+/*******************  Bit definition for TIM_RCR register  ********************/
+#define  TIM_RCR_REP                         ((uint8_t)0xFF)               /*!<Repetition Counter Value */
+
+/*******************  Bit definition for TIM_CCR1 register  *******************/
+#define  TIM_CCR1_CCR1                       ((uint16_t)0xFFFF)            /*!<Capture/Compare 1 Value */
+
+/*******************  Bit definition for TIM_CCR2 register  *******************/
+#define  TIM_CCR2_CCR2                       ((uint16_t)0xFFFF)            /*!<Capture/Compare 2 Value */
+
+/*******************  Bit definition for TIM_CCR3 register  *******************/
+#define  TIM_CCR3_CCR3                       ((uint16_t)0xFFFF)            /*!<Capture/Compare 3 Value */
+
+/*******************  Bit definition for TIM_CCR4 register  *******************/
+#define  TIM_CCR4_CCR4                       ((uint16_t)0xFFFF)            /*!<Capture/Compare 4 Value */
+
+/*******************  Bit definition for TIM_BDTR register  *******************/
+#define  TIM_BDTR_DTG                        ((uint16_t)0x00FF)            /*!<DTG[0:7] bits (Dead-Time Generator set-up) */
+#define  TIM_BDTR_DTG_0                      ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  TIM_BDTR_DTG_1                      ((uint16_t)0x0002)            /*!<Bit 1 */
+#define  TIM_BDTR_DTG_2                      ((uint16_t)0x0004)            /*!<Bit 2 */
+#define  TIM_BDTR_DTG_3                      ((uint16_t)0x0008)            /*!<Bit 3 */
+#define  TIM_BDTR_DTG_4                      ((uint16_t)0x0010)            /*!<Bit 4 */
+#define  TIM_BDTR_DTG_5                      ((uint16_t)0x0020)            /*!<Bit 5 */
+#define  TIM_BDTR_DTG_6                      ((uint16_t)0x0040)            /*!<Bit 6 */
+#define  TIM_BDTR_DTG_7                      ((uint16_t)0x0080)            /*!<Bit 7 */
+
+#define  TIM_BDTR_LOCK                       ((uint16_t)0x0300)            /*!<LOCK[1:0] bits (Lock Configuration) */
+#define  TIM_BDTR_LOCK_0                     ((uint16_t)0x0100)            /*!<Bit 0 */
+#define  TIM_BDTR_LOCK_1                     ((uint16_t)0x0200)            /*!<Bit 1 */
+
+#define  TIM_BDTR_OSSI                       ((uint16_t)0x0400)            /*!<Off-State Selection for Idle mode */
+#define  TIM_BDTR_OSSR                       ((uint16_t)0x0800)            /*!<Off-State Selection for Run mode */
+#define  TIM_BDTR_BKE                        ((uint16_t)0x1000)            /*!<Break enable */
+#define  TIM_BDTR_BKP                        ((uint16_t)0x2000)            /*!<Break Polarity */
+#define  TIM_BDTR_AOE                        ((uint16_t)0x4000)            /*!<Automatic Output enable */
+#define  TIM_BDTR_MOE                        ((uint16_t)0x8000)            /*!<Main Output enable */
+
+/*******************  Bit definition for TIM_DCR register  ********************/
+#define  TIM_DCR_DBA                         ((uint16_t)0x001F)            /*!<DBA[4:0] bits (DMA Base Address) */
+#define  TIM_DCR_DBA_0                       ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  TIM_DCR_DBA_1                       ((uint16_t)0x0002)            /*!<Bit 1 */
+#define  TIM_DCR_DBA_2                       ((uint16_t)0x0004)            /*!<Bit 2 */
+#define  TIM_DCR_DBA_3                       ((uint16_t)0x0008)            /*!<Bit 3 */
+#define  TIM_DCR_DBA_4                       ((uint16_t)0x0010)            /*!<Bit 4 */
+
+#define  TIM_DCR_DBL                         ((uint16_t)0x1F00)            /*!<DBL[4:0] bits (DMA Burst Length) */
+#define  TIM_DCR_DBL_0                       ((uint16_t)0x0100)            /*!<Bit 0 */
+#define  TIM_DCR_DBL_1                       ((uint16_t)0x0200)            /*!<Bit 1 */
+#define  TIM_DCR_DBL_2                       ((uint16_t)0x0400)            /*!<Bit 2 */
+#define  TIM_DCR_DBL_3                       ((uint16_t)0x0800)            /*!<Bit 3 */
+#define  TIM_DCR_DBL_4                       ((uint16_t)0x1000)            /*!<Bit 4 */
+
+/*******************  Bit definition for TIM_DMAR register  *******************/
+#define  TIM_DMAR_DMAB                       ((uint16_t)0xFFFF)            /*!<DMA register for burst accesses */
+
+/*******************  Bit definition for TIM_OR register  *********************/
+#define TIM_OR_TI4_RMP                       ((uint16_t)0x00C0)            /*!<TI4_RMP[1:0] bits (TIM5 Input 4 remap) */
+#define TIM_OR_TI4_RMP_0                     ((uint16_t)0x0040)            /*!<Bit 0 */
+#define TIM_OR_TI4_RMP_1                     ((uint16_t)0x0080)            /*!<Bit 1 */
+#define TIM_OR_ITR1_RMP                      ((uint16_t)0x0C00)            /*!<ITR1_RMP[1:0] bits (TIM2 Internal trigger 1 remap) */
+#define TIM_OR_ITR1_RMP_0                    ((uint16_t)0x0400)            /*!<Bit 0 */
+#define TIM_OR_ITR1_RMP_1                    ((uint16_t)0x0800)            /*!<Bit 1 */
+
+
+/******************************************************************************/
+/*                                                                            */
+/*         Universal Synchronous Asynchronous Receiver Transmitter            */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bit definition for USART_SR register  *******************/
+#define  USART_SR_PE                         ((uint16_t)0x0001)            /*!<Parity Error */
+#define  USART_SR_FE                         ((uint16_t)0x0002)            /*!<Framing Error */
+#define  USART_SR_NE                         ((uint16_t)0x0004)            /*!<Noise Error Flag */
+#define  USART_SR_ORE                        ((uint16_t)0x0008)            /*!<OverRun Error */
+#define  USART_SR_IDLE                       ((uint16_t)0x0010)            /*!<IDLE line detected */
+#define  USART_SR_RXNE                       ((uint16_t)0x0020)            /*!<Read Data Register Not Empty */
+#define  USART_SR_TC                         ((uint16_t)0x0040)            /*!<Transmission Complete */
+#define  USART_SR_TXE                        ((uint16_t)0x0080)            /*!<Transmit Data Register Empty */
+#define  USART_SR_LBD                        ((uint16_t)0x0100)            /*!<LIN Break Detection Flag */
+#define  USART_SR_CTS                        ((uint16_t)0x0200)            /*!<CTS Flag */
+
+/*******************  Bit definition for USART_DR register  *******************/
+#define  USART_DR_DR                         ((uint16_t)0x01FF)            /*!<Data value */
+
+/******************  Bit definition for USART_BRR register  *******************/
+#define  USART_BRR_DIV_Fraction              ((uint16_t)0x000F)            /*!<Fraction of USARTDIV */
+#define  USART_BRR_DIV_Mantissa              ((uint16_t)0xFFF0)            /*!<Mantissa of USARTDIV */
+
+/******************  Bit definition for USART_CR1 register  *******************/
+#define  USART_CR1_SBK                       ((uint16_t)0x0001)            /*!<Send Break */
+#define  USART_CR1_RWU                       ((uint16_t)0x0002)            /*!<Receiver wakeup */
+#define  USART_CR1_RE                        ((uint16_t)0x0004)            /*!<Receiver Enable */
+#define  USART_CR1_TE                        ((uint16_t)0x0008)            /*!<Transmitter Enable */
+#define  USART_CR1_IDLEIE                    ((uint16_t)0x0010)            /*!<IDLE Interrupt Enable */
+#define  USART_CR1_RXNEIE                    ((uint16_t)0x0020)            /*!<RXNE Interrupt Enable */
+#define  USART_CR1_TCIE                      ((uint16_t)0x0040)            /*!<Transmission Complete Interrupt Enable */
+#define  USART_CR1_TXEIE                     ((uint16_t)0x0080)            /*!<PE Interrupt Enable */
+#define  USART_CR1_PEIE                      ((uint16_t)0x0100)            /*!<PE Interrupt Enable */
+#define  USART_CR1_PS                        ((uint16_t)0x0200)            /*!<Parity Selection */
+#define  USART_CR1_PCE                       ((uint16_t)0x0400)            /*!<Parity Control Enable */
+#define  USART_CR1_WAKE                      ((uint16_t)0x0800)            /*!<Wakeup method */
+#define  USART_CR1_M                         ((uint16_t)0x1000)            /*!<Word length */
+#define  USART_CR1_UE                        ((uint16_t)0x2000)            /*!<USART Enable */
+#define  USART_CR1_OVER8                     ((uint16_t)0x8000)            /*!<USART Oversampling by 8 enable */
+
+/******************  Bit definition for USART_CR2 register  *******************/
+#define  USART_CR2_ADD                       ((uint16_t)0x000F)            /*!<Address of the USART node */
+#define  USART_CR2_LBDL                      ((uint16_t)0x0020)            /*!<LIN Break Detection Length */
+#define  USART_CR2_LBDIE                     ((uint16_t)0x0040)            /*!<LIN Break Detection Interrupt Enable */
+#define  USART_CR2_LBCL                      ((uint16_t)0x0100)            /*!<Last Bit Clock pulse */
+#define  USART_CR2_CPHA                      ((uint16_t)0x0200)            /*!<Clock Phase */
+#define  USART_CR2_CPOL                      ((uint16_t)0x0400)            /*!<Clock Polarity */
+#define  USART_CR2_CLKEN                     ((uint16_t)0x0800)            /*!<Clock Enable */
+
+#define  USART_CR2_STOP                      ((uint16_t)0x3000)            /*!<STOP[1:0] bits (STOP bits) */
+#define  USART_CR2_STOP_0                    ((uint16_t)0x1000)            /*!<Bit 0 */
+#define  USART_CR2_STOP_1                    ((uint16_t)0x2000)            /*!<Bit 1 */
+
+#define  USART_CR2_LINEN                     ((uint16_t)0x4000)            /*!<LIN mode enable */
+
+/******************  Bit definition for USART_CR3 register  *******************/
+#define  USART_CR3_EIE                       ((uint16_t)0x0001)            /*!<Error Interrupt Enable */
+#define  USART_CR3_IREN                      ((uint16_t)0x0002)            /*!<IrDA mode Enable */
+#define  USART_CR3_IRLP                      ((uint16_t)0x0004)            /*!<IrDA Low-Power */
+#define  USART_CR3_HDSEL                     ((uint16_t)0x0008)            /*!<Half-Duplex Selection */
+#define  USART_CR3_NACK                      ((uint16_t)0x0010)            /*!<Smartcard NACK enable */
+#define  USART_CR3_SCEN                      ((uint16_t)0x0020)            /*!<Smartcard mode enable */
+#define  USART_CR3_DMAR                      ((uint16_t)0x0040)            /*!<DMA Enable Receiver */
+#define  USART_CR3_DMAT                      ((uint16_t)0x0080)            /*!<DMA Enable Transmitter */
+#define  USART_CR3_RTSE                      ((uint16_t)0x0100)            /*!<RTS Enable */
+#define  USART_CR3_CTSE                      ((uint16_t)0x0200)            /*!<CTS Enable */
+#define  USART_CR3_CTSIE                     ((uint16_t)0x0400)            /*!<CTS Interrupt Enable */
+#define  USART_CR3_ONEBIT                    ((uint16_t)0x0800)            /*!<USART One bit method enable */
+
+/******************  Bit definition for USART_GTPR register  ******************/
+#define  USART_GTPR_PSC                      ((uint16_t)0x00FF)            /*!<PSC[7:0] bits (Prescaler value) */
+#define  USART_GTPR_PSC_0                    ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  USART_GTPR_PSC_1                    ((uint16_t)0x0002)            /*!<Bit 1 */
+#define  USART_GTPR_PSC_2                    ((uint16_t)0x0004)            /*!<Bit 2 */
+#define  USART_GTPR_PSC_3                    ((uint16_t)0x0008)            /*!<Bit 3 */
+#define  USART_GTPR_PSC_4                    ((uint16_t)0x0010)            /*!<Bit 4 */
+#define  USART_GTPR_PSC_5                    ((uint16_t)0x0020)            /*!<Bit 5 */
+#define  USART_GTPR_PSC_6                    ((uint16_t)0x0040)            /*!<Bit 6 */
+#define  USART_GTPR_PSC_7                    ((uint16_t)0x0080)            /*!<Bit 7 */
+
+#define  USART_GTPR_GT                       ((uint16_t)0xFF00)            /*!<Guard time value */
+
+/******************************************************************************/
+/*                                                                            */
+/*                            Window WATCHDOG                                 */
+/*                                                                            */
+/******************************************************************************/
+/*******************  Bit definition for WWDG_CR register  ********************/
+#define  WWDG_CR_T                           ((uint8_t)0x7F)               /*!<T[6:0] bits (7-Bit counter (MSB to LSB)) */
+#define  WWDG_CR_T0                          ((uint8_t)0x01)               /*!<Bit 0 */
+#define  WWDG_CR_T1                          ((uint8_t)0x02)               /*!<Bit 1 */
+#define  WWDG_CR_T2                          ((uint8_t)0x04)               /*!<Bit 2 */
+#define  WWDG_CR_T3                          ((uint8_t)0x08)               /*!<Bit 3 */
+#define  WWDG_CR_T4                          ((uint8_t)0x10)               /*!<Bit 4 */
+#define  WWDG_CR_T5                          ((uint8_t)0x20)               /*!<Bit 5 */
+#define  WWDG_CR_T6                          ((uint8_t)0x40)               /*!<Bit 6 */
+
+#define  WWDG_CR_WDGA                        ((uint8_t)0x80)               /*!<Activation bit */
+
+/*******************  Bit definition for WWDG_CFR register  *******************/
+#define  WWDG_CFR_W                          ((uint16_t)0x007F)            /*!<W[6:0] bits (7-bit window value) */
+#define  WWDG_CFR_W0                         ((uint16_t)0x0001)            /*!<Bit 0 */
+#define  WWDG_CFR_W1                         ((uint16_t)0x0002)            /*!<Bit 1 */
+#define  WWDG_CFR_W2                         ((uint16_t)0x0004)            /*!<Bit 2 */
+#define  WWDG_CFR_W3                         ((uint16_t)0x0008)            /*!<Bit 3 */
+#define  WWDG_CFR_W4                         ((uint16_t)0x0010)            /*!<Bit 4 */
+#define  WWDG_CFR_W5                         ((uint16_t)0x0020)            /*!<Bit 5 */
+#define  WWDG_CFR_W6                         ((uint16_t)0x0040)            /*!<Bit 6 */
+
+#define  WWDG_CFR_WDGTB                      ((uint16_t)0x0180)            /*!<WDGTB[1:0] bits (Timer Base) */
+#define  WWDG_CFR_WDGTB0                     ((uint16_t)0x0080)            /*!<Bit 0 */
+#define  WWDG_CFR_WDGTB1                     ((uint16_t)0x0100)            /*!<Bit 1 */
+
+#define  WWDG_CFR_EWI                        ((uint16_t)0x0200)            /*!<Early Wakeup Interrupt */
+
+/*******************  Bit definition for WWDG_SR register  ********************/
+#define  WWDG_SR_EWIF                        ((uint8_t)0x01)               /*!<Early Wakeup Interrupt Flag */
+
+
+/******************************************************************************/
+/*                                                                            */
+/*                                DBG                                         */
+/*                                                                            */
+/******************************************************************************/
+/********************  Bit definition for DBGMCU_IDCODE register  *************/
+#define  DBGMCU_IDCODE_DEV_ID                ((uint32_t)0x00000FFF)
+#define  DBGMCU_IDCODE_REV_ID                ((uint32_t)0xFFFF0000)
+
+/********************  Bit definition for DBGMCU_CR register  *****************/
+#define  DBGMCU_CR_DBG_SLEEP                 ((uint32_t)0x00000001)
+#define  DBGMCU_CR_DBG_STOP                  ((uint32_t)0x00000002)
+#define  DBGMCU_CR_DBG_STANDBY               ((uint32_t)0x00000004)
+#define  DBGMCU_CR_TRACE_IOEN                ((uint32_t)0x00000020)
+
+#define  DBGMCU_CR_TRACE_MODE                ((uint32_t)0x000000C0)
+#define  DBGMCU_CR_TRACE_MODE_0              ((uint32_t)0x00000040)/*!<Bit 0 */
+#define  DBGMCU_CR_TRACE_MODE_1              ((uint32_t)0x00000080)/*!<Bit 1 */
+
+/********************  Bit definition for DBGMCU_APB1_FZ register  ************/
+#define  DBGMCU_APB1_FZ_DBG_TIM2_STOP        ((uint32_t)0x00000001)
+#define  DBGMCU_APB1_FZ_DBG_TIM3_STOP        ((uint32_t)0x00000002)
+#define  DBGMCU_APB1_FZ_DBG_TIM4_STOP        ((uint32_t)0x00000004)
+#define  DBGMCU_APB1_FZ_DBG_TIM5_STOP        ((uint32_t)0x00000008)
+#define  DBGMCU_APB1_FZ_DBG_TIM6_STOP        ((uint32_t)0x00000010)
+#define  DBGMCU_APB1_FZ_DBG_TIM7_STOP        ((uint32_t)0x00000020)
+#define  DBGMCU_APB1_FZ_DBG_TIM12_STOP       ((uint32_t)0x00000040)
+#define  DBGMCU_APB1_FZ_DBG_TIM13_STOP       ((uint32_t)0x00000080)
+#define  DBGMCU_APB1_FZ_DBG_TIM14_STOP       ((uint32_t)0x00000100)
+#define  DBGMCU_APB1_FZ_DBG_RTC_STOP         ((uint32_t)0x00000400)
+#define  DBGMCU_APB1_FZ_DBG_WWDG_STOP        ((uint32_t)0x00000800)
+#define  DBGMCU_APB1_FZ_DBG_IWDG_STOP        ((uint32_t)0x00001000)
+#define  DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT   ((uint32_t)0x00200000)
+#define  DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT   ((uint32_t)0x00400000)
+#define  DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT   ((uint32_t)0x00800000)
+#define  DBGMCU_APB1_FZ_DBG_CAN1_STOP            ((uint32_t)0x02000000)
+#define  DBGMCU_APB1_FZ_DBG_CAN2_STOP            ((uint32_t)0x04000000)
+
+/********************  Bit definition for DBGMCU_APB2_FZ register  ************/
+#define  DBGMCU_APB1_FZ_DBG_TIM1_STOP        ((uint32_t)0x00000001)
+#define  DBGMCU_APB1_FZ_DBG_TIM8_STOP        ((uint32_t)0x00000002)
+#define  DBGMCU_APB1_FZ_DBG_TIM9_STOP        ((uint32_t)0x00010000)
+#define  DBGMCU_APB1_FZ_DBG_TIM10_STOP       ((uint32_t)0x00020000)
+#define  DBGMCU_APB1_FZ_DBG_TIM11_STOP       ((uint32_t)0x00040000)
+
+/******************************************************************************/
+/*                                                                            */
+/*                Ethernet MAC Registers bits definitions                     */
+/*                                                                            */
+/******************************************************************************/
+/* Bit definition for Ethernet MAC Control Register register */
+#define ETH_MACCR_WD      ((uint32_t)0x00800000)  /* Watchdog disable */
+#define ETH_MACCR_JD      ((uint32_t)0x00400000)  /* Jabber disable */
+#define ETH_MACCR_IFG     ((uint32_t)0x000E0000)  /* Inter-frame gap */
+#define ETH_MACCR_IFG_96Bit     ((uint32_t)0x00000000)  /* Minimum IFG between frames during transmission is 96Bit */
+  #define ETH_MACCR_IFG_88Bit     ((uint32_t)0x00020000)  /* Minimum IFG between frames during transmission is 88Bit */
+  #define ETH_MACCR_IFG_80Bit     ((uint32_t)0x00040000)  /* Minimum IFG between frames during transmission is 80Bit */
+  #define ETH_MACCR_IFG_72Bit     ((uint32_t)0x00060000)  /* Minimum IFG between frames during transmission is 72Bit */
+  #define ETH_MACCR_IFG_64Bit     ((uint32_t)0x00080000)  /* Minimum IFG between frames during transmission is 64Bit */        
+  #define ETH_MACCR_IFG_56Bit     ((uint32_t)0x000A0000)  /* Minimum IFG between frames during transmission is 56Bit */
+  #define ETH_MACCR_IFG_48Bit     ((uint32_t)0x000C0000)  /* Minimum IFG between frames during transmission is 48Bit */
+  #define ETH_MACCR_IFG_40Bit     ((uint32_t)0x000E0000)  /* Minimum IFG between frames during transmission is 40Bit */              
+#define ETH_MACCR_CSD     ((uint32_t)0x00010000)  /* Carrier sense disable (during transmission) */
+#define ETH_MACCR_FES     ((uint32_t)0x00004000)  /* Fast ethernet speed */
+#define ETH_MACCR_ROD     ((uint32_t)0x00002000)  /* Receive own disable */
+#define ETH_MACCR_LM      ((uint32_t)0x00001000)  /* loopback mode */
+#define ETH_MACCR_DM      ((uint32_t)0x00000800)  /* Duplex mode */
+#define ETH_MACCR_IPCO    ((uint32_t)0x00000400)  /* IP Checksum offload */
+#define ETH_MACCR_RD      ((uint32_t)0x00000200)  /* Retry disable */
+#define ETH_MACCR_APCS    ((uint32_t)0x00000080)  /* Automatic Pad/CRC stripping */
+#define ETH_MACCR_BL      ((uint32_t)0x00000060)  /* Back-off limit: random integer number (r) of slot time delays before rescheduling
+                                                       a transmission attempt during retries after a collision: 0 =< r <2^k */
+  #define ETH_MACCR_BL_10    ((uint32_t)0x00000000)  /* k = min (n, 10) */
+  #define ETH_MACCR_BL_8     ((uint32_t)0x00000020)  /* k = min (n, 8) */
+  #define ETH_MACCR_BL_4     ((uint32_t)0x00000040)  /* k = min (n, 4) */
+  #define ETH_MACCR_BL_1     ((uint32_t)0x00000060)  /* k = min (n, 1) */ 
+#define ETH_MACCR_DC      ((uint32_t)0x00000010)  /* Defferal check */
+#define ETH_MACCR_TE      ((uint32_t)0x00000008)  /* Transmitter enable */
+#define ETH_MACCR_RE      ((uint32_t)0x00000004)  /* Receiver enable */
+
+/* Bit definition for Ethernet MAC Frame Filter Register */
+#define ETH_MACFFR_RA     ((uint32_t)0x80000000)  /* Receive all */ 
+#define ETH_MACFFR_HPF    ((uint32_t)0x00000400)  /* Hash or perfect filter */ 
+#define ETH_MACFFR_SAF    ((uint32_t)0x00000200)  /* Source address filter enable */ 
+#define ETH_MACFFR_SAIF   ((uint32_t)0x00000100)  /* SA inverse filtering */ 
+#define ETH_MACFFR_PCF    ((uint32_t)0x000000C0)  /* Pass control frames: 3 cases */
+  #define ETH_MACFFR_PCF_BlockAll                ((uint32_t)0x00000040)  /* MAC filters all control frames from reaching the application */
+  #define ETH_MACFFR_PCF_ForwardAll              ((uint32_t)0x00000080)  /* MAC forwards all control frames to application even if they fail the Address Filter */
+  #define ETH_MACFFR_PCF_ForwardPassedAddrFilter ((uint32_t)0x000000C0)  /* MAC forwards control frames that pass the Address Filter. */ 
+#define ETH_MACFFR_BFD    ((uint32_t)0x00000020)  /* Broadcast frame disable */ 
+#define ETH_MACFFR_PAM    ((uint32_t)0x00000010)  /* Pass all mutlicast */ 
+#define ETH_MACFFR_DAIF   ((uint32_t)0x00000008)  /* DA Inverse filtering */ 
+#define ETH_MACFFR_HM     ((uint32_t)0x00000004)  /* Hash multicast */ 
+#define ETH_MACFFR_HU     ((uint32_t)0x00000002)  /* Hash unicast */
+#define ETH_MACFFR_PM     ((uint32_t)0x00000001)  /* Promiscuous mode */
+
+/* Bit definition for Ethernet MAC Hash Table High Register */
+#define ETH_MACHTHR_HTH   ((uint32_t)0xFFFFFFFF)  /* Hash table high */
+
+/* Bit definition for Ethernet MAC Hash Table Low Register */
+#define ETH_MACHTLR_HTL   ((uint32_t)0xFFFFFFFF)  /* Hash table low */
+
+/* Bit definition for Ethernet MAC MII Address Register */
+#define ETH_MACMIIAR_PA   ((uint32_t)0x0000F800)  /* Physical layer address */ 
+#define ETH_MACMIIAR_MR   ((uint32_t)0x000007C0)  /* MII register in the selected PHY */ 
+#define ETH_MACMIIAR_CR   ((uint32_t)0x0000001C)  /* CR clock range: 6 cases */ 
+  #define ETH_MACMIIAR_CR_Div42   ((uint32_t)0x00000000)  /* HCLK:60-100 MHz; MDC clock= HCLK/42 */
+  #define ETH_MACMIIAR_CR_Div62   ((uint32_t)0x00000004)  /* HCLK:100-120 MHz; MDC clock= HCLK/62 */
+  #define ETH_MACMIIAR_CR_Div16   ((uint32_t)0x00000008)  /* HCLK:20-35 MHz; MDC clock= HCLK/16 */
+  #define ETH_MACMIIAR_CR_Div26   ((uint32_t)0x0000000C)  /* HCLK:35-60 MHz; MDC clock= HCLK/42 */  
+#define ETH_MACMIIAR_MW   ((uint32_t)0x00000002)  /* MII write */ 
+#define ETH_MACMIIAR_MB   ((uint32_t)0x00000001)  /* MII busy */ 
+  
+/* Bit definition for Ethernet MAC MII Data Register */
+#define ETH_MACMIIDR_MD   ((uint32_t)0x0000FFFF)  /* MII data: read/write data from/to PHY */
+
+/* Bit definition for Ethernet MAC Flow Control Register */
+#define ETH_MACFCR_PT     ((uint32_t)0xFFFF0000)  /* Pause time */
+#define ETH_MACFCR_ZQPD   ((uint32_t)0x00000080)  /* Zero-quanta pause disable */
+#define ETH_MACFCR_PLT    ((uint32_t)0x00000030)  /* Pause low threshold: 4 cases */
+  #define ETH_MACFCR_PLT_Minus4   ((uint32_t)0x00000000)  /* Pause time minus 4 slot times */
+  #define ETH_MACFCR_PLT_Minus28  ((uint32_t)0x00000010)  /* Pause time minus 28 slot times */
+  #define ETH_MACFCR_PLT_Minus144 ((uint32_t)0x00000020)  /* Pause time minus 144 slot times */
+  #define ETH_MACFCR_PLT_Minus256 ((uint32_t)0x00000030)  /* Pause time minus 256 slot times */      
+#define ETH_MACFCR_UPFD   ((uint32_t)0x00000008)  /* Unicast pause frame detect */
+#define ETH_MACFCR_RFCE   ((uint32_t)0x00000004)  /* Receive flow control enable */
+#define ETH_MACFCR_TFCE   ((uint32_t)0x00000002)  /* Transmit flow control enable */
+#define ETH_MACFCR_FCBBPA ((uint32_t)0x00000001)  /* Flow control busy/backpressure activate */
+
+/* Bit definition for Ethernet MAC VLAN Tag Register */
+#define ETH_MACVLANTR_VLANTC ((uint32_t)0x00010000)  /* 12-bit VLAN tag comparison */
+#define ETH_MACVLANTR_VLANTI ((uint32_t)0x0000FFFF)  /* VLAN tag identifier (for receive frames) */
+
+/* Bit definition for Ethernet MAC Remote Wake-UpFrame Filter Register */ 
+#define ETH_MACRWUFFR_D   ((uint32_t)0xFFFFFFFF)  /* Wake-up frame filter register data */
+/* Eight sequential Writes to this address (offset 0x28) will write all Wake-UpFrame Filter Registers.
+   Eight sequential Reads from this address (offset 0x28) will read all Wake-UpFrame Filter Registers. */
+/* Wake-UpFrame Filter Reg0 : Filter 0 Byte Mask
+   Wake-UpFrame Filter Reg1 : Filter 1 Byte Mask
+   Wake-UpFrame Filter Reg2 : Filter 2 Byte Mask
+   Wake-UpFrame Filter Reg3 : Filter 3 Byte Mask
+   Wake-UpFrame Filter Reg4 : RSVD - Filter3 Command - RSVD - Filter2 Command - 
+                              RSVD - Filter1 Command - RSVD - Filter0 Command
+   Wake-UpFrame Filter Re5 : Filter3 Offset - Filter2 Offset - Filter1 Offset - Filter0 Offset
+   Wake-UpFrame Filter Re6 : Filter1 CRC16 - Filter0 CRC16
+   Wake-UpFrame Filter Re7 : Filter3 CRC16 - Filter2 CRC16 */
+
+/* Bit definition for Ethernet MAC PMT Control and Status Register */ 
+#define ETH_MACPMTCSR_WFFRPR ((uint32_t)0x80000000)  /* Wake-Up Frame Filter Register Pointer Reset */
+#define ETH_MACPMTCSR_GU     ((uint32_t)0x00000200)  /* Global Unicast */
+#define ETH_MACPMTCSR_WFR    ((uint32_t)0x00000040)  /* Wake-Up Frame Received */
+#define ETH_MACPMTCSR_MPR    ((uint32_t)0x00000020)  /* Magic Packet Received */
+#define ETH_MACPMTCSR_WFE    ((uint32_t)0x00000004)  /* Wake-Up Frame Enable */
+#define ETH_MACPMTCSR_MPE    ((uint32_t)0x00000002)  /* Magic Packet Enable */
+#define ETH_MACPMTCSR_PD     ((uint32_t)0x00000001)  /* Power Down */
+
+/* Bit definition for Ethernet MAC Status Register */
+#define ETH_MACSR_TSTS      ((uint32_t)0x00000200)  /* Time stamp trigger status */
+#define ETH_MACSR_MMCTS     ((uint32_t)0x00000040)  /* MMC transmit status */
+#define ETH_MACSR_MMMCRS    ((uint32_t)0x00000020)  /* MMC receive status */
+#define ETH_MACSR_MMCS      ((uint32_t)0x00000010)  /* MMC status */
+#define ETH_MACSR_PMTS      ((uint32_t)0x00000008)  /* PMT status */
+
+/* Bit definition for Ethernet MAC Interrupt Mask Register */
+#define ETH_MACIMR_TSTIM     ((uint32_t)0x00000200)  /* Time stamp trigger interrupt mask */
+#define ETH_MACIMR_PMTIM     ((uint32_t)0x00000008)  /* PMT interrupt mask */
+
+/* Bit definition for Ethernet MAC Address0 High Register */
+#define ETH_MACA0HR_MACA0H   ((uint32_t)0x0000FFFF)  /* MAC address0 high */
+
+/* Bit definition for Ethernet MAC Address0 Low Register */
+#define ETH_MACA0LR_MACA0L   ((uint32_t)0xFFFFFFFF)  /* MAC address0 low */
+
+/* Bit definition for Ethernet MAC Address1 High Register */
+#define ETH_MACA1HR_AE       ((uint32_t)0x80000000)  /* Address enable */
+#define ETH_MACA1HR_SA       ((uint32_t)0x40000000)  /* Source address */
+#define ETH_MACA1HR_MBC      ((uint32_t)0x3F000000)  /* Mask byte control: bits to mask for comparison of the MAC Address bytes */
+  #define ETH_MACA1HR_MBC_HBits15_8    ((uint32_t)0x20000000)  /* Mask MAC Address high reg bits [15:8] */
+  #define ETH_MACA1HR_MBC_HBits7_0     ((uint32_t)0x10000000)  /* Mask MAC Address high reg bits [7:0] */
+  #define ETH_MACA1HR_MBC_LBits31_24   ((uint32_t)0x08000000)  /* Mask MAC Address low reg bits [31:24] */
+  #define ETH_MACA1HR_MBC_LBits23_16   ((uint32_t)0x04000000)  /* Mask MAC Address low reg bits [23:16] */
+  #define ETH_MACA1HR_MBC_LBits15_8    ((uint32_t)0x02000000)  /* Mask MAC Address low reg bits [15:8] */
+  #define ETH_MACA1HR_MBC_LBits7_0     ((uint32_t)0x01000000)  /* Mask MAC Address low reg bits [7:0] */ 
+#define ETH_MACA1HR_MACA1H   ((uint32_t)0x0000FFFF)  /* MAC address1 high */
+
+/* Bit definition for Ethernet MAC Address1 Low Register */
+#define ETH_MACA1LR_MACA1L   ((uint32_t)0xFFFFFFFF)  /* MAC address1 low */
+
+/* Bit definition for Ethernet MAC Address2 High Register */
+#define ETH_MACA2HR_AE       ((uint32_t)0x80000000)  /* Address enable */
+#define ETH_MACA2HR_SA       ((uint32_t)0x40000000)  /* Source address */
+#define ETH_MACA2HR_MBC      ((uint32_t)0x3F000000)  /* Mask byte control */
+  #define ETH_MACA2HR_MBC_HBits15_8    ((uint32_t)0x20000000)  /* Mask MAC Address high reg bits [15:8] */
+  #define ETH_MACA2HR_MBC_HBits7_0     ((uint32_t)0x10000000)  /* Mask MAC Address high reg bits [7:0] */
+  #define ETH_MACA2HR_MBC_LBits31_24   ((uint32_t)0x08000000)  /* Mask MAC Address low reg bits [31:24] */
+  #define ETH_MACA2HR_MBC_LBits23_16   ((uint32_t)0x04000000)  /* Mask MAC Address low reg bits [23:16] */
+  #define ETH_MACA2HR_MBC_LBits15_8    ((uint32_t)0x02000000)  /* Mask MAC Address low reg bits [15:8] */
+  #define ETH_MACA2HR_MBC_LBits7_0     ((uint32_t)0x01000000)  /* Mask MAC Address low reg bits [70] */
+#define ETH_MACA2HR_MACA2H   ((uint32_t)0x0000FFFF)  /* MAC address1 high */
+
+/* Bit definition for Ethernet MAC Address2 Low Register */
+#define ETH_MACA2LR_MACA2L   ((uint32_t)0xFFFFFFFF)  /* MAC address2 low */
+
+/* Bit definition for Ethernet MAC Address3 High Register */
+#define ETH_MACA3HR_AE       ((uint32_t)0x80000000)  /* Address enable */
+#define ETH_MACA3HR_SA       ((uint32_t)0x40000000)  /* Source address */
+#define ETH_MACA3HR_MBC      ((uint32_t)0x3F000000)  /* Mask byte control */
+  #define ETH_MACA3HR_MBC_HBits15_8    ((uint32_t)0x20000000)  /* Mask MAC Address high reg bits [15:8] */
+  #define ETH_MACA3HR_MBC_HBits7_0     ((uint32_t)0x10000000)  /* Mask MAC Address high reg bits [7:0] */
+  #define ETH_MACA3HR_MBC_LBits31_24   ((uint32_t)0x08000000)  /* Mask MAC Address low reg bits [31:24] */
+  #define ETH_MACA3HR_MBC_LBits23_16   ((uint32_t)0x04000000)  /* Mask MAC Address low reg bits [23:16] */
+  #define ETH_MACA3HR_MBC_LBits15_8    ((uint32_t)0x02000000)  /* Mask MAC Address low reg bits [15:8] */
+  #define ETH_MACA3HR_MBC_LBits7_0     ((uint32_t)0x01000000)  /* Mask MAC Address low reg bits [70] */
+#define ETH_MACA3HR_MACA3H   ((uint32_t)0x0000FFFF)  /* MAC address3 high */
+
+/* Bit definition for Ethernet MAC Address3 Low Register */
+#define ETH_MACA3LR_MACA3L   ((uint32_t)0xFFFFFFFF)  /* MAC address3 low */
+
+/******************************************************************************/
+/*                Ethernet MMC Registers bits definition                      */
+/******************************************************************************/
+
+/* Bit definition for Ethernet MMC Contol Register */
+#define ETH_MMCCR_MCFHP      ((uint32_t)0x00000020)  /* MMC counter Full-Half preset (Only in STM32F2xx) */
+#define ETH_MMCCR_MCP        ((uint32_t)0x00000010)  /* MMC counter preset (Only in STM32F2xx) */
+#define ETH_MMCCR_MCF        ((uint32_t)0x00000008)  /* MMC Counter Freeze */
+#define ETH_MMCCR_ROR        ((uint32_t)0x00000004)  /* Reset on Read */
+#define ETH_MMCCR_CSR        ((uint32_t)0x00000002)  /* Counter Stop Rollover */
+#define ETH_MMCCR_CR         ((uint32_t)0x00000001)  /* Counters Reset */
+
+/* Bit definition for Ethernet MMC Receive Interrupt Register */
+#define ETH_MMCRIR_RGUFS     ((uint32_t)0x00020000)  /* Set when Rx good unicast frames counter reaches half the maximum value */
+#define ETH_MMCRIR_RFAES     ((uint32_t)0x00000040)  /* Set when Rx alignment error counter reaches half the maximum value */
+#define ETH_MMCRIR_RFCES     ((uint32_t)0x00000020)  /* Set when Rx crc error counter reaches half the maximum value */
+
+/* Bit definition for Ethernet MMC Transmit Interrupt Register */
+#define ETH_MMCTIR_TGFS      ((uint32_t)0x00200000)  /* Set when Tx good frame count counter reaches half the maximum value */
+#define ETH_MMCTIR_TGFMSCS   ((uint32_t)0x00008000)  /* Set when Tx good multi col counter reaches half the maximum value */
+#define ETH_MMCTIR_TGFSCS    ((uint32_t)0x00004000)  /* Set when Tx good single col counter reaches half the maximum value */
+
+/* Bit definition for Ethernet MMC Receive Interrupt Mask Register */
+#define ETH_MMCRIMR_RGUFM    ((uint32_t)0x00020000)  /* Mask the interrupt when Rx good unicast frames counter reaches half the maximum value */
+#define ETH_MMCRIMR_RFAEM    ((uint32_t)0x00000040)  /* Mask the interrupt when when Rx alignment error counter reaches half the maximum value */
+#define ETH_MMCRIMR_RFCEM    ((uint32_t)0x00000020)  /* Mask the interrupt when Rx crc error counter reaches half the maximum value */
+
+/* Bit definition for Ethernet MMC Transmit Interrupt Mask Register */
+#define ETH_MMCTIMR_TGFM     ((uint32_t)0x00200000)  /* Mask the interrupt when Tx good frame count counter reaches half the maximum value */
+#define ETH_MMCTIMR_TGFMSCM  ((uint32_t)0x00008000)  /* Mask the interrupt when Tx good multi col counter reaches half the maximum value */
+#define ETH_MMCTIMR_TGFSCM   ((uint32_t)0x00004000)  /* Mask the interrupt when Tx good single col counter reaches half the maximum value */
+
+/* Bit definition for Ethernet MMC Transmitted Good Frames after Single Collision Counter Register */
+#define ETH_MMCTGFSCCR_TGFSCC     ((uint32_t)0xFFFFFFFF)  /* Number of successfully transmitted frames after a single collision in Half-duplex mode. */
+
+/* Bit definition for Ethernet MMC Transmitted Good Frames after More than a Single Collision Counter Register */
+#define ETH_MMCTGFMSCCR_TGFMSCC   ((uint32_t)0xFFFFFFFF)  /* Number of successfully transmitted frames after more than a single collision in Half-duplex mode. */
+
+/* Bit definition for Ethernet MMC Transmitted Good Frames Counter Register */
+#define ETH_MMCTGFCR_TGFC    ((uint32_t)0xFFFFFFFF)  /* Number of good frames transmitted. */
+
+/* Bit definition for Ethernet MMC Received Frames with CRC Error Counter Register */
+#define ETH_MMCRFCECR_RFCEC  ((uint32_t)0xFFFFFFFF)  /* Number of frames received with CRC error. */
+
+/* Bit definition for Ethernet MMC Received Frames with Alignement Error Counter Register */
+#define ETH_MMCRFAECR_RFAEC  ((uint32_t)0xFFFFFFFF)  /* Number of frames received with alignment (dribble) error */
+
+/* Bit definition for Ethernet MMC Received Good Unicast Frames Counter Register */
+#define ETH_MMCRGUFCR_RGUFC  ((uint32_t)0xFFFFFFFF)  /* Number of good unicast frames received. */
+
+/******************************************************************************/
+/*               Ethernet PTP Registers bits definition                       */
+/******************************************************************************/
+
+/* Bit definition for Ethernet PTP Time Stamp Contol Register */
+#define ETH_PTPTSCR_TSCNT       ((uint32_t)0x00030000)  /* Time stamp clock node type */
+#define ETH_PTPTSSR_TSSMRME     ((uint32_t)0x00008000)  /* Time stamp snapshot for message relevant to master enable */
+#define ETH_PTPTSSR_TSSEME      ((uint32_t)0x00004000)  /* Time stamp snapshot for event message enable */
+#define ETH_PTPTSSR_TSSIPV4FE   ((uint32_t)0x00002000)  /* Time stamp snapshot for IPv4 frames enable */
+#define ETH_PTPTSSR_TSSIPV6FE   ((uint32_t)0x00001000)  /* Time stamp snapshot for IPv6 frames enable */
+#define ETH_PTPTSSR_TSSPTPOEFE  ((uint32_t)0x00000800)  /* Time stamp snapshot for PTP over ethernet frames enable */
+#define ETH_PTPTSSR_TSPTPPSV2E  ((uint32_t)0x00000400)  /* Time stamp PTP packet snooping for version2 format enable */
+#define ETH_PTPTSSR_TSSSR       ((uint32_t)0x00000200)  /* Time stamp Sub-seconds rollover */
+#define ETH_PTPTSSR_TSSARFE     ((uint32_t)0x00000100)  /* Time stamp snapshot for all received frames enable */
+
+#define ETH_PTPTSCR_TSARU    ((uint32_t)0x00000020)  /* Addend register update */
+#define ETH_PTPTSCR_TSITE    ((uint32_t)0x00000010)  /* Time stamp interrupt trigger enable */
+#define ETH_PTPTSCR_TSSTU    ((uint32_t)0x00000008)  /* Time stamp update */
+#define ETH_PTPTSCR_TSSTI    ((uint32_t)0x00000004)  /* Time stamp initialize */
+#define ETH_PTPTSCR_TSFCU    ((uint32_t)0x00000002)  /* Time stamp fine or coarse update */
+#define ETH_PTPTSCR_TSE      ((uint32_t)0x00000001)  /* Time stamp enable */
+
+/* Bit definition for Ethernet PTP Sub-Second Increment Register */
+#define ETH_PTPSSIR_STSSI    ((uint32_t)0x000000FF)  /* System time Sub-second increment value */
+
+/* Bit definition for Ethernet PTP Time Stamp High Register */
+#define ETH_PTPTSHR_STS      ((uint32_t)0xFFFFFFFF)  /* System Time second */
+
+/* Bit definition for Ethernet PTP Time Stamp Low Register */
+#define ETH_PTPTSLR_STPNS    ((uint32_t)0x80000000)  /* System Time Positive or negative time */
+#define ETH_PTPTSLR_STSS     ((uint32_t)0x7FFFFFFF)  /* System Time sub-seconds */
+
+/* Bit definition for Ethernet PTP Time Stamp High Update Register */
+#define ETH_PTPTSHUR_TSUS    ((uint32_t)0xFFFFFFFF)  /* Time stamp update seconds */
+
+/* Bit definition for Ethernet PTP Time Stamp Low Update Register */
+#define ETH_PTPTSLUR_TSUPNS  ((uint32_t)0x80000000)  /* Time stamp update Positive or negative time */
+#define ETH_PTPTSLUR_TSUSS   ((uint32_t)0x7FFFFFFF)  /* Time stamp update sub-seconds */
+
+/* Bit definition for Ethernet PTP Time Stamp Addend Register */
+#define ETH_PTPTSAR_TSA      ((uint32_t)0xFFFFFFFF)  /* Time stamp addend */
+
+/* Bit definition for Ethernet PTP Target Time High Register */
+#define ETH_PTPTTHR_TTSH     ((uint32_t)0xFFFFFFFF)  /* Target time stamp high */
+
+/* Bit definition for Ethernet PTP Target Time Low Register */
+#define ETH_PTPTTLR_TTSL     ((uint32_t)0xFFFFFFFF)  /* Target time stamp low */
+
+/* Bit definition for Ethernet PTP Time Stamp Status Register */
+#define ETH_PTPTSSR_TSTTR    ((uint32_t)0x00000020)  /* Time stamp target time reached */
+#define ETH_PTPTSSR_TSSO     ((uint32_t)0x00000010)  /* Time stamp seconds overflow */
+
+/******************************************************************************/
+/*                 Ethernet DMA Registers bits definition                     */
+/******************************************************************************/
+
+/* Bit definition for Ethernet DMA Bus Mode Register */
+#define ETH_DMABMR_AAB       ((uint32_t)0x02000000)  /* Address-Aligned beats */
+#define ETH_DMABMR_FPM        ((uint32_t)0x01000000)  /* 4xPBL mode */
+#define ETH_DMABMR_USP       ((uint32_t)0x00800000)  /* Use separate PBL */
+#define ETH_DMABMR_RDP       ((uint32_t)0x007E0000)  /* RxDMA PBL */
+  #define ETH_DMABMR_RDP_1Beat    ((uint32_t)0x00020000)  /* maximum number of beats to be transferred in one RxDMA transaction is 1 */
+  #define ETH_DMABMR_RDP_2Beat    ((uint32_t)0x00040000)  /* maximum number of beats to be transferred in one RxDMA transaction is 2 */
+  #define ETH_DMABMR_RDP_4Beat    ((uint32_t)0x00080000)  /* maximum number of beats to be transferred in one RxDMA transaction is 4 */
+  #define ETH_DMABMR_RDP_8Beat    ((uint32_t)0x00100000)  /* maximum number of beats to be transferred in one RxDMA transaction is 8 */
+  #define ETH_DMABMR_RDP_16Beat   ((uint32_t)0x00200000)  /* maximum number of beats to be transferred in one RxDMA transaction is 16 */
+  #define ETH_DMABMR_RDP_32Beat   ((uint32_t)0x00400000)  /* maximum number of beats to be transferred in one RxDMA transaction is 32 */                
+  #define ETH_DMABMR_RDP_4xPBL_4Beat   ((uint32_t)0x01020000)  /* maximum number of beats to be transferred in one RxDMA transaction is 4 */
+  #define ETH_DMABMR_RDP_4xPBL_8Beat   ((uint32_t)0x01040000)  /* maximum number of beats to be transferred in one RxDMA transaction is 8 */
+  #define ETH_DMABMR_RDP_4xPBL_16Beat  ((uint32_t)0x01080000)  /* maximum number of beats to be transferred in one RxDMA transaction is 16 */
+  #define ETH_DMABMR_RDP_4xPBL_32Beat  ((uint32_t)0x01100000)  /* maximum number of beats to be transferred in one RxDMA transaction is 32 */
+  #define ETH_DMABMR_RDP_4xPBL_64Beat  ((uint32_t)0x01200000)  /* maximum number of beats to be transferred in one RxDMA transaction is 64 */
+  #define ETH_DMABMR_RDP_4xPBL_128Beat ((uint32_t)0x01400000)  /* maximum number of beats to be transferred in one RxDMA transaction is 128 */  
+#define ETH_DMABMR_FB        ((uint32_t)0x00010000)  /* Fixed Burst */
+#define ETH_DMABMR_RTPR      ((uint32_t)0x0000C000)  /* Rx Tx priority ratio */
+  #define ETH_DMABMR_RTPR_1_1     ((uint32_t)0x00000000)  /* Rx Tx priority ratio */
+  #define ETH_DMABMR_RTPR_2_1     ((uint32_t)0x00004000)  /* Rx Tx priority ratio */
+  #define ETH_DMABMR_RTPR_3_1     ((uint32_t)0x00008000)  /* Rx Tx priority ratio */
+  #define ETH_DMABMR_RTPR_4_1     ((uint32_t)0x0000C000)  /* Rx Tx priority ratio */  
+#define ETH_DMABMR_PBL    ((uint32_t)0x00003F00)  /* Programmable burst length */
+  #define ETH_DMABMR_PBL_1Beat    ((uint32_t)0x00000100)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */
+  #define ETH_DMABMR_PBL_2Beat    ((uint32_t)0x00000200)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */
+  #define ETH_DMABMR_PBL_4Beat    ((uint32_t)0x00000400)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */
+  #define ETH_DMABMR_PBL_8Beat    ((uint32_t)0x00000800)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */
+  #define ETH_DMABMR_PBL_16Beat   ((uint32_t)0x00001000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */
+  #define ETH_DMABMR_PBL_32Beat   ((uint32_t)0x00002000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */                
+  #define ETH_DMABMR_PBL_4xPBL_4Beat   ((uint32_t)0x01000100)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */
+  #define ETH_DMABMR_PBL_4xPBL_8Beat   ((uint32_t)0x01000200)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */
+  #define ETH_DMABMR_PBL_4xPBL_16Beat  ((uint32_t)0x01000400)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */
+  #define ETH_DMABMR_PBL_4xPBL_32Beat  ((uint32_t)0x01000800)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */
+  #define ETH_DMABMR_PBL_4xPBL_64Beat  ((uint32_t)0x01001000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */
+  #define ETH_DMABMR_PBL_4xPBL_128Beat ((uint32_t)0x01002000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */
+#define ETH_DMABMR_EDE       ((uint32_t)0x00000080)  /* Enhanced Descriptor Enable */
+#define ETH_DMABMR_DSL       ((uint32_t)0x0000007C)  /* Descriptor Skip Length */
+#define ETH_DMABMR_DA        ((uint32_t)0x00000002)  /* DMA arbitration scheme */
+#define ETH_DMABMR_SR        ((uint32_t)0x00000001)  /* Software reset */
+
+/* Bit definition for Ethernet DMA Transmit Poll Demand Register */
+#define ETH_DMATPDR_TPD      ((uint32_t)0xFFFFFFFF)  /* Transmit poll demand */
+
+/* Bit definition for Ethernet DMA Receive Poll Demand Register */
+#define ETH_DMARPDR_RPD      ((uint32_t)0xFFFFFFFF)  /* Receive poll demand  */
+
+/* Bit definition for Ethernet DMA Receive Descriptor List Address Register */
+#define ETH_DMARDLAR_SRL     ((uint32_t)0xFFFFFFFF)  /* Start of receive list */
+
+/* Bit definition for Ethernet DMA Transmit Descriptor List Address Register */
+#define ETH_DMATDLAR_STL     ((uint32_t)0xFFFFFFFF)  /* Start of transmit list */
+
+/* Bit definition for Ethernet DMA Status Register */
+#define ETH_DMASR_TSTS       ((uint32_t)0x20000000)  /* Time-stamp trigger status */
+#define ETH_DMASR_PMTS       ((uint32_t)0x10000000)  /* PMT status */
+#define ETH_DMASR_MMCS       ((uint32_t)0x08000000)  /* MMC status */
+#define ETH_DMASR_EBS        ((uint32_t)0x03800000)  /* Error bits status */
+  /* combination with EBS[2:0] for GetFlagStatus function */
+  #define ETH_DMASR_EBS_DescAccess      ((uint32_t)0x02000000)  /* Error bits 0-data buffer, 1-desc. access */
+  #define ETH_DMASR_EBS_ReadTransf      ((uint32_t)0x01000000)  /* Error bits 0-write trnsf, 1-read transfr */
+  #define ETH_DMASR_EBS_DataTransfTx    ((uint32_t)0x00800000)  /* Error bits 0-Rx DMA, 1-Tx DMA */
+#define ETH_DMASR_TPS         ((uint32_t)0x00700000)  /* Transmit process state */
+  #define ETH_DMASR_TPS_Stopped         ((uint32_t)0x00000000)  /* Stopped - Reset or Stop Tx Command issued  */
+  #define ETH_DMASR_TPS_Fetching        ((uint32_t)0x00100000)  /* Running - fetching the Tx descriptor */
+  #define ETH_DMASR_TPS_Waiting         ((uint32_t)0x00200000)  /* Running - waiting for status */
+  #define ETH_DMASR_TPS_Reading         ((uint32_t)0x00300000)  /* Running - reading the data from host memory */
+  #define ETH_DMASR_TPS_Suspended       ((uint32_t)0x00600000)  /* Suspended - Tx Descriptor unavailabe */
+  #define ETH_DMASR_TPS_Closing         ((uint32_t)0x00700000)  /* Running - closing Rx descriptor */
+#define ETH_DMASR_RPS         ((uint32_t)0x000E0000)  /* Receive process state */
+  #define ETH_DMASR_RPS_Stopped         ((uint32_t)0x00000000)  /* Stopped - Reset or Stop Rx Command issued */
+  #define ETH_DMASR_RPS_Fetching        ((uint32_t)0x00020000)  /* Running - fetching the Rx descriptor */
+  #define ETH_DMASR_RPS_Waiting         ((uint32_t)0x00060000)  /* Running - waiting for packet */
+  #define ETH_DMASR_RPS_Suspended       ((uint32_t)0x00080000)  /* Suspended - Rx Descriptor unavailable */
+  #define ETH_DMASR_RPS_Closing         ((uint32_t)0x000A0000)  /* Running - closing descriptor */
+  #define ETH_DMASR_RPS_Queuing         ((uint32_t)0x000E0000)  /* Running - queuing the recieve frame into host memory */
+#define ETH_DMASR_NIS        ((uint32_t)0x00010000)  /* Normal interrupt summary */
+#define ETH_DMASR_AIS        ((uint32_t)0x00008000)  /* Abnormal interrupt summary */
+#define ETH_DMASR_ERS        ((uint32_t)0x00004000)  /* Early receive status */
+#define ETH_DMASR_FBES       ((uint32_t)0x00002000)  /* Fatal bus error status */
+#define ETH_DMASR_ETS        ((uint32_t)0x00000400)  /* Early transmit status */
+#define ETH_DMASR_RWTS       ((uint32_t)0x00000200)  /* Receive watchdog timeout status */
+#define ETH_DMASR_RPSS       ((uint32_t)0x00000100)  /* Receive process stopped status */
+#define ETH_DMASR_RBUS       ((uint32_t)0x00000080)  /* Receive buffer unavailable status */
+#define ETH_DMASR_RS         ((uint32_t)0x00000040)  /* Receive status */
+#define ETH_DMASR_TUS        ((uint32_t)0x00000020)  /* Transmit underflow status */
+#define ETH_DMASR_ROS        ((uint32_t)0x00000010)  /* Receive overflow status */
+#define ETH_DMASR_TJTS       ((uint32_t)0x00000008)  /* Transmit jabber timeout status */
+#define ETH_DMASR_TBUS       ((uint32_t)0x00000004)  /* Transmit buffer unavailable status */
+#define ETH_DMASR_TPSS       ((uint32_t)0x00000002)  /* Transmit process stopped status */
+#define ETH_DMASR_TS         ((uint32_t)0x00000001)  /* Transmit status */
+
+/* Bit definition for Ethernet DMA Operation Mode Register */
+#define ETH_DMAOMR_DTCEFD    ((uint32_t)0x04000000)  /* Disable Dropping of TCP/IP checksum error frames */
+#define ETH_DMAOMR_RSF       ((uint32_t)0x02000000)  /* Receive store and forward */
+#define ETH_DMAOMR_DFRF      ((uint32_t)0x01000000)  /* Disable flushing of received frames */
+#define ETH_DMAOMR_TSF       ((uint32_t)0x00200000)  /* Transmit store and forward */
+#define ETH_DMAOMR_FTF       ((uint32_t)0x00100000)  /* Flush transmit FIFO */
+#define ETH_DMAOMR_TTC       ((uint32_t)0x0001C000)  /* Transmit threshold control */
+  #define ETH_DMAOMR_TTC_64Bytes       ((uint32_t)0x00000000)  /* threshold level of the MTL Transmit FIFO is 64 Bytes */
+  #define ETH_DMAOMR_TTC_128Bytes      ((uint32_t)0x00004000)  /* threshold level of the MTL Transmit FIFO is 128 Bytes */
+  #define ETH_DMAOMR_TTC_192Bytes      ((uint32_t)0x00008000)  /* threshold level of the MTL Transmit FIFO is 192 Bytes */
+  #define ETH_DMAOMR_TTC_256Bytes      ((uint32_t)0x0000C000)  /* threshold level of the MTL Transmit FIFO is 256 Bytes */
+  #define ETH_DMAOMR_TTC_40Bytes       ((uint32_t)0x00010000)  /* threshold level of the MTL Transmit FIFO is 40 Bytes */
+  #define ETH_DMAOMR_TTC_32Bytes       ((uint32_t)0x00014000)  /* threshold level of the MTL Transmit FIFO is 32 Bytes */
+  #define ETH_DMAOMR_TTC_24Bytes       ((uint32_t)0x00018000)  /* threshold level of the MTL Transmit FIFO is 24 Bytes */
+  #define ETH_DMAOMR_TTC_16Bytes       ((uint32_t)0x0001C000)  /* threshold level of the MTL Transmit FIFO is 16 Bytes */
+#define ETH_DMAOMR_ST        ((uint32_t)0x00002000)  /* Start/stop transmission command */
+#define ETH_DMAOMR_FEF       ((uint32_t)0x00000080)  /* Forward error frames */
+#define ETH_DMAOMR_FUGF      ((uint32_t)0x00000040)  /* Forward undersized good frames */
+#define ETH_DMAOMR_RTC       ((uint32_t)0x00000018)  /* receive threshold control */
+  #define ETH_DMAOMR_RTC_64Bytes       ((uint32_t)0x00000000)  /* threshold level of the MTL Receive FIFO is 64 Bytes */
+  #define ETH_DMAOMR_RTC_32Bytes       ((uint32_t)0x00000008)  /* threshold level of the MTL Receive FIFO is 32 Bytes */
+  #define ETH_DMAOMR_RTC_96Bytes       ((uint32_t)0x00000010)  /* threshold level of the MTL Receive FIFO is 96 Bytes */
+  #define ETH_DMAOMR_RTC_128Bytes      ((uint32_t)0x00000018)  /* threshold level of the MTL Receive FIFO is 128 Bytes */
+#define ETH_DMAOMR_OSF       ((uint32_t)0x00000004)  /* operate on second frame */
+#define ETH_DMAOMR_SR        ((uint32_t)0x00000002)  /* Start/stop receive */
+
+/* Bit definition for Ethernet DMA Interrupt Enable Register */
+#define ETH_DMAIER_NISE      ((uint32_t)0x00010000)  /* Normal interrupt summary enable */
+#define ETH_DMAIER_AISE      ((uint32_t)0x00008000)  /* Abnormal interrupt summary enable */
+#define ETH_DMAIER_ERIE      ((uint32_t)0x00004000)  /* Early receive interrupt enable */
+#define ETH_DMAIER_FBEIE     ((uint32_t)0x00002000)  /* Fatal bus error interrupt enable */
+#define ETH_DMAIER_ETIE      ((uint32_t)0x00000400)  /* Early transmit interrupt enable */
+#define ETH_DMAIER_RWTIE     ((uint32_t)0x00000200)  /* Receive watchdog timeout interrupt enable */
+#define ETH_DMAIER_RPSIE     ((uint32_t)0x00000100)  /* Receive process stopped interrupt enable */
+#define ETH_DMAIER_RBUIE     ((uint32_t)0x00000080)  /* Receive buffer unavailable interrupt enable */
+#define ETH_DMAIER_RIE       ((uint32_t)0x00000040)  /* Receive interrupt enable */
+#define ETH_DMAIER_TUIE      ((uint32_t)0x00000020)  /* Transmit Underflow interrupt enable */
+#define ETH_DMAIER_ROIE      ((uint32_t)0x00000010)  /* Receive Overflow interrupt enable */
+#define ETH_DMAIER_TJTIE     ((uint32_t)0x00000008)  /* Transmit jabber timeout interrupt enable */
+#define ETH_DMAIER_TBUIE     ((uint32_t)0x00000004)  /* Transmit buffer unavailable interrupt enable */
+#define ETH_DMAIER_TPSIE     ((uint32_t)0x00000002)  /* Transmit process stopped interrupt enable */
+#define ETH_DMAIER_TIE       ((uint32_t)0x00000001)  /* Transmit interrupt enable */
+
+/* Bit definition for Ethernet DMA Missed Frame and Buffer Overflow Counter Register */
+#define ETH_DMAMFBOCR_OFOC   ((uint32_t)0x10000000)  /* Overflow bit for FIFO overflow counter */
+#define ETH_DMAMFBOCR_MFA    ((uint32_t)0x0FFE0000)  /* Number of frames missed by the application */
+#define ETH_DMAMFBOCR_OMFC   ((uint32_t)0x00010000)  /* Overflow bit for missed frame counter */
+#define ETH_DMAMFBOCR_MFC    ((uint32_t)0x0000FFFF)  /* Number of frames missed by the controller */
+
+/* Bit definition for Ethernet DMA Current Host Transmit Descriptor Register */
+#define ETH_DMACHTDR_HTDAP   ((uint32_t)0xFFFFFFFF)  /* Host transmit descriptor address pointer */
+
+/* Bit definition for Ethernet DMA Current Host Receive Descriptor Register */
+#define ETH_DMACHRDR_HRDAP   ((uint32_t)0xFFFFFFFF)  /* Host receive descriptor address pointer */
+
+/* Bit definition for Ethernet DMA Current Host Transmit Buffer Address Register */
+#define ETH_DMACHTBAR_HTBAP  ((uint32_t)0xFFFFFFFF)  /* Host transmit buffer address pointer */
+
+/* Bit definition for Ethernet DMA Current Host Receive Buffer Address Register */
+#define ETH_DMACHRBAR_HRBAP  ((uint32_t)0xFFFFFFFF)  /* Host receive buffer address pointer */
+
+#define SET_BIT(REG, BIT)     ((REG) |= (BIT))
+
+#define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT))
+
+#define READ_BIT(REG, BIT)    ((REG) & (BIT))
+
+#define CLEAR_REG(REG)        ((REG) = (0x0))
+
+#define WRITE_REG(REG, VAL)   ((REG) = (VAL))
+
+#define READ_REG(REG)         ((REG))
+
+#define MODIFY_REG(REG, CLEARMASK, SETMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __STM32F2xx_H */
+
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
diff --git a/bbb_cape/src/cape/CMSIS/core_cm3.h b/bbb_cape/src/cape/CMSIS/core_cm3.h
new file mode 100644
index 0000000..122c9aa
--- /dev/null
+++ b/bbb_cape/src/cape/CMSIS/core_cm3.h
@@ -0,0 +1,1627 @@
+/**************************************************************************//**
+ * @file     core_cm3.h
+ * @brief    CMSIS Cortex-M3 Core Peripheral Access Layer Header File
+ * @version  V3.20
+ * @date     25. February 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#if defined ( __ICCARM__ )
+ #pragma system_include  /* treat file as system include file for MISRA check */
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifndef __CORE_CM3_H_GENERIC
+#define __CORE_CM3_H_GENERIC
+
+/** \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions
+  CMSIS violates the following MISRA-C:2004 rules:
+
+   \li Required Rule 8.5, object/function definition in header file.<br>
+     Function definitions in header files are used to allow 'inlining'.
+
+   \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
+     Unions are used for effective representation of core registers.
+
+   \li Advisory Rule 19.7, Function-like macro defined.<br>
+     Function-like macros are used to allow more efficient code.
+ */
+
+
+/*******************************************************************************
+ *                 CMSIS definitions
+ ******************************************************************************/
+/** \ingroup Cortex_M3
+  @{
+ */
+
+/*  CMSIS CM3 definitions */
+#define __CM3_CMSIS_VERSION_MAIN  (0x03)                                   /*!< [31:16] CMSIS HAL main version   */
+#define __CM3_CMSIS_VERSION_SUB   (0x20)                                   /*!< [15:0]  CMSIS HAL sub version    */
+#define __CM3_CMSIS_VERSION       ((__CM3_CMSIS_VERSION_MAIN << 16) | \
+                                    __CM3_CMSIS_VERSION_SUB          )     /*!< CMSIS HAL version number         */
+
+#define __CORTEX_M                (0x03)                                   /*!< Cortex-M Core                    */
+
+
+#if   defined ( __CC_ARM )
+  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */
+  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */
+  #define __STATIC_INLINE  static __inline
+
+#elif defined ( __ICCARM__ )
+  #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler          */
+  #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
+  #define __STATIC_INLINE  static inline
+
+#elif defined ( __TMS470__ )
+  #define __ASM            __asm                                      /*!< asm keyword for TI CCS Compiler       */
+  #define __STATIC_INLINE  static inline
+
+#elif defined ( __GNUC__ )
+  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */
+  #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */
+  #define __STATIC_INLINE  static inline
+
+#elif defined ( __TASKING__ )
+  #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */
+  #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */
+  #define __STATIC_INLINE  static inline
+
+#endif
+
+/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all
+*/
+#define __FPU_USED       0
+
+#if defined ( __CC_ARM )
+  #if defined __TARGET_FPU_VFP
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __ICCARM__ )
+  #if defined __ARMVFP__
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __TMS470__ )
+  #if defined __TI__VFP_SUPPORT____
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __GNUC__ )
+  #if defined (__VFP_FP__) && !defined(__SOFTFP__)
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __TASKING__ )
+  #if defined __FPU_VFP__
+    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+#endif
+
+#include <stdint.h>                      /* standard types definitions                      */
+#include <core_cmInstr.h>                /* Core Instruction Access                         */
+#include <core_cmFunc.h>                 /* Core Function Access                            */
+
+#endif /* __CORE_CM3_H_GENERIC */
+
+#ifndef __CMSIS_GENERIC
+
+#ifndef __CORE_CM3_H_DEPENDANT
+#define __CORE_CM3_H_DEPENDANT
+
+/* check device defines and use defaults */
+#if defined __CHECK_DEVICE_DEFINES
+  #ifndef __CM3_REV
+    #define __CM3_REV               0x0200
+    #warning "__CM3_REV not defined in device header file; using default!"
+  #endif
+
+  #ifndef __MPU_PRESENT
+    #define __MPU_PRESENT             0
+    #warning "__MPU_PRESENT not defined in device header file; using default!"
+  #endif
+
+  #ifndef __NVIC_PRIO_BITS
+    #define __NVIC_PRIO_BITS          4
+    #warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
+  #endif
+
+  #ifndef __Vendor_SysTickConfig
+    #define __Vendor_SysTickConfig    0
+    #warning "__Vendor_SysTickConfig not defined in device header file; using default!"
+  #endif
+#endif
+
+/* IO definitions (access restrictions to peripheral registers) */
+/**
+    \defgroup CMSIS_glob_defs CMSIS Global Defines
+
+    <strong>IO Type Qualifiers</strong> are used
+    \li to specify the access to peripheral variables.
+    \li for automatic generation of peripheral register debug information.
+*/
+#ifdef __cplusplus
+  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
+#else
+  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
+#endif
+#define     __O     volatile             /*!< Defines 'write only' permissions                */
+#define     __IO    volatile             /*!< Defines 'read / write' permissions              */
+
+/*@} end of group Cortex_M3 */
+
+
+
+/*******************************************************************************
+ *                 Register Abstraction
+  Core Register contain:
+  - Core Register
+  - Core NVIC Register
+  - Core SCB Register
+  - Core SysTick Register
+  - Core Debug Register
+  - Core MPU Register
+ ******************************************************************************/
+/** \defgroup CMSIS_core_register Defines and Type Definitions
+    \brief Type definitions and defines for Cortex-M processor based devices.
+*/
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_CORE  Status and Control Registers
+    \brief  Core Register type definitions.
+  @{
+ */
+
+/** \brief  Union type to access the Application Program Status Register (APSR).
+ */
+typedef union
+{
+  struct
+  {
+#if (__CORTEX_M != 0x04)
+    uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved                           */
+#else
+    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved                           */
+    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */
+    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved                           */
+#endif
+    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */
+    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */
+    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */
+    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */
+    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} APSR_Type;
+
+
+/** \brief  Union type to access the Interrupt Program Status Register (IPSR).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */
+    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved                           */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} IPSR_Type;
+
+
+/** \brief  Union type to access the Special-Purpose Program Status Registers (xPSR).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */
+#if (__CORTEX_M != 0x04)
+    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved                           */
+#else
+    uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved                           */
+    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */
+    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved                           */
+#endif
+    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0)          */
+    uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0)          */
+    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */
+    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */
+    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */
+    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */
+    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} xPSR_Type;
+
+
+/** \brief  Union type to access the Control Registers (CONTROL).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */
+    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used                   */
+    uint32_t FPCA:1;                     /*!< bit:      2  FP extension active flag           */
+    uint32_t _reserved0:29;              /*!< bit:  3..31  Reserved                           */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} CONTROL_Type;
+
+/*@} end of group CMSIS_CORE */
+
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)
+    \brief      Type definitions for the NVIC Registers
+  @{
+ */
+
+/** \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
+ */
+typedef struct
+{
+  __IO uint32_t ISER[8];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
+       uint32_t RESERVED0[24];
+  __IO uint32_t ICER[8];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register         */
+       uint32_t RSERVED1[24];
+  __IO uint32_t ISPR[8];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register          */
+       uint32_t RESERVED2[24];
+  __IO uint32_t ICPR[8];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register        */
+       uint32_t RESERVED3[24];
+  __IO uint32_t IABR[8];                 /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register           */
+       uint32_t RESERVED4[56];
+  __IO uint8_t  IP[240];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
+       uint32_t RESERVED5[644];
+  __O  uint32_t STIR;                    /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register     */
+}  NVIC_Type;
+
+/* Software Triggered Interrupt Register Definitions */
+#define NVIC_STIR_INTID_Pos                 0                                          /*!< STIR: INTLINESNUM Position */
+#define NVIC_STIR_INTID_Msk                (0x1FFUL << NVIC_STIR_INTID_Pos)            /*!< STIR: INTLINESNUM Mask */
+
+/*@} end of group CMSIS_NVIC */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_SCB     System Control Block (SCB)
+    \brief      Type definitions for the System Control Block Registers
+  @{
+ */
+
+/** \brief  Structure type to access the System Control Block (SCB).
+ */
+typedef struct
+{
+  __I  uint32_t CPUID;                   /*!< Offset: 0x000 (R/ )  CPUID Base Register                                   */
+  __IO uint32_t ICSR;                    /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register                  */
+  __IO uint32_t VTOR;                    /*!< Offset: 0x008 (R/W)  Vector Table Offset Register                          */
+  __IO uint32_t AIRCR;                   /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register      */
+  __IO uint32_t SCR;                     /*!< Offset: 0x010 (R/W)  System Control Register                               */
+  __IO uint32_t CCR;                     /*!< Offset: 0x014 (R/W)  Configuration Control Register                        */
+  __IO uint8_t  SHP[12];                 /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */
+  __IO uint32_t SHCSR;                   /*!< Offset: 0x024 (R/W)  System Handler Control and State Register             */
+  __IO uint32_t CFSR;                    /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register                    */
+  __IO uint32_t HFSR;                    /*!< Offset: 0x02C (R/W)  HardFault Status Register                             */
+  __IO uint32_t DFSR;                    /*!< Offset: 0x030 (R/W)  Debug Fault Status Register                           */
+  __IO uint32_t MMFAR;                   /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register                      */
+  __IO uint32_t BFAR;                    /*!< Offset: 0x038 (R/W)  BusFault Address Register                             */
+  __IO uint32_t AFSR;                    /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register                       */
+  __I  uint32_t PFR[2];                  /*!< Offset: 0x040 (R/ )  Processor Feature Register                            */
+  __I  uint32_t DFR;                     /*!< Offset: 0x048 (R/ )  Debug Feature Register                                */
+  __I  uint32_t ADR;                     /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register                            */
+  __I  uint32_t MMFR[4];                 /*!< Offset: 0x050 (R/ )  Memory Model Feature Register                         */
+  __I  uint32_t ISAR[5];                 /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register                   */
+       uint32_t RESERVED0[5];
+  __IO uint32_t CPACR;                   /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register                   */
+} SCB_Type;
+
+/* SCB CPUID Register Definitions */
+#define SCB_CPUID_IMPLEMENTER_Pos          24                                             /*!< SCB CPUID: IMPLEMENTER Position */
+#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */
+
+#define SCB_CPUID_VARIANT_Pos              20                                             /*!< SCB CPUID: VARIANT Position */
+#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */
+
+#define SCB_CPUID_ARCHITECTURE_Pos         16                                             /*!< SCB CPUID: ARCHITECTURE Position */
+#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */
+
+#define SCB_CPUID_PARTNO_Pos                4                                             /*!< SCB CPUID: PARTNO Position */
+#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */
+
+#define SCB_CPUID_REVISION_Pos              0                                             /*!< SCB CPUID: REVISION Position */
+#define SCB_CPUID_REVISION_Msk             (0xFUL << SCB_CPUID_REVISION_Pos)              /*!< SCB CPUID: REVISION Mask */
+
+/* SCB Interrupt Control State Register Definitions */
+#define SCB_ICSR_NMIPENDSET_Pos            31                                             /*!< SCB ICSR: NMIPENDSET Position */
+#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */
+
+#define SCB_ICSR_PENDSVSET_Pos             28                                             /*!< SCB ICSR: PENDSVSET Position */
+#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */
+
+#define SCB_ICSR_PENDSVCLR_Pos             27                                             /*!< SCB ICSR: PENDSVCLR Position */
+#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */
+
+#define SCB_ICSR_PENDSTSET_Pos             26                                             /*!< SCB ICSR: PENDSTSET Position */
+#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */
+
+#define SCB_ICSR_PENDSTCLR_Pos             25                                             /*!< SCB ICSR: PENDSTCLR Position */
+#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */
+
+#define SCB_ICSR_ISRPREEMPT_Pos            23                                             /*!< SCB ICSR: ISRPREEMPT Position */
+#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */
+
+#define SCB_ICSR_ISRPENDING_Pos            22                                             /*!< SCB ICSR: ISRPENDING Position */
+#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */
+
+#define SCB_ICSR_VECTPENDING_Pos           12                                             /*!< SCB ICSR: VECTPENDING Position */
+#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */
+
+#define SCB_ICSR_RETTOBASE_Pos             11                                             /*!< SCB ICSR: RETTOBASE Position */
+#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */
+
+#define SCB_ICSR_VECTACTIVE_Pos             0                                             /*!< SCB ICSR: VECTACTIVE Position */
+#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos)           /*!< SCB ICSR: VECTACTIVE Mask */
+
+/* SCB Vector Table Offset Register Definitions */
+#if (__CM3_REV < 0x0201)                   /* core r2p1 */
+#define SCB_VTOR_TBLBASE_Pos               29                                             /*!< SCB VTOR: TBLBASE Position */
+#define SCB_VTOR_TBLBASE_Msk               (1UL << SCB_VTOR_TBLBASE_Pos)                  /*!< SCB VTOR: TBLBASE Mask */
+
+#define SCB_VTOR_TBLOFF_Pos                 7                                             /*!< SCB VTOR: TBLOFF Position */
+#define SCB_VTOR_TBLOFF_Msk                (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos)            /*!< SCB VTOR: TBLOFF Mask */
+#else
+#define SCB_VTOR_TBLOFF_Pos                 7                                             /*!< SCB VTOR: TBLOFF Position */
+#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */
+#endif
+
+/* SCB Application Interrupt and Reset Control Register Definitions */
+#define SCB_AIRCR_VECTKEY_Pos              16                                             /*!< SCB AIRCR: VECTKEY Position */
+#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */
+
+#define SCB_AIRCR_VECTKEYSTAT_Pos          16                                             /*!< SCB AIRCR: VECTKEYSTAT Position */
+#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */
+
+#define SCB_AIRCR_ENDIANESS_Pos            15                                             /*!< SCB AIRCR: ENDIANESS Position */
+#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */
+
+#define SCB_AIRCR_PRIGROUP_Pos              8                                             /*!< SCB AIRCR: PRIGROUP Position */
+#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */
+
+#define SCB_AIRCR_SYSRESETREQ_Pos           2                                             /*!< SCB AIRCR: SYSRESETREQ Position */
+#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */
+
+#define SCB_AIRCR_VECTCLRACTIVE_Pos         1                                             /*!< SCB AIRCR: VECTCLRACTIVE Position */
+#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */
+
+#define SCB_AIRCR_VECTRESET_Pos             0                                             /*!< SCB AIRCR: VECTRESET Position */
+#define SCB_AIRCR_VECTRESET_Msk            (1UL << SCB_AIRCR_VECTRESET_Pos)               /*!< SCB AIRCR: VECTRESET Mask */
+
+/* SCB System Control Register Definitions */
+#define SCB_SCR_SEVONPEND_Pos               4                                             /*!< SCB SCR: SEVONPEND Position */
+#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */
+
+#define SCB_SCR_SLEEPDEEP_Pos               2                                             /*!< SCB SCR: SLEEPDEEP Position */
+#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */
+
+#define SCB_SCR_SLEEPONEXIT_Pos             1                                             /*!< SCB SCR: SLEEPONEXIT Position */
+#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */
+
+/* SCB Configuration Control Register Definitions */
+#define SCB_CCR_STKALIGN_Pos                9                                             /*!< SCB CCR: STKALIGN Position */
+#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */
+
+#define SCB_CCR_BFHFNMIGN_Pos               8                                             /*!< SCB CCR: BFHFNMIGN Position */
+#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */
+
+#define SCB_CCR_DIV_0_TRP_Pos               4                                             /*!< SCB CCR: DIV_0_TRP Position */
+#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */
+
+#define SCB_CCR_UNALIGN_TRP_Pos             3                                             /*!< SCB CCR: UNALIGN_TRP Position */
+#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */
+
+#define SCB_CCR_USERSETMPEND_Pos            1                                             /*!< SCB CCR: USERSETMPEND Position */
+#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */
+
+#define SCB_CCR_NONBASETHRDENA_Pos          0                                             /*!< SCB CCR: NONBASETHRDENA Position */
+#define SCB_CCR_NONBASETHRDENA_Msk         (1UL << SCB_CCR_NONBASETHRDENA_Pos)            /*!< SCB CCR: NONBASETHRDENA Mask */
+
+/* SCB System Handler Control and State Register Definitions */
+#define SCB_SHCSR_USGFAULTENA_Pos          18                                             /*!< SCB SHCSR: USGFAULTENA Position */
+#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */
+
+#define SCB_SHCSR_BUSFAULTENA_Pos          17                                             /*!< SCB SHCSR: BUSFAULTENA Position */
+#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */
+
+#define SCB_SHCSR_MEMFAULTENA_Pos          16                                             /*!< SCB SHCSR: MEMFAULTENA Position */
+#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */
+
+#define SCB_SHCSR_SVCALLPENDED_Pos         15                                             /*!< SCB SHCSR: SVCALLPENDED Position */
+#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */
+
+#define SCB_SHCSR_BUSFAULTPENDED_Pos       14                                             /*!< SCB SHCSR: BUSFAULTPENDED Position */
+#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */
+
+#define SCB_SHCSR_MEMFAULTPENDED_Pos       13                                             /*!< SCB SHCSR: MEMFAULTPENDED Position */
+#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */
+
+#define SCB_SHCSR_USGFAULTPENDED_Pos       12                                             /*!< SCB SHCSR: USGFAULTPENDED Position */
+#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */
+
+#define SCB_SHCSR_SYSTICKACT_Pos           11                                             /*!< SCB SHCSR: SYSTICKACT Position */
+#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */
+
+#define SCB_SHCSR_PENDSVACT_Pos            10                                             /*!< SCB SHCSR: PENDSVACT Position */
+#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */
+
+#define SCB_SHCSR_MONITORACT_Pos            8                                             /*!< SCB SHCSR: MONITORACT Position */
+#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */
+
+#define SCB_SHCSR_SVCALLACT_Pos             7                                             /*!< SCB SHCSR: SVCALLACT Position */
+#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */
+
+#define SCB_SHCSR_USGFAULTACT_Pos           3                                             /*!< SCB SHCSR: USGFAULTACT Position */
+#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */
+
+#define SCB_SHCSR_BUSFAULTACT_Pos           1                                             /*!< SCB SHCSR: BUSFAULTACT Position */
+#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */
+
+#define SCB_SHCSR_MEMFAULTACT_Pos           0                                             /*!< SCB SHCSR: MEMFAULTACT Position */
+#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL << SCB_SHCSR_MEMFAULTACT_Pos)             /*!< SCB SHCSR: MEMFAULTACT Mask */
+
+/* SCB Configurable Fault Status Registers Definitions */
+#define SCB_CFSR_USGFAULTSR_Pos            16                                             /*!< SCB CFSR: Usage Fault Status Register Position */
+#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */
+
+#define SCB_CFSR_BUSFAULTSR_Pos             8                                             /*!< SCB CFSR: Bus Fault Status Register Position */
+#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */
+
+#define SCB_CFSR_MEMFAULTSR_Pos             0                                             /*!< SCB CFSR: Memory Manage Fault Status Register Position */
+#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos)            /*!< SCB CFSR: Memory Manage Fault Status Register Mask */
+
+/* SCB Hard Fault Status Registers Definitions */
+#define SCB_HFSR_DEBUGEVT_Pos              31                                             /*!< SCB HFSR: DEBUGEVT Position */
+#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */
+
+#define SCB_HFSR_FORCED_Pos                30                                             /*!< SCB HFSR: FORCED Position */
+#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */
+
+#define SCB_HFSR_VECTTBL_Pos                1                                             /*!< SCB HFSR: VECTTBL Position */
+#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */
+
+/* SCB Debug Fault Status Register Definitions */
+#define SCB_DFSR_EXTERNAL_Pos               4                                             /*!< SCB DFSR: EXTERNAL Position */
+#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */
+
+#define SCB_DFSR_VCATCH_Pos                 3                                             /*!< SCB DFSR: VCATCH Position */
+#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */
+
+#define SCB_DFSR_DWTTRAP_Pos                2                                             /*!< SCB DFSR: DWTTRAP Position */
+#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */
+
+#define SCB_DFSR_BKPT_Pos                   1                                             /*!< SCB DFSR: BKPT Position */
+#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */
+
+#define SCB_DFSR_HALTED_Pos                 0                                             /*!< SCB DFSR: HALTED Position */
+#define SCB_DFSR_HALTED_Msk                (1UL << SCB_DFSR_HALTED_Pos)                   /*!< SCB DFSR: HALTED Mask */
+
+/*@} end of group CMSIS_SCB */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)
+    \brief      Type definitions for the System Control and ID Register not in the SCB
+  @{
+ */
+
+/** \brief  Structure type to access the System Control and ID Register not in the SCB.
+ */
+typedef struct
+{
+       uint32_t RESERVED0[1];
+  __I  uint32_t ICTR;                    /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register      */
+#if ((defined __CM3_REV) && (__CM3_REV >= 0x200))
+  __IO uint32_t ACTLR;                   /*!< Offset: 0x008 (R/W)  Auxiliary Control Register      */
+#else
+       uint32_t RESERVED1[1];
+#endif
+} SCnSCB_Type;
+
+/* Interrupt Controller Type Register Definitions */
+#define SCnSCB_ICTR_INTLINESNUM_Pos         0                                          /*!< ICTR: INTLINESNUM Position */
+#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos)      /*!< ICTR: INTLINESNUM Mask */
+
+/* Auxiliary Control Register Definitions */
+
+#define SCnSCB_ACTLR_DISFOLD_Pos            2                                          /*!< ACTLR: DISFOLD Position */
+#define SCnSCB_ACTLR_DISFOLD_Msk           (1UL << SCnSCB_ACTLR_DISFOLD_Pos)           /*!< ACTLR: DISFOLD Mask */
+
+#define SCnSCB_ACTLR_DISDEFWBUF_Pos         1                                          /*!< ACTLR: DISDEFWBUF Position */
+#define SCnSCB_ACTLR_DISDEFWBUF_Msk        (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos)        /*!< ACTLR: DISDEFWBUF Mask */
+
+#define SCnSCB_ACTLR_DISMCYCINT_Pos         0                                          /*!< ACTLR: DISMCYCINT Position */
+#define SCnSCB_ACTLR_DISMCYCINT_Msk        (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos)        /*!< ACTLR: DISMCYCINT Mask */
+
+/*@} end of group CMSIS_SCnotSCB */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_SysTick     System Tick Timer (SysTick)
+    \brief      Type definitions for the System Timer Registers.
+  @{
+ */
+
+/** \brief  Structure type to access the System Timer (SysTick).
+ */
+typedef struct
+{
+  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
+  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
+  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
+  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
+} SysTick_Type;
+
+/* SysTick Control / Status Register Definitions */
+#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */
+#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */
+
+#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */
+#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */
+
+#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */
+#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */
+
+#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */
+#define SysTick_CTRL_ENABLE_Msk            (1UL << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */
+
+/* SysTick Reload Register Definitions */
+#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */
+#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */
+
+/* SysTick Current Register Definitions */
+#define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */
+#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */
+
+/* SysTick Calibration Register Definitions */
+#define SysTick_CALIB_NOREF_Pos            31                                             /*!< SysTick CALIB: NOREF Position */
+#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */
+
+#define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */
+#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */
+
+#define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */
+#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */
+
+/*@} end of group CMSIS_SysTick */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)
+    \brief      Type definitions for the Instrumentation Trace Macrocell (ITM)
+  @{
+ */
+
+/** \brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).
+ */
+typedef struct
+{
+  __O  union
+  {
+    __O  uint8_t    u8;                  /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit                   */
+    __O  uint16_t   u16;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit                  */
+    __O  uint32_t   u32;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit                  */
+  }  PORT [32];                          /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers               */
+       uint32_t RESERVED0[864];
+  __IO uint32_t TER;                     /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register                 */
+       uint32_t RESERVED1[15];
+  __IO uint32_t TPR;                     /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register              */
+       uint32_t RESERVED2[15];
+  __IO uint32_t TCR;                     /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register                */
+       uint32_t RESERVED3[29];
+  __O  uint32_t IWR;                     /*!< Offset: 0xEF8 ( /W)  ITM Integration Write Register            */
+  __I  uint32_t IRR;                     /*!< Offset: 0xEFC (R/ )  ITM Integration Read Register             */
+  __IO uint32_t IMCR;                    /*!< Offset: 0xF00 (R/W)  ITM Integration Mode Control Register     */
+       uint32_t RESERVED4[43];
+  __O  uint32_t LAR;                     /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register                  */
+  __I  uint32_t LSR;                     /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register                  */
+       uint32_t RESERVED5[6];
+  __I  uint32_t PID4;                    /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */
+  __I  uint32_t PID5;                    /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */
+  __I  uint32_t PID6;                    /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */
+  __I  uint32_t PID7;                    /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */
+  __I  uint32_t PID0;                    /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */
+  __I  uint32_t PID1;                    /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */
+  __I  uint32_t PID2;                    /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */
+  __I  uint32_t PID3;                    /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */
+  __I  uint32_t CID0;                    /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */
+  __I  uint32_t CID1;                    /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */
+  __I  uint32_t CID2;                    /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */
+  __I  uint32_t CID3;                    /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */
+} ITM_Type;
+
+/* ITM Trace Privilege Register Definitions */
+#define ITM_TPR_PRIVMASK_Pos                0                                             /*!< ITM TPR: PRIVMASK Position */
+#define ITM_TPR_PRIVMASK_Msk               (0xFUL << ITM_TPR_PRIVMASK_Pos)                /*!< ITM TPR: PRIVMASK Mask */
+
+/* ITM Trace Control Register Definitions */
+#define ITM_TCR_BUSY_Pos                   23                                             /*!< ITM TCR: BUSY Position */
+#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */
+
+#define ITM_TCR_TraceBusID_Pos             16                                             /*!< ITM TCR: ATBID Position */
+#define ITM_TCR_TraceBusID_Msk             (0x7FUL << ITM_TCR_TraceBusID_Pos)             /*!< ITM TCR: ATBID Mask */
+
+#define ITM_TCR_GTSFREQ_Pos                10                                             /*!< ITM TCR: Global timestamp frequency Position */
+#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */
+
+#define ITM_TCR_TSPrescale_Pos              8                                             /*!< ITM TCR: TSPrescale Position */
+#define ITM_TCR_TSPrescale_Msk             (3UL << ITM_TCR_TSPrescale_Pos)                /*!< ITM TCR: TSPrescale Mask */
+
+#define ITM_TCR_SWOENA_Pos                  4                                             /*!< ITM TCR: SWOENA Position */
+#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */
+
+#define ITM_TCR_DWTENA_Pos                  3                                             /*!< ITM TCR: DWTENA Position */
+#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */
+
+#define ITM_TCR_SYNCENA_Pos                 2                                             /*!< ITM TCR: SYNCENA Position */
+#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */
+
+#define ITM_TCR_TSENA_Pos                   1                                             /*!< ITM TCR: TSENA Position */
+#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */
+
+#define ITM_TCR_ITMENA_Pos                  0                                             /*!< ITM TCR: ITM Enable bit Position */
+#define ITM_TCR_ITMENA_Msk                 (1UL << ITM_TCR_ITMENA_Pos)                    /*!< ITM TCR: ITM Enable bit Mask */
+
+/* ITM Integration Write Register Definitions */
+#define ITM_IWR_ATVALIDM_Pos                0                                             /*!< ITM IWR: ATVALIDM Position */
+#define ITM_IWR_ATVALIDM_Msk               (1UL << ITM_IWR_ATVALIDM_Pos)                  /*!< ITM IWR: ATVALIDM Mask */
+
+/* ITM Integration Read Register Definitions */
+#define ITM_IRR_ATREADYM_Pos                0                                             /*!< ITM IRR: ATREADYM Position */
+#define ITM_IRR_ATREADYM_Msk               (1UL << ITM_IRR_ATREADYM_Pos)                  /*!< ITM IRR: ATREADYM Mask */
+
+/* ITM Integration Mode Control Register Definitions */
+#define ITM_IMCR_INTEGRATION_Pos            0                                             /*!< ITM IMCR: INTEGRATION Position */
+#define ITM_IMCR_INTEGRATION_Msk           (1UL << ITM_IMCR_INTEGRATION_Pos)              /*!< ITM IMCR: INTEGRATION Mask */
+
+/* ITM Lock Status Register Definitions */
+#define ITM_LSR_ByteAcc_Pos                 2                                             /*!< ITM LSR: ByteAcc Position */
+#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */
+
+#define ITM_LSR_Access_Pos                  1                                             /*!< ITM LSR: Access Position */
+#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */
+
+#define ITM_LSR_Present_Pos                 0                                             /*!< ITM LSR: Present Position */
+#define ITM_LSR_Present_Msk                (1UL << ITM_LSR_Present_Pos)                   /*!< ITM LSR: Present Mask */
+
+/*@}*/ /* end of group CMSIS_ITM */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)
+    \brief      Type definitions for the Data Watchpoint and Trace (DWT)
+  @{
+ */
+
+/** \brief  Structure type to access the Data Watchpoint and Trace Register (DWT).
+ */
+typedef struct
+{
+  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  Control Register                          */
+  __IO uint32_t CYCCNT;                  /*!< Offset: 0x004 (R/W)  Cycle Count Register                      */
+  __IO uint32_t CPICNT;                  /*!< Offset: 0x008 (R/W)  CPI Count Register                        */
+  __IO uint32_t EXCCNT;                  /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register         */
+  __IO uint32_t SLEEPCNT;                /*!< Offset: 0x010 (R/W)  Sleep Count Register                      */
+  __IO uint32_t LSUCNT;                  /*!< Offset: 0x014 (R/W)  LSU Count Register                        */
+  __IO uint32_t FOLDCNT;                 /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register         */
+  __I  uint32_t PCSR;                    /*!< Offset: 0x01C (R/ )  Program Counter Sample Register           */
+  __IO uint32_t COMP0;                   /*!< Offset: 0x020 (R/W)  Comparator Register 0                     */
+  __IO uint32_t MASK0;                   /*!< Offset: 0x024 (R/W)  Mask Register 0                           */
+  __IO uint32_t FUNCTION0;               /*!< Offset: 0x028 (R/W)  Function Register 0                       */
+       uint32_t RESERVED0[1];
+  __IO uint32_t COMP1;                   /*!< Offset: 0x030 (R/W)  Comparator Register 1                     */
+  __IO uint32_t MASK1;                   /*!< Offset: 0x034 (R/W)  Mask Register 1                           */
+  __IO uint32_t FUNCTION1;               /*!< Offset: 0x038 (R/W)  Function Register 1                       */
+       uint32_t RESERVED1[1];
+  __IO uint32_t COMP2;                   /*!< Offset: 0x040 (R/W)  Comparator Register 2                     */
+  __IO uint32_t MASK2;                   /*!< Offset: 0x044 (R/W)  Mask Register 2                           */
+  __IO uint32_t FUNCTION2;               /*!< Offset: 0x048 (R/W)  Function Register 2                       */
+       uint32_t RESERVED2[1];
+  __IO uint32_t COMP3;                   /*!< Offset: 0x050 (R/W)  Comparator Register 3                     */
+  __IO uint32_t MASK3;                   /*!< Offset: 0x054 (R/W)  Mask Register 3                           */
+  __IO uint32_t FUNCTION3;               /*!< Offset: 0x058 (R/W)  Function Register 3                       */
+} DWT_Type;
+
+/* DWT Control Register Definitions */
+#define DWT_CTRL_NUMCOMP_Pos               28                                          /*!< DWT CTRL: NUMCOMP Position */
+#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */
+
+#define DWT_CTRL_NOTRCPKT_Pos              27                                          /*!< DWT CTRL: NOTRCPKT Position */
+#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */
+
+#define DWT_CTRL_NOEXTTRIG_Pos             26                                          /*!< DWT CTRL: NOEXTTRIG Position */
+#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */
+
+#define DWT_CTRL_NOCYCCNT_Pos              25                                          /*!< DWT CTRL: NOCYCCNT Position */
+#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */
+
+#define DWT_CTRL_NOPRFCNT_Pos              24                                          /*!< DWT CTRL: NOPRFCNT Position */
+#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */
+
+#define DWT_CTRL_CYCEVTENA_Pos             22                                          /*!< DWT CTRL: CYCEVTENA Position */
+#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */
+
+#define DWT_CTRL_FOLDEVTENA_Pos            21                                          /*!< DWT CTRL: FOLDEVTENA Position */
+#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */
+
+#define DWT_CTRL_LSUEVTENA_Pos             20                                          /*!< DWT CTRL: LSUEVTENA Position */
+#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */
+
+#define DWT_CTRL_SLEEPEVTENA_Pos           19                                          /*!< DWT CTRL: SLEEPEVTENA Position */
+#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */
+
+#define DWT_CTRL_EXCEVTENA_Pos             18                                          /*!< DWT CTRL: EXCEVTENA Position */
+#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */
+
+#define DWT_CTRL_CPIEVTENA_Pos             17                                          /*!< DWT CTRL: CPIEVTENA Position */
+#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */
+
+#define DWT_CTRL_EXCTRCENA_Pos             16                                          /*!< DWT CTRL: EXCTRCENA Position */
+#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */
+
+#define DWT_CTRL_PCSAMPLENA_Pos            12                                          /*!< DWT CTRL: PCSAMPLENA Position */
+#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */
+
+#define DWT_CTRL_SYNCTAP_Pos               10                                          /*!< DWT CTRL: SYNCTAP Position */
+#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */
+
+#define DWT_CTRL_CYCTAP_Pos                 9                                          /*!< DWT CTRL: CYCTAP Position */
+#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */
+
+#define DWT_CTRL_POSTINIT_Pos               5                                          /*!< DWT CTRL: POSTINIT Position */
+#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */
+
+#define DWT_CTRL_POSTPRESET_Pos             1                                          /*!< DWT CTRL: POSTPRESET Position */
+#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */
+
+#define DWT_CTRL_CYCCNTENA_Pos              0                                          /*!< DWT CTRL: CYCCNTENA Position */
+#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL << DWT_CTRL_CYCCNTENA_Pos)           /*!< DWT CTRL: CYCCNTENA Mask */
+
+/* DWT CPI Count Register Definitions */
+#define DWT_CPICNT_CPICNT_Pos               0                                          /*!< DWT CPICNT: CPICNT Position */
+#define DWT_CPICNT_CPICNT_Msk              (0xFFUL << DWT_CPICNT_CPICNT_Pos)           /*!< DWT CPICNT: CPICNT Mask */
+
+/* DWT Exception Overhead Count Register Definitions */
+#define DWT_EXCCNT_EXCCNT_Pos               0                                          /*!< DWT EXCCNT: EXCCNT Position */
+#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL << DWT_EXCCNT_EXCCNT_Pos)           /*!< DWT EXCCNT: EXCCNT Mask */
+
+/* DWT Sleep Count Register Definitions */
+#define DWT_SLEEPCNT_SLEEPCNT_Pos           0                                          /*!< DWT SLEEPCNT: SLEEPCNT Position */
+#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos)       /*!< DWT SLEEPCNT: SLEEPCNT Mask */
+
+/* DWT LSU Count Register Definitions */
+#define DWT_LSUCNT_LSUCNT_Pos               0                                          /*!< DWT LSUCNT: LSUCNT Position */
+#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL << DWT_LSUCNT_LSUCNT_Pos)           /*!< DWT LSUCNT: LSUCNT Mask */
+
+/* DWT Folded-instruction Count Register Definitions */
+#define DWT_FOLDCNT_FOLDCNT_Pos             0                                          /*!< DWT FOLDCNT: FOLDCNT Position */
+#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos)         /*!< DWT FOLDCNT: FOLDCNT Mask */
+
+/* DWT Comparator Mask Register Definitions */
+#define DWT_MASK_MASK_Pos                   0                                          /*!< DWT MASK: MASK Position */
+#define DWT_MASK_MASK_Msk                  (0x1FUL << DWT_MASK_MASK_Pos)               /*!< DWT MASK: MASK Mask */
+
+/* DWT Comparator Function Register Definitions */
+#define DWT_FUNCTION_MATCHED_Pos           24                                          /*!< DWT FUNCTION: MATCHED Position */
+#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */
+
+#define DWT_FUNCTION_DATAVADDR1_Pos        16                                          /*!< DWT FUNCTION: DATAVADDR1 Position */
+#define DWT_FUNCTION_DATAVADDR1_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos)      /*!< DWT FUNCTION: DATAVADDR1 Mask */
+
+#define DWT_FUNCTION_DATAVADDR0_Pos        12                                          /*!< DWT FUNCTION: DATAVADDR0 Position */
+#define DWT_FUNCTION_DATAVADDR0_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos)      /*!< DWT FUNCTION: DATAVADDR0 Mask */
+
+#define DWT_FUNCTION_DATAVSIZE_Pos         10                                          /*!< DWT FUNCTION: DATAVSIZE Position */
+#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */
+
+#define DWT_FUNCTION_LNK1ENA_Pos            9                                          /*!< DWT FUNCTION: LNK1ENA Position */
+#define DWT_FUNCTION_LNK1ENA_Msk           (0x1UL << DWT_FUNCTION_LNK1ENA_Pos)         /*!< DWT FUNCTION: LNK1ENA Mask */
+
+#define DWT_FUNCTION_DATAVMATCH_Pos         8                                          /*!< DWT FUNCTION: DATAVMATCH Position */
+#define DWT_FUNCTION_DATAVMATCH_Msk        (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos)      /*!< DWT FUNCTION: DATAVMATCH Mask */
+
+#define DWT_FUNCTION_CYCMATCH_Pos           7                                          /*!< DWT FUNCTION: CYCMATCH Position */
+#define DWT_FUNCTION_CYCMATCH_Msk          (0x1UL << DWT_FUNCTION_CYCMATCH_Pos)        /*!< DWT FUNCTION: CYCMATCH Mask */
+
+#define DWT_FUNCTION_EMITRANGE_Pos          5                                          /*!< DWT FUNCTION: EMITRANGE Position */
+#define DWT_FUNCTION_EMITRANGE_Msk         (0x1UL << DWT_FUNCTION_EMITRANGE_Pos)       /*!< DWT FUNCTION: EMITRANGE Mask */
+
+#define DWT_FUNCTION_FUNCTION_Pos           0                                          /*!< DWT FUNCTION: FUNCTION Position */
+#define DWT_FUNCTION_FUNCTION_Msk          (0xFUL << DWT_FUNCTION_FUNCTION_Pos)        /*!< DWT FUNCTION: FUNCTION Mask */
+
+/*@}*/ /* end of group CMSIS_DWT */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_TPI     Trace Port Interface (TPI)
+    \brief      Type definitions for the Trace Port Interface (TPI)
+  @{
+ */
+
+/** \brief  Structure type to access the Trace Port Interface Register (TPI).
+ */
+typedef struct
+{
+  __IO uint32_t SSPSR;                   /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register     */
+  __IO uint32_t CSPSR;                   /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */
+       uint32_t RESERVED0[2];
+  __IO uint32_t ACPR;                    /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */
+       uint32_t RESERVED1[55];
+  __IO uint32_t SPPR;                    /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */
+       uint32_t RESERVED2[131];
+  __I  uint32_t FFSR;                    /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */
+  __IO uint32_t FFCR;                    /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */
+  __I  uint32_t FSCR;                    /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */
+       uint32_t RESERVED3[759];
+  __I  uint32_t TRIGGER;                 /*!< Offset: 0xEE8 (R/ )  TRIGGER */
+  __I  uint32_t FIFO0;                   /*!< Offset: 0xEEC (R/ )  Integration ETM Data */
+  __I  uint32_t ITATBCTR2;               /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */
+       uint32_t RESERVED4[1];
+  __I  uint32_t ITATBCTR0;               /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */
+  __I  uint32_t FIFO1;                   /*!< Offset: 0xEFC (R/ )  Integration ITM Data */
+  __IO uint32_t ITCTRL;                  /*!< Offset: 0xF00 (R/W)  Integration Mode Control */
+       uint32_t RESERVED5[39];
+  __IO uint32_t CLAIMSET;                /*!< Offset: 0xFA0 (R/W)  Claim tag set */
+  __IO uint32_t CLAIMCLR;                /*!< Offset: 0xFA4 (R/W)  Claim tag clear */
+       uint32_t RESERVED7[8];
+  __I  uint32_t DEVID;                   /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */
+  __I  uint32_t DEVTYPE;                 /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */
+} TPI_Type;
+
+/* TPI Asynchronous Clock Prescaler Register Definitions */
+#define TPI_ACPR_PRESCALER_Pos              0                                          /*!< TPI ACPR: PRESCALER Position */
+#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL << TPI_ACPR_PRESCALER_Pos)        /*!< TPI ACPR: PRESCALER Mask */
+
+/* TPI Selected Pin Protocol Register Definitions */
+#define TPI_SPPR_TXMODE_Pos                 0                                          /*!< TPI SPPR: TXMODE Position */
+#define TPI_SPPR_TXMODE_Msk                (0x3UL << TPI_SPPR_TXMODE_Pos)              /*!< TPI SPPR: TXMODE Mask */
+
+/* TPI Formatter and Flush Status Register Definitions */
+#define TPI_FFSR_FtNonStop_Pos              3                                          /*!< TPI FFSR: FtNonStop Position */
+#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */
+
+#define TPI_FFSR_TCPresent_Pos              2                                          /*!< TPI FFSR: TCPresent Position */
+#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */
+
+#define TPI_FFSR_FtStopped_Pos              1                                          /*!< TPI FFSR: FtStopped Position */
+#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */
+
+#define TPI_FFSR_FlInProg_Pos               0                                          /*!< TPI FFSR: FlInProg Position */
+#define TPI_FFSR_FlInProg_Msk              (0x1UL << TPI_FFSR_FlInProg_Pos)            /*!< TPI FFSR: FlInProg Mask */
+
+/* TPI Formatter and Flush Control Register Definitions */
+#define TPI_FFCR_TrigIn_Pos                 8                                          /*!< TPI FFCR: TrigIn Position */
+#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */
+
+#define TPI_FFCR_EnFCont_Pos                1                                          /*!< TPI FFCR: EnFCont Position */
+#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */
+
+/* TPI TRIGGER Register Definitions */
+#define TPI_TRIGGER_TRIGGER_Pos             0                                          /*!< TPI TRIGGER: TRIGGER Position */
+#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL << TPI_TRIGGER_TRIGGER_Pos)          /*!< TPI TRIGGER: TRIGGER Mask */
+
+/* TPI Integration ETM Data Register Definitions (FIFO0) */
+#define TPI_FIFO0_ITM_ATVALID_Pos          29                                          /*!< TPI FIFO0: ITM_ATVALID Position */
+#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */
+
+#define TPI_FIFO0_ITM_bytecount_Pos        27                                          /*!< TPI FIFO0: ITM_bytecount Position */
+#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */
+
+#define TPI_FIFO0_ETM_ATVALID_Pos          26                                          /*!< TPI FIFO0: ETM_ATVALID Position */
+#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */
+
+#define TPI_FIFO0_ETM_bytecount_Pos        24                                          /*!< TPI FIFO0: ETM_bytecount Position */
+#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */
+
+#define TPI_FIFO0_ETM2_Pos                 16                                          /*!< TPI FIFO0: ETM2 Position */
+#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */
+
+#define TPI_FIFO0_ETM1_Pos                  8                                          /*!< TPI FIFO0: ETM1 Position */
+#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */
+
+#define TPI_FIFO0_ETM0_Pos                  0                                          /*!< TPI FIFO0: ETM0 Position */
+#define TPI_FIFO0_ETM0_Msk                 (0xFFUL << TPI_FIFO0_ETM0_Pos)              /*!< TPI FIFO0: ETM0 Mask */
+
+/* TPI ITATBCTR2 Register Definitions */
+#define TPI_ITATBCTR2_ATREADY_Pos           0                                          /*!< TPI ITATBCTR2: ATREADY Position */
+#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL << TPI_ITATBCTR2_ATREADY_Pos)        /*!< TPI ITATBCTR2: ATREADY Mask */
+
+/* TPI Integration ITM Data Register Definitions (FIFO1) */
+#define TPI_FIFO1_ITM_ATVALID_Pos          29                                          /*!< TPI FIFO1: ITM_ATVALID Position */
+#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */
+
+#define TPI_FIFO1_ITM_bytecount_Pos        27                                          /*!< TPI FIFO1: ITM_bytecount Position */
+#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */
+
+#define TPI_FIFO1_ETM_ATVALID_Pos          26                                          /*!< TPI FIFO1: ETM_ATVALID Position */
+#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */
+
+#define TPI_FIFO1_ETM_bytecount_Pos        24                                          /*!< TPI FIFO1: ETM_bytecount Position */
+#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */
+
+#define TPI_FIFO1_ITM2_Pos                 16                                          /*!< TPI FIFO1: ITM2 Position */
+#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */
+
+#define TPI_FIFO1_ITM1_Pos                  8                                          /*!< TPI FIFO1: ITM1 Position */
+#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */
+
+#define TPI_FIFO1_ITM0_Pos                  0                                          /*!< TPI FIFO1: ITM0 Position */
+#define TPI_FIFO1_ITM0_Msk                 (0xFFUL << TPI_FIFO1_ITM0_Pos)              /*!< TPI FIFO1: ITM0 Mask */
+
+/* TPI ITATBCTR0 Register Definitions */
+#define TPI_ITATBCTR0_ATREADY_Pos           0                                          /*!< TPI ITATBCTR0: ATREADY Position */
+#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL << TPI_ITATBCTR0_ATREADY_Pos)        /*!< TPI ITATBCTR0: ATREADY Mask */
+
+/* TPI Integration Mode Control Register Definitions */
+#define TPI_ITCTRL_Mode_Pos                 0                                          /*!< TPI ITCTRL: Mode Position */
+#define TPI_ITCTRL_Mode_Msk                (0x1UL << TPI_ITCTRL_Mode_Pos)              /*!< TPI ITCTRL: Mode Mask */
+
+/* TPI DEVID Register Definitions */
+#define TPI_DEVID_NRZVALID_Pos             11                                          /*!< TPI DEVID: NRZVALID Position */
+#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */
+
+#define TPI_DEVID_MANCVALID_Pos            10                                          /*!< TPI DEVID: MANCVALID Position */
+#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */
+
+#define TPI_DEVID_PTINVALID_Pos             9                                          /*!< TPI DEVID: PTINVALID Position */
+#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */
+
+#define TPI_DEVID_MinBufSz_Pos              6                                          /*!< TPI DEVID: MinBufSz Position */
+#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */
+
+#define TPI_DEVID_AsynClkIn_Pos             5                                          /*!< TPI DEVID: AsynClkIn Position */
+#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */
+
+#define TPI_DEVID_NrTraceInput_Pos          0                                          /*!< TPI DEVID: NrTraceInput Position */
+#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL << TPI_DEVID_NrTraceInput_Pos)      /*!< TPI DEVID: NrTraceInput Mask */
+
+/* TPI DEVTYPE Register Definitions */
+#define TPI_DEVTYPE_SubType_Pos             0                                          /*!< TPI DEVTYPE: SubType Position */
+#define TPI_DEVTYPE_SubType_Msk            (0xFUL << TPI_DEVTYPE_SubType_Pos)          /*!< TPI DEVTYPE: SubType Mask */
+
+#define TPI_DEVTYPE_MajorType_Pos           4                                          /*!< TPI DEVTYPE: MajorType Position */
+#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */
+
+/*@}*/ /* end of group CMSIS_TPI */
+
+
+#if (__MPU_PRESENT == 1)
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_MPU     Memory Protection Unit (MPU)
+    \brief      Type definitions for the Memory Protection Unit (MPU)
+  @{
+ */
+
+/** \brief  Structure type to access the Memory Protection Unit (MPU).
+ */
+typedef struct
+{
+  __I  uint32_t TYPE;                    /*!< Offset: 0x000 (R/ )  MPU Type Register                              */
+  __IO uint32_t CTRL;                    /*!< Offset: 0x004 (R/W)  MPU Control Register                           */
+  __IO uint32_t RNR;                     /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register                     */
+  __IO uint32_t RBAR;                    /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register               */
+  __IO uint32_t RASR;                    /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register         */
+  __IO uint32_t RBAR_A1;                 /*!< Offset: 0x014 (R/W)  MPU Alias 1 Region Base Address Register       */
+  __IO uint32_t RASR_A1;                 /*!< Offset: 0x018 (R/W)  MPU Alias 1 Region Attribute and Size Register */
+  __IO uint32_t RBAR_A2;                 /*!< Offset: 0x01C (R/W)  MPU Alias 2 Region Base Address Register       */
+  __IO uint32_t RASR_A2;                 /*!< Offset: 0x020 (R/W)  MPU Alias 2 Region Attribute and Size Register */
+  __IO uint32_t RBAR_A3;                 /*!< Offset: 0x024 (R/W)  MPU Alias 3 Region Base Address Register       */
+  __IO uint32_t RASR_A3;                 /*!< Offset: 0x028 (R/W)  MPU Alias 3 Region Attribute and Size Register */
+} MPU_Type;
+
+/* MPU Type Register */
+#define MPU_TYPE_IREGION_Pos               16                                             /*!< MPU TYPE: IREGION Position */
+#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */
+
+#define MPU_TYPE_DREGION_Pos                8                                             /*!< MPU TYPE: DREGION Position */
+#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */
+
+#define MPU_TYPE_SEPARATE_Pos               0                                             /*!< MPU TYPE: SEPARATE Position */
+#define MPU_TYPE_SEPARATE_Msk              (1UL << MPU_TYPE_SEPARATE_Pos)                 /*!< MPU TYPE: SEPARATE Mask */
+
+/* MPU Control Register */
+#define MPU_CTRL_PRIVDEFENA_Pos             2                                             /*!< MPU CTRL: PRIVDEFENA Position */
+#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */
+
+#define MPU_CTRL_HFNMIENA_Pos               1                                             /*!< MPU CTRL: HFNMIENA Position */
+#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */
+
+#define MPU_CTRL_ENABLE_Pos                 0                                             /*!< MPU CTRL: ENABLE Position */
+#define MPU_CTRL_ENABLE_Msk                (1UL << MPU_CTRL_ENABLE_Pos)                   /*!< MPU CTRL: ENABLE Mask */
+
+/* MPU Region Number Register */
+#define MPU_RNR_REGION_Pos                  0                                             /*!< MPU RNR: REGION Position */
+#define MPU_RNR_REGION_Msk                 (0xFFUL << MPU_RNR_REGION_Pos)                 /*!< MPU RNR: REGION Mask */
+
+/* MPU Region Base Address Register */
+#define MPU_RBAR_ADDR_Pos                   5                                             /*!< MPU RBAR: ADDR Position */
+#define MPU_RBAR_ADDR_Msk                  (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos)             /*!< MPU RBAR: ADDR Mask */
+
+#define MPU_RBAR_VALID_Pos                  4                                             /*!< MPU RBAR: VALID Position */
+#define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */
+
+#define MPU_RBAR_REGION_Pos                 0                                             /*!< MPU RBAR: REGION Position */
+#define MPU_RBAR_REGION_Msk                (0xFUL << MPU_RBAR_REGION_Pos)                 /*!< MPU RBAR: REGION Mask */
+
+/* MPU Region Attribute and Size Register */
+#define MPU_RASR_ATTRS_Pos                 16                                             /*!< MPU RASR: MPU Region Attribute field Position */
+#define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */
+
+#define MPU_RASR_XN_Pos                    28                                             /*!< MPU RASR: ATTRS.XN Position */
+#define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */
+
+#define MPU_RASR_AP_Pos                    24                                             /*!< MPU RASR: ATTRS.AP Position */
+#define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */
+
+#define MPU_RASR_TEX_Pos                   19                                             /*!< MPU RASR: ATTRS.TEX Position */
+#define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */
+
+#define MPU_RASR_S_Pos                     18                                             /*!< MPU RASR: ATTRS.S Position */
+#define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */
+
+#define MPU_RASR_C_Pos                     17                                             /*!< MPU RASR: ATTRS.C Position */
+#define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */
+
+#define MPU_RASR_B_Pos                     16                                             /*!< MPU RASR: ATTRS.B Position */
+#define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */
+
+#define MPU_RASR_SRD_Pos                    8                                             /*!< MPU RASR: Sub-Region Disable Position */
+#define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */
+
+#define MPU_RASR_SIZE_Pos                   1                                             /*!< MPU RASR: Region Size Field Position */
+#define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */
+
+#define MPU_RASR_ENABLE_Pos                 0                                             /*!< MPU RASR: Region enable bit Position */
+#define MPU_RASR_ENABLE_Msk                (1UL << MPU_RASR_ENABLE_Pos)                   /*!< MPU RASR: Region enable bit Disable Mask */
+
+/*@} end of group CMSIS_MPU */
+#endif
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)
+    \brief      Type definitions for the Core Debug Registers
+  @{
+ */
+
+/** \brief  Structure type to access the Core Debug Register (CoreDebug).
+ */
+typedef struct
+{
+  __IO uint32_t DHCSR;                   /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register    */
+  __O  uint32_t DCRSR;                   /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register        */
+  __IO uint32_t DCRDR;                   /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register            */
+  __IO uint32_t DEMCR;                   /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */
+} CoreDebug_Type;
+
+/* Debug Halting Control and Status Register */
+#define CoreDebug_DHCSR_DBGKEY_Pos         16                                             /*!< CoreDebug DHCSR: DBGKEY Position */
+#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */
+
+#define CoreDebug_DHCSR_S_RESET_ST_Pos     25                                             /*!< CoreDebug DHCSR: S_RESET_ST Position */
+#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */
+
+#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24                                             /*!< CoreDebug DHCSR: S_RETIRE_ST Position */
+#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */
+
+#define CoreDebug_DHCSR_S_LOCKUP_Pos       19                                             /*!< CoreDebug DHCSR: S_LOCKUP Position */
+#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */
+
+#define CoreDebug_DHCSR_S_SLEEP_Pos        18                                             /*!< CoreDebug DHCSR: S_SLEEP Position */
+#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */
+
+#define CoreDebug_DHCSR_S_HALT_Pos         17                                             /*!< CoreDebug DHCSR: S_HALT Position */
+#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */
+
+#define CoreDebug_DHCSR_S_REGRDY_Pos       16                                             /*!< CoreDebug DHCSR: S_REGRDY Position */
+#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */
+
+#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5                                             /*!< CoreDebug DHCSR: C_SNAPSTALL Position */
+#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */
+
+#define CoreDebug_DHCSR_C_MASKINTS_Pos      3                                             /*!< CoreDebug DHCSR: C_MASKINTS Position */
+#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */
+
+#define CoreDebug_DHCSR_C_STEP_Pos          2                                             /*!< CoreDebug DHCSR: C_STEP Position */
+#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */
+
+#define CoreDebug_DHCSR_C_HALT_Pos          1                                             /*!< CoreDebug DHCSR: C_HALT Position */
+#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */
+
+#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0                                             /*!< CoreDebug DHCSR: C_DEBUGEN Position */
+#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos)         /*!< CoreDebug DHCSR: C_DEBUGEN Mask */
+
+/* Debug Core Register Selector Register */
+#define CoreDebug_DCRSR_REGWnR_Pos         16                                             /*!< CoreDebug DCRSR: REGWnR Position */
+#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */
+
+#define CoreDebug_DCRSR_REGSEL_Pos          0                                             /*!< CoreDebug DCRSR: REGSEL Position */
+#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos)         /*!< CoreDebug DCRSR: REGSEL Mask */
+
+/* Debug Exception and Monitor Control Register */
+#define CoreDebug_DEMCR_TRCENA_Pos         24                                             /*!< CoreDebug DEMCR: TRCENA Position */
+#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */
+
+#define CoreDebug_DEMCR_MON_REQ_Pos        19                                             /*!< CoreDebug DEMCR: MON_REQ Position */
+#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< CoreDebug DEMCR: MON_REQ Mask */
+
+#define CoreDebug_DEMCR_MON_STEP_Pos       18                                             /*!< CoreDebug DEMCR: MON_STEP Position */
+#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< CoreDebug DEMCR: MON_STEP Mask */
+
+#define CoreDebug_DEMCR_MON_PEND_Pos       17                                             /*!< CoreDebug DEMCR: MON_PEND Position */
+#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< CoreDebug DEMCR: MON_PEND Mask */
+
+#define CoreDebug_DEMCR_MON_EN_Pos         16                                             /*!< CoreDebug DEMCR: MON_EN Position */
+#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< CoreDebug DEMCR: MON_EN Mask */
+
+#define CoreDebug_DEMCR_VC_HARDERR_Pos     10                                             /*!< CoreDebug DEMCR: VC_HARDERR Position */
+#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */
+
+#define CoreDebug_DEMCR_VC_INTERR_Pos       9                                             /*!< CoreDebug DEMCR: VC_INTERR Position */
+#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< CoreDebug DEMCR: VC_INTERR Mask */
+
+#define CoreDebug_DEMCR_VC_BUSERR_Pos       8                                             /*!< CoreDebug DEMCR: VC_BUSERR Position */
+#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< CoreDebug DEMCR: VC_BUSERR Mask */
+
+#define CoreDebug_DEMCR_VC_STATERR_Pos      7                                             /*!< CoreDebug DEMCR: VC_STATERR Position */
+#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< CoreDebug DEMCR: VC_STATERR Mask */
+
+#define CoreDebug_DEMCR_VC_CHKERR_Pos       6                                             /*!< CoreDebug DEMCR: VC_CHKERR Position */
+#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< CoreDebug DEMCR: VC_CHKERR Mask */
+
+#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5                                             /*!< CoreDebug DEMCR: VC_NOCPERR Position */
+#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< CoreDebug DEMCR: VC_NOCPERR Mask */
+
+#define CoreDebug_DEMCR_VC_MMERR_Pos        4                                             /*!< CoreDebug DEMCR: VC_MMERR Position */
+#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< CoreDebug DEMCR: VC_MMERR Mask */
+
+#define CoreDebug_DEMCR_VC_CORERESET_Pos    0                                             /*!< CoreDebug DEMCR: VC_CORERESET Position */
+#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos)      /*!< CoreDebug DEMCR: VC_CORERESET Mask */
+
+/*@} end of group CMSIS_CoreDebug */
+
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_core_base     Core Definitions
+    \brief      Definitions for base addresses, unions, and structures.
+  @{
+ */
+
+/* Memory mapping of Cortex-M3 Hardware */
+#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address  */
+#define ITM_BASE            (0xE0000000UL)                            /*!< ITM Base Address                   */
+#define DWT_BASE            (0xE0001000UL)                            /*!< DWT Base Address                   */
+#define TPI_BASE            (0xE0040000UL)                            /*!< TPI Base Address                   */
+#define CoreDebug_BASE      (0xE000EDF0UL)                            /*!< Core Debug Base Address            */
+#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address               */
+#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                  */
+#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address  */
+
+#define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */
+#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct           */
+#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */
+#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct          */
+#define ITM                 ((ITM_Type       *)     ITM_BASE      )   /*!< ITM configuration struct           */
+#define DWT                 ((DWT_Type       *)     DWT_BASE      )   /*!< DWT configuration struct           */
+#define TPI                 ((TPI_Type       *)     TPI_BASE      )   /*!< TPI configuration struct           */
+#define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE)   /*!< Core Debug configuration struct    */
+
+#if (__MPU_PRESENT == 1)
+  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit             */
+  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit             */
+#endif
+
+/*@} */
+
+
+
+/*******************************************************************************
+ *                Hardware Abstraction Layer
+  Core Function Interface contains:
+  - Core NVIC Functions
+  - Core SysTick Functions
+  - Core Debug Functions
+  - Core Register Access Functions
+ ******************************************************************************/
+/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
+*/
+
+
+
+/* ##########################   NVIC functions  #################################### */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_NVICFunctions NVIC Functions
+    \brief      Functions that manage interrupts and exceptions via the NVIC.
+    @{
+ */
+
+/** \brief  Set Priority Grouping
+
+  The function sets the priority grouping field using the required unlock sequence.
+  The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.
+  Only values from 0..7 are used.
+  In case of a conflict between priority grouping and available
+  priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
+
+    \param [in]      PriorityGroup  Priority grouping field.
+ */
+__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
+{
+  uint32_t reg_value;
+  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07);               /* only values 0..7 are used          */
+
+  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */
+  reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk);             /* clear bits to change               */
+  reg_value  =  (reg_value                                 |
+                ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) |
+                (PriorityGroupTmp << 8));                                     /* Insert write key and priorty group */
+  SCB->AIRCR =  reg_value;
+}
+
+
+/** \brief  Get Priority Grouping
+
+  The function reads the priority grouping field from the NVIC Interrupt Controller.
+
+    \return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
+ */
+__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void)
+{
+  return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos);   /* read priority grouping field */
+}
+
+
+/** \brief  Enable External Interrupt
+
+    The function enables a device-specific interrupt in the NVIC interrupt controller.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
+{
+  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
+}
+
+
+/** \brief  Disable External Interrupt
+
+    The function disables a device-specific interrupt in the NVIC interrupt controller.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
+{
+  NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */
+}
+
+
+/** \brief  Get Pending Interrupt
+
+    The function reads the pending register in the NVIC and returns the pending bit
+    for the specified interrupt.
+
+    \param [in]      IRQn  Interrupt number.
+
+    \return             0  Interrupt status is not pending.
+    \return             1  Interrupt status is pending.
+ */
+__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
+{
+  return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */
+}
+
+
+/** \brief  Set Pending Interrupt
+
+    The function sets the pending bit of an external interrupt.
+
+    \param [in]      IRQn  Interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
+{
+  NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */
+}
+
+
+/** \brief  Clear Pending Interrupt
+
+    The function clears the pending bit of an external interrupt.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
+{
+  NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */
+}
+
+
+/** \brief  Get Active Interrupt
+
+    The function reads the active register in NVIC and returns the active bit.
+
+    \param [in]      IRQn  Interrupt number.
+
+    \return             0  Interrupt status is not active.
+    \return             1  Interrupt status is active.
+ */
+__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)
+{
+  return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */
+}
+
+
+/** \brief  Set Interrupt Priority
+
+    The function sets the priority of an interrupt.
+
+    \note The priority cannot be set for every core interrupt.
+
+    \param [in]      IRQn  Interrupt number.
+    \param [in]  priority  Priority to set.
+ */
+__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
+{
+  if(IRQn < 0) {
+    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M  System Interrupts */
+  else {
+    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts  */
+}
+
+
+/** \brief  Get Interrupt Priority
+
+    The function reads the priority of an interrupt. The interrupt
+    number can be positive to specify an external (device specific)
+    interrupt, or negative to specify an internal (core) interrupt.
+
+
+    \param [in]   IRQn  Interrupt number.
+    \return             Interrupt Priority. Value is aligned automatically to the implemented
+                        priority bits of the microcontroller.
+ */
+__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
+{
+
+  if(IRQn < 0) {
+    return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M  system interrupts */
+  else {
+    return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)]           >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */
+}
+
+
+/** \brief  Encode Priority
+
+    The function encodes the priority for an interrupt with the given priority group,
+    preemptive priority value, and subpriority value.
+    In case of a conflict between priority grouping and available
+    priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set.
+
+    \param [in]     PriorityGroup  Used priority group.
+    \param [in]   PreemptPriority  Preemptive priority value (starting from 0).
+    \param [in]       SubPriority  Subpriority value (starting from 0).
+    \return                        Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
+ */
+__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
+{
+  uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);          /* only values 0..7 are used          */
+  uint32_t PreemptPriorityBits;
+  uint32_t SubPriorityBits;
+
+  PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
+  SubPriorityBits     = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
+
+  return (
+           ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) |
+           ((SubPriority     & ((1 << (SubPriorityBits    )) - 1)))
+         );
+}
+
+
+/** \brief  Decode Priority
+
+    The function decodes an interrupt priority value with a given priority group to
+    preemptive priority value and subpriority value.
+    In case of a conflict between priority grouping and available
+    priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set.
+
+    \param [in]         Priority   Priority value, which can be retrieved with the function \ref NVIC_GetPriority().
+    \param [in]     PriorityGroup  Used priority group.
+    \param [out] pPreemptPriority  Preemptive priority value (starting from 0).
+    \param [out]     pSubPriority  Subpriority value (starting from 0).
+ */
+__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority)
+{
+  uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);          /* only values 0..7 are used          */
+  uint32_t PreemptPriorityBits;
+  uint32_t SubPriorityBits;
+
+  PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
+  SubPriorityBits     = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
+
+  *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1);
+  *pSubPriority     = (Priority                   ) & ((1 << (SubPriorityBits    )) - 1);
+}
+
+
+/** \brief  System Reset
+
+    The function initiates a system reset request to reset the MCU.
+ */
+__STATIC_INLINE void NVIC_SystemReset(void)
+{
+  __DSB();                                                     /* Ensure all outstanding memory accesses included
+                                                                  buffered write are completed before reset */
+  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
+                 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
+                 SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
+  __DSB();                                                     /* Ensure completion of memory access */
+  while(1);                                                    /* wait until reset */
+}
+
+/*@} end of CMSIS_Core_NVICFunctions */
+
+
+
+/* ##################################    SysTick function  ############################################ */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
+    \brief      Functions that configure the System.
+  @{
+ */
+
+#if (__Vendor_SysTickConfig == 0)
+
+/** \brief  System Tick Configuration
+
+    The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
+    Counter is in free running mode to generate periodic interrupts.
+
+    \param [in]  ticks  Number of ticks between two interrupts.
+
+    \return          0  Function succeeded.
+    \return          1  Function failed.
+
+    \note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
+    function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
+    must contain a vendor-specific implementation of this function.
+
+ */
+__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
+{
+  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */
+
+  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
+  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
+  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
+  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
+                   SysTick_CTRL_TICKINT_Msk   |
+                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
+  return (0);                                                  /* Function successful */
+}
+
+#endif
+
+/*@} end of CMSIS_Core_SysTickFunctions */
+
+
+
+/* ##################################### Debug In/Output function ########################################### */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_core_DebugFunctions ITM Functions
+    \brief   Functions that access the ITM debug interface.
+  @{
+ */
+
+extern volatile int32_t ITM_RxBuffer;                    /*!< External variable to receive characters.                         */
+#define                 ITM_RXBUFFER_EMPTY    0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */
+
+
+/** \brief  ITM Send Character
+
+    The function transmits a character via the ITM channel 0, and
+    \li Just returns when no debugger is connected that has booked the output.
+    \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.
+
+    \param [in]     ch  Character to transmit.
+
+    \returns            Character to transmit.
+ */
+__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
+{
+  if ((ITM->TCR & ITM_TCR_ITMENA_Msk)                  &&      /* ITM enabled */
+      (ITM->TER & (1UL << 0)        )                    )     /* ITM Port #0 enabled */
+  {
+    while (ITM->PORT[0].u32 == 0);
+    ITM->PORT[0].u8 = (uint8_t) ch;
+  }
+  return (ch);
+}
+
+
+/** \brief  ITM Receive Character
+
+    The function inputs a character via the external variable \ref ITM_RxBuffer.
+
+    \return             Received character.
+    \return         -1  No character pending.
+ */
+__STATIC_INLINE int32_t ITM_ReceiveChar (void) {
+  int32_t ch = -1;                           /* no character available */
+
+  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) {
+    ch = ITM_RxBuffer;
+    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */
+  }
+
+  return (ch);
+}
+
+
+/** \brief  ITM Check Character
+
+    The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer.
+
+    \return          0  No character available.
+    \return          1  Character available.
+ */
+__STATIC_INLINE int32_t ITM_CheckChar (void) {
+
+  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) {
+    return (0);                                 /* no character available */
+  } else {
+    return (1);                                 /*    character available */
+  }
+}
+
+/*@} end of CMSIS_core_DebugFunctions */
+
+#endif /* __CORE_CM3_H_DEPENDANT */
+
+#endif /* __CMSIS_GENERIC */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/bbb_cape/src/cape/CMSIS/core_cmFunc.h b/bbb_cape/src/cape/CMSIS/core_cmFunc.h
new file mode 100644
index 0000000..0a18faf
--- /dev/null
+++ b/bbb_cape/src/cape/CMSIS/core_cmFunc.h
@@ -0,0 +1,636 @@
+/**************************************************************************//**
+ * @file     core_cmFunc.h
+ * @brief    CMSIS Cortex-M Core Function Access Header File
+ * @version  V3.20
+ * @date     25. February 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#ifndef __CORE_CMFUNC_H
+#define __CORE_CMFUNC_H
+
+
+/* ###########################  Core Function Access  ########################### */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
+  @{
+ */
+
+#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+/* ARM armcc specific functions */
+
+#if (__ARMCC_VERSION < 400677)
+  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
+#endif
+
+/* intrinsic void __enable_irq();     */
+/* intrinsic void __disable_irq();    */
+
+/** \brief  Get Control Register
+
+    This function returns the content of the Control Register.
+
+    \return               Control Register value
+ */
+__STATIC_INLINE uint32_t __get_CONTROL(void)
+{
+  register uint32_t __regControl         __ASM("control");
+  return(__regControl);
+}
+
+
+/** \brief  Set Control Register
+
+    This function writes the given value to the Control Register.
+
+    \param [in]    control  Control Register value to set
+ */
+__STATIC_INLINE void __set_CONTROL(uint32_t control)
+{
+  register uint32_t __regControl         __ASM("control");
+  __regControl = control;
+}
+
+
+/** \brief  Get IPSR Register
+
+    This function returns the content of the IPSR Register.
+
+    \return               IPSR Register value
+ */
+__STATIC_INLINE uint32_t __get_IPSR(void)
+{
+  register uint32_t __regIPSR          __ASM("ipsr");
+  return(__regIPSR);
+}
+
+
+/** \brief  Get APSR Register
+
+    This function returns the content of the APSR Register.
+
+    \return               APSR Register value
+ */
+__STATIC_INLINE uint32_t __get_APSR(void)
+{
+  register uint32_t __regAPSR          __ASM("apsr");
+  return(__regAPSR);
+}
+
+
+/** \brief  Get xPSR Register
+
+    This function returns the content of the xPSR Register.
+
+    \return               xPSR Register value
+ */
+__STATIC_INLINE uint32_t __get_xPSR(void)
+{
+  register uint32_t __regXPSR          __ASM("xpsr");
+  return(__regXPSR);
+}
+
+
+/** \brief  Get Process Stack Pointer
+
+    This function returns the current value of the Process Stack Pointer (PSP).
+
+    \return               PSP Register value
+ */
+__STATIC_INLINE uint32_t __get_PSP(void)
+{
+  register uint32_t __regProcessStackPointer  __ASM("psp");
+  return(__regProcessStackPointer);
+}
+
+
+/** \brief  Set Process Stack Pointer
+
+    This function assigns the given value to the Process Stack Pointer (PSP).
+
+    \param [in]    topOfProcStack  Process Stack Pointer value to set
+ */
+__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
+{
+  register uint32_t __regProcessStackPointer  __ASM("psp");
+  __regProcessStackPointer = topOfProcStack;
+}
+
+
+/** \brief  Get Main Stack Pointer
+
+    This function returns the current value of the Main Stack Pointer (MSP).
+
+    \return               MSP Register value
+ */
+__STATIC_INLINE uint32_t __get_MSP(void)
+{
+  register uint32_t __regMainStackPointer     __ASM("msp");
+  return(__regMainStackPointer);
+}
+
+
+/** \brief  Set Main Stack Pointer
+
+    This function assigns the given value to the Main Stack Pointer (MSP).
+
+    \param [in]    topOfMainStack  Main Stack Pointer value to set
+ */
+__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
+{
+  register uint32_t __regMainStackPointer     __ASM("msp");
+  __regMainStackPointer = topOfMainStack;
+}
+
+
+/** \brief  Get Priority Mask
+
+    This function returns the current state of the priority mask bit from the Priority Mask Register.
+
+    \return               Priority Mask value
+ */
+__STATIC_INLINE uint32_t __get_PRIMASK(void)
+{
+  register uint32_t __regPriMask         __ASM("primask");
+  return(__regPriMask);
+}
+
+
+/** \brief  Set Priority Mask
+
+    This function assigns the given value to the Priority Mask Register.
+
+    \param [in]    priMask  Priority Mask
+ */
+__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
+{
+  register uint32_t __regPriMask         __ASM("primask");
+  __regPriMask = (priMask);
+}
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Enable FIQ
+
+    This function enables FIQ interrupts by clearing the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+#define __enable_fault_irq                __enable_fiq
+
+
+/** \brief  Disable FIQ
+
+    This function disables FIQ interrupts by setting the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+#define __disable_fault_irq               __disable_fiq
+
+
+/** \brief  Get Base Priority
+
+    This function returns the current value of the Base Priority register.
+
+    \return               Base Priority register value
+ */
+__STATIC_INLINE uint32_t  __get_BASEPRI(void)
+{
+  register uint32_t __regBasePri         __ASM("basepri");
+  return(__regBasePri);
+}
+
+
+/** \brief  Set Base Priority
+
+    This function assigns the given value to the Base Priority register.
+
+    \param [in]    basePri  Base Priority value to set
+ */
+__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
+{
+  register uint32_t __regBasePri         __ASM("basepri");
+  __regBasePri = (basePri & 0xff);
+}
+
+
+/** \brief  Get Fault Mask
+
+    This function returns the current value of the Fault Mask register.
+
+    \return               Fault Mask register value
+ */
+__STATIC_INLINE uint32_t __get_FAULTMASK(void)
+{
+  register uint32_t __regFaultMask       __ASM("faultmask");
+  return(__regFaultMask);
+}
+
+
+/** \brief  Set Fault Mask
+
+    This function assigns the given value to the Fault Mask register.
+
+    \param [in]    faultMask  Fault Mask value to set
+ */
+__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+  register uint32_t __regFaultMask       __ASM("faultmask");
+  __regFaultMask = (faultMask & (uint32_t)1);
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+#if       (__CORTEX_M == 0x04)
+
+/** \brief  Get FPSCR
+
+    This function returns the current value of the Floating Point Status/Control register.
+
+    \return               Floating Point Status/Control register value
+ */
+__STATIC_INLINE uint32_t __get_FPSCR(void)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  register uint32_t __regfpscr         __ASM("fpscr");
+  return(__regfpscr);
+#else
+   return(0);
+#endif
+}
+
+
+/** \brief  Set FPSCR
+
+    This function assigns the given value to the Floating Point Status/Control register.
+
+    \param [in]    fpscr  Floating Point Status/Control value to set
+ */
+__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  register uint32_t __regfpscr         __ASM("fpscr");
+  __regfpscr = (fpscr);
+#endif
+}
+
+#endif /* (__CORTEX_M == 0x04) */
+
+
+#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+/* IAR iccarm specific functions */
+
+#include <cmsis_iar.h>
+
+
+#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+/* TI CCS specific functions */
+
+#include <cmsis_ccs.h>
+
+
+#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+/* GNU gcc specific functions */
+
+/** \brief  Enable IRQ Interrupts
+
+  This function enables IRQ interrupts by clearing the I-bit in the CPSR.
+  Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
+{
+  __ASM volatile ("cpsie i" : : : "memory");
+}
+
+
+/** \brief  Disable IRQ Interrupts
+
+  This function disables IRQ interrupts by setting the I-bit in the CPSR.
+  Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
+{
+  __ASM volatile ("cpsid i" : : : "memory");
+}
+
+
+/** \brief  Get Control Register
+
+    This function returns the content of the Control Register.
+
+    \return               Control Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, control" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Control Register
+
+    This function writes the given value to the Control Register.
+
+    \param [in]    control  Control Register value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
+{
+  __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
+}
+
+
+/** \brief  Get IPSR Register
+
+    This function returns the content of the IPSR Register.
+
+    \return               IPSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get APSR Register
+
+    This function returns the content of the APSR Register.
+
+    \return               APSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, apsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get xPSR Register
+
+    This function returns the content of the xPSR Register.
+
+    \return               xPSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get Process Stack Pointer
+
+    This function returns the current value of the Process Stack Pointer (PSP).
+
+    \return               PSP Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
+{
+  register uint32_t result;
+
+  __ASM volatile ("MRS %0, psp\n"  : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Process Stack Pointer
+
+    This function assigns the given value to the Process Stack Pointer (PSP).
+
+    \param [in]    topOfProcStack  Process Stack Pointer value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
+{
+  __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp");
+}
+
+
+/** \brief  Get Main Stack Pointer
+
+    This function returns the current value of the Main Stack Pointer (MSP).
+
+    \return               MSP Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
+{
+  register uint32_t result;
+
+  __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Main Stack Pointer
+
+    This function assigns the given value to the Main Stack Pointer (MSP).
+
+    \param [in]    topOfMainStack  Main Stack Pointer value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
+{
+  __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp");
+}
+
+
+/** \brief  Get Priority Mask
+
+    This function returns the current state of the priority mask bit from the Priority Mask Register.
+
+    \return               Priority Mask value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, primask" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Priority Mask
+
+    This function assigns the given value to the Priority Mask Register.
+
+    \param [in]    priMask  Priority Mask
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
+{
+  __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
+}
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Enable FIQ
+
+    This function enables FIQ interrupts by clearing the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
+{
+  __ASM volatile ("cpsie f" : : : "memory");
+}
+
+
+/** \brief  Disable FIQ
+
+    This function disables FIQ interrupts by setting the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
+{
+  __ASM volatile ("cpsid f" : : : "memory");
+}
+
+
+/** \brief  Get Base Priority
+
+    This function returns the current value of the Base Priority register.
+
+    \return               Base Priority register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Base Priority
+
+    This function assigns the given value to the Base Priority register.
+
+    \param [in]    basePri  Base Priority value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
+{
+  __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory");
+}
+
+
+/** \brief  Get Fault Mask
+
+    This function returns the current value of the Fault Mask register.
+
+    \return               Fault Mask register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Fault Mask
+
+    This function assigns the given value to the Fault Mask register.
+
+    \param [in]    faultMask  Fault Mask value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+  __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+#if       (__CORTEX_M == 0x04)
+
+/** \brief  Get FPSCR
+
+    This function returns the current value of the Floating Point Status/Control register.
+
+    \return               Floating Point Status/Control register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  uint32_t result;
+
+  /* Empty asm statement works as a scheduling barrier */
+  __ASM volatile ("");
+  __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
+  __ASM volatile ("");
+  return(result);
+#else
+   return(0);
+#endif
+}
+
+
+/** \brief  Set FPSCR
+
+    This function assigns the given value to the Floating Point Status/Control register.
+
+    \param [in]    fpscr  Floating Point Status/Control value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  /* Empty asm statement works as a scheduling barrier */
+  __ASM volatile ("");
+  __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");
+  __ASM volatile ("");
+#endif
+}
+
+#endif /* (__CORTEX_M == 0x04) */
+
+
+#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+/* TASKING carm specific functions */
+
+/*
+ * The CMSIS functions have been implemented as intrinsics in the compiler.
+ * Please use "carm -?i" to get an up to date list of all instrinsics,
+ * Including the CMSIS ones.
+ */
+
+#endif
+
+/*@} end of CMSIS_Core_RegAccFunctions */
+
+
+#endif /* __CORE_CMFUNC_H */
diff --git a/bbb_cape/src/cape/CMSIS/core_cmInstr.h b/bbb_cape/src/cape/CMSIS/core_cmInstr.h
new file mode 100644
index 0000000..d213f0e
--- /dev/null
+++ b/bbb_cape/src/cape/CMSIS/core_cmInstr.h
@@ -0,0 +1,688 @@
+/**************************************************************************//**
+ * @file     core_cmInstr.h
+ * @brief    CMSIS Cortex-M Core Instruction Access Header File
+ * @version  V3.20
+ * @date     05. March 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#ifndef __CORE_CMINSTR_H
+#define __CORE_CMINSTR_H
+
+
+/* ##########################  Core Instruction Access  ######################### */
+/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
+  Access to dedicated instructions
+  @{
+*/
+
+#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+/* ARM armcc specific functions */
+
+#if (__ARMCC_VERSION < 400677)
+  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
+#endif
+
+
+/** \brief  No Operation
+
+    No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+#define __NOP                             __nop
+
+
+/** \brief  Wait For Interrupt
+
+    Wait For Interrupt is a hint instruction that suspends execution
+    until one of a number of events occurs.
+ */
+#define __WFI                             __wfi
+
+
+/** \brief  Wait For Event
+
+    Wait For Event is a hint instruction that permits the processor to enter
+    a low-power state until one of a number of events occurs.
+ */
+#define __WFE                             __wfe
+
+
+/** \brief  Send Event
+
+    Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+#define __SEV                             __sev
+
+
+/** \brief  Instruction Synchronization Barrier
+
+    Instruction Synchronization Barrier flushes the pipeline in the processor,
+    so that all instructions following the ISB are fetched from cache or
+    memory, after the instruction has been completed.
+ */
+#define __ISB()                           __isb(0xF)
+
+
+/** \brief  Data Synchronization Barrier
+
+    This function acts as a special kind of Data Memory Barrier.
+    It completes when all explicit memory accesses before this instruction complete.
+ */
+#define __DSB()                           __dsb(0xF)
+
+
+/** \brief  Data Memory Barrier
+
+    This function ensures the apparent order of the explicit memory operations before
+    and after the instruction, without ensuring their completion.
+ */
+#define __DMB()                           __dmb(0xF)
+
+
+/** \brief  Reverse byte order (32 bit)
+
+    This function reverses the byte order in integer value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#define __REV                             __rev
+
+
+/** \brief  Reverse byte order (16 bit)
+
+    This function reverses the byte order in two unsigned short values.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
+{
+  rev16 r0, r0
+  bx lr
+}
+#endif
+
+/** \brief  Reverse byte order in signed short value
+
+    This function reverses the byte order in a signed short value with sign extension to integer.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
+{
+  revsh r0, r0
+  bx lr
+}
+#endif
+
+
+/** \brief  Rotate Right in unsigned value (32 bit)
+
+    This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
+
+    \param [in]    value  Value to rotate
+    \param [in]    value  Number of Bits to rotate
+    \return               Rotated value
+ */
+#define __ROR                             __ror
+
+
+/** \brief  Breakpoint
+
+    This function causes the processor to enter Debug state.
+    Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+
+    \param [in]    value  is ignored by the processor.
+                   If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value)                       __breakpoint(value)
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Reverse bit order of value
+
+    This function reverses the bit order of the given value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#define __RBIT                            __rbit
+
+
+/** \brief  LDR Exclusive (8 bit)
+
+    This function performs a exclusive LDR command for 8 bit value.
+
+    \param [in]    ptr  Pointer to data
+    \return             value of type uint8_t at (*ptr)
+ */
+#define __LDREXB(ptr)                     ((uint8_t ) __ldrex(ptr))
+
+
+/** \brief  LDR Exclusive (16 bit)
+
+    This function performs a exclusive LDR command for 16 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint16_t at (*ptr)
+ */
+#define __LDREXH(ptr)                     ((uint16_t) __ldrex(ptr))
+
+
+/** \brief  LDR Exclusive (32 bit)
+
+    This function performs a exclusive LDR command for 32 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint32_t at (*ptr)
+ */
+#define __LDREXW(ptr)                     ((uint32_t ) __ldrex(ptr))
+
+
+/** \brief  STR Exclusive (8 bit)
+
+    This function performs a exclusive STR command for 8 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXB(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  STR Exclusive (16 bit)
+
+    This function performs a exclusive STR command for 16 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXH(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  STR Exclusive (32 bit)
+
+    This function performs a exclusive STR command for 32 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXW(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  Remove the exclusive lock
+
+    This function removes the exclusive lock which is created by LDREX.
+
+ */
+#define __CLREX                           __clrex
+
+
+/** \brief  Signed Saturate
+
+    This function saturates a signed value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (1..32)
+    \return             Saturated value
+ */
+#define __SSAT                            __ssat
+
+
+/** \brief  Unsigned Saturate
+
+    This function saturates an unsigned value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (0..31)
+    \return             Saturated value
+ */
+#define __USAT                            __usat
+
+
+/** \brief  Count leading zeros
+
+    This function counts the number of leading zeros of a data value.
+
+    \param [in]  value  Value to count the leading zeros
+    \return             number of leading zeros in value
+ */
+#define __CLZ                             __clz
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+
+#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+/* IAR iccarm specific functions */
+
+#include <cmsis_iar.h>
+
+
+#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+/* TI CCS specific functions */
+
+#include <cmsis_ccs.h>
+
+
+#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+/* GNU gcc specific functions */
+
+/* Define macros for porting to both thumb1 and thumb2.
+ * For thumb1, use low register (r0-r7), specified by constrant "l"
+ * Otherwise, use general registers, specified by constrant "r" */
+#if defined (__thumb__) && !defined (__thumb2__)
+#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
+#define __CMSIS_GCC_USE_REG(r) "l" (r)
+#else
+#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
+#define __CMSIS_GCC_USE_REG(r) "r" (r)
+#endif
+
+/** \brief  No Operation
+
+    No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void)
+{
+  __ASM volatile ("nop");
+}
+
+
+/** \brief  Wait For Interrupt
+
+    Wait For Interrupt is a hint instruction that suspends execution
+    until one of a number of events occurs.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void)
+{
+  __ASM volatile ("wfi");
+}
+
+
+/** \brief  Wait For Event
+
+    Wait For Event is a hint instruction that permits the processor to enter
+    a low-power state until one of a number of events occurs.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void)
+{
+  __ASM volatile ("wfe");
+}
+
+
+/** \brief  Send Event
+
+    Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void)
+{
+  __ASM volatile ("sev");
+}
+
+
+/** \brief  Instruction Synchronization Barrier
+
+    Instruction Synchronization Barrier flushes the pipeline in the processor,
+    so that all instructions following the ISB are fetched from cache or
+    memory, after the instruction has been completed.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void)
+{
+  __ASM volatile ("isb");
+}
+
+
+/** \brief  Data Synchronization Barrier
+
+    This function acts as a special kind of Data Memory Barrier.
+    It completes when all explicit memory accesses before this instruction complete.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void)
+{
+  __ASM volatile ("dsb");
+}
+
+
+/** \brief  Data Memory Barrier
+
+    This function ensures the apparent order of the explicit memory operations before
+    and after the instruction, without ensuring their completion.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void)
+{
+  __ASM volatile ("dmb");
+}
+
+
+/** \brief  Reverse byte order (32 bit)
+
+    This function reverses the byte order in integer value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
+{
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+  return __builtin_bswap32(value);
+#else
+  uint32_t result;
+
+  __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+  return(result);
+#endif
+}
+
+
+/** \brief  Reverse byte order (16 bit)
+
+    This function reverses the byte order in two unsigned short values.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value)
+{
+  uint32_t result;
+
+  __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+  return(result);
+}
+
+
+/** \brief  Reverse byte order in signed short value
+
+    This function reverses the byte order in a signed short value with sign extension to integer.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
+{
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+  return (short)__builtin_bswap16(value);
+#else
+  uint32_t result;
+
+  __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+  return(result);
+#endif
+}
+
+
+/** \brief  Rotate Right in unsigned value (32 bit)
+
+    This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
+
+    \param [in]    value  Value to rotate
+    \param [in]    value  Number of Bits to rotate
+    \return               Rotated value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
+{
+  return (op1 >> op2) | (op1 << (32 - op2)); 
+}
+
+
+/** \brief  Breakpoint
+
+    This function causes the processor to enter Debug state.
+    Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+
+    \param [in]    value  is ignored by the processor.
+                   If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value)                       __ASM volatile ("bkpt "#value)
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Reverse bit order of value
+
+    This function reverses the bit order of the given value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
+{
+  uint32_t result;
+
+   __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (8 bit)
+
+    This function performs a exclusive LDR command for 8 bit value.
+
+    \param [in]    ptr  Pointer to data
+    \return             value of type uint8_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
+{
+    uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+   __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
+#else
+    /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
+       accepted by assembler. So has to use following less efficient pattern.
+    */
+   __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+#endif
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (16 bit)
+
+    This function performs a exclusive LDR command for 16 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint16_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
+{
+    uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+   __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
+#else
+    /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
+       accepted by assembler. So has to use following less efficient pattern.
+    */
+   __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+#endif
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (32 bit)
+
+    This function performs a exclusive LDR command for 32 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint32_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
+{
+    uint32_t result;
+
+   __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (8 bit)
+
+    This function performs a exclusive STR command for 8 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (16 bit)
+
+    This function performs a exclusive STR command for 16 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (32 bit)
+
+    This function performs a exclusive STR command for 32 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  Remove the exclusive lock
+
+    This function removes the exclusive lock which is created by LDREX.
+
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
+{
+  __ASM volatile ("clrex" ::: "memory");
+}
+
+
+/** \brief  Signed Saturate
+
+    This function saturates a signed value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (1..32)
+    \return             Saturated value
+ */
+#define __SSAT(ARG1,ARG2) \
+({                          \
+  uint32_t __RES, __ARG1 = (ARG1); \
+  __ASM ("ssat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
+  __RES; \
+ })
+
+
+/** \brief  Unsigned Saturate
+
+    This function saturates an unsigned value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (0..31)
+    \return             Saturated value
+ */
+#define __USAT(ARG1,ARG2) \
+({                          \
+  uint32_t __RES, __ARG1 = (ARG1); \
+  __ASM ("usat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
+  __RES; \
+ })
+
+
+/** \brief  Count leading zeros
+
+    This function counts the number of leading zeros of a data value.
+
+    \param [in]  value  Value to count the leading zeros
+    \return             number of leading zeros in value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
+{
+   uint32_t result;
+
+  __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
+  return(result);
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+
+
+#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+/* TASKING carm specific functions */
+
+/*
+ * The CMSIS functions have been implemented as intrinsics in the compiler.
+ * Please use "carm -?i" to get an up to date list of all intrinsics,
+ * Including the CMSIS ones.
+ */
+
+#endif
+
+/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
+
+#endif /* __CORE_CMINSTR_H */
diff --git a/bbb_cape/src/cape/Makefile b/bbb_cape/src/cape/Makefile
new file mode 100644
index 0000000..18fb048
--- /dev/null
+++ b/bbb_cape/src/cape/Makefile
@@ -0,0 +1,98 @@
+OBJDIR := .obj/
+$(shell mkdir -p $(OBJDIR))
+
+ifeq ($(OS),Windows_NT)
+  CROSS_COMPILE := arm-none-eabi-
+else
+  CROSS_COMPILE := /opt/cortex-m3/bin/arm-eabi-
+endif
+
+CC := $(CROSS_COMPILE)gcc
+LD := $(CROSS_COMPILE)ld
+OBJCOPY := $(CROSS_COMPILE)objcopy
+OBJDUMP := $(CROSS_COMPILE)objdump
+AS := $(CROSS_COMPILE)as
+
+CPPFLAGS := -I.. -ICMSIS \
+
+CFLAGS := -nostartfiles -nostdlib -ffreestanding -fbuiltin \
+	-O3 -mcpu=cortex-m3 \
+	-mthumb -Wl,--gc-sections -ffunction-sections -Wl,-static \
+	-Wall -Werror --std=gnu99 \
+	-Wstrict-aliasing=2 -Wcast-qual -Wpointer-arith \
+
+LDFLAGS := -O3 -mcpu=cortex-m3 \
+	-nostartfiles -nostdlib \
+	-T gcc_arm.ld \
+
+ASFLAGS := -O3 -mcpu=cortex-m3 \
+	-nostartfiles -nostdlib \
+	-mthumb \
+
+OBJECTS_main_common := main \
+	uart_common \
+	uart_dma \
+	uart \
+	fill_packet \
+	cows \
+	encoder \
+	crc \
+	gyro \
+	led \
+	analog \
+	digital \
+	util \
+
+OBJECTS_bootloader := bootloader \
+	uart_common \
+	uart_byte \
+	led \
+
+OBJECTS_main_test := $(OBJECTS_main_common) \
+	robot_test \
+
+OUTPUTS := main_test bootloader
+
+# The sort is to remove duplicates because Make warns about those.
+OBJECTS := $(sort $(foreach output,$(OUTPUTS),$(OBJECTS_$(output))))
+
+OUTPUTS_elf := $(OUTPUTS:%=$(OBJDIR)%.elf)
+OUTPUTS_hex := $(OUTPUTS:%=$(OBJDIR)%.hex)
+
+.PHONY: all
+all: $(OUTPUTS_hex)
+
+-include $(OBJECTS:%=$(OBJDIR)%.d)
+
+.SECONDEXPANSION:
+PERCENT := %
+
+# "$(OBJDIR)%.elf: $(OBJECTS_%:%=$(OBJDIR)%.o)" with the % signs meaning the
+# right thing in the right places.
+$(OUTPUTS_elf): $(OBJDIR)%.elf: $$(OBJECTS_$$*:$$(PERCENT)=$(OBJDIR)$$(PERCENT).o)
+$(OUTPUTS_elf): $(OBJDIR)%.elf:	gcc_arm.ld %.ld $(OBJDIR)STM32F2XX_startup.o
+	$(CC) $(CPPFLAGS) -T $*.ld $(LDFLAGS) -o $@ \
+		$(OBJDIR)STM32F2XX_startup.o \
+		$(OBJECTS_$*:%=$(OBJDIR)%.o) \
+		-Wa,-Map -Wa,$(OBJDIR)$*.map
+
+$(OBJECTS:%=$(OBJDIR)%.o): $(OBJDIR)%.o: %.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) -MD -MP -MT '$@ $*.s' -c -o $@ $<
+$(OBJDIR)%.o: %.S
+	$(CC) $(CPPFLAGS) $(ASFLAGS) -MD -MP -MT '$@ $*.s' -c -o $@ $<
+
+# So that you can see the assembly for an individual file with any comments etc.
+$(OBJECTS:%=%.s): %.s: %.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $<
+%.s: %.S
+	$(CC) $(CPPFLAGS) $(ASFLAGS) -S -o $@ $< > $@
+
+# So that you can see the assembly of the whole .elf file.
+$(OUTPUTS:%=elf_%.s): elf_%.s: $(OBJDIR)%.elf
+	$(OBJDUMP) -d -S $< > $@
+
+$(OUTPUTS_hex): $(OBJDIR)%.hex: $(OBJDIR)%.elf
+	$(OBJCOPY) -O ihex $< $@
+
+clean:
+	rm -rf $(OBJDIR)
diff --git a/bbb_cape/src/cape/README b/bbb_cape/src/cape/README
new file mode 100644
index 0000000..ddda84c
--- /dev/null
+++ b/bbb_cape/src/cape/README
@@ -0,0 +1,16 @@
+[files]
+  Low-level hardware interface files: These are files copied (and tweaked) from
+      other places that deal with the low-level hardware stuff.
+	CMSIS/STM32F2XX.h: This has the declarations for all of the peripherial
+	    registers and other stuff specific to this MCU. It was downloaded from
+		the Rowley Associates STM32 BSP.
+    CMSIS/core_cm3.h: This has the declarations for the generic Cortex-M3
+	    registers. It is a generic file that seems to be dowloadable from lots
+		of places (with slight differences between each, of course). STM32F2XX.h
+		#includes it.
+	STM32FXX_startup.S: This defines the exception vector table and handles
+	    copying data into RAM etc before calling main.
+    *.ld: These are linker scripts. They defines where in memory everything
+	    actually goes and give various locations names so that the startup
+		code (described above) can find them and put the data where it
+		belongs.
diff --git a/bbb_cape/src/cape/STM32F2XX_startup.S b/bbb_cape/src/cape/STM32F2XX_startup.S
new file mode 100644
index 0000000..ace098a
--- /dev/null
+++ b/bbb_cape/src/cape/STM32F2XX_startup.S
@@ -0,0 +1,233 @@
+/* File: startup_ARMCM3.S
+ * Purpose: startup file for Cortex-M3 devices. Should use with
+ *   GCC for ARM Embedded Processors
+ * Version: V1.4
+ * Date: 20 Dezember 2012
+ *
+ */
+/* Copyright (c) 2011 - 2012 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+.syntax unified
+.arch armv7-m
+.code 16  
+
+.section .stack
+  .align 3
+
+  .equ  Stack_Size, 0x00000400
+
+ .globl  __StackLimit
+ __StackLimit:
+  .space  Stack_Size
+  .size __StackLimit, . - __StackLimit
+
+ .globl  __StackTop
+ __StackTop:
+  .size __StackTop, . - __StackTop
+
+.section .heap
+  .align 3
+
+ .globl  __HeapBase
+ __HeapBase:
+  .equ  Heap_Size, 0x00000C00
+  .if  Heap_Size
+    .space  Heap_Size
+  .endif
+  .size __HeapBase, . - __HeapBase
+
+ .globl  __HeapLimit
+ __HeapLimit:
+  .size __HeapLimit, . - __HeapLimit
+
+.macro ISR_HANDLER name=
+  .section .vectors, "a"
+    .word \name
+  .section .init, "ax"
+   .thumb_func
+   .weak \name
+   \name:
+    1: b 1b /* endless loop */
+.endm
+
+.macro ISR_RESERVED
+  .section .vectors, "a"
+    .word 0
+.endm
+
+.section .vectors, "a"
+ .global _vectors
+ _vectors:
+  .long  __StackTop
+  .long  Reset_Handler
+  ISR_HANDLER NMI_Handler
+  ISR_HANDLER HardFault_Handler
+  ISR_HANDLER MemManage_Handler 
+  ISR_HANDLER BusFault_Handler
+  ISR_HANDLER UsageFault_Handler
+  ISR_RESERVED
+  ISR_RESERVED
+  ISR_RESERVED
+  ISR_RESERVED
+  ISR_HANDLER SVC_Handler
+  ISR_HANDLER DebugMon_Handler
+  ISR_RESERVED
+  ISR_HANDLER PendSV_Handler
+  ISR_HANDLER SysTick_Handler 
+
+  /* interrupts */
+  ISR_HANDLER WWDG_IRQHandler
+  ISR_HANDLER PVD_IRQHandler
+  ISR_HANDLER TAMP_STAMP_IRQHandler
+  ISR_HANDLER RTC_WKUP_IRQHandler
+  ISR_HANDLER FLASH_IRQHandler
+  ISR_HANDLER RCC_IRQHandler
+  ISR_HANDLER EXTI0_IRQHandler
+  ISR_HANDLER EXTI1_IRQHandler
+  ISR_HANDLER EXTI2_IRQHandler
+  ISR_HANDLER EXTI3_IRQHandler
+  ISR_HANDLER EXTI4_IRQHandler
+  ISR_HANDLER DMA1_Stream0_IRQHandler
+  ISR_HANDLER DMA1_Stream1_IRQHandler
+  ISR_HANDLER DMA1_Stream2_IRQHandler
+  ISR_HANDLER DMA1_Stream3_IRQHandler
+  ISR_HANDLER DMA1_Stream4_IRQHandler
+  ISR_HANDLER DMA1_Stream5_IRQHandler
+  ISR_HANDLER DMA1_Stream6_IRQHandler
+  ISR_HANDLER ADC_IRQHandler
+  ISR_HANDLER CAN1_TX_IRQHandler
+  ISR_HANDLER CAN1_RX0_IRQHandler
+  ISR_HANDLER CAN1_RX1_IRQHandler
+  ISR_HANDLER CAN1_SCE_IRQHandler
+  ISR_HANDLER EXTI9_5_IRQHandler
+  ISR_HANDLER TIM1_BRK_TIM9_IRQHandler
+  ISR_HANDLER TIM1_UP_TIM10_IRQHandler
+  ISR_HANDLER TIM1_TRG_COM_TIM11_IRQHandler
+  ISR_HANDLER TIM1_CC_IRQHandler
+  ISR_HANDLER TIM2_IRQHandler
+  ISR_HANDLER TIM3_IRQHandler
+  ISR_HANDLER TIM4_IRQHandler
+  ISR_HANDLER I2C1_EV_IRQHandler
+  ISR_HANDLER I2C1_ER_IRQHandler
+  ISR_HANDLER I2C2_EV_IRQHandler
+  ISR_HANDLER I2C2_ER_IRQHandler
+  ISR_HANDLER SPI1_IRQHandler
+  ISR_HANDLER SPI2_IRQHandler
+  ISR_HANDLER USART1_IRQHandler
+  ISR_HANDLER USART2_IRQHandler
+  ISR_HANDLER USART3_IRQHandler
+  ISR_HANDLER EXTI15_10_IRQHandler
+  ISR_HANDLER RTC_Alarm_IRQHandler
+  ISR_HANDLER OTG_FS_WKUP_IRQHandler
+  ISR_HANDLER TIM8_BRK_TIM12_IRQHandler
+  ISR_HANDLER TIM8_UP_TIM13_IRQHandler
+  ISR_HANDLER TIM8_TRG_COM_TIM14_IRQHandler
+  ISR_HANDLER TIM8_CC_IRQHandler
+  ISR_HANDLER DMA1_Stream7_IRQHandler
+  ISR_HANDLER FSMC_IRQHandler
+  ISR_HANDLER SDIO_IRQHandler
+  ISR_HANDLER TIM5_IRQHandler
+  ISR_HANDLER SPI3_IRQHandler
+  ISR_HANDLER UART4_IRQHandler
+  ISR_HANDLER UART5_IRQHandler
+  ISR_HANDLER TIM6_DAC_IRQHandler
+  ISR_HANDLER TIM7_IRQHandler
+  ISR_HANDLER DMA2_Stream0_IRQHandler
+  ISR_HANDLER DMA2_Stream1_IRQHandler
+  ISR_HANDLER DMA2_Stream2_IRQHandler
+  ISR_HANDLER DMA2_Stream3_IRQHandler
+  ISR_HANDLER DMA2_Stream4_IRQHandler
+  ISR_HANDLER ETH_IRQHandler
+  ISR_HANDLER ETH_WKUP_IRQHandler
+  ISR_HANDLER CAN2_TX_IRQHandler
+  ISR_HANDLER CAN2_RX0_IRQHandler
+  ISR_HANDLER CAN2_RX1_IRQHandler
+  ISR_HANDLER CAN2_SCE_IRQHandler
+  ISR_HANDLER OTG_FS_IRQHandler
+  ISR_HANDLER DMA2_Stream5_IRQHandler
+  ISR_HANDLER DMA2_Stream6_IRQHandler
+  ISR_HANDLER DMA2_Stream7_IRQHandler
+  ISR_HANDLER USART6_IRQHandler
+  ISR_HANDLER I2C3_EV_IRQHandler
+  ISR_HANDLER I2C3_ER_IRQHandler
+  ISR_HANDLER OTG_HS_EP1_OUT_IRQHandler
+  ISR_HANDLER OTG_HS_EP1_IN_IRQHandler
+  ISR_HANDLER OTG_HS_WKUP_IRQHandler
+  ISR_HANDLER OTG_HS_IRQHandler
+  ISR_HANDLER DCMI_IRQHandler
+  ISR_HANDLER CRYP_IRQHandler
+  ISR_HANDLER HASH_RNG_IRQHandler
+
+.section .vectors, "a"
+ _vectors_end:
+
+.text
+ .thumb_func
+ .align 2
+ .globl  Reset_Handler
+ .type  Reset_Handler, %function
+ Reset_Handler:
+
+/*     Loop to copy data from read only memory to RAM. The ranges
+ *      of copy from/to are specified by following symbols evaluated in
+ *      linker script.
+ *      __etext: End of code section, i.e., begin of data sections to copy from.
+ *      __data_start__/__data_end__: RAM address range that data should be
+ *      copied to. Both must be aligned to 4 bytes boundary.  */
+  ldr  r1, =__etext
+  ldr  r2, =__data_start__
+  ldr  r3, =__data_end__
+  subs  r3, r2
+  ble  .LC1
+ .LC0:
+  subs  r3, #4
+  ldr  r0, [r1, r3]
+  str  r0, [r2, r3]
+  bgt  .LC0
+ .LC1:
+
+/*     Loop to zero out BSS section, which uses following symbols
+ *     in linker script:
+ *      __bss_start__: start of BSS section. Must align to 4
+ *      __bss_end__: end of BSS section. Must align to 4
+ */
+  ldr r1, =__bss_start__
+  ldr r2, =__bss_end__
+  movs  r0, 0
+ .LC2:
+  cmp   r1, r2
+  itt  lt
+  strlt   r0, [r1], #4
+  blt  .LC2
+
+  bl  _start
+  1: b 1b /* endless loop if it ever returns */
+
+  .pool
+  .size Reset_Handler, . - Reset_Handler
diff --git a/bbb_cape/src/cape/analog.c b/bbb_cape/src/cape/analog.c
new file mode 100644
index 0000000..855098c
--- /dev/null
+++ b/bbb_cape/src/cape/analog.c
@@ -0,0 +1,108 @@
+#include "cape/analog.h"
+
+#include <string.h>
+
+#include <STM32F2XX.h>
+
+#include "cape/util.h"
+#include "cape/led.h"
+
+#define SPI SPI2
+#define SPI_IRQHandler SPI2_IRQHandler
+#define SPI_IRQn SPI2_IRQn
+#define RCC_APB1ENR_SPIEN RCC_APB1ENR_SPI2EN
+#define TIM TIM14
+#define TIM_IRQHandler TIM8_TRG_COM_TIM14_IRQHandler
+#define TIM_IRQn TIM8_TRG_COM_TIM14_IRQn
+#define RCC_APB1ENR_TIMEN RCC_APB1ENR_TIM14EN
+#define CSEL_GPIO GPIOB
+#define CSEL_NUM 12
+
+#define NUM_CHANNELS 8
+
+uint16_t analog_readings[NUM_CHANNELS] __attribute__((aligned(8)));
+static volatile int current_channel;
+static volatile int partial_reading;
+static volatile int frame;
+
+static void start_read(int channel) {
+  // This needs to wait 13 cycles between enabling the CSEL pin and starting to
+  // send data.
+  // (100ns+8ns)*120MHz = 12.96
+
+  // Clear the CSEL pin to select it.
+  for (int i = 0; i < 9; ++i) gpio_off(CSEL_GPIO, CSEL_NUM);
+  current_channel = channel;
+  partial_reading = 0;
+  frame = 0;
+  SPI->DR = 1;  // start bit
+  uint16_t data = (1 << 15) /* not differential */ |
+      (channel << 12);
+  while (!(SPI->SR & SPI_SR_TXE));
+  SPI->DR = data;
+}
+
+void SPI_IRQHandler(void) {
+  uint32_t status = SPI->SR;
+  if (status & SPI_SR_RXNE) {
+    uint16_t value = SPI->DR;
+    if (frame == 0) {
+      frame = 1;
+      partial_reading = value;
+    } else {
+      // Masking off the high bits is important because there's nothing driving
+      // the MISO line during the time the MCU receives them.
+      analog_readings[current_channel] = (partial_reading << 16 | value) & 0x3FF;
+      for (int i = 0; i < 100; ++i) gpio_off(CSEL_GPIO, CSEL_NUM);
+      gpio_on(CSEL_GPIO, CSEL_NUM);
+
+      TIM->CR1 = TIM_CR1_OPM;
+      TIM->EGR = TIM_EGR_UG;
+      TIM->CR1 |= TIM_CR1_CEN;
+    }
+  }
+}
+
+void TIM_IRQHandler(void) {
+  TIM->SR = ~TIM_SR_CC1IF;
+
+  start_read((current_channel + 1) % NUM_CHANNELS);
+}
+
+void analog_init(void) {
+  memset(analog_readings, 0xFF, sizeof(analog_readings));
+
+  RCC->APB1ENR |= RCC_APB1ENR_SPIEN;
+  RCC->APB1ENR |= RCC_APB1ENR_TIMEN;
+
+  gpio_setup_out(CSEL_GPIO, CSEL_NUM, 3);
+  gpio_on(CSEL_GPIO, CSEL_NUM);  // deselect it
+
+  gpio_setup_alt(GPIOB, 13, 5);  // SCK
+  gpio_setup_alt(GPIOB, 14, 5);  // MISO
+  gpio_setup_alt(GPIOB, 15, 5);  // MOSI
+
+  NVIC_SetPriority(SPI_IRQn, 6);
+  NVIC_EnableIRQ(SPI_IRQn);
+  NVIC_SetPriority(TIM_IRQn, 6);
+  NVIC_EnableIRQ(TIM_IRQn);
+
+  TIM->CR1 = TIM_CR1_OPM;
+  TIM->DIER = TIM_DIER_CC1IE;
+  TIM->CCMR1 = 0;
+  // Make each tick take 1500ns.
+  TIM->PSC = (60 * 1500 / 1000) - 1;
+  // Call the interrupt after 1 tick.
+  TIM->CCR1 = 1;
+
+  SPI->CR1 = 0;  // make sure it's disabled
+  SPI->CR1 =
+      SPI_CR1_DFF /* 16 bit frame */ |
+      SPI_CR1_SSM | SPI_CR1_SSI | /* don't watch for other masters */
+      3 << 3 /* 30MHz/16 = 1.875MHz */ |
+      SPI_CR1_MSTR /* master mode */;
+  SPI->CR2 = SPI_CR2_RXNEIE;
+  SPI->CR1 |= SPI_CR1_SPE;  // enable it
+
+  start_read(0);
+}
diff --git a/bbb_cape/src/cape/analog.h b/bbb_cape/src/cape/analog.h
new file mode 100644
index 0000000..50038d5
--- /dev/null
+++ b/bbb_cape/src/cape/analog.h
@@ -0,0 +1,17 @@
+#ifndef CAPE_ANALOG_H_
+#define CAPE_ANALOG_H_
+
+#include <stdint.h>
+
+// Starts up constantly reading analog values and storing them in an array to
+// be retrieved by analog_get.
+void analog_init(void);
+
+static inline uint16_t analog_get(int num) {
+  if (num < 0 || num > 7) return 0xFFFF;
+
+  extern uint16_t analog_readings[8] __attribute__((aligned(8)));
+  return analog_readings[num];
+}
+
+#endif  // CAPE_ANALOG_H_
diff --git a/bbb_cape/src/cape/bootloader.c b/bbb_cape/src/cape/bootloader.c
new file mode 100644
index 0000000..3562252
--- /dev/null
+++ b/bbb_cape/src/cape/bootloader.c
@@ -0,0 +1,70 @@
+#include <stdint.h>
+
+#include <STM32F2XX.h>
+
+#include "cape/bootloader_handoff.h"
+#include "cape/led.h"
+
+// Sets everything up and then jumps to the main code.
+static void jump_to_main(void) __attribute__((noreturn));
+static void jump_to_main(void) {
+  __asm__ __volatile__(
+      "mov sp, %[stack]\n\t"
+      "bx %[reset]" : :
+      [stack]"r"(RAM_START + RAM_SIZE), [reset]"r"(MAIN_FLASH_START | 1)
+      : "memory");
+  __builtin_unreachable();
+}
+
+static void setup_main_clock(void) {
+  // We set up a couple of registers here separately from the actual register to
+  // avoid having to think about what happens when the value is in some
+  // intermediate state.
+
+  RCC->CR |= RCC_CR_HSEON;  // get the HSE oscillator going
+
+  FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN |
+               FLASH_ACR_LATENCY_3WS;
+
+  uint32_t rcc_pllcfgr = 0;
+  rcc_pllcfgr |= RCC_PLLCFGR_PLLSRC;  // use the external oscillator
+  // 8MHz * 120 / 4 / 2 = 120MHz
+  rcc_pllcfgr |= 120 << 6;  // multiplier
+  rcc_pllcfgr |= 4;  // divider
+  rcc_pllcfgr |= 5 << 24;  // other stuff divider = 5, just in case
+  RCC->PLLCFGR = rcc_pllcfgr;
+
+  uint32_t rcc_cfgr = 0;
+  rcc_cfgr |= 4 << 13;  // APB2 divider = 2
+  rcc_cfgr |= 5 << 10;  // APB1 divider = 4
+  rcc_cfgr |= 2;  // use the PLL
+
+  // Wait for the HSE oscillator to be stable.
+  while (!(RCC->CR & RCC_CR_HSERDY)) {}
+
+  RCC->CR |= RCC_CR_PLLON;
+  // Wait for the main PLL to be stable.
+  while (!(RCC->CR & RCC_CR_PLLRDY)) {}
+  // Wait until the flash is using 3 wait states.
+  while ((FLASH->ACR & 7) != 3) {}
+  RCC->CFGR = rcc_cfgr;
+  // Wait until we are using the PLL as our main clock source.
+  while ((RCC->CFGR & (3 << 2)) != (2 << 2)) {}
+}
+
+void _start(void) {
+  // Enable the GPIO pin clocks.
+  // We don't have anything on the 1 port D pin, so don't bother enabling it.
+  RCC->AHB1ENR |=
+      RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN;
+  led_init();
+  led_set(LED_HB, 1);
+
+  setup_main_clock();
+
+  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
+  SYSCFG->CMPCR |= SYSCFG_CMPCR_CMP_PD;  // enable IO compensation cell
+  while (!(SYSCFG->CMPCR & SYSCFG_CMPCR_READY)) {}  // wait for it to be ready
+
+  jump_to_main();
+}
diff --git a/bbb_cape/src/cape/bootloader.ld b/bbb_cape/src/cape/bootloader.ld
new file mode 100644
index 0000000..6751529
--- /dev/null
+++ b/bbb_cape/src/cape/bootloader.ld
@@ -0,0 +1,13 @@
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16k
+  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 128k
+}
+
+SECTIONS
+{
+	.text :
+	{
+		KEEP(*(.vectors))
+	} > FLASH
+}
diff --git a/bbb_cape/src/cape/bootloader_handoff.h b/bbb_cape/src/cape/bootloader_handoff.h
new file mode 100644
index 0000000..1e48e90
--- /dev/null
+++ b/bbb_cape/src/cape/bootloader_handoff.h
@@ -0,0 +1,15 @@
+#ifndef CAPE_BOOTLOADER_HANDOFF_H_
+#define CAPE_BOOTLOADER_HANDOFF_H_
+
+// This file has constants and functions for dealing with the handoff between
+// the bootloader and the main code.
+
+// How much flash the bootloader has (starting at address 0).
+#define BOOTLOADER_FLASH_SIZE 0x4000
+// Where the main code's flash starts.
+#define MAIN_FLASH_START BOOTLOADER_FLASH_SIZE
+
+#define RAM_START 0x20000000
+#define RAM_SIZE 0x20000
+
+#endif  // CAPE_BOOTLOADER_HANDOFF_H_
diff --git a/bbb_cape/src/cape/cape.gyp b/bbb_cape/src/cape/cape.gyp
new file mode 100644
index 0000000..91ec298
--- /dev/null
+++ b/bbb_cape/src/cape/cape.gyp
@@ -0,0 +1,20 @@
+{
+  'target_defaults': {
+    'include_dirs': [
+      '..',
+    ],
+  },
+  'targets': [
+    {
+      'target_name': 'cows',
+      'type': 'static_library',
+      'sources': [
+        'cows.c',
+      ],
+    },
+    {
+      'target_name': 'data_struct',
+      'type': 'static_library',
+    },
+  ],
+}
diff --git a/bbb_cape/src/cape/cows.c b/bbb_cape/src/cape/cows.c
new file mode 100644
index 0000000..bcf6308
--- /dev/null
+++ b/bbb_cape/src/cape/cows.c
@@ -0,0 +1,77 @@
+#include "cape/cows.h"
+
+#include <limits.h>
+
+#if __STDC_HOSTED__
+#include <assert.h>
+#else
+#define assert(...)
+#endif
+
+// This implementation is based on
+// <http://www.jacquesf.com/2011/03/consistent-overhead-byte-stuffing/>.
+
+uint32_t cows_stuff(const void *__restrict__ source_in, size_t source_length,
+                    void *__restrict__ destination_in) {
+  assert((source_length % 4) == 0);
+  const uint32_t *restrict source = (const uint32_t *)source_in;
+  uint32_t *restrict destination = (uint32_t *)destination_in;
+  size_t source_index = 0;
+  size_t destination_index = 1;
+  size_t code_index = 0;
+  uint32_t code = 1;
+
+  while (source_index < source_length / 4) {
+    if (source[source_index] == 0) {
+      destination[code_index] = code;
+      code = 1;
+      code_index = destination_index++;
+      ++source_index;
+    } else {
+      destination[destination_index++] = source[source_index++];
+      ++code;
+      if (code == UINT32_MAX) {
+        destination[code_index] = code;
+        code = 1;
+        code_index = destination_index++;
+      }
+    }
+  }
+  destination[code_index] = code;
+  return destination_index;
+}
+
+uint32_t cows_unstuff(const uint32_t *__restrict__ source, size_t source_length,
+                      uint32_t *__restrict__ destination,
+                      size_t destination_length) {
+  assert((source_length % 4) == 0);
+  assert((destination_length % 4) == 0);
+  size_t source_index = 0;
+  size_t destination_index = 0;
+  uint32_t code;
+
+  while (1) {
+    code = source[source_index];
+    if (source_index + code > source_length / 4 && code != 1) {
+      return 0;
+    }
+
+    ++source_index;
+
+    for (uint32_t i = 1; i < code; ++i) {
+      if (destination_index >= destination_length / 4) {
+        return 0;
+      }
+      destination[destination_index++] = source[source_index++];
+    }
+    if (source_index == source_length / 4) {
+      return destination_index;
+    }
+    if (code != UINT32_MAX) {
+      if (destination_index >= destination_length / 4) {
+        return 0;
+      }
+      destination[destination_index++] = 0;
+    }
+  }
+}
diff --git a/bbb_cape/src/cape/cows.h b/bbb_cape/src/cape/cows.h
new file mode 100644
index 0000000..9c47827
--- /dev/null
+++ b/bbb_cape/src/cape/cows.h
@@ -0,0 +1,42 @@
+#ifndef CAPE_COWS_H_
+#define CAPE_COWS_H_
+
+#include <sys/types.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// This file implements something very similar to Consistent Overhead Byte
+// Stuffing <http://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing>. It
+// uses that algorithm except with 4-byte chunks instead of individual bytes
+// because that's more efficient on 32-bit processors. I'm calling it Consistent
+// Overhead Word Stuffing.
+
+// source_length must be a multiple of 4. That many bytes of source
+// will be read.
+// destination must have at least
+// ((source_length / (2^32 - 1)) rounded up) * 4
+// more bytes than source_length available.
+// source and destination both have to be 4-byte aligned.
+// Returns the total number of words written (not necessarily the maximum given
+// in the above description of destination).
+uint32_t cows_stuff(const void *__restrict__ source, size_t source_length,
+                    void *__restrict__ destination);
+
+// source_length must be a multiple of 4. That many bytes of source
+// will be read.
+// source and destination both have to be 4-byte aligned.
+// Returns the total number of words written to destination or 0 for error.
+// Possible errors are trying to unstuff more data than is available in source
+// or trying to write more than destination_length bytes out.
+uint32_t cows_unstuff(const uint32_t *__restrict__ source, size_t source_length,
+                      uint32_t *__restrict__ destination,
+                      size_t destination_length);
+
+#ifdef __cplusplus
+} // extern C
+#endif
+
+#endif  // CAPE_COWS_H_
diff --git a/bbb_cape/src/cape/crc.c b/bbb_cape/src/cape/crc.c
new file mode 100644
index 0000000..8182610
--- /dev/null
+++ b/bbb_cape/src/cape/crc.c
@@ -0,0 +1,16 @@
+#include "cape/crc.h"
+
+#include <STM32F2XX.h>
+
+void crc_init(void) {
+  RCC->AHB1ENR |= RCC_AHB1ENR_CRCEN;
+}
+
+uint32_t crc_calculate(uint32_t *data, size_t words) {
+  CRC->CR = 1;  // reset it
+  uint32_t *end = data + words;
+  for (; data < end; ++data) {
+    CRC->DR = *data;
+  }
+  return CRC->DR;
+}
diff --git a/bbb_cape/src/cape/crc.h b/bbb_cape/src/cape/crc.h
new file mode 100644
index 0000000..2aeed82
--- /dev/null
+++ b/bbb_cape/src/cape/crc.h
@@ -0,0 +1,13 @@
+#ifndef CAPE_CRC_H_
+#define CAPE_CRC_H_
+
+#include <stdint.h>
+#include <sys/types.h>
+
+void crc_init(void);
+
+// The second argument is the number of words to checksum, NOT the number of
+// bytes.
+uint32_t crc_calculate(uint32_t *restrict data, size_t words);
+
+#endif  // CAPE_CRC_H_
diff --git a/bbb_cape/src/cape/data_struct.h b/bbb_cape/src/cape/data_struct.h
new file mode 100644
index 0000000..9e5ee6c
--- /dev/null
+++ b/bbb_cape/src/cape/data_struct.h
@@ -0,0 +1,125 @@
+// This isn't really a header file. It's designed to be #included directly into
+// other code (possibly in a namespace or whatever), so it doesn't have include
+// guards.
+// This means that it can not #include anything else because it (sometimes) gets
+// #included inside a namespace.
+// <stdint.h> must be #included by the containing file.
+// In the cape code, bbb_cape/src/cape/fill_packet.h #includes this file.
+// In the prime code, bbb_cape/src/bbb/data_struct.h #includes this file.
+
+#pragma pack(push, 1)
+// Be careful with declaration order in here. ARM doesn't like unaligned
+// accesses and this structure is packed, so messing the order up will cause the
+// compiler to generate very inefficient code to access fields.
+struct DATA_STRUCT_NAME {
+  int64_t gyro_angle;
+
+  union {
+    struct {
+      // In 10us since the cape last reset.
+      uint64_t timestamp;
+
+      // The CRC32 (same algorithm as the checksum for the packet) of the whole
+      // contents of flash for the main code (aka what's in the .hex file).
+      uint32_t flash_checksum;
+
+      struct {
+        // If the current gyro_angle has been not updated because of a bad
+        // reading from the sensor.
+        uint8_t old_gyro_reading : 1;
+        // If the gyro is still initializing.
+        // If this is 1, then all of the other gyro data is invalid.
+        uint8_t uninitialized_gyro : 1;
+        // If the gyro is still zeroing.
+        // If this is 1, then all of the other gyro data is invalid.
+        uint8_t zeroing_gyro : 1;
+        // If we're not going to get any more good gyro_angles.
+        uint8_t bad_gyro : 1;
+      };
+    };
+    struct {
+      uint64_t header1, header2;
+    };
+  };
+
+  // We are 64-bit aligned at this point.
+
+  union {
+    // This is for the test code that basically just sends all of the values
+    // over to make sure that everything is working.
+    struct {
+      int32_t encoders[8];
+
+      uint16_t analogs[8];
+
+      uint32_t digitals;
+
+      int32_t posedge_value, negedge_value;
+      uint8_t posedge_count, negedge_count;
+    } test;
+
+    // This is for the comp and practice robots.
+    struct {
+      int32_t left_drive;
+      int32_t right_drive;
+      int32_t shooter_angle;
+      int32_t shooter;
+      int32_t indexer;
+      int32_t wrist;
+
+      int32_t capture_top_rise;
+      int32_t capture_top_fall;
+      int32_t capture_bottom_fall_delay;
+      int32_t capture_wrist_rise;
+      int32_t capture_shooter_angle_rise;
+
+      uint16_t battery_voltage;
+      uint16_t left_drive_hall;
+      uint16_t right_drive_hall;
+
+      int8_t top_rise_count;
+
+      int8_t top_fall_count;
+
+      int8_t bottom_rise_count;
+
+      int8_t bottom_fall_delay_count;
+      int8_t bottom_fall_count;
+
+      int8_t wrist_rise_count;
+
+      int8_t shooter_angle_rise_count;
+
+      struct {
+        uint8_t wrist_hall_effect : 1;
+        uint8_t angle_adjust_bottom_hall_effect : 1;
+        uint8_t top_disc : 1;
+        uint8_t bottom_disc : 1;
+        uint8_t loader_top : 1;
+        uint8_t loader_bottom : 1;
+      };
+    } main;
+  };
+} __attribute__((aligned(8)));
+#pragma pack(pop)
+
+// The number of bytes that we actually send (so it stays consistent) (including
+// the byte-stuffing overhead and the CRC on the end).
+// This will always be a multiple of 4.
+#define DATA_STRUCT_SEND_SIZE 148
+
+#ifdef __cplusplus
+#define STATIC_ASSERT(cond, msg) static_assert(cond, #msg)
+#endif
+// 4 bytes of 0s at the beginning, 4 bytes of byte-stuffing overhead, and 4
+// bytes of CRC on the end.
+STATIC_ASSERT(
+    (sizeof(struct DATA_STRUCT_NAME) + 8 + 4) <= DATA_STRUCT_SEND_SIZE,
+    The_sensor_data_structure_is_too_big);
+// The byte-stuffing and CRC both work in chunks of 4 bytes, so it has to be a
+// multiple of that in size.
+STATIC_ASSERT((sizeof(struct DATA_STRUCT_NAME) % 4) == 0,
+              The_sensor_data_structure_is_not_a_multiple_of_4_bytes);
+#ifdef __cplusplus
+#undef STATIC_ASSERT
+#endif
diff --git a/bbb_cape/src/cape/digital.c b/bbb_cape/src/cape/digital.c
new file mode 100644
index 0000000..70fce99
--- /dev/null
+++ b/bbb_cape/src/cape/digital.c
@@ -0,0 +1,211 @@
+#include "cape/digital.h"
+
+#include <STM32F2XX.h>
+
+#include "cape/util.h"
+
+static void digital_capture_default(void) {}
+
+void digital_capture_0P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_0N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_1P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_1N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_2P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_2N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_3P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_3N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_4P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_4N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_5P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_5N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_6P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_6N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_7P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_7N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_8P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_8N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_9P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_9N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_10P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_10N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_11P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_11N(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_12P(void) ALIAS_WEAK(digital_capture_default);
+void digital_capture_12N(void) ALIAS_WEAK(digital_capture_default);
+
+void EXTI2_IRQHandler(void) {
+  uint32_t inputs = GPIOB->IDR;
+  EXTI->PR = EXTI_PR_PR2;
+  if (inputs & (1 << 2)) {
+    digital_capture_11N();
+  } else {
+    digital_capture_11P();
+  }
+}
+
+void EXTI4_IRQHandler(void) {
+  uint32_t inputs = GPIOC->IDR;
+  EXTI->PR = EXTI_PR_PR4;
+  if (inputs & (1 << 4)) {
+    digital_capture_0N();
+  } else {
+    digital_capture_0P();
+  }
+}
+
+static void EXTI5_Handler(uint32_t inputs) {
+  if (inputs & (1 << 5)) {
+    digital_capture_1N();
+  } else {
+    digital_capture_1P();
+  }
+}
+
+static void EXTI7_Handler(uint32_t inputs) {
+  if (inputs & (1 << 7)) {
+    digital_capture_10N();
+  } else {
+    digital_capture_10P();
+  }
+}
+
+static void EXTI8_Handler(uint32_t inputs) {
+  if (inputs & (1 << 8)) {
+    digital_capture_7N();
+  } else {
+    digital_capture_7P();
+  }
+}
+
+static void EXTI9_Handler(uint32_t inputs) {
+  if (inputs & (1 << 9)) {
+    digital_capture_6N();
+  } else {
+    digital_capture_6P();
+  }
+}
+
+void EXTI9_5_IRQHandler(void) {
+  uint32_t a_inputs = GPIOA->IDR, b_inputs = GPIOB->IDR, c_inputs = GPIOC->IDR;
+  uint32_t exti = __clz(EXTI->PR);
+  EXTI->PR = (1 << 31) >> exti;
+  switch (exti) {
+    case 31 - 5:
+      EXTI5_Handler(c_inputs);
+      break;
+    case 31 - 7:
+      EXTI7_Handler(a_inputs);
+      break;
+    case 31 - 8:
+      EXTI8_Handler(b_inputs);
+      break;
+    case 31 - 9:
+      EXTI9_Handler(b_inputs);
+      break;
+  }
+}
+
+static void EXTI10_Handler(uint32_t inputs) {
+  if (inputs & (1 << 10)) {
+    digital_capture_5N();
+  } else {
+    digital_capture_5P();
+  }
+}
+
+static void EXTI11_Handler(uint32_t inputs) {
+  if (inputs & (1 << 11)) {
+    digital_capture_9N();
+  } else {
+    digital_capture_9P();
+  }
+}
+
+static void EXTI12_Handler(uint32_t inputs) {
+  if (inputs & (1 << 12)) {
+    digital_capture_8N();
+  } else {
+    digital_capture_8P();
+  }
+}
+
+static void EXTI13_Handler(uint32_t inputs) {
+  if (inputs & (1 << 13)) {
+    digital_capture_2N();
+  } else {
+    digital_capture_2P();
+  }
+}
+
+static void EXTI14_Handler(uint32_t inputs) {
+  if (inputs & (1 << 14)) {
+    digital_capture_3N();
+  } else {
+    digital_capture_3P();
+  }
+}
+
+static void EXTI15_Handler(uint32_t inputs) {
+  if (inputs & (1 << 15)) {
+    digital_capture_4N();
+  } else {
+    digital_capture_4P();
+  }
+}
+
+void EXTI15_10_IRQHandler(void) {
+  uint32_t a_inputs = GPIOA->IDR, b_inputs = GPIOB->IDR, c_inputs = GPIOC->IDR;
+  uint32_t exti = __clz(EXTI->PR);
+  EXTI->PR = (1 << 31) >> exti;
+  switch (exti) {
+    case 31 - 10:
+      EXTI10_Handler(b_inputs);
+      break;
+    case 31 - 11:
+      EXTI11_Handler(a_inputs);
+      break;
+    case 31 - 12:
+      EXTI12_Handler(a_inputs);
+      break;
+    case 31 - 13:
+      EXTI13_Handler(c_inputs);
+      break;
+    case 31 - 14:
+      EXTI14_Handler(c_inputs);
+      break;
+    case 31 - 15:
+      EXTI15_Handler(c_inputs);
+      break;
+  }
+}
+
+static void init_exti(int exti, int port) {
+  EXTI_set(exti, port);
+  EXTI->IMR |= 1 << exti;
+  EXTI->RTSR |= 1 << exti;
+  EXTI->FTSR |= 1 << exti;
+}
+
+void digital_init(void) {
+  init_exti(2, 1);
+  init_exti(4, 2);
+  init_exti(5, 2);
+  init_exti(7, 0);
+  init_exti(8, 1);
+  init_exti(9, 1);
+  init_exti(10, 1);
+  init_exti(11, 0);
+  init_exti(12, 0);
+  init_exti(13, 2);
+  init_exti(14, 2);
+  init_exti(15, 2);
+
+  NVIC_SetPriority(EXTI2_IRQn, 1);
+  NVIC_EnableIRQ(EXTI2_IRQn);
+  NVIC_SetPriority(EXTI4_IRQn, 1);
+  NVIC_EnableIRQ(EXTI4_IRQn);
+  NVIC_SetPriority(EXTI9_5_IRQn, 1);
+  NVIC_EnableIRQ(EXTI9_5_IRQn);
+  NVIC_SetPriority(EXTI15_10_IRQn, 1);
+  NVIC_EnableIRQ(EXTI15_10_IRQn);
+}
diff --git a/bbb_cape/src/cape/digital.h b/bbb_cape/src/cape/digital.h
new file mode 100644
index 0000000..9743c3f
--- /dev/null
+++ b/bbb_cape/src/cape/digital.h
@@ -0,0 +1,90 @@
+#ifndef CAPE_DIGITAL_H_
+#define CAPE_DIGITAL_H_
+
+#include <STM32F2XX.h>
+
+void digital_init(void);
+
+// For all of the digital functions, a high voltage level on the input reads as
+// 1 (and a low to high transition is a positive edge).
+
+static inline int digital_read(int num) {
+  switch (num) {
+    case 0:
+      return !(GPIOC->IDR & (1 << 4));
+    case 1:
+      return !(GPIOC->IDR & (1 << 5));
+    case 2:
+      return !(GPIOC->IDR & (1 << 13));
+    case 3:
+      return !(GPIOC->IDR & (1 << 14));
+    case 4:
+      return !(GPIOC->IDR & (1 << 15));
+    case 5:
+      return !(GPIOB->IDR & (1 << 10));
+    case 6:
+      return !(GPIOB->IDR & (1 << 9));
+    case 7:
+      return !(GPIOB->IDR & (1 << 8));
+    case 8:
+      return !(GPIOA->IDR & (1 << 12));
+    case 9:
+      return !(GPIOA->IDR & (1 << 11));
+    case 10:
+      return !(GPIOA->IDR & (1 << 7));
+    case 11:
+      return !(GPIOB->IDR & (1 << 2));
+    default:
+      return 0;
+  }
+}
+
+// A helper function for implementing digital_capture_{disable,enable}.
+static inline enum IRQn digital_capture_getirqn(int num) {
+  switch (num) {
+    case 0:
+      return EXTI4_IRQn;
+    case 1:
+      return EXTI9_5_IRQn;
+    case 2:
+      return EXTI15_10_IRQn;
+    case 3:
+      return EXTI15_10_IRQn;
+    case 4:
+      return EXTI15_10_IRQn;
+    case 5:
+      return EXTI15_10_IRQn;
+    case 6:
+      return EXTI9_5_IRQn;
+    case 7:
+      return EXTI9_5_IRQn;
+    case 8:
+      return EXTI15_10_IRQn;
+    case 9:
+      return EXTI15_10_IRQn;
+    case 10:
+      return EXTI9_5_IRQn;
+    case 11:
+      return EXTI2_IRQn;
+    default:
+      __builtin_trap();
+  }
+}
+
+static inline void digital_capture_disable(int num) {
+  NVIC_DisableIRQ(digital_capture_getirqn(num));
+}
+
+static inline void digital_capture_enable(int num) {
+  NVIC_EnableIRQ(digital_capture_getirqn(num));
+}
+
+// These are the functions for handling edges on the inputs. They have
+// default (weak symbol) implementations that do nothing.
+//void digital_capture_0P(void);
+//void digital_capture_0N(void);
+//void digital_capture_1P(void);
+//void digital_capture_1N(void);
+//...
+
+#endif  // CAPE_DIGITAL_H_
diff --git a/bbb_cape/src/cape/encoder.c b/bbb_cape/src/cape/encoder.c
new file mode 100644
index 0000000..93868fb
--- /dev/null
+++ b/bbb_cape/src/cape/encoder.c
@@ -0,0 +1,188 @@
+#include "cape/encoder.h"
+
+#include <STM32F2XX.h>
+
+#include "cape/util.h"
+
+// Here is where each encoder is hooked up:
+// 0: PC6,PC7 TIM8
+// 1: PC0,PC1 EXTI0,EXTI1
+// 2: PA0,PA1 TIM5(32)
+// 3: PA2,PA3 TIM9.1,EXTI3
+// 4: PA8,PB0 TIM1.1,TIM3.3
+// 5: PA5,PB3 TIM2(32)
+// 6: PA6,PB5 TIM3
+// 7: PB6,PB7 TIM4
+
+volatile int32_t encoder1_value = 0;
+volatile int32_t encoder3_value = 0;
+volatile int32_t encoder4_value = 0;
+
+// 1.A
+void EXTI0_IRQHandler(void) {
+  uint32_t inputs = GPIOC->IDR;
+  EXTI->PR = EXTI_PR_PR0;
+	int32_t old_value = encoder1_value;
+	int32_t new_value;
+  // This looks like a weird way to XOR the 2 inputs, but it compiles down to
+  // just 2 instructions, which is hard to beat.
+  if (((inputs >> 1) ^ inputs) & (1 << 0)) {
+		new_value = old_value + 1;
+  } else {
+		new_value = old_value - 1;
+  }
+	encoder1_value = new_value;
+}
+
+// 1.B
+void EXTI1_IRQHandler(void) {
+  uint32_t inputs = GPIOC->IDR;
+  EXTI->PR = EXTI_PR_PR1;
+	int32_t old_value = encoder1_value;
+	int32_t new_value;
+  if (((inputs >> 1) ^ inputs) & (1 << 0)) {
+		new_value = old_value - 1;
+  } else {
+		new_value = old_value + 1;
+  }
+	encoder1_value = new_value;
+}
+
+// 3.A
+void TIM1_BRK_TIM9_IRQHandler(void) {
+  uint32_t inputs = GPIOA->IDR;
+  TIM9->SR = ~TIM_SR_CC1IF;
+	int32_t old_value = encoder3_value;
+	int32_t new_value;
+  if (((inputs >> 1) ^ inputs) & (1 << 2)) {
+		new_value = old_value + 1;
+  } else {
+		new_value = old_value - 1;
+  }
+	encoder3_value = new_value;
+}
+
+// 3.B
+void EXTI3_IRQHandler(void) {
+  uint32_t inputs = GPIOA->IDR;
+  EXTI->PR = EXTI_PR_PR3;
+	int32_t old_value = encoder3_value;
+	int32_t new_value;
+  if (((inputs >> 1) ^ inputs) & (1 << 2)) {
+		new_value = old_value - 1;
+  } else {
+		new_value = old_value + 1;
+  }
+	encoder3_value = new_value;
+}
+
+// 4.A
+void TIM1_CC_IRQHandler(void) {
+  uint32_t a_inputs = GPIOA->IDR, b_inputs = GPIOB->IDR;
+  TIM1->SR = ~TIM_SR_CC1IF;
+	int32_t old_value = encoder4_value;
+	int32_t new_value;
+  if (((a_inputs >> 8) ^ b_inputs) & (1 << 0)) {
+		new_value = old_value + 1;
+  } else {
+		new_value = old_value - 1;
+  }
+	encoder4_value = new_value;
+}
+
+// 4.B
+void TIM3_IRQHandler(void) {
+  uint32_t a_inputs = GPIOA->IDR, b_inputs = GPIOB->IDR;
+  TIM3->SR = ~TIM_SR_CC3IF;
+	int32_t old_value = encoder4_value;
+	int32_t new_value;
+  if (((a_inputs >> 8) ^ b_inputs) & (1 << 0)) {
+		new_value = old_value - 1;
+  } else {
+		new_value = old_value + 1;
+  }
+	encoder4_value = new_value;
+}
+
+static void encoder_setup(TIM_TypeDef *timer) {
+  timer->CR1 =
+      TIM_CR1_URS /* don't generate spurious update interrupts that
+                     might be shared with other timers */;
+  timer->SMCR = 3;  // 4x quadrature encoder mode
+  timer->CCMR1 =
+      TIM_CCMR1_CC2S_0 | /* input pin 2 -> timer input 2 */
+      TIM_CCMR1_CC1S_0;  /* input pin 1 -> timer input 1 */
+  timer->EGR = TIM_EGR_UG;
+  timer->CR1 |= TIM_CR1_CEN;
+}
+
+void encoder_init(void) {
+  // Set up the 3 simple software encoder inputs.
+  EXTI_set(0, 2);
+  EXTI_set(1, 2);
+  EXTI_set(3, 0);
+  EXTI->IMR |= EXTI_IMR_MR0 | EXTI_IMR_MR1 | EXTI_IMR_MR3;
+  EXTI->RTSR |= EXTI_RTSR_TR0 | EXTI_RTSR_TR1 | EXTI_RTSR_TR3;
+  EXTI->FTSR |= EXTI_FTSR_TR0 | EXTI_FTSR_TR1 | EXTI_FTSR_TR3;
+  NVIC_EnableIRQ(EXTI0_IRQn);
+  NVIC_EnableIRQ(EXTI1_IRQn);
+  NVIC_EnableIRQ(EXTI3_IRQn);
+
+  // Set up the A2 software encoder input through TIM9 input 1.
+  gpio_setup_alt(GPIOA, 2, 3);
+  RCC->APB2ENR |= RCC_APB2ENR_TIM9EN;
+  TIM9->CR1 = 0;
+  TIM9->DIER = TIM_DIER_CC1IE;
+  TIM9->CCMR1 = TIM_CCMR1_CC1S_0; /* input pin 1 -> timer input 1 */
+  TIM9->CCER = TIM_CCER_CC1NP | TIM_CCER_CC1P | TIM_CCER_CC1E;
+  TIM9->EGR = TIM_EGR_UG;
+  TIM9->CR1 |= TIM_CR1_CEN;
+  NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
+
+	// Set up the A4 software encoder input through TIM1 input 1.
+  gpio_setup_alt(GPIOA, 8, 1);
+  RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
+	TIM1->CR1 = 0;
+	TIM1->DIER = TIM_DIER_CC1IE;
+	TIM1->CCMR1 = TIM_CCMR1_CC1S_0; /* input pin 1 -> timer input 1 */
+	TIM1->CCER = TIM_CCER_CC1NP | TIM_CCER_CC1P | TIM_CCER_CC1E;
+	TIM1->EGR = TIM_EGR_UG;
+	TIM1->CR1 |= TIM_CR1_CEN;
+	NVIC_EnableIRQ(TIM1_CC_IRQn);
+
+	// Set up the B4 software encoder input through TIM3 input 3.
+  gpio_setup_alt(GPIOB, 0, 2);
+	RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
+	TIM3->CR1 = 0;
+	TIM3->DIER = TIM_DIER_CC3IE;
+	TIM3->CCMR2 = TIM_CCMR2_CC3S_0; /* input pin 3 -> timer input 3 */
+	TIM3->CCER = TIM_CCER_CC3NP | TIM_CCER_CC3P | TIM_CCER_CC3E;
+	TIM3->EGR = TIM_EGR_UG;
+	TIM3->CR1 |= TIM_CR1_CEN;
+	NVIC_EnableIRQ(TIM3_IRQn);
+
+  gpio_setup_alt(GPIOA, 5, 1);
+  gpio_setup_alt(GPIOB, 3, 1);
+  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
+  encoder_setup(TIM2);
+
+  gpio_setup_alt(GPIOA, 6, 2);
+  gpio_setup_alt(GPIOB, 5, 2);
+  RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
+  encoder_setup(TIM3);
+
+  gpio_setup_alt(GPIOB, 6, 2);
+  gpio_setup_alt(GPIOB, 7, 2);
+  RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
+  encoder_setup(TIM4);
+
+  gpio_setup_alt(GPIOA, 0, 2);
+  gpio_setup_alt(GPIOA, 1, 2);
+  RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;
+  encoder_setup(TIM5);
+
+  gpio_setup_alt(GPIOC, 6, 3);
+  gpio_setup_alt(GPIOC, 7, 3);
+  RCC->APB2ENR |= RCC_APB2ENR_TIM8EN;
+  encoder_setup(TIM8);
+}
diff --git a/bbb_cape/src/cape/encoder.h b/bbb_cape/src/cape/encoder.h
new file mode 100644
index 0000000..8e3ef18
--- /dev/null
+++ b/bbb_cape/src/cape/encoder.h
@@ -0,0 +1,80 @@
+#ifndef CAPE_ENCODER_H_
+#define CAPE_ENCODER_H_
+
+#include <stdint.h>
+#include <limits.h>
+
+#include <STM32F2XX.h>
+
+void encoder_init(void);
+
+// Updates a signed 32-bit counter with a new 16-bit value. Assumes that the
+// value will not more than half-wrap between updates.
+// new is 32 bits so it doesn't have to get masked, but the value passed in must
+// be <= UINT16_MAX.
+// Useful for 16-bit encoder counters.
+static inline void counter_update_s32_u16(int32_t *restrict counter,
+                                          uint32_t new) {
+  static const uint16_t kHalf = 0xFFFF / 2;
+  uint16_t old = *counter & 0xFFFF;
+  int32_t counter_top = *counter ^ old;
+  int32_t delta = (int32_t)old - (int32_t)new;
+  int32_t new_counter;
+  if (__builtin_expect(delta < -kHalf, 0)) {
+    new_counter = (counter_top - 0x10000) ^ 0xFFFF;
+  } else if (__builtin_expect(delta > kHalf, 0)) {
+    new_counter = counter_top + 0x10000;
+  } else {
+    new_counter = counter_top;
+  }
+  *counter = new_counter | new;
+}
+
+// Updates an unsigned 64-bit counter with a new 16-bit value. Assumes that the
+// value will not wrap more than once between updates.
+// new is 32 bits so it doesn't have to get masked, but the value passed in must
+// be <= UINT16_MAX.
+// Useful for 16-bit timers being used for absolute timings.
+static inline void counter_update_u64_u16(uint64_t *restrict counter,
+                                          uint32_t new) {
+  uint16_t old = *counter & 0xFFFF;
+  int64_t counter_top = *counter ^ old;
+  int64_t new_counter;
+  if (__builtin_expect(new < old, 0)) {
+    new_counter = counter_top + 0x10000;
+  } else {
+    new_counter = counter_top;
+  }
+  *counter = new_counter | new;
+}
+
+// number is the 0-indexed number on the silkscreen
+static inline int32_t encoder_read(int number) {
+  static int32_t value0, value6, value7;
+  extern volatile int32_t encoder1_value, encoder3_value, encoder4_value;
+  switch (number) {
+    case 0:
+      counter_update_s32_u16(&value0, TIM8->CNT);
+      return value0;
+    case 1:
+      return encoder1_value;
+    case 2:
+      return TIM5->CNT;
+    case 3:
+      return encoder3_value;
+    case 4:
+      return encoder4_value;
+    case 5:
+      return TIM2->CNT;
+    case 6:
+      counter_update_s32_u16(&value6, TIM3->CNT);
+      return value6;
+    case 7:
+      counter_update_s32_u16(&value7, TIM4->CNT);
+      return value7;
+    default:
+      return INT32_MAX;
+  }
+}
+
+#endif  // CAPE_ENCODER_H_
diff --git a/bbb_cape/src/cape/fill_packet.c b/bbb_cape/src/cape/fill_packet.c
new file mode 100644
index 0000000..012b7e3
--- /dev/null
+++ b/bbb_cape/src/cape/fill_packet.c
@@ -0,0 +1,94 @@
+#include "cape/fill_packet.h"
+
+#include <string.h>
+
+#include <STM32F2XX.h>
+
+#include "cape/uart_dma.h"
+#include "cape/uart_common.h"
+#include "cape/cows.h"
+#include "cape/encoder.h"
+#include "cape/crc.h"
+#include "cape/bootloader_handoff.h"
+#include "cape/gyro.h"
+#include "cape/analog.h"
+#include "cape/robot.h"
+#include "cape/digital.h"
+#include "cape/led.h"
+
+#include "cape/uart_byte.h"
+
+#define TIMESTAMP_TIM TIM6
+#define RCC_APB1ENR_TIMESTAMP_TIMEN RCC_APB1ENR_TIM6EN
+
+static uint8_t buffer1[DATA_STRUCT_SEND_SIZE] __attribute__((aligned(4)));
+static uint8_t buffer2[DATA_STRUCT_SEND_SIZE] __attribute__((aligned(4)));
+
+static uint32_t flash_checksum;
+// These aren't really integers; they're (4-byte) variables whose addresses mark
+// various locations.
+extern uint8_t __etext, __data_start__, __data_end__;
+
+static inline void do_fill_packet(struct DataStruct *packet) {
+  static uint64_t timestamp = 0;
+  counter_update_u64_u16(&timestamp, TIMESTAMP_TIM->CNT);
+  packet->timestamp = timestamp;
+
+  packet->flash_checksum = flash_checksum;
+
+  struct GyroOutput gyro_output;
+  gyro_get_output(&gyro_output);
+  packet->gyro_angle = gyro_output.angle;
+  packet->old_gyro_reading = gyro_output.last_reading_bad;
+  packet->uninitialized_gyro = !gyro_output.initialized;
+  packet->zeroing_gyro = !gyro_output.zeroed;
+  packet->bad_gyro = gyro_output.gyro_bad;
+
+  robot_fill_packet(packet);
+  //counter_update_u64_u16(&timestamp, TIMESTAMP_TIM->CNT);
+  //packet->main.encoders[0] = timestamp;
+}
+
+// Fills the new packet with data.
+void uart_dma_callback(uint8_t *buffer) {
+  struct {
+    struct DataStruct packet;
+    uint8_t padding[DATA_STRUCT_SEND_SIZE - sizeof(struct DataStruct) - 12];
+    uint32_t checksum;
+  } __attribute__((packed)) data __attribute__((aligned(4)));
+  STATIC_ASSERT(sizeof(data) == DATA_STRUCT_SEND_SIZE - 8,
+                The_size_of_the_data_is_wrong);
+  struct DataStruct *packet = &data.packet;
+
+  do_fill_packet(packet);
+
+  uint32_t *p;
+  memcpy(&p, &packet, sizeof(void *));
+  data.checksum = crc_calculate(p, (sizeof(data) - 4) / 4);
+
+  ((uint32_t *)buffer)[0] = 0;
+  cows_stuff(&data, sizeof(data), buffer + 4);
+}
+
+void fill_packet_start(void) {
+  RCC->APB1ENR |= RCC_APB1ENR_TIMESTAMP_TIMEN;
+  TIMESTAMP_TIM->CR1 = 0;
+  TIMESTAMP_TIM->PSC = 600 - 1;
+  TIMESTAMP_TIM->EGR = TIM_EGR_UG;
+  TIMESTAMP_TIM->CR1 |= TIM_CR1_CEN;
+
+  crc_init();
+  analog_init();
+  encoder_init();
+  digital_init();
+
+  uint8_t *flash_end = &__etext + (&__data_start__ - &__data_end__) + 8;
+  flash_checksum = crc_calculate((void *)MAIN_FLASH_START,
+                                 (size_t)(flash_end - MAIN_FLASH_START) / 4);
+
+  led_set(LED_ERR, 0);
+  gyro_init();
+
+  uart_common_configure(750000);
+  uart_dma_configure(DATA_STRUCT_SEND_SIZE, buffer1, buffer2);
+}
diff --git a/bbb_cape/src/cape/fill_packet.h b/bbb_cape/src/cape/fill_packet.h
new file mode 100644
index 0000000..f3f1543
--- /dev/null
+++ b/bbb_cape/src/cape/fill_packet.h
@@ -0,0 +1,14 @@
+#ifndef CAPE_FILL_PACKET_H_
+#define CAPE_FILL_PACKET_H_
+
+#include <stdint.h>
+
+#include "cape/util.h"
+#define DATA_STRUCT_NAME DataStruct
+#include "cape/data_struct.h"
+#undef DATA_STRUCT_NAME
+
+// Starts writing out sensor packets as fast as the serial port can write them.
+void fill_packet_start(void);
+
+#endif  // CAPE_FILL_PACKET_H_
diff --git a/bbb_cape/src/cape/gcc_arm.ld b/bbb_cape/src/cape/gcc_arm.ld
new file mode 100644
index 0000000..1a1cb27
--- /dev/null
+++ b/bbb_cape/src/cape/gcc_arm.ld
@@ -0,0 +1,145 @@
+GROUP(libgcc.a libc.a libm.a)
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+
+	.ARM.extab :
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	__exidx_start = .;
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+	__exidx_end = .;
+
+	__etext = .;
+
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+
+		/* bootloader.ld sticks this at the beginning of FLASH before here */
+		KEEP(*(.vectors))
+
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+
+	.heap (COPY):
+	{
+		__end__ = .;
+		end = __end__;
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/bbb_cape/src/cape/gyro.c b/bbb_cape/src/cape/gyro.c
new file mode 100644
index 0000000..d650d4b
--- /dev/null
+++ b/bbb_cape/src/cape/gyro.c
@@ -0,0 +1,413 @@
+#include "cape/gyro.h"
+
+#include <inttypes.h>
+
+#include <STM32F2XX.h>
+
+#include "cape/util.h"
+#include "cape/led.h"
+
+#define printf(...)
+
+#define SPI SPI3
+#define SPI_IRQHandler SPI3_IRQHandler
+#define SPI_IRQn SPI3_IRQn
+#define RCC_APB1ENR_SPIEN RCC_APB1ENR_SPI3EN
+#define TIM TIM13
+#define TIM_IRQHandler TIM8_UP_TIM13_IRQHandler
+#define TIM_IRQn TIM8_UP_TIM13_IRQn
+#define RCC_APB1ENR_TIMEN RCC_APB1ENR_TIM13EN
+#define CSEL_GPIO GPIOA
+#define CSEL_NUM 4
+// The header file also contains references to TIM in gyro_read.
+
+struct GyroOutput gyro_output;
+
+// Set when a parity error is detected and cleared before starting a read.
+static volatile int parity_error;
+// Which byte we're currently waiting to read.
+static volatile int receive_byte;
+// The first byte that we receive (the most significant one).
+static volatile uint16_t high_value;
+
+// 1 if the latest result is potentially bad and 0 if it's good.
+static volatile int bad_reading;
+// 1 if the gyro is bad and we're not going to get any more readings.
+static volatile int bad_gyro;
+// The new reading waiting for the next timer cycle to be outputted.
+static volatile int16_t new_reading;
+
+struct GyroOutput gyro_output;
+
+// How many times per second to read the gyro value.
+#define kGyroReadFrequency 200
+// How many times per second to flash the LED.
+// Must evenly divide kGyroReadFrequency.
+#define kFlashFrequency 10
+
+#define kStartupCycles (kGyroReadFrequency * 2)
+#define kZeroingCycles (kGyroReadFrequency * 6)
+
+// An accumulator for all of the values read while zeroing.
+int32_t zero_bias = 0;
+
+int startup_cycles_left = kStartupCycles;
+int zeroing_cycles_left = kZeroingCycles;
+
+// These are a pair that hold the offset calculated while zeroing.
+// full_units_ is the base (in ticks) and remainder_ ranges between 0 and
+// kZeroingCycles (like struct timespec). remainder_ is used to calculate which
+// cycles to add an additional unit to the result.
+int32_t full_units_offset = 0;
+int32_t remainder_offset = 0;
+// This keeps track of when to add 1 to the read value (using _offset).
+int32_t remainder_sum = 0;
+
+int32_t led_flash = 0;
+
+enum State {
+  STATE_SETUP0,
+  STATE_SETUP1,
+  STATE_SETUP2,
+  STATE_SETUP3,
+  STATE_READ,
+};
+static volatile enum State state;
+static int setup_counter;
+
+// Switches to new_state in time TIM milliseconds (aka it shows in the TIM ISR).
+static void switch_state(enum State new_state, int time) {
+  TIM->CR1 = 0;
+  state = new_state;
+  TIM->CCR1 = time;
+  TIM->EGR = TIM_EGR_UG;
+  TIM->CR1 |= TIM_CR1_CEN;
+}
+
+static void gyro_setup_failed(void) {
+  printf("gyro setup failed. stopping\n");
+  gyro_output.angle = 0;
+  gyro_output.last_reading_bad = gyro_output.gyro_bad = 1;
+  gyro_output.initialized = 1;
+  gyro_output.zeroed = 0;
+  led_set(LED_ERR, 1);
+}
+
+static void gyro_enable_csel(void) {
+  // Clear the CSEL pin to select it.
+  // Do it 8 times (9 cycles) to wait for the amount of time the gyro datasheet
+  // says we need to.
+  // (1/2/(7.5MHz)+8ns)*120MHz = 8.96
+  for (int i = 0; i < 8; ++i) gpio_off(CSEL_GPIO, CSEL_NUM);
+}
+
+// Blocks until there is space to enqueue data.
+static void spi_write(uint16_t data) {
+  while (!(SPI->SR & SPI_SR_TXE)) {}
+  SPI->DR = data;
+}
+
+static void do_gyro_read(uint32_t data) {
+  parity_error = 0;
+  receive_byte = 0;
+
+  gyro_enable_csel();
+  spi_write(data >> 16);
+  if (__builtin_parity(data & ~1) == 0) data |= 1;
+  spi_write(data);
+}
+
+// Returns all of the non-data bits in the "header" except the parity from
+// value.
+static uint8_t gyro_status(uint32_t value) {
+  return (value >> 26) & ~4;
+}
+
+// Returns all of the error bits in the "footer" from value.
+static uint8_t gyro_errors(uint32_t value) {
+  return (value >> 1) & 0x7F;
+}
+
+static void reading_received(uint32_t reading) {
+    switch (state) {
+      case STATE_SETUP0:
+        if (parity_error) {
+          switch_state(STATE_SETUP0, 100);
+        } else {
+          if (reading != 1) {
+            printf("gyro unexpected initial response 0x%" PRIx32 "\n", reading);
+            // There's a chance that we're retrying because of a parity error
+            // previously, so keep going.
+          }
+          // Wait for it to assert the fault conditions before reading them.
+          switch_state(STATE_SETUP1, 50);
+        }
+        break;
+      case STATE_SETUP1:
+        if (parity_error) {
+          switch_state(STATE_SETUP0, 100);
+        } else {
+          // Wait for it to clear the fault conditions before reading again.
+          switch_state(STATE_SETUP2, 50);
+        }
+        break;
+      case STATE_SETUP2:
+        if (parity_error) {
+          switch_state(STATE_SETUP0, 100);
+        } else {
+          // If it's not reporting self test data.
+          if (gyro_status(reading) != 2) {
+            printf("gyro first value 0x%" PRIx32 " not self test data\n",
+                   reading);
+            switch_state(STATE_SETUP0, 100);
+            break;
+          }
+          // If we don't see all of the errors.
+          if (gyro_errors(reading) != 0x7F) {
+            printf("gyro self test value 0x%" PRIx32 " is bad\n", reading);
+            gyro_setup_failed();
+            break;
+          }
+          // Wait for the sequential transfer delay before reading out the last
+          // of
+          // the self test data.
+          switch_state(STATE_SETUP3, 1);
+        }
+        break;
+      case STATE_SETUP3:
+        if (parity_error) {
+          switch_state(STATE_SETUP0, 100);
+        } else {
+          // It should still be reporting self test data.
+          if (gyro_status(reading) != 2) {
+            printf("gyro second value 0x%" PRIx32 " not self test data\n",
+                   reading);
+            switch_state(STATE_SETUP0, 100);
+            break;
+          }
+
+          gyro_output.initialized = 1;
+          gyro_output.angle = 0;
+          gyro_output.last_reading_bad = 1;  // until we're started up
+          gyro_output.gyro_bad = bad_gyro = 0;
+          // Start reading values (after the sequential transfer delay).
+          switch_state(STATE_READ, 1);
+        }
+        break;
+      case STATE_READ:
+        if (parity_error) {
+          bad_reading = 1;
+        } else {
+          // This check assumes that the sequence bits are all 0, but they should
+          // be
+          // because that's all we send.
+          if (gyro_status(reading) != 1) {
+            uint8_t status = gyro_status(reading);
+            if (status == 0) {
+              printf("gyro says sensor data is bad\n");
+            } else {
+              printf("gyro gave weird status 0x%" PRIx8 "\n", status);
+            }
+            bad_reading = 1;
+          }
+
+          if (gyro_errors(reading) != 0) {
+            uint8_t errors = gyro_errors(reading);
+            if (errors & ~(1 << 1)) {
+              bad_reading = 1;
+              // Error 1 (continuous self-test error) will set status to 0 if it's
+              // bad
+              // enough by itself.
+            }
+            if (errors & (1 << 6)) {
+              printf("gyro PLL error\n");
+            }
+            if (errors & (1 << 5)) {
+              printf("gyro quadrature error\n");
+            }
+            if (errors & (1 << 4)) {
+              printf("gyro non-volatile memory error\n");
+              bad_gyro = 1;
+            }
+            if (errors & (1 << 3)) {
+              printf("gyro volatile memory error\n");
+              bad_gyro = 1;
+            }
+            if (errors & (1 << 2)) {
+              printf("gyro power error\n");
+            }
+            if (errors & (1 << 1)) {
+              printf("gyro continuous self-test error\n");
+            }
+            if (errors & 1) {
+              printf("gyro unexpected self check mode\n");
+            }
+          }
+          if (bad_gyro) {
+            bad_reading = 1;
+          }
+          new_reading = -(int16_t)(reading >> 10 & 0xFFFF);
+        }
+        switch_state(STATE_READ, 1000 / kGyroReadFrequency);
+        break;
+    }
+}
+
+
+void SPI_IRQHandler(void) {
+  uint32_t status = SPI->SR;
+  if (status & SPI_SR_RXNE) {
+    uint16_t value = SPI->DR;
+    if (receive_byte == 0) {
+      receive_byte = 1;
+
+      if (__builtin_parity(value) != 1) {
+        parity_error = 1;
+        high_value = 0;
+      } else {
+        high_value = value;
+      }
+    } else {
+      uint32_t full_value = high_value << 16 | value;
+      if (__builtin_parity(full_value) != 1) {
+        parity_error = 1;
+      }
+
+      // We have to wait for the hardware to finish sending all the bits first.
+      while (SPI->SR & SPI_SR_BSY) {}
+      // Do it 8 times (9 cycles) to wait for the amount of time the gyro datasheet
+      // says we need to.
+      // (1/2/(7.5MHz)+8ns)*120MHz = 8.96
+      for (int i = 0; i < 8; ++i) gpio_off(CSEL_GPIO, CSEL_NUM);
+
+      // Set the CSEL pin high to deselect it.
+      gpio_on(CSEL_GPIO, CSEL_NUM);
+
+      reading_received(full_value);
+    }
+  }
+}
+
+void TIM_IRQHandler(void) {
+  TIM->CR1 &= ~TIM_CR1_CEN;
+  TIM->SR = ~TIM_SR_CC1IF;
+  switch (state) {
+    case STATE_SETUP0:
+      if (setup_counter++ < 100) {
+        // Get it started doing a check.
+        do_gyro_read(0x20000003);
+      } else {
+        gyro_setup_failed();
+      }
+      break;
+    case STATE_SETUP1:  // Dummy read to clear the old latched state.
+    case STATE_SETUP2:  // Read self-test data.
+    case STATE_SETUP3:  // Read the second latched self-test data.
+      do_gyro_read(0x20000000);
+      break;
+    case STATE_READ:
+      ++led_flash;
+      if (led_flash < kGyroReadFrequency / kFlashFrequency / 2) {
+        led_set(LED_HB, 0);
+      } else {
+        led_set(LED_HB, 1);
+      }
+      if (led_flash >= kGyroReadFrequency / kFlashFrequency) {
+        led_flash = 0;
+      }
+
+      if (bad_gyro) {
+        led_set(LED_ERR, 1);
+        printf("gyro reader giving up because of bad gyro\n");
+        gyro_output.gyro_bad = 1;
+        gyro_output.last_reading_bad = 1;
+        gyro_output.angle = 0;
+        break;
+      }
+
+      if (startup_cycles_left) {
+        led_set(LED_Z, 0);
+        --startup_cycles_left;
+        if (bad_reading) {
+          printf("gyro retrying startup wait because of bad reading\n");
+          startup_cycles_left = kStartupCycles;
+        }
+      } else if (zeroing_cycles_left) {
+        led_set(LED_Z, 1);
+        --zeroing_cycles_left;
+        if (bad_reading) {
+          printf("gyro restarting zeroing because of bad reading\n");
+          zeroing_cycles_left = kZeroingCycles;
+          zero_bias = 0;
+        } else {
+          zero_bias -= new_reading;
+          if (zeroing_cycles_left == 0) {
+            // Do all the nice math
+            full_units_offset = zero_bias / kZeroingCycles;
+            remainder_offset = zero_bias % kZeroingCycles;
+            if (remainder_offset < 0) {
+              remainder_offset += kZeroingCycles;
+              --full_units_offset;
+            }
+            gyro_output.zeroed = 1;
+          }
+        }
+      } else {
+        led_set(LED_Z, 0);
+
+        int64_t new_angle = gyro_output.angle;
+        if (!bad_reading) new_angle += new_reading + full_units_offset;
+        if (remainder_sum >= kZeroingCycles) {
+          remainder_sum -= kZeroingCycles;
+          new_angle += 1;
+        }
+        gyro_output.angle = new_angle;
+        gyro_output.last_reading_bad = bad_reading;
+        remainder_sum += remainder_offset;
+      }
+      do_gyro_read(0x20000000);
+      break;
+  }
+}
+
+void gyro_init(void) {
+  gyro_output.initialized = 0;
+  gyro_output.zeroed = 0;
+
+  RCC->APB1ENR |= RCC_APB1ENR_SPIEN;
+  RCC->APB1ENR |= RCC_APB1ENR_TIMEN;
+
+  // Set up CSEL.
+  gpio_setup_out(CSEL_GPIO, CSEL_NUM, 3);
+  gpio_on(CSEL_GPIO, CSEL_NUM);  // deselect it
+
+  // Set up SCK, MISO, and MOSI.
+  gpio_setup_alt(GPIOC, 10, 6);  // SCK
+  gpio_setup_alt(GPIOC, 11, 6);  // MISO
+  gpio_setup_alt(GPIOC, 12, 6);  // MOSI
+
+  NVIC_SetPriority(SPI_IRQn, 4);
+  NVIC_EnableIRQ(SPI_IRQn);
+  NVIC_SetPriority(TIM_IRQn, 5);
+  NVIC_EnableIRQ(TIM_IRQn);
+
+  TIM->CR1 = 0;
+  TIM->DIER = TIM_DIER_CC1IE;
+  TIM->CCMR1 = 0;
+  // Make it generate 1 tick every ms.
+  TIM->PSC = 60000 - 1;
+  TIM->EGR = TIM_EGR_UG;
+
+  SPI->CR1 = 0;  // make sure it's disabled
+  SPI->CR1 =
+      SPI_CR1_DFF /* 16 bit frame */ |
+      SPI_CR1_SSM | SPI_CR1_SSI | /* don't watch for other masters */
+      1 << 3 /* 30MHz/4 = 7.5MHz */ |
+      SPI_CR1_MSTR /* master mode */;
+  SPI->CR2 = SPI_CR2_RXNEIE;
+  SPI->CR1 |= SPI_CR1_SPE;  // enable it
+
+  setup_counter = 0;
+  led_set(LED_Z, 1);
+  switch_state(STATE_SETUP0, 100);
+}
diff --git a/bbb_cape/src/cape/gyro.h b/bbb_cape/src/cape/gyro.h
new file mode 100644
index 0000000..5af74e9
--- /dev/null
+++ b/bbb_cape/src/cape/gyro.h
@@ -0,0 +1,30 @@
+#ifndef GYRO_BOARD_SRC_USB_GYRO_H_
+#define GYRO_BOARD_SRC_USB_GYRO_H_
+
+#include <stdint.h>
+#include <string.h>
+
+#include <STM32F2XX.h>
+
+// Does everything to set up the gyro code, including starting a timer which
+// triggers reads and integrates the gyro values and blinks the LEDs etc.
+void gyro_init(void);
+
+struct GyroOutput {
+  int64_t angle;
+  int last_reading_bad;
+  int gyro_bad;
+  int initialized;
+  int zeroed;
+};
+
+// Reads the most recent output value and avoids race conditions.
+// Must be called from a lower-priority ISR than TIM10's.
+static inline void gyro_get_output(struct GyroOutput *output) {
+  extern struct GyroOutput gyro_output;
+  NVIC_DisableIRQ(TIM8_UP_TIM13_IRQn);
+  memcpy(output, &gyro_output, sizeof(gyro_output));
+  NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
+}
+
+#endif  // GYRO_BOARD_SRC_USB_GYRO_H_
diff --git a/bbb_cape/src/cape/hardware.notes b/bbb_cape/src/cape/hardware.notes
new file mode 100644
index 0000000..54c8029
--- /dev/null
+++ b/bbb_cape/src/cape/hardware.notes
@@ -0,0 +1,81 @@
+EXTI interrupt groupings:
+  by number in the port
+  0,1,2,3,4,5-9,10-15
+
+
+PA0  TIM5.1
+PA1  TIM5.2
+PA2
+PA3
+PA4  SPI3_NSS (slave select)
+PA5  TIM2.1
+PA6  TIM3.1
+PA7
+PA8  TIM1.1
+PA9  USART1_TX (bootloader)
+PA10 USART1_RX (bootloader)
+PA11 (don't change during reset into bootloader)
+PA12 (don't change during reset into bootloader)
+PA13 SWDIO
+PA14 SWCLK
+PA15 (gets pulled up during reset (JTAG pin))
+PB0  TIM3.3
+PB1
+PB2  BOOT1 (tie to GND)
+PB3  TIM2.2
+PB4  (gets pulled up during reset (JTAG pin))
+PB5  TIM3.2 (don't change during reset into bootloader)
+PB6  TIM4.1
+PB7  TIM4.2
+PB8
+PB9
+PB10
+PB11 (don't change during reset into bootloader)
+PB12 SPI2_NSS (slave select)
+PB13 SPI2_SCK
+PB14 SPI2_MISO
+PB15 SPI2_MOSI
+PC0
+PC1
+PC2
+PC3
+PC4
+PC5
+PC6  TIM8.1
+PC7  TIM8.2
+PC8
+PC9
+PC10 SPI3_SCK
+PC11 SPI3_MISO
+PC12 SPI3_MOSI
+PC13
+PC14
+PC15
+PD2
+
+[GPIOs]
+C0  enc
+C1  enc
+A2  enc (as TIM9.1)
+A3  enc
+
+B2
+C4
+C5
+A7
+B8
+B9
+B10
+A11
+A12
+C13
+C14
+C15
+
+C8  BBB_RST TIM8.3
+
+
+IO compensation cell?
+  controls slew rates
+  increased power draw
+  should probably just enable it?
diff --git a/bbb_cape/src/cape/led.c b/bbb_cape/src/cape/led.c
new file mode 100644
index 0000000..92edaf1
--- /dev/null
+++ b/bbb_cape/src/cape/led.c
@@ -0,0 +1,50 @@
+#include "cape/led.h"
+
+#include <STM32F2XX.h>
+
+#include "cape/util.h"
+
+#define LED_SPEED 0
+
+// DB = PC3
+// Z = PB1
+// HB = PB4
+// ERR = PB11
+
+static void do_led_set(GPIO_TypeDef *port, int number, int on) {
+  // The LEDs are hooked up between 3.3V and the GPIO pin, so these are
+  // backwards.
+  if (on) {
+    gpio_off(port, number);
+  } else {
+    gpio_on(port, number);
+  }
+}
+
+void led_set(enum LED led, int on) {
+  switch (led) {
+    case LED_ERR:
+      do_led_set(GPIOB, 11, on);
+      break;
+    case LED_HB:
+      do_led_set(GPIOB, 4, on);
+      break;
+    case LED_Z:
+      do_led_set(GPIOB, 1, on);
+      break;
+    case LED_DB:
+      do_led_set(GPIOC, 3, on);
+      break;
+  }
+}
+
+void led_init(void) {
+  gpio_setup_out(GPIOB, 11, LED_SPEED);
+  led_set(LED_ERR, 0);
+  gpio_setup_out(GPIOB, 4, LED_SPEED);
+  led_set(LED_HB, 0);
+  gpio_setup_out(GPIOB, 1, LED_SPEED);
+  led_set(LED_Z, 0);
+  gpio_setup_out(GPIOC, 3, LED_SPEED);
+  led_set(LED_DB, 0);
+}
diff --git a/bbb_cape/src/cape/led.h b/bbb_cape/src/cape/led.h
new file mode 100644
index 0000000..ee47853
--- /dev/null
+++ b/bbb_cape/src/cape/led.h
@@ -0,0 +1,17 @@
+#ifndef CAPE_LED_H_
+#define CAPE_LED_H_
+
+// The LEDs as referenced by the silkscreen.
+enum LED {
+  LED_ERR,
+  LED_HB,
+  LED_Z,
+  LED_DB,
+};
+
+// Turns the indicated LED on or off.
+void led_set(enum LED led, int on);
+
+void led_init(void);
+
+#endif  // CAPE_LED_H_
diff --git a/bbb_cape/src/cape/main.c b/bbb_cape/src/cape/main.c
new file mode 100644
index 0000000..390112b
--- /dev/null
+++ b/bbb_cape/src/cape/main.c
@@ -0,0 +1,30 @@
+#include <STM32F2XX.h>
+
+#include "cape/fill_packet.h"
+#include "cape/led.h"
+
+// The startup asm code defines this to the start of our exception vector table.
+extern uint32_t _vectors;
+
+void _start(void) {
+  led_set(LED_ERR, 1);
+  led_set(LED_HB, 0);
+  // Change the vector table offset to use our vector table instead of the
+  // bootloader's.
+  SCB->VTOR = (uint32_t)&_vectors;
+  // Data Memory Barrier to make sure it gets the updated vector table.
+  __asm__ __volatile__("dmb");
+
+  fill_packet_start();
+
+  // Make it go right to sleep after handling all exceptions. This actually
+  // decreses ISR latency a little bit because it doesn't have to stack the
+  // registers for the first one.
+  SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
+
+  // This seems like the perfect place to use WFI, but Brian on 2013-12-13
+  // couldn't find anything verifying that WFI doesn't increase the latency for
+  // the first interrupt handled, and we should never actually get here anyways,
+  // so it doesn't matter.
+  while (1) {}
+}
diff --git a/bbb_cape/src/cape/main.ld b/bbb_cape/src/cape/main.ld
new file mode 100644
index 0000000..058c2eb
--- /dev/null
+++ b/bbb_cape/src/cape/main.ld
@@ -0,0 +1,14 @@
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 16k, LENGTH = 1024k - 16k
+  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 128k
+}
+
+SECTIONS
+{
+	.text :
+	{
+		/* make sure this stays at the beginning of FLASH */
+		KEEP(*(Reset_Handler))
+	} > FLASH
+}
diff --git a/bbb_cape/src/cape/main_test.ld b/bbb_cape/src/cape/main_test.ld
new file mode 120000
index 0000000..af355cc
--- /dev/null
+++ b/bbb_cape/src/cape/main_test.ld
@@ -0,0 +1 @@
+main.ld
\ No newline at end of file
diff --git a/bbb_cape/src/cape/peripherial_usage.notes b/bbb_cape/src/cape/peripherial_usage.notes
new file mode 100644
index 0000000..22e41ee
--- /dev/null
+++ b/bbb_cape/src/cape/peripherial_usage.notes
@@ -0,0 +1,55 @@
+This file documents what code is using which peripherial(s), priorities when
+applicable, and which file(s) the code is in. The purpose is to make assigning
+priorities to everything else easier because the relative priorities of
+everything is what matters; the absolute priority is meaningless. It also helps
+with choosing things like timers.
+
+[BBB communication]
+uart_common
+  USART1
+uart
+  USART1_IRQ:3
+uart_dma
+  DMA2.7:2
+  DMA2.7_IRQ:8
+uart_byte
+  TIM7
+
+[gyro communication]
+gyro
+  SPI3
+  SPI3_IRQ:4
+  TIM13
+  TIM13_IRQ:5 (aka TIM8_UP)
+
+[ADC communication]
+analog
+  SPI2
+  SPI2_IRQ:6
+  TIM14
+  TIM14_IRQ:6 (aka TIM8_TRG_COM)
+
+[encoders]
+encoder
+  TIM2,TIM3,TIM4,TIM5,TIM8
+  EXTI0,EXTI1,EXTI3
+  EXTI0_IRQ:0,EXTI1_IRQ:0,EXTI3_IRQ:0
+  TIM9 (for its input capture 1)
+  TIM9_IRQ:0 (aka TIM1_BRK)
+  TIM1 (for its input capture 1)
+  TIM1_CC_IRQ:0
+  TIM3 (for its input capture 3)
+  TIM3_IRQ:0
+
+[digital inputs]
+digital
+  EXTI2,EXTI4-15
+  EXTI2_IRQ:1,EXTI4-15_IRQ:1
+
+[sensor packet sending]
+fill_packet
+  TIM6
+
+[utilities]
+crc
+  CRC
diff --git a/bbb_cape/src/cape/robot.h b/bbb_cape/src/cape/robot.h
new file mode 100644
index 0000000..02da3e2
--- /dev/null
+++ b/bbb_cape/src/cape/robot.h
@@ -0,0 +1,11 @@
+#ifndef CAPE_ROBOT_H_
+#define CAPE_ROBOT_H_
+
+// This header file is for the robot-specific files which should be named
+// robot_name.c. It documents what functions each robot should implement.
+
+#include "cape/fill_packet.h"
+
+void robot_fill_packet(struct DataStruct *packet);
+
+#endif  // CAPE_ROBOT_H_
diff --git a/bbb_cape/src/cape/robot_test.c b/bbb_cape/src/cape/robot_test.c
new file mode 100644
index 0000000..f329790
--- /dev/null
+++ b/bbb_cape/src/cape/robot_test.c
@@ -0,0 +1,51 @@
+#include "cape/robot.h"
+
+#include "cape/encoder.h"
+#include "cape/analog.h"
+#include "cape/digital.h"
+
+#define CAPTURE_NUM 11
+
+#define CAPTURE(num, np) digital_capture_ ## num ## np
+#define CAPTURE2(num, np) CAPTURE(num, np)
+#define CAPTURE_P CAPTURE2(CAPTURE_NUM, P)
+#define CAPTURE_N CAPTURE2(CAPTURE_NUM, N)
+
+static int32_t posedge_value, negedge_value;
+static uint8_t posedge_count = 0, negedge_count = 0;
+
+void CAPTURE_P(void) {
+  ++posedge_count;
+  posedge_value = encoder_read(1);
+}
+void CAPTURE_N(void) {
+  ++negedge_count;
+  negedge_value = encoder_read(1);
+}
+
+void robot_fill_packet(struct DataStruct *packet) {
+  packet->test.encoders[0] = encoder_read(0);
+  packet->test.encoders[1] = encoder_read(1);
+  packet->test.encoders[2] = encoder_read(2);
+  packet->test.encoders[3] = encoder_read(3);
+  packet->test.encoders[4] = encoder_read(4);
+  packet->test.encoders[5] = encoder_read(5);
+  packet->test.encoders[6] = encoder_read(6);
+  packet->test.encoders[7] = encoder_read(7);
+
+  for (int i = 0; i < 8; ++i) {
+    packet->test.analogs[i] = analog_get(i);
+  }
+
+  packet->test.digitals = 0;
+  for (int i = 0; i < 12; ++i) {
+    SET_BITS(packet->test.digitals, 1, digital_read(i), i);
+  }
+
+  digital_capture_disable(CAPTURE_NUM);
+  packet->test.posedge_count = posedge_count;
+  packet->test.posedge_value = posedge_value;
+  packet->test.negedge_count = negedge_count;
+  packet->test.negedge_value = negedge_value;
+  digital_capture_enable(CAPTURE_NUM);
+}
diff --git a/bbb_cape/src/cape/startup.notes b/bbb_cape/src/cape/startup.notes
new file mode 100644
index 0000000..eac1b35
--- /dev/null
+++ b/bbb_cape/src/cape/startup.notes
@@ -0,0 +1,23 @@
+This file describes the processor startup process.
+
+The basic idea is that the bootloader and main code each have their own
+exception handler tables and code. The bootloader's code lives at the bottom
+of flash and the main code is in the rest of it. They both use the same startup
+code (STM32F2XX_startup.S, which deals with copying .data etc into RAM and
+zeroing RAM for .bss etc. This same file also defines the layout of the
+exception table (full of weak symbols). Although they both use the same startup
+code, it gets put into different places by the different linker scripts. The
+main code's exception table is in .data so it gets copied into RAM before being
+used to avoid waiting for flash reads to handle interrupts, but the bootloader's
+just gets put in flash because it has to be there (at address 0) and it doesn't
+care about interrupt performance.
+
+The bootloader code has its exception table starting at address 0, which is
+where the processor goes to start. The processor sets the stack pointer to the
+1st entry in the table and then jumps to the 2nd (the reset handler). Our
+bootloader then checks if it should pass through to the main code. If it does
+that, it then uses the same kind of interface to the main code's startup file.
+The main code's exception table lives in RAM, so the bootloader just uses the
+stack pointer and reset handler values that it knows because they're always the
+same (stack pointer to the top of RAM and reset handler at the beginning of
+the main code's flash).
diff --git a/bbb_cape/src/cape/toolchain-build-notes.txt b/bbb_cape/src/cape/toolchain-build-notes.txt
new file mode 100644
index 0000000..d81c905
--- /dev/null
+++ b/bbb_cape/src/cape/toolchain-build-notes.txt
@@ -0,0 +1,23 @@
+These are Brian's notes from building a toolchain on 2013-03-29.
+It compiles the code successfully and lives in /opt/cortex-m3.
+The flags are from logic, Austin's gcc, and
+  <http://www.coactionos.com/getting-started/43-building-and-installing-a-cortex-m3-compiler-on-ubuntu.html>
+  (for some of the newlib flags).
+This has been uploaded to our package repository for wheezy as arm-eabi-gcc.
+
+binutils
+	../binutils-2.23.2/configure --prefix=/opt/cortex-m3 --target=arm-eabi
+	make -j6
+	make install
+gcc
+	Symlinked in gmp-4.3.2, mpc-0.8.1, and mpfr-2.4.2 first.
+	../gcc-4.5.4/configure --target=arm-eabi --prefix=/opt/cortex-m3 --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newlib --with-headers --disable-shared --with-gnu-as --with-gnu-ld --with-cpu-cortex-m3 --disable-shared --with-float=soft --with-cpu=cortex-m3 --with-tune=cortex-m3 --disable-libmudflap --disable-libgomp --with-mode=thumb
+	make -j6 all-gcc
+	sudo make install-gcc
+newlib
+	../newlib-1.20.0/configure --target=arm-eabi --prefix=/opt/cortex-m3 --enable-interwork --enable-multilib --enable-languages=c,c++ --with-headers --disable-shared --with-gnu-as --with-gnu-ld --with-cpu-cortex-m3 --disable-shared --with-float=soft --with-cpu=cortex-m3 --with-tune=cortex-m3 --disable-libmudflap --disable-libgomp --with-mode=thumb --disable-werror --disable-newlib-supplied-syscalls --disable-nls --enable-target-optspace --disable-libssp --enable-newlib-reent-small --enable-newlib-multithread --disable-libgloss
+	make CFLAGS_FOR_TARGET="-D__IEEE_BIG_ENDIAN -D__IEEE_BYTES_LITTLE_ENDIAN -D__BUFSIZ__=128"
+	sudo make install
+gcc
+	make -j6
+	sudo make install
diff --git a/bbb_cape/src/cape/uart.c b/bbb_cape/src/cape/uart.c
new file mode 100644
index 0000000..63620ab
--- /dev/null
+++ b/bbb_cape/src/cape/uart.c
@@ -0,0 +1,66 @@
+#include "cape/uart.h"
+#include "cape/uart_common_private.h"
+
+#include "cape/util.h"
+#include "cape/uart_common.h"
+
+// TODO(brians): Add error checking.
+
+static void default_callback(int bytes) {}
+
+void uart_transmit_callback(int bytes_transmitted) ALIAS_WEAK(default_callback);
+void uart_receive_callback(int bytes_received) ALIAS_WEAK(default_callback);
+
+static int transmit_bytes, receive_bytes;
+// These actually contain 1 less than the indicated number to make the common
+// path through the ISR faster.
+static int transmitted_bytes, received_bytes;
+static uint8_t *transmit_data, *receive_data;
+
+// Enable the transmitter and interrupt when we can write.
+static const uint32_t kTransmitBits = USART_CR1_TE | USART_CR1_TXEIE;
+// Enable the receive and interrupt when there's data to read.
+static const uint32_t kReceiveBits = USART_CR1_RE | USART_CR1_RXNEIE;
+
+void USART1_IRQHandler(void) {
+  uint32_t status = UART->SR;
+  if (status & USART_SR_TXE) {
+    if ((transmitted_bytes + 1) < transmit_bytes) {
+      UART->DR = transmit_data[++transmitted_bytes];
+    } else {
+      // Get another interrupt when it's done writing that last byte.
+      UART->CR1 = (UART->CR1 & ~USART_CR1_TXEIE) | USART_CR1_TCIE;
+    }
+  } else if (status & USART_SR_RXNE) {
+    receive_data[++received_bytes] = UART->DR;
+    if ((received_bytes + 1) >= receive_bytes) {
+      UART->CR1 &= ~kReceiveBits;
+      uart_receive_callback(receive_bytes);
+    }
+  } else if (status & USART_SR_TC) {
+      UART->CR1 &= ~(USART_CR1_TCIE | USART_CR1_TE);
+      uart_transmit_callback(transmit_bytes);
+  }
+}
+
+void uart_configure(void) {
+  NVIC_SetPriority(USART1_IRQn, 3);
+  NVIC_EnableIRQ(USART1_IRQn);
+}
+
+void uart_transmit(int bytes, uint8_t *data) {
+  transmit_bytes = bytes;
+  transmitted_bytes = 0;
+  transmit_data = data;
+  compiler_memory_barrier();
+  UART->CR1 |= kTransmitBits;
+  UART->DR = data[0];
+}
+
+void uart_receive(int bytes, uint8_t *data) {
+  receive_bytes = bytes;
+  received_bytes = -1;
+  receive_data = data;
+  compiler_memory_barrier();
+  UART->CR1 |= kReceiveBits;
+}
diff --git a/bbb_cape/src/cape/uart.h b/bbb_cape/src/cape/uart.h
new file mode 100644
index 0000000..fd43c99
--- /dev/null
+++ b/bbb_cape/src/cape/uart.h
@@ -0,0 +1,22 @@
+#ifndef CAPE_UART_H_
+#define CAPE_UART_H_
+
+#include <stdint.h>
+
+// This file deals with USART1. It sends bytes from a buffer or receives bytes
+// into a buffer and then calls a callback function.
+
+// uart_common_configure must be called before this.
+void uart_configure(void);
+
+// Callbacks to be implemented by the user.
+// Implemented as weak symbols that do nothing by default.
+// The argument is the number of bytes transmitted or received. It will be less
+// than the requested number if there was an error.
+void uart_transmit_callback(int bytes_transmitted);
+void uart_receive_callback(int bytes_received);
+
+void uart_transmit(int bytes, uint8_t *data);
+void uart_receive(int bytes, uint8_t *data);
+
+#endif  // CAPE_UART_H_
diff --git a/bbb_cape/src/cape/uart_byte.c b/bbb_cape/src/cape/uart_byte.c
new file mode 100644
index 0000000..cfcf1bf
--- /dev/null
+++ b/bbb_cape/src/cape/uart_byte.c
@@ -0,0 +1,34 @@
+#include "cape/uart_byte.h"
+#include "cape/uart_common_private.h"
+
+#include <STM32F2XX.h>
+
+#define TIMEOUT_TIM TIM7
+#define RCC_APB1ENR_TIMEOUT_TIMEN RCC_APB1ENR_TIM7EN
+
+void uart_byte_configure(void) {
+  RCC->APB1ENR |= RCC_APB1ENR_TIMEOUT_TIMEN;
+
+  TIMEOUT_TIM->CR1 = 0;
+}
+
+int uart_byte_receive(uint16_t timeout_count, uint16_t timeout_divider) {
+  TIMEOUT_TIM->PSC = timeout_divider;
+  TIMEOUT_TIM->EGR = TIM_EGR_UG;
+  TIMEOUT_TIM->CR1 |= TIM_CR1_CEN;
+
+  while ((UART->SR & USART_SR_RXNE) == 0) {
+    if (TIMEOUT_TIM->CNT >= timeout_count) {
+      TIMEOUT_TIM->CR1 &= ~TIM_CR1_CEN;
+      return -1;
+    }
+  }
+
+  TIMEOUT_TIM->CR1 &= ~TIM_CR1_CEN;
+  return UART->DR;
+}
+
+void uart_byte_send(uint8_t value) {
+  while ((UART->SR & USART_SR_TXE) == 0) {}
+  UART->DR = value;
+}
diff --git a/bbb_cape/src/cape/uart_byte.h b/bbb_cape/src/cape/uart_byte.h
new file mode 100644
index 0000000..e037e36
--- /dev/null
+++ b/bbb_cape/src/cape/uart_byte.h
@@ -0,0 +1,17 @@
+#ifndef CAPE_UART_BYTE_H_
+#define CAPE_UART_BYTE_H_
+
+#include <stdint.h>
+
+// uart_common_configure must be called before this.
+void uart_byte_configure(void);
+
+// Spins until 1 byte is received or some amount of time. The timeout is
+// timeout_count*(timeout_divider+1)/60MHz.
+// The result is <0 for timeout or the received byte.
+int uart_byte_receive(uint16_t timeout_count, uint16_t timeout_divider);
+
+// Spins until 1 byte can be written out.
+void uart_byte_send(uint8_t value);
+
+#endif  // CAPE_UART_BYTE_H_
diff --git a/bbb_cape/src/cape/uart_common.c b/bbb_cape/src/cape/uart_common.c
new file mode 100644
index 0000000..03d4cdd
--- /dev/null
+++ b/bbb_cape/src/cape/uart_common.c
@@ -0,0 +1,31 @@
+#include "cape/uart_common.h"
+#include "cape/uart_common_private.h"
+
+#include "cape/util.h"
+
+#define RCC_APB2ENR_UARTEN RCC_APB2ENR_USART1EN
+
+#define FPCLK 60000000
+
+// The UART is on PA9 and PA10.
+void uart_common_configure(int baud) {
+  gpio_setup_alt(GPIOA, 9, 7);
+  gpio_setup_alt(GPIOA, 10, 7);
+  RCC->APB2ENR |= RCC_APB2ENR_UARTEN;
+
+  // baud = 60MHz / kMultiplier * (whole_part + fraction / kMultiplier))
+  static const int kMultiplier = 16 /* 8 * (2 - OVER8) */;
+  // The divisor of FPCLK that we want (*2).
+  int divisor = FPCLK * 2 / baud;
+  // The whole-number part of the divisor.
+  int mantissa = divisor / kMultiplier / 2;
+  // The fractional part of the divisor (*2).
+  int fraction = divisor % (kMultiplier * 2);
+  UART->BRR = (mantissa << 4) | ((fraction + 1) / 2);
+  UART->CR1 =
+      //USART_CR1_M /* 9th bit for the parity */ |
+      //USART_CR1_PCE /* enable parity (even by default) */ |
+      //USART_CR1_OVER8 /* support going faster */ |
+      0;
+  UART->CR1 |= USART_CR1_UE;  // enable it
+}
diff --git a/bbb_cape/src/cape/uart_common.h b/bbb_cape/src/cape/uart_common.h
new file mode 100644
index 0000000..bb98a07
--- /dev/null
+++ b/bbb_cape/src/cape/uart_common.h
@@ -0,0 +1,11 @@
+#ifndef CAPE_UART_COMMON_H_
+#define CAPE_UART_COMMON_H_
+
+// Configures it for baud, 1 start bit, 1 stop bit, and 1 even parity bit.
+// baud must be between 57KHz and 3.75MHz. It must be something that the USART can
+// handle exactly (see
+// <http://www.st.com/web/en/resource/technical/document/reference_manual/CD00225773.pdf#page=633>
+// or so for choices (fPCLK = 60MHz, OVER8 = 0 for now)).
+void uart_common_configure(int baud);
+
+#endif  // CAPE_UART_COMMON_H_
diff --git a/bbb_cape/src/cape/uart_common_private.h b/bbb_cape/src/cape/uart_common_private.h
new file mode 100644
index 0000000..3836b29
--- /dev/null
+++ b/bbb_cape/src/cape/uart_common_private.h
@@ -0,0 +1,8 @@
+#ifndef CAPE_UART_COMMON_PRIVATE_H_
+#define CAPE_UART_COMMON_PRIVATE_H_
+
+#include <STM32F2XX.h>
+
+#define UART USART1
+
+#endif  // CAPE_UART_COMMON_PRIVATE_H_
diff --git a/bbb_cape/src/cape/uart_dma.c b/bbb_cape/src/cape/uart_dma.c
new file mode 100644
index 0000000..4a6ac92
--- /dev/null
+++ b/bbb_cape/src/cape/uart_dma.c
@@ -0,0 +1,76 @@
+#include "cape/uart_dma.h"
+#include "cape/uart_common_private.h"
+
+#include "cape/util.h"
+#include "cape/uart_common.h"
+#include "cape/led.h"
+
+#define DMA DMA2
+#define DMA_Stream DMA2_Stream7
+#define DMA_SR DMA2->HISR
+#define DMA_FCR DMA2->HIFCR
+#define DMA_Stream_IRQHandler DMA2_Stream7_IRQHandler
+#define DMA_Stream_IRQn DMA2_Stream7_IRQn
+#define DMA_CHANNEL_NUMBER 4
+#define RCC_AHB1ENR_DMAEN RCC_AHB1ENR_DMA2EN
+
+#define DMA_SR_SHIFT(value) ((value) << 22)
+#define DMA_SR_BIT(bit) DMA_SR_SHIFT(1 << (bit))
+
+void uart_dma_callback(uint8_t *new_buffer) __attribute__((weak));
+void uart_dma_callback(uint8_t *new_buffer) {}
+
+static uint8_t *volatile buffer1, *volatile buffer2;
+
+void DMA_Stream_IRQHandler(void) {
+  uint32_t status = DMA_SR;
+  if (status & DMA_SR_BIT(5)) {  // transfer completed
+    DMA_FCR = DMA_SR_BIT(5);
+    uart_dma_callback(((DMA_Stream->CR & DMA_SxCR_CT) == 0) ? buffer2
+                                                            : buffer1);
+  } else if (status & DMA_SR_BIT(3)) {  // transfer error
+    DMA_FCR = DMA_SR_BIT(3);
+    // Somebody probably wrote to the wrong buffer, which disables the DMA, so
+    // we now need to re-enable it.
+    // If we're fighting somebody else writing stuff, we'll do this a bunch of
+    // times, but oh well.
+    DMA_Stream->CR |= DMA_SxCR_EN;
+    led_set(LED_ERR, 1);
+  }
+}
+
+void uart_dma_configure(int bytes, uint8_t *buffer1_in, uint8_t *buffer2_in) {
+  buffer1 = buffer1_in;
+  buffer2 = buffer2_in;
+  uart_dma_callback(buffer1);
+
+  UART->CR3 = USART_CR3_DMAT;
+  UART->CR1 |= USART_CR1_TE;
+
+  RCC->AHB1ENR |= RCC_AHB1ENR_DMAEN;
+  DMA_Stream->CR = 0;
+  while (DMA_Stream->CR & DMA_SxCR_EN);  // make sure it's disabled
+  DMA_Stream->PAR = (uint32_t)&UART->DR;
+  DMA_Stream->M0AR = (uint32_t)buffer1;
+  DMA_Stream->M1AR = (uint32_t)buffer2;
+  // This is measured in chunks of PSIZE bytes, not MSIZE.
+  DMA_Stream->NDTR = bytes;
+  DMA_Stream->CR = DMA_CHANNEL_NUMBER << 25 |
+      DMA_SxCR_DBM /* enable double buffer mode */ |
+      2 << 16 /* priority */ |
+      2 << 13 /* memory data size = 32 bits */ |
+      0 << 11 /* peripherial data size = 8 bits */ |
+      DMA_SxCR_MINC /* increment memory address */ |
+      1 << 6 /* memory to peripherial */ |
+      DMA_SxCR_TCIE | DMA_SxCR_TEIE;
+  DMA_Stream->FCR =
+      DMA_SxFCR_DMDIS /* disable direct mode (enable the FIFO) */ |
+      1 /* 1/2 full threshold */;
+  UART->SR = ~USART_SR_TC;
+  DMA_FCR = DMA_SR_SHIFT(1 << 0 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5);
+  DMA_Stream->CR |= DMA_SxCR_EN;  // enable it
+  NVIC_SetPriority(DMA_Stream_IRQn, 8);
+  NVIC_EnableIRQ(DMA_Stream_IRQn);
+
+  uart_dma_callback(buffer2);
+}
diff --git a/bbb_cape/src/cape/uart_dma.h b/bbb_cape/src/cape/uart_dma.h
new file mode 100644
index 0000000..cc68eed
--- /dev/null
+++ b/bbb_cape/src/cape/uart_dma.h
@@ -0,0 +1,20 @@
+#ifndef CAPE_UART_DMA_H_
+#define CAPE_UART_DMA_H_
+
+#include <stdint.h>
+
+// This file deals with USART1 over DMA. It sets the DMA stream to double-buffer
+// mode and calls a function when it's time to fill a new buffer. It only
+// supports sending.
+
+// Callback to be implemented by the user.
+// Implemented as a weak symbol that does nothing by default.
+// new_buffer is the buffer that should be filled out to be written next.
+void uart_dma_callback(uint8_t *new_buffer);
+
+// uart_common_configure must be called before this.
+// bytes is the size off buffer1 and buffer2.
+// Calls uart_dma_callback twice (for each buffer) to get started.
+void uart_dma_configure(int bytes, uint8_t *buffer1, uint8_t *buffer2);
+
+#endif  // CAPE_UART_DMA_H_
diff --git a/bbb_cape/src/cape/util.c b/bbb_cape/src/cape/util.c
new file mode 100644
index 0000000..4f2d9e1
--- /dev/null
+++ b/bbb_cape/src/cape/util.c
@@ -0,0 +1,17 @@
+#include "cape/util.h"
+
+#include "cape/led.h"
+
+void led_write(uint32_t value, int bits) {
+  for (int i = -2; i < bits; ++i) {
+    led_set(LED_Z, i < 0);
+    for (int ii = 0; ii < 1000000; ++ii) {
+      led_set(LED_ERR, i >= 0 && ii < 500000);
+      if (i >= 0) {
+        led_set(LED_DB, value & (1 << i));
+      } else {
+        led_set(LED_DB, 0);
+      }
+    }
+  }
+}
diff --git a/bbb_cape/src/cape/util.h b/bbb_cape/src/cape/util.h
new file mode 100644
index 0000000..d19a7e9
--- /dev/null
+++ b/bbb_cape/src/cape/util.h
@@ -0,0 +1,76 @@
+#ifndef CAPE_UTIL_H_
+#define CAPE_UTIL_H_
+
+#include <stdint.h>
+
+#include <STM32F2XX.h>
+
+#define ALIAS_WEAK(f) __attribute__ ((weak, alias (#f)))
+
+// MSG has to be separated_with_spaces.
+#define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(!!(COND))*2-1]
+
+// Prevents the compiler from reordering memory operations around this.
+static inline void compiler_memory_barrier(void) {
+  __asm__ __volatile__("" ::: "memory");
+}
+
+// Count leading zeros.
+// Returns 0 if bit 31 is set etc.
+__attribute__((always_inline)) static __INLINE uint32_t __clz(uint32_t value) {
+  uint32_t result;
+  __asm__("clz %0, %1" : "=r" (result) : "r" (value));
+  return result;
+}
+
+// Sets number_of_bits (shifted left shift number of slots) to value in
+// variable.
+// This means that the total shift is number_bits*shift.
+#define SET_BITS(variable, number_bits, value, shift) do { \
+  variable = (((variable) & \
+               ~(((1 << (number_bits)) - 1) << (shift * (number_bits)))) | \
+              ((value) << (shift * (number_bits)))); \
+} while (0);
+
+// A convenient way to set up a GPIO pin for some alternate function without
+// missing part or messing up which bits need setting to what.
+// pin is the 0-indexed pin number.
+// afr is 0-0xF for the various alternate functions.
+static inline void gpio_setup_alt(GPIO_TypeDef *port, int pin, int afr) {
+  SET_BITS(port->MODER, 2, 2 /* alternate function */, pin);
+  if (pin < 8) {
+    SET_BITS(port->AFR[0], 4, afr, pin);
+  } else {
+    SET_BITS(port->AFR[1], 4, afr, (pin - 8));
+  }
+}
+
+// A convenient way to set up a GPIO pin for output (push-pull) without missing
+// part or messing up which bits need setting to what.
+// speed is 0 (slow) to 3 (fast)
+static inline void gpio_setup_out(GPIO_TypeDef *port, int pin, int speed) {
+  SET_BITS(port->MODER, 2, 1 /* output */, pin);
+  SET_BITS(port->OSPEEDR, 2, speed, pin);
+}
+
+static inline void gpio_setup_in(GPIO_TypeDef *port, int pin) {
+  SET_BITS(port->MODER, 2, 0 /* input */, pin);
+}
+
+// exti is which EXTI line to set
+// port is 0 for A, 1 for B, etc
+static inline void EXTI_set(int exti, int port) {
+  SET_BITS(SYSCFG->EXTICR[exti / 4], 4, port, exti % 4);
+}
+
+static inline void gpio_on(GPIO_TypeDef *port, int pin) {
+  port->BSRRL = 1 << pin;
+}
+
+static inline void gpio_off(GPIO_TypeDef *port, int pin) {
+  port->BSRRH = 1 << pin;
+}
+
+void led_write(uint32_t value, int bits);
+
+#endif  // CAPE_UTIL_H_
diff --git a/bbb_cape/src/flasher/.gitignore b/bbb_cape/src/flasher/.gitignore
new file mode 100644
index 0000000..0c665e0
--- /dev/null
+++ b/bbb_cape/src/flasher/.gitignore
@@ -0,0 +1 @@
+stm32flash/
diff --git a/bbb_cape/src/flasher/0001-fixed-the-page-by-page-erase-logic.patch b/bbb_cape/src/flasher/0001-fixed-the-page-by-page-erase-logic.patch
new file mode 100644
index 0000000..c119655
--- /dev/null
+++ b/bbb_cape/src/flasher/0001-fixed-the-page-by-page-erase-logic.patch
@@ -0,0 +1,37 @@
+From 3076652b98d4d33ac50eb546839a47980464c34d Mon Sep 17 00:00:00 2001
+From: Brian <brian@localhost>
+Date: Wed, 1 Jan 2014 16:21:50 -0800
+Subject: [PATCH] fixed the page-by-page erase logic
+
+Previously, it always started at page 0 and erased 1 more page than it
+was told to with bootloaders that support the extended erase command.
+---
+ stm32.c |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/stm32.c b/stm32.c
+index f724722..dee7959 100644
+--- a/stm32.c
++++ b/stm32.c
+@@ -430,14 +430,14 @@ char stm32_erase_memory(const stm32_t *stm, uint8_t spage, uint8_t pages) {
+ 		uint8_t pg_byte;
+  		uint8_t cs = 0;
+  
+-		pg_byte = pages >> 8;
+-		stm32_send_byte(stm, pg_byte); // Number of pages to be erased, two bytes, MSB first
++		pg_byte = (pages - 1) >> 8;
++		stm32_send_byte(stm, pg_byte); // Number of pages to be erased - 1, two bytes, MSB first
+ 		cs ^= pg_byte;
+-		pg_byte = pages & 0xFF;
++		pg_byte = (pages - 1) & 0xFF;
+ 		stm32_send_byte(stm, pg_byte);
+ 		cs ^= pg_byte;
+  
+- 		for (pg_num = 0; pg_num <= pages; pg_num++) {
++		for (pg_num = spage; pg_num < spage + pages; pg_num++) {
+  			pg_byte = pg_num >> 8;
+  			cs ^= pg_byte;
+  			stm32_send_byte(stm, pg_byte);
+-- 
+1.7.10.4
+
diff --git a/bbb_cape/src/flasher/build.sh b/bbb_cape/src/flasher/build.sh
new file mode 100755
index 0000000..3c26bc3
--- /dev/null
+++ b/bbb_cape/src/flasher/build.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+set -e
+
+cd $(dirname $0)
+
+[[ -d stm32flash ]] || ( git clone https://git.gitorious.org/stm32flash/stm32flash.git stm32flash &&
+	cd stm32flash && git checkout 5b0e391c539e906df7b97f0b457875d90883ea8e && patch -p1 < ../0001-fixed-the-page-by-page-erase-logic.patch )
+
+# TODO(brians): This breaks the build of the main code. Figure out something
+# better for this stuff.
+
+../../../aos/build/build.sh atom flasher.gyp no "$@"
diff --git a/bbb_cape/src/flasher/flasher.gyp b/bbb_cape/src/flasher/flasher.gyp
new file mode 100644
index 0000000..c9e190e
--- /dev/null
+++ b/bbb_cape/src/flasher/flasher.gyp
@@ -0,0 +1,37 @@
+{
+  'targets': [
+    {
+      'target_name': 'All',
+      'type': 'none',
+      'dependencies': [
+        'stm32_flasher',
+      ],
+    },
+    {
+      'target_name': 'stm32_flasher',
+      'type': 'executable',
+      'sources': [
+        'stm32_flasher.cc',
+      ],
+      'dependencies': [
+        'stm32flash',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+    },
+    {
+      'target_name': 'stm32flash',
+      'type': 'static_library',
+      'sources': [
+        'stm32flash/init.c',
+        'stm32flash/parsers/hex.c',
+        'stm32flash/serial_common.c',
+        'stm32flash/serial_platform.c',
+        'stm32flash/utils.c',
+        'stm32flash/stm32.c',
+      ],
+      'cflags': [
+        '-Wno-error',
+      ],
+    },
+  ],
+}
diff --git a/bbb_cape/src/flasher/stm32_flasher.cc b/bbb_cape/src/flasher/stm32_flasher.cc
new file mode 100644
index 0000000..ddddb1b
--- /dev/null
+++ b/bbb_cape/src/flasher/stm32_flasher.cc
@@ -0,0 +1,213 @@
+#include <libgen.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <string>
+
+#include "aos/common/logging/logging.h"
+#include "aos/common/logging/logging_impl.h"
+
+extern "C" {
+#include "stm32flash/parsers/parser.h"
+#include "stm32flash/parsers/hex.h"
+#include "stm32flash/serial.h"
+#include "stm32flash/stm32.h"
+#include "stm32flash/init.h"
+}
+
+int main(int argc, char **argv) {
+  ::aos::logging::Init();
+  ::aos::logging::AddImplementation(
+      new ::aos::logging::StreamLogImplementation(stdout));
+
+  if (argc < 2) {
+    fputs("Need an argument saying which target to download.\n", stderr);
+    return 1;
+  }
+  ::std::string target = argv[1];
+
+  //::std::string device = "/dev/ttyUSB0";
+  // TODO(brians): Figure out an intelligent way to set the device to use.
+  ::std::string device = "/dev/ttyO1";
+  serial_baud_t baud_rate = SERIAL_BAUD_57600;
+
+  ::std::string filename =
+      ::std::string(dirname(strdup(argv[0]))) +
+      "/../../../bbb_cape/src/cape/.obj/" + target + ".hex";
+
+  int file = open(filename.c_str(), O_RDONLY);
+  if (file == -1) {
+    filename = target;
+    file = open(filename.c_str(), O_RDONLY);
+    if (file == -1) {
+      LOG(FATAL, "open(%s, O_RDONLY) failed with %d: %s\n",
+          filename.c_str(), errno, strerror(errno));
+    } else {
+      LOG(INFO, "using filename %s from the command line\n", filename.c_str());
+    }
+  }
+
+  uint16_t start_address = 0;
+  {
+    uint8_t buffer[1 /* : */ + 2 /* record size */ + 4 /* address */ +
+        2 /* record type */];
+    ssize_t bytes = read(file, buffer, sizeof(buffer));
+    if (close(file) == -1) {
+      LOG(FATAL, "close(%d) failed with %d: %s\n",
+          file, errno, strerror(errno));
+    }
+    if (bytes != sizeof(buffer)) {
+      LOG(FATAL, "read %zd bytes from %s instead of %zu\n",
+          bytes, filename.c_str(), sizeof(buffer));
+    }
+    if (buffer[0] != ':' || buffer[7] != '0' || buffer[8] != '0') {
+      LOG(FATAL, "%s isn't a valid hex file that we know how to handle\n",
+          filename.c_str());
+    }
+    for (int i = 0; i < 4; ++i) {
+      uint8_t digit = buffer[3 + i];
+      int value;
+      if (digit >= '0' && digit <= '9') {
+        value = digit - '0';
+      } else if (digit >= 'a' && digit <= 'f') {
+        value = digit - 'a';
+      } else if (digit >= 'A' && digit <= 'F') {
+        value = digit - 'A';
+      } else {
+        LOG(FATAL, "unknown hex digit %c\n", digit);
+      }
+      start_address |= value << (12 - (4 * i));
+    }
+    LOG(INFO, "start address = 0x%x\n", start_address);
+  }
+
+  parser_t *parser = &PARSER_HEX;
+  void *p_st = parser->init();
+  if (p_st == NULL) {
+    LOG(FATAL, "%s parser failed to initialize.\n", parser->name);
+  }
+  if (parser->open(p_st, filename.c_str(), 0) != PARSER_ERR_OK) {
+    LOG(FATAL, "opening file %s failed\n", filename.c_str());
+  }
+
+  serial_t *serial = serial_open(device.c_str());
+  if (serial == NULL) {
+    LOG(FATAL, "failed to open serial port %s because of %d: %s\n",
+        device.c_str(), errno, strerror(errno));
+  }
+  if (serial_setup(serial, baud_rate,
+                   SERIAL_BITS_8,
+                   SERIAL_PARITY_EVEN,
+                   SERIAL_STOPBIT_1) != SERIAL_ERR_OK) {
+    LOG(FATAL, "setting up serial port %s failed because of %d: %s\n",
+        device.c_str(), errno, strerror(errno));
+  }
+  LOG(INFO, "serial configuration: %s\n", serial_get_setup_str(serial));
+
+  if (init_bl_entry(serial, NULL /* GPIO sequence */) == 0) {
+    LOG(FATAL, "init_bl_entry(%p, NULL) failed\n", serial);
+  }
+  stm32_t *stm = stm32_init(serial, true);
+  if (stm == NULL) {
+    LOG(FATAL, "stm32_init(%p, true) failed\n", serial);
+  }
+
+  unsigned int last_byte = parser->size(p_st);
+  unsigned int size = last_byte - start_address;
+
+  // An array of the sizes of each sector.
+  static const uint32_t kSectorSizes[12] = {0x4000, 0x4000, 0x4000, 0x4000,
+                                            0x10000, 0x20000, 0x20000, 0x20000,
+                                            0x20000, 0x20000, 0x20000, 0x20000};
+  static const int kNumSectors = sizeof(kSectorSizes) / sizeof(kSectorSizes[0]);
+  // The sector number that we're going to start writing at.
+  int start_sector = 0;
+  for (uint32_t address = 0; start_sector <= kNumSectors;
+       address += kSectorSizes[start_sector++]) {
+    if (start_sector == kNumSectors) {
+      LOG(FATAL, "start address %x is too big\n", start_address);
+    }
+    if (address > start_address) {
+      LOG(FATAL, "start address %x is not on a sector boundary\n",
+          start_address);
+    }
+    if (address == start_address) break;
+  }
+
+  // The first sector that we're not going to erase.
+  int end_sector = 0;
+  for (uint32_t address = 0; end_sector <= kNumSectors;
+       address += kSectorSizes[end_sector++]) {
+    if (address > start_address + size) break;
+    if (end_sector == kNumSectors) {
+      LOG(FATAL, "%x bytes beyond start address of %x is too big\n",
+          size, start_address);
+    }
+  }
+
+  if (!stm32_erase_memory(stm, start_sector, end_sector - start_sector)) {
+    LOG(FATAL, "failed to erase memory\n");
+  }
+
+  // Read all of the 0xFFs that the parser inserts to pad the data out.
+  {
+    uint8_t garbage[1024];
+    uint32_t length = start_address;
+    while (length > 0) {
+      uint32_t read = ::std::min(sizeof(garbage), length);
+      if (parser->read(p_st, garbage, &read) != PARSER_ERR_OK) {
+        LOG(FATAL, "reading 0xFFs from the hex parser failed\n");
+      }
+      length -= read;
+    }
+  }
+
+  uint32_t kFlashStart = 0x08000000;
+
+  uint8_t buffer[256];  // 256 is the biggest size supported
+  uint32_t completed = 0;
+  while (completed < size) {
+    uint32_t address = start_address + completed + kFlashStart;
+    uint32_t length = ::std::min(size - completed, sizeof(buffer));
+    if (parser->read(p_st, buffer, &length) != PARSER_ERR_OK) {
+      LOG(FATAL, "reading file failed\n");
+    }
+    if (length == 0) {
+      LOG(FATAL, "failed to read input file\n");
+    }
+    if ((length % 4) != 0) {
+      // Pad the size we want to write to a multiple of 4 bytes.
+      for (unsigned int i = 0; i < (4 - (length % 4)); ++i) {
+        buffer[length++] = 0xFF;
+      }
+    }
+    if (!stm32_write_memory(stm, address, buffer, length)) {
+      LOG(FATAL, "failed to write memory at address 0x%x\n", address);
+    }
+    uint8_t compare_buffer[sizeof(buffer)];
+    if (!stm32_read_memory(stm, address, compare_buffer, length)) {
+      LOG(FATAL, "failed to read memory at address 0x%x\n", address);
+    }
+    if (memcmp(buffer, compare_buffer, length) != 0) {
+      printf("\n");
+      for (size_t i = 0; i < length; ++i) {
+        LOG(DEBUG, "want %x have %x\n", buffer[i], compare_buffer[i]);
+      }
+      LOG(FATAL, "verify from 0x%x to 0x%x failed\n",
+          address, address + length);
+    }
+    completed += length;
+    printf("\rWrote and verified 0x%08x/0x%08x",
+           completed, size);
+    fflush(stdout);
+  }
+  printf("\n");
+
+  if (init_bl_exit(stm, serial, NULL /* GPIO sequence */)) {
+    LOG(INFO, "all done\n");
+  } else {
+    LOG(FATAL, "init_bl_exit failed\n");
+  }
+}
diff --git a/doc/building-the-code.txt b/doc/building-the-code.txt
index 2d68389..14a739c 100644
--- a/doc/building-the-code.txt
+++ b/doc/building-the-code.txt
@@ -1,12 +1,15 @@
 This file contains instructions on how to set up a computer to build the code.
 
+[OS]
+Most of these instructions assume 64 bit Debian Squeeze.
+
 [Install Packages]
 First, you have to download and follow the directions in
   <http://robotics.mvla.net/files/frc971/packages/frc971.list>.
 You also have to follow the directions at
   <http://backports-master.debian.org/Instructions/>.
 Then, run `apt-get install subversion git g++-multilib gcc-multilib ruby patch \
-    make openjdk-6-jdk lib32event-dev`
+    make openjdk-6-jdk lib32event-dev python unzip bzip2 default-jdk`
   and `apt-get install -t squeeze-backports swig` (package lists correct for
   amd64 Squeeze; you might be able to get it to build on other
   versions/platforms/distributions (Ubuntu, Mint, ...) if you can find the
@@ -17,9 +20,14 @@
       libevent-extra-2.0-5 libevent-pthreads-2.0-5 libevent-openssl-2.0-5 \
       libevent-dev lib32event-extra-2.0-5 lib32event-pthreads-2.0-5 \
       lib32event-openssl-2.0-5 lib32event-dev" packages.
-Also run `apt-get install powerpc-wrs-vxworks` if you want to be able to build
-  the cRIO code too.
-  NOTE: That is in *addition* to the above command.
+
+(On 64-bit Ubuntu Precise Pangolin:
+`apt-get install subversion git g++-multilib gcc-multilib ruby patch \
+    make openjdk-6-jdk default-jdk libevent-dev:i386 libevent-2.0-5:i386`)
+
+Also run `apt-get install powerpc-wrs-vxworks tcl` if you want to be able to
+  build the cRIO code too.
+  NOTE: This is in *addition* to the above commands.
   You will have to accept the
     "WARNING: The following packages cannot be authenticated!" warning for the
     "powerpc-wrs-vxworks" package.
diff --git a/doc/codereview-directions.txt b/doc/codereview-directions.txt
new file mode 100644
index 0000000..4610c95
--- /dev/null
+++ b/doc/codereview-directions.txt
@@ -0,0 +1,56 @@
+This file has some general information about how 971 does code reviews.
+
+We use Rietveld (<https://code.google.com/p/rietveld>) running in an app engine
+  app of ours. It is at <http://971code.appspot.com/>.
+
+[General Procedure]
+We try to code review all code before it gets checked in to svn. Code reviews
+  are also sometimes useful for getting feedback about documentation etc.
+First, somebody starts a code review and sends out emails to people asking them
+  to look. Then, other people look at it and make suggestions (in the form of
+  comments). The person who started the review (the owner of it) looks at the
+  comments and responds to them and/or changes their code and uploads new
+  versions for everybody to look at. Once all of the reviewers approve the code,
+  the owner checks it in and closes the code review (issue).
+
+[Reviewing]
+This is the section for people who have received emails about reviewing code
+  should look.
+The email that you receive will have a link to the issue (like
+  <http://971code.appspot.com/82001/>). Click on it to go to the issue page.
+  The most useful form of diff are the "Side-by-side diffs". Click the "View"
+  link in that column next to each file to look at it. After the first set of
+  comments, the "Delta from patch set" links are also helpful to see what got
+  changed so that you don't have to look at everything again. While looking at
+  a diff, double-click on any line of code to leave a comment there. You can
+  also reply to existing comments. The web interface sometimes hides comments
+  right after you create/edit them. Refresh the page to fix that (don't just do
+  it again, or you'll end up with 2 identical comments). Once you are done
+  looking at all of the files and making comments, click the
+  "Publish+Mail Comments" link (at the top of each diff or on the left of the
+  main issue page) to send out your comments. You can also put general notes in
+  the "Message" box. If you think that it looks good, then put "LGTM" at the top
+  of the message. The owner of the code review will keep looking at your
+  comments, making changes, and sending out more messages until it's finished.
+
+[Starting a Review]
+To begin, log in to <http://971code.appspot.com/> then click the "Create Issue"
+  link. Download the "upload.py" script and use that, not the web form, for
+  uploading a diff. (The web form has too many problems and is unusable with
+  git.) The script will find svn, git, or hg diffs in your current directory. If
+  you want the diff to cover back to an earlier change number, use the --rev
+  arg.
+
+  You don't need to give it a -s (--server) arg since the right default server
+  address is in the script. You can give it a -e (--email) arg with your gmail
+  address or let it ask you. (If you use 2-factor login for gmail, which I
+  recommend, you'll need to create an application-specific password instead of
+  using your regular password + OTP code.)
+
+  After it uploads, you can review the diffs on the web page. You can change
+  code and upload another diff. When ready, use the web UI to send the code
+  review email. Don't delete the old diffs; they are helpful for reviewers to
+  figure out what changed.
+
+For more information about using Rietveld, see
+  <https://code.google.com/p/rietveld/wiki/CodeReviewHelp>.
diff --git a/doc/git-setup.txt b/doc/git-setup.txt
index ad44cb5..d0fd0af 100644
--- a/doc/git-setup.txt
+++ b/doc/git-setup.txt
@@ -1,34 +1,71 @@
-Some us are using git for managing quickly changing code. This file has
-  directions/notes for setting that up.
+Some of us are using git for managing quickly changing code. This file has
+notes for setting that up.
+
+ssh to robotics.mvla.net and add the git executables to your .bashrc:
+  PATH=$PATH:/www/https/files/frc971/2013/brian/
 
 [Cloning]
 `git clone \
-    ssh://username@robotics.mvla.net/www/https/git/frc971/somebody/2013.git`
-  where username is your login on the server and somebody is whoever's git
+    ssh://USERNAME@robotics.mvla.net/www/https/git/frc971/SOMEBODY/2013.git`
+  where USERNAME is your login on the server and SOMEBODY is whoever's git
   repo you want to clone
+If you don't have a login on the server, then cloning
+  https://robotics.mvla.net/git/frc971/somebody/2013.git instead should work
+  (with your SVN username and password). However, that form of URL is read-
+  only. In order for this to work, you have to either set the environment
+  variable GIT_SSL_NO_VERIFY to 1 or set the git option http.sslverify to false.
+  If you get an error like the one below, install a newer version of git.
+    Unable to find 8fcd87533b76ca5b4b83fb6031ddf0de5e03eb57 under https://robotics.mvla.net/git/frc971/brian/2013.git
+    Cannot obtain needed object 8fcd87533b76ca5b4b83fb6031ddf0de5e03eb57
+    error: Fetch failed.
+  I get this error sometimes with version 1.7.2.5 but not with version 1.7.10.4.
 
 [Adding Other People's Repositories]
-`git remote add somebody \
-    ssh://username@robotics.mvla.net/www.https/git/frc971/somebody/2013.git`
-  where username is your login on the server and somebody is another person's
+`git remote add SOMEBODY \
+    ssh://USERNAME@robotics.mvla.net/www/https/git/frc971/SOMEBODY/2013.git`
+  where USERNAME is your login on the server and SOMEBODY is another person's
   git repository
+The https:// URL discussed above in [Cloning] will work too.
 
 [Working with Other People's Repositories]
-`git fetch somebody` will pull their changes, and then you can rebase on top of
+`git fetch SOMEBODY` will pull their changes, and then you can rebase on top of
   them etc.
 `git push --mirror` will push all of your local branches so that everybody else
-  can see them.
+  can see them. (This is the default if the configuration option remote.<remote>.mirror is set.)
+  However, you can not do that with an https:// URL.
 
 [Synchronizing with SVN]
-In order to synchronize the git commits with svn, somebody has to get git-svn
-  set up in their local git repo and then push/pull commits.
-  To do that, `git svn init https://robotics.mvla.net/svn/frc971/2013/trunk/src`
-  Then, unless you want git-svn to pull down everything from SVN again, you have
-    to do `vim .git/refs/remotes/git-svn` (or whatever you name the remote) and
-    put in the commit ID of the latest commit in the repository that's from SVN.
-  After doing that (and a `git svn fetch`), git-svn works like usual.
-  To pull changes from svn, do `git-svn fetch`. To push changes to svn, do
-    `git svn dcommit`, which will take all of your git commits between the
-    latest commit from svn and your HEAD and make them into svn commits.
-  Multiple people dealing with svn works out because the git commit IDs end up
-    the same, so they all just become the same.
+In order to synchronize the git commits with svn, somebody has to set up git-svn in their local git repo and then push/pull commits.
+
+To do that, `git svn init https://robotics.mvla.net/svn/frc971/2013/trunk/src`
+
+Then, unless you want git-svn to pull down everything from SVN again, you have to edit .git/refs/remotes/git-svn (or whatever you name the remote) in your local repository and put in the commit ID of the latest commit in the repository that's from SVN.
+
+After doing that (and a `git svn fetch`), git-svn works like usual (see git-svn(1) for details).
+
+To pull changes from svn, do `git-svn fetch`. To push changes to svn, do `git svn dcommit`, which will take all of your git commits between the latest commit from svn and your HEAD and make them into svn commits.
+
+Multiple people dealing with svn works OK because the git commit SHAs end up the same so they all just become the same objects.
+
+[Server Setup]
+To get started working with git on the server, first you have to set up your
+  .bashrc so that the git tools work. To do that, add the following line to your
+  .bashrc *ABOVE* the '[ -z "$PS1" ] && return' line.
+    PATH=$PATH:/www/https/files/frc971/2013/brian/
+You also need a place to store your files. You will need an adminstrator to
+  create a folder for you in /www/https/git/frc971 (on the server) with the
+  correct permissions and group.
+
+[Repository Setup]
+To create a git repository on the server,
+  "/www/https/git/frc971/brian/bare-git-repo" to wherever you want your
+  repository (using `git init` won't work correctly). The standard location for
+  mirrors of the "https://robotics.mvla.net/svn/frc971/YEAR/trunk/src" folder is
+  "/www/https/git/frc971/USERNAME/YEAR.git".
+In order for https:// access to work, you have to make sure to rename
+  .git/hooks/post-update.sample to .git/hooks/post-update (and then run
+  `git update-server-info` if you're not going to push immediately).
+
+To learn more about git, see git(1) (`man git` or
+  <http://manpages.debian.net/cgi-bin/man.cgi?query=git>) (especially the NOTES
+  section).
diff --git a/doc/wpilib-check-notes.txt b/doc/wpilib-check-notes.txt
new file mode 100644
index 0000000..e8c1a0f
--- /dev/null
+++ b/doc/wpilib-check-notes.txt
@@ -0,0 +1,50 @@
+This file has the results of going through all of the WPILib code that we use.
+If you use any more parts of WPILib, then check them carefully (preferrably get
+multiple people to do it) and then add the results here.
+The notes are so that it is clear what has been checked and how things interact
+in nonintiutive ways to potentially create subtle bugs.
+
+DriverStationEnhancedIO
+  only checked what DriverStation does to it
+  the rest of it is implemented horribly
+DriverStation
+  GetMatchTime() is garbage (DriverStation shouldn't keep track of that
+    information and it does a bad job of it)
+  don't call Set*PriorityDashboardPackerToUse
+  IsNewControlData() and WaitForData() are OK
+  make sure to GetDataReadLock() correctly when you want to read data
+  GetStickAxis uses brain-dead math
+  most of the "helper" methods to retrieve parts of the control data have no
+    benefit and do other weird things besides just get the value
+Dashboard
+  GetStatusBuffer and Flush do get called from a separate task by DriverStation
+  only checked what DriverStation does to it
+MotorSafetyHelper
+  CheckMotors() does get called from a separate task by DriverStation
+RobotBase
+  the Is* methods are garbage (call them directly on the instances of the
+    objects that they forward too)
+Task
+  the constructor and Start get called in RobotBase in a task without the
+    floating point save flag set
+ReentrantSemaphore
+Synchronized
+Error
+  it synchronizes all of the non-const methods internally, and does it right
+  Do not use EnableStackTrace.
+ErrorBase
+  the mutable Error instance varible is weird, but safe
+Utility
+  it is a bad idea to use wpi_selfTrace()
+    That gets called if you use Error::EnableStackTrace or
+      wpi_stackOnAssertEnable, so don't call those.
+  The assertions NEVER stop on failure unless you wpi_SuspendOnAssertEnabled.
+Global
+Watchdog
+  the return value of Feed() is garbage
+Module
+DigitalModule
+  didn't look at I2C
+AnalogChannel
+AnalogModule
+NetworkRobot
diff --git a/doc/wpilib-issues.txt b/doc/wpilib-issues.txt
new file mode 100644
index 0000000..1b46940
--- /dev/null
+++ b/doc/wpilib-issues.txt
@@ -0,0 +1,6 @@
+sprintf
+ErrorBase/Error not thread safe (aka CANJaguar)
+all of the sync issues last year
+Module not thread safe
+
+compressor turned on as soon as power was turned on (2 times in a row)
diff --git a/frc971/atom_code/.gitignore b/frc971/atom_code/.gitignore
new file mode 100644
index 0000000..b1eea9c
--- /dev/null
+++ b/frc971/atom_code/.gitignore
@@ -0,0 +1,2 @@
+/shooter.csv
+/wrist.csv
diff --git a/frc971/atom_code/atom_code.gyp b/frc971/atom_code/atom_code.gyp
index d727036..d60b26b 100644
--- a/frc971/atom_code/atom_code.gyp
+++ b/frc971/atom_code/atom_code.gyp
@@ -5,20 +5,31 @@
       'type': 'none',
       'dependencies': [
         '<(AOS)/build/aos_all.gyp:Atom',
-        '../control_loops/control_loops.gyp:DriveTrain',
+        '../control_loops/drivetrain/drivetrain.gyp:drivetrain',
+        '../control_loops/drivetrain/drivetrain.gyp:drivetrain_lib_test',
+        '../control_loops/wrist/wrist.gyp:wrist',
+        '../control_loops/wrist/wrist.gyp:wrist_lib_test',
+        '../control_loops/index/index.gyp:index',
+        '../control_loops/index/index.gyp:index_lib_test',
+        '../control_loops/angle_adjust/angle_adjust.gyp:angle_adjust',
+        '../control_loops/angle_adjust/angle_adjust.gyp:angle_adjust_lib_test',
+        '../control_loops/angle_adjust/angle_adjust.gyp:angle_adjust_csv',
+        '../control_loops/shooter/shooter.gyp:shooter_lib_test',
+        '../control_loops/shooter/shooter.gyp:shooter',
+        '../autonomous/autonomous.gyp:auto',
         '../input/input.gyp:JoystickReader',
-        '../input/input.gyp:SensorReader',
-        '../input/input.gyp:GyroReader',
-        '../input/input.gyp:AutoMode',
+        '../../vision/vision.gyp:OpenCVWorkTask',
+        '../../vision/vision.gyp:GoalMaster',
         '../output/output.gyp:MotorWriter',
         '../output/output.gyp:CameraServer',
-        'camera/camera.gyp:frc971',
+        #'camera/camera.gyp:frc971',
+        '../input/input.gyp:sensor_receiver',
+        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:*',
       ],
       'copies': [
         {
           'destination': '<(rsync_dir)',
           'files': [
-            'scripts/aos_module.ko',
             'scripts/start_list.txt',
           ],
         },
diff --git a/frc971/atom_code/build.sh b/frc971/atom_code/build.sh
index d1dff19..172b2d4 100755
--- a/frc971/atom_code/build.sh
+++ b/frc971/atom_code/build.sh
@@ -1,3 +1,5 @@
 #!/bin/bash
 
-../../aos/build/build.sh atom atom_code.gyp no $1
+cd $(dirname $0)
+
+../../aos/build/build.sh atom atom_code.gyp no "$@"
diff --git a/frc971/atom_code/scripts/aos_module.ko b/frc971/atom_code/scripts/aos_module.ko
deleted file mode 100644
index cdaddb7..0000000
--- a/frc971/atom_code/scripts/aos_module.ko
+++ /dev/null
Binary files differ
diff --git a/frc971/atom_code/scripts/start_list.txt b/frc971/atom_code/scripts/start_list.txt
index 0edca32..0991e96 100644
--- a/frc971/atom_code/scripts/start_list.txt
+++ b/frc971/atom_code/scripts/start_list.txt
@@ -1,11 +1,11 @@
+BinaryLogReader
 MotorWriter
 JoystickReader
-SensorReader
-GyroReader
-DriveTrain
-AutoMode
-BinaryLogReader
+drivetrain
 CRIOLogReader
-CameraReader
-CameraServer
-CameraHTTPStreamer
+angle_adjust
+wrist
+index
+shooter
+auto
+gyro_sensor_receiver
diff --git a/frc971/autonomous/auto.cc b/frc971/autonomous/auto.cc
new file mode 100644
index 0000000..8b8159c
--- /dev/null
+++ b/frc971/autonomous/auto.cc
@@ -0,0 +1,475 @@
+#include "stdio.h"
+
+#include "aos/common/control_loop/Timing.h"
+#include "aos/common/time.h"
+#include "aos/common/util/trapezoid_profile.h"
+#include "aos/common/logging/logging.h"
+#include "aos/common/network/team_number.h"
+
+#include "frc971/autonomous/auto.q.h"
+#include "frc971/constants.h"
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/wrist/wrist_motor.q.h"
+#include "frc971/control_loops/index/index_motor.q.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor.q.h"
+
+using ::aos::time::Time;
+
+namespace frc971 {
+namespace autonomous {
+
+static double left_initial_position, right_initial_position;
+
+bool ShouldExitAuto() {
+  ::frc971::autonomous::autonomous.FetchLatest();
+  bool ans = !::frc971::autonomous::autonomous->run_auto;
+  if (ans) {
+    LOG(INFO, "Time to exit auto mode\n");
+  }
+  return ans;
+}
+
+void SetShooterVelocity(double velocity) {
+  LOG(INFO, "Setting shooter velocity to %f\n", velocity);
+  control_loops::shooter.goal.MakeWithBuilder()
+    .velocity(velocity).Send();
+}
+
+void SetWristGoal(double goal) {
+  LOG(INFO, "Setting wrist to %f\n", goal);
+  control_loops::wrist.goal.MakeWithBuilder()
+    .goal(goal).Send();
+}
+
+void SetAngle_AdjustGoal(double goal) {
+  LOG(INFO, "Setting angle adjust to %f\n", goal);
+  control_loops::angle_adjust.goal.MakeWithBuilder()
+    .goal(goal).Send();
+}
+
+void StartIndex() {
+  LOG(INFO, "Starting index\n");
+  control_loops::index_loop.goal.MakeWithBuilder()
+    .goal_state(2)
+    .force_fire(false)
+    .override_index(false)
+    .Send();
+}
+
+void PreloadIndex() {
+  LOG(INFO, "Preloading index\n");
+  control_loops::index_loop.goal.MakeWithBuilder()
+    .goal_state(3)
+    .force_fire(false)
+    .override_index(false)
+    .Send();
+}
+
+void ShootIndex() {
+  LOG(INFO, "Shooting index\n");
+  control_loops::index_loop.goal.MakeWithBuilder()
+    .goal_state(4)
+    .force_fire(false)
+    .override_index(false)
+    .Send();
+}
+
+void ResetIndex() {
+  LOG(INFO, "Resetting index\n");
+  control_loops::index_loop.goal.MakeWithBuilder()
+    .goal_state(5)
+    .force_fire(false)
+    .override_index(false)
+    .Send();
+}
+
+void WaitForIndexReset() {
+  LOG(INFO, "Waiting for the indexer to reset\n");
+  control_loops::index_loop.status.FetchLatest();
+
+  // Fetch a couple index status packets to make sure that the indexer has run.
+  for (int i = 0; i < 5; ++i) {
+    LOG(DEBUG, "Fetching another index status packet\n");
+    control_loops::index_loop.status.FetchNextBlocking();
+    if (ShouldExitAuto()) return;
+  }
+  LOG(INFO, "Indexer is now reset.\n");
+}
+
+void WaitForWrist() {
+  LOG(INFO, "Waiting for the wrist\n");
+  control_loops::wrist.status.FetchLatest();
+
+  while (!control_loops::wrist.status.get()) {
+    LOG(WARNING, "No previous wrist packet, trying to fetch again\n");
+    control_loops::wrist.status.FetchNextBlocking();
+  }
+
+  while (!control_loops::wrist.status->done) {
+    control_loops::wrist.status.FetchNextBlocking();
+    LOG(DEBUG, "Got a new wrist status packet\n");
+    if (ShouldExitAuto()) return;
+  }
+  LOG(INFO, "Done waiting for the wrist\n");
+}
+void WaitForIndex() {
+  LOG(INFO, "Waiting for the indexer to be ready to intake\n");
+  control_loops::index_loop.status.FetchLatest();
+
+  while (!control_loops::index_loop.status.get()) {
+    LOG(WARNING, "No previous index packet, trying to fetch again\n");
+    control_loops::index_loop.status.FetchNextBlocking();
+  }
+
+  while (!control_loops::index_loop.status->ready_to_intake) {
+    control_loops::index_loop.status.FetchNextBlocking();
+    if (ShouldExitAuto()) return;
+  }
+  LOG(INFO, "Indexer ready to intake\n");
+}
+
+void WaitForAngle_Adjust() {
+  LOG(INFO, "Waiting for the angle adjuster to finish\n");
+  control_loops::angle_adjust.status.FetchLatest();
+
+  while (!control_loops::angle_adjust.status.get()) {
+    LOG(WARNING, "No previous angle adjust packet, trying to fetch again\n");
+    control_loops::angle_adjust.status.FetchNextBlocking();
+  }
+
+  while (!control_loops::angle_adjust.status->done) {
+    control_loops::angle_adjust.status.FetchNextBlocking();
+    if (ShouldExitAuto()) return;
+  }
+  LOG(INFO, "Angle adjuster done\n");
+}
+
+void WaitForShooter() {
+  LOG(INFO, "Waiting for the shooter to spin up\n");
+  control_loops::shooter.status.FetchLatest();
+
+  while (!control_loops::shooter.status.get()) {
+    LOG(WARNING, "No previous shooteracket, trying to fetch again\n");
+    control_loops::shooter.status.FetchNextBlocking();
+  }
+
+  while (!control_loops::shooter.status->ready) {
+    control_loops::shooter.status.FetchNextBlocking();
+    if (ShouldExitAuto()) return;
+  }
+  LOG(INFO, "Shooter ready to shoot\n");
+}
+
+void ShootNDiscs(int n) {
+  LOG(INFO, "Waiting until %d discs have been shot\n", n);
+  control_loops::index_loop.status.FetchLatest();
+
+  while (!control_loops::index_loop.status.get()) {
+    LOG(WARNING, "No previous index_loop packet, trying to fetch again\n");
+    control_loops::index_loop.status.FetchNextBlocking();
+  }
+
+  int final_disc_count = control_loops::index_loop.status->shot_disc_count + n;
+  LOG(DEBUG, "Disc count should be %d when done\n", final_disc_count);
+  while (final_disc_count > control_loops::index_loop.status->shot_disc_count) {
+    control_loops::index_loop.status.FetchNextBlocking();
+    if (ShouldExitAuto()) return;
+  }
+  LOG(INFO, "Shot %d discs\n", n);
+}
+
+void StopDrivetrain() {
+  LOG(INFO, "Stopping the drivetrain\n");
+  control_loops::drivetrain.goal.MakeWithBuilder()
+      .control_loop_driving(true)
+      .left_goal(left_initial_position)
+      .left_velocity_goal(0)
+      .right_goal(right_initial_position)
+      .right_velocity_goal(0)
+      .quickturn(false)
+      .Send();
+}
+
+void ResetDrivetrain() {
+  LOG(INFO, "resetting the drivetrain\n");
+  control_loops::drivetrain.goal.MakeWithBuilder()
+      .control_loop_driving(false)
+      .highgear(false)
+      .steering(0.0)
+      .throttle(0.0)
+      .Send();
+}
+
+void SetDriveGoal(double yoffset, double maximum_velocity = 1.5) {
+  LOG(INFO, "Going to move %f\n", yoffset);
+
+  // Measured conversion to get the distance right.
+  ::aos::util::TrapezoidProfile profile(::aos::time::Time::InMS(10));
+  ::Eigen::Matrix<double, 2, 1> driveTrainState;
+  const double goal_velocity = 0.0;
+  const double epsilon = 0.01;
+
+  profile.set_maximum_acceleration(2.0);
+  profile.set_maximum_velocity(maximum_velocity);
+ 
+  while (true) {
+    ::aos::time::PhasedLoop10MS(5000);      // wait until next 10ms tick
+    driveTrainState = profile.Update(yoffset, goal_velocity);
+
+    if (::std::abs(driveTrainState(0, 0) - yoffset) < epsilon) break;
+    if (ShouldExitAuto()) return;
+
+    LOG(DEBUG, "Driving left to %f, right to %f\n",
+        driveTrainState(0, 0) + left_initial_position,
+        driveTrainState(0, 0) + right_initial_position);
+    control_loops::drivetrain.goal.MakeWithBuilder()
+        .control_loop_driving(true)
+        .highgear(false)
+        .left_goal(driveTrainState(0, 0) + left_initial_position)
+        .right_goal(driveTrainState(0, 0) + right_initial_position)
+        .left_velocity_goal(driveTrainState(1, 0))
+        .right_velocity_goal(driveTrainState(1, 0))
+        .Send();
+  }
+  left_initial_position += yoffset;
+  right_initial_position += yoffset;
+  LOG(INFO, "Done moving\n");
+}
+
+// Drives forward while we can pick up discs up to max_distance (in meters).
+void DriveForwardPickUp(double max_distance, double wrist_angle) {
+  LOG(INFO, "going to pick up at a max distance of %f\n", max_distance);
+
+  static const ::aos::time::Time kPeriod = ::aos::time::Time::InMS(10);
+  ::aos::util::TrapezoidProfile profile(kPeriod);
+  ::Eigen::Matrix<double, 2, 1> driveTrainState;
+  const double goal_velocity = 0.0;
+  const double epsilon = 0.01;
+  static const double kMaximumAcceleration = 1.0;
+
+  profile.set_maximum_acceleration(kMaximumAcceleration);
+  profile.set_maximum_velocity(0.6);
+
+  bool driving_back = false;
+  const double kDestination = -0.20;
+
+  while (true) {
+    ::aos::time::PhasedLoop10MS(5000);      // wait until next 10ms tick
+    driveTrainState = profile.Update(driving_back ? kDestination : max_distance,
+                                     goal_velocity);
+
+    if (ShouldExitAuto()) return;
+
+    if (driving_back) {
+      if (::std::abs(driveTrainState(0, 0)) < epsilon) break;
+    } else if (::std::abs(driveTrainState(0, 0) - max_distance) < epsilon) {
+      LOG(INFO, "went the max distance; driving back\n");
+      driving_back = true;
+      profile.set_maximum_velocity(2.5);
+      SetWristGoal(wrist_angle);
+    }
+
+    if (control_loops::index_loop.status.FetchLatest()) {
+      if (control_loops::index_loop.status->hopper_disc_count >= 4) {
+        LOG(INFO, "done intaking; driving back\n");
+        driving_back = true;
+        profile.set_maximum_velocity(2.5);
+        SetWristGoal(wrist_angle);
+      }
+    } else {
+      LOG(WARNING, "getting index status failed\n");
+    }
+
+    LOG(DEBUG, "Driving left to %f, right to %f\n",
+        driveTrainState(0, 0) + left_initial_position,
+        driveTrainState(0, 0) + right_initial_position);
+    control_loops::drivetrain.goal.MakeWithBuilder()
+        .control_loop_driving(true)
+        .highgear(false)
+        .left_goal(driveTrainState(0, 0) + left_initial_position)
+        .right_goal(driveTrainState(0, 0) + right_initial_position)
+        .left_velocity_goal(driveTrainState(1, 0))
+        .right_velocity_goal(driveTrainState(1, 0))
+        .Send();
+  }
+  left_initial_position += kDestination;
+  right_initial_position += kDestination;
+  LOG(INFO, "Done moving\n");
+}
+
+void DriveSpin(double radians) {
+  LOG(INFO, "going to spin %f\n", radians);
+
+  ::aos::util::TrapezoidProfile profile(::aos::time::Time::InMS(10));
+  ::Eigen::Matrix<double, 2, 1> driveTrainState;
+  const double goal_velocity = 0.0;
+  const double epsilon = 0.01;
+  // in drivetrain "meters"
+  const double kRobotWidth = 0.4544;
+
+  profile.set_maximum_acceleration(1.5);
+  profile.set_maximum_velocity(0.8);
+
+  const double side_offset = kRobotWidth * radians / 2.0;
+
+  while (true) {
+    ::aos::time::PhasedLoop10MS(5000);      // wait until next 10ms tick
+    driveTrainState = profile.Update(side_offset, goal_velocity);
+
+    if (::std::abs(driveTrainState(0, 0) - side_offset) < epsilon) break;
+    if (ShouldExitAuto()) return;
+
+    LOG(DEBUG, "Driving left to %f, right to %f\n",
+        left_initial_position - driveTrainState(0, 0),
+        right_initial_position + driveTrainState(0, 0));
+    control_loops::drivetrain.goal.MakeWithBuilder()
+        .control_loop_driving(true)
+        .highgear(false)
+        .left_goal(left_initial_position - driveTrainState(0, 0))
+        .right_goal(right_initial_position + driveTrainState(0, 0))
+        .left_velocity_goal(-driveTrainState(1, 0))
+        .right_velocity_goal(driveTrainState(1, 0))
+        .Send();
+  }
+  left_initial_position -= side_offset;
+  right_initial_position += side_offset;
+  LOG(INFO, "Done moving\n");
+}
+
+// start with N discs in the indexer
+void HandleAuto() {
+  LOG(INFO, "Handling auto mode\n");
+
+  const double WRIST_UP =
+      constants::GetValues().wrist_hall_effect_start_angle - 0.4;
+  const double WRIST_DOWN = -0.580;
+  const double WRIST_DOWN_TWO = WRIST_DOWN - 0.012;
+  const double ANGLE_ONE = 0.509;
+  const double ANGLE_TWO = 0.673;
+
+  ResetIndex();
+  SetWristGoal(1.0);  // wrist must calibrate itself on power-up
+  SetAngle_AdjustGoal(ANGLE_TWO);  // make it still move a bit
+  SetShooterVelocity(0.0);  // or else it keeps spinning from last time
+  ResetDrivetrain();
+
+  //::aos::time::SleepFor(::aos::time::Time::InSeconds(20));
+  if (ShouldExitAuto()) return;
+  
+  control_loops::drivetrain.position.FetchLatest();
+  while (!control_loops::drivetrain.position.get()) {
+    LOG(WARNING, "No previous drivetrain position packet, trying to fetch again\n");
+    control_loops::drivetrain.position.FetchNextBlocking();
+  }
+  left_initial_position =
+    control_loops::drivetrain.position->left_encoder;
+  right_initial_position =
+    control_loops::drivetrain.position->right_encoder;
+
+  StopDrivetrain();
+
+  SetWristGoal(WRIST_UP);    // wrist must calibrate itself on power-up
+  SetAngle_AdjustGoal(ANGLE_ONE);
+  SetShooterVelocity(395.0);
+  WaitForIndexReset();
+  if (ShouldExitAuto()) return;
+  PreloadIndex();      // spin to top and put 1 disc into loader
+
+  if (ShouldExitAuto()) return;
+  WaitForWrist();
+  if (ShouldExitAuto()) return;
+  WaitForAngle_Adjust();
+  ShootIndex();        // tilt up, shoot, repeat until empty
+          // calls WaitForShooter
+  ShootNDiscs(4);      // ShootNDiscs returns if ShouldExitAuto
+  if (ShouldExitAuto()) return;
+
+  StartIndex();        // take in up to 4 discs
+
+  if (false) {
+    const double kDistanceToCenterMeters = 3.11023;
+    const double kMaxPickupDistance = 2.5;
+    const double kTurnToCenterDegrees = 78.2;
+
+    // Drive back to the center line.
+    SetDriveGoal(-kDistanceToCenterMeters);
+    if (ShouldExitAuto()) return;
+
+    SetWristGoal(WRIST_DOWN);
+    // Turn towards the center.
+    DriveSpin(kTurnToCenterDegrees * M_PI / 180.0);
+    if (ShouldExitAuto()) return;
+    WaitForWrist();
+    if (ShouldExitAuto()) return;
+
+    // Pick up at most 4 discs and drive at most kMaxPickupDistance.
+    DriveForwardPickUp(kMaxPickupDistance, WRIST_UP);
+
+    SetWristGoal(WRIST_UP);
+    DriveSpin(-kTurnToCenterDegrees * M_PI / 180.0);
+    if (ShouldExitAuto()) return;
+    // Drive back to where we were.
+    SetDriveGoal(kDistanceToCenterMeters);
+    if (ShouldExitAuto()) return;
+
+    ShootNDiscs(4);
+    if (ShouldExitAuto()) return;
+  } else {
+    // Delay to let the disc out of the shooter.
+    ::aos::time::SleepFor(::aos::time::Time::InSeconds(0.25));
+    SetWristGoal(WRIST_DOWN);
+    StartIndex();				// take in up to 4 discs
+
+    if (ShouldExitAuto()) return;
+    WaitForWrist();			// wrist must be down before moving
+    ::aos::time::SleepFor(::aos::time::Time::InSeconds(0.25));
+    SetAngle_AdjustGoal(ANGLE_TWO);
+    SetShooterVelocity(375.0);
+
+    if (ShouldExitAuto()) return; 
+    WaitForIndex();			// ready to pick up discs
+
+    // How long we're going to drive in total.
+    static const double kDriveDistance = 2.84;
+    // How long to drive slowly to pick up the 2 disks under the pyramid.
+    static const double kFirstDrive = 0.4;
+    // How long to drive slowly to pick up the last 2 disks.
+    static const double kLastDrive = 0.34;
+    // How fast to drive when picking up disks.
+    static const double kPickupVelocity = 0.6;
+    // How fast to drive when not picking up disks.
+    static const double kDriveVelocity =
+        constants::GetValues().clutch_transmission ? 0.8 : 1.75;
+    // Where to take the second set of shots from.
+    static const double kSecondShootDistance = 2.0;
+
+    // Go slowly to grab the 2 disks under the pyramid.
+    SetDriveGoal(kFirstDrive, kPickupVelocity);
+    ::aos::time::SleepFor(::aos::time::Time::InSeconds(0.1));
+
+    if (constants::GetValues().clutch_transmission) {
+      SetDriveGoal(kSecondShootDistance - kFirstDrive, kDriveVelocity);
+    } else {
+      SetDriveGoal(kDriveDistance - kFirstDrive - kLastDrive, kDriveVelocity);
+      SetWristGoal(WRIST_DOWN_TWO);
+      // Go slowly at the end to pick up the last 2 disks.
+      SetDriveGoal(kLastDrive, kPickupVelocity);
+      if (ShouldExitAuto()) return;
+
+      ::aos::time::SleepFor(::aos::time::Time::InSeconds(0.5));
+      SetDriveGoal(kSecondShootDistance - kDriveDistance, kDriveVelocity);
+    }
+
+    PreloadIndex();
+
+    if (ShouldExitAuto()) return;
+    WaitForAngle_Adjust();
+    if (ShouldExitAuto()) return;
+    ShootIndex();	
+    if (ShouldExitAuto()) return;
+  }
+}
+
+}  // namespace autonomous
+}  // namespace frc971
diff --git a/frc971/autonomous/auto.h b/frc971/autonomous/auto.h
new file mode 100644
index 0000000..00d2d72
--- /dev/null
+++ b/frc971/autonomous/auto.h
@@ -0,0 +1,11 @@
+#ifndef FRC971_AUTONOMOUS_AUTO_H_
+#define FRC971_AUTONOMOUS_AUTO_H_
+
+namespace frc971 {
+namespace autonomous {
+
+void HandleAuto();
+
+}  // namespace autonomous
+}  // namespace frc971
+#endif  // FRC971_AUTONOMOUS_AUTO_H_
diff --git a/frc971/autonomous/auto.q b/frc971/autonomous/auto.q
new file mode 100644
index 0000000..5791034
--- /dev/null
+++ b/frc971/autonomous/auto.q
@@ -0,0 +1,8 @@
+package frc971.autonomous;
+
+message AutoControl {
+  // True if auto mode should be running, false otherwise.
+  bool run_auto;
+};
+
+queue AutoControl autonomous;
diff --git a/frc971/autonomous/auto_main.cc b/frc971/autonomous/auto_main.cc
new file mode 100644
index 0000000..8ce82f8
--- /dev/null
+++ b/frc971/autonomous/auto_main.cc
@@ -0,0 +1,39 @@
+#include "stdio.h"
+
+#include "aos/common/control_loop/Timing.h"
+#include "aos/common/time.h"
+#include "aos/atom_code/init.h"
+#include "aos/common/logging/logging.h"
+#include "frc971/autonomous/auto.q.h"
+#include "frc971/autonomous/auto.h"
+
+using ::aos::time::Time;
+
+int main(int /*argc*/, char * /*argv*/[]) {
+  ::aos::Init();
+
+  ::frc971::autonomous::autonomous.FetchLatest();
+  while (!::frc971::autonomous::autonomous.get()) {
+    ::frc971::autonomous::autonomous.FetchNextBlocking();
+    LOG(INFO, "Got another auto packet\n");
+  }
+
+  while (true) {
+    while (!::frc971::autonomous::autonomous->run_auto) {
+      ::frc971::autonomous::autonomous.FetchNextBlocking();
+      LOG(INFO, "Got another auto packet\n");
+    }
+    LOG(INFO, "Starting auto mode\n");
+    ::frc971::autonomous::HandleAuto();
+
+    LOG(INFO, "Auto mode exited, waiting for it to finish.\n");
+    while (::frc971::autonomous::autonomous->run_auto) {
+      ::frc971::autonomous::autonomous.FetchNextBlocking();
+      LOG(INFO, "Got another auto packet\n");
+    }
+    LOG(INFO, "Waiting for auto to start back up.\n");
+  }
+  ::aos::Cleanup();
+  return 0;
+}
+
diff --git a/frc971/autonomous/autonomous.gyp b/frc971/autonomous/autonomous.gyp
new file mode 100644
index 0000000..526904c
--- /dev/null
+++ b/frc971/autonomous/autonomous.gyp
@@ -0,0 +1,55 @@
+{
+  'targets': [
+    {
+      'target_name': 'auto_queue',
+      'type': 'static_library',
+      'sources': ['auto.q'],
+      'variables': {
+        'header_path': 'frc971/autonomous',
+      },
+      'dependencies': [
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'includes': ['../../aos/build/queues.gypi'],
+    },
+    {
+      'target_name': 'auto_lib',
+      'type': 'static_library',
+      'sources': [
+        'auto.cc',
+      ],
+      'dependencies': [
+        'auto_queue',
+        '<(AOS)/common/common.gyp:controls',
+        '<(DEPTH)/frc971/control_loops/wrist/wrist.gyp:wrist_loop',
+        '<(DEPTH)/frc971/control_loops/shooter/shooter.gyp:shooter_loop',
+        '<(DEPTH)/frc971/control_loops/index/index.gyp:index_loop',
+        '<(DEPTH)/frc971/control_loops/angle_adjust/angle_adjust.gyp:angle_adjust_loop',
+        '<(DEPTH)/frc971/control_loops/drivetrain/drivetrain.gyp:drivetrain_loop',
+        '<(DEPTH)/frc971/frc971.gyp:constants',
+        '<(AOS)/common/common.gyp:time',
+        '<(AOS)/common/common.gyp:timing',
+        '<(AOS)/common/util/util.gyp:trapezoid_profile',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:controls',
+      ],
+    },
+    {
+      'target_name': 'auto',
+      'type': 'executable',
+      'sources': [
+        'auto_main.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        'auto_queue',
+        'auto_lib',
+      ],
+    },
+  ],
+}
diff --git a/frc971/constants.cc b/frc971/constants.cc
new file mode 100644
index 0000000..da2d593
--- /dev/null
+++ b/frc971/constants.cc
@@ -0,0 +1,169 @@
+#include "frc971/constants.h"
+
+#include <math.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#include "aos/common/logging/logging.h"
+#include "aos/common/once.h"
+#include "aos/common/network/team_number.h"
+
+#include "frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"
+#include "frc971/control_loops/drivetrain/polydrivetrain_clutch_motor_plant.h"
+#include "frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
+#include "frc971/control_loops/drivetrain/drivetrain_clutch_motor_plant.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+namespace frc971 {
+namespace constants {
+namespace {
+
+// It has about 0.029043 of gearbox slop.
+// For purposes of moving the end up/down by a certain amount, the wrist is 18
+// inches long.
+const double kCompWristHallEffectStartAngle = 1.277;
+const double kPracticeWristHallEffectStartAngle = 1.178;
+
+const double kWristHallEffectStopAngle = 100 * M_PI / 180.0;
+
+const double kPracticeWristUpperPhysicalLimit = 1.677562;
+const double kCompWristUpperPhysicalLimit = 1.677562;
+
+const double kPracticeWristLowerPhysicalLimit = -0.746128;
+const double kCompWristLowerPhysicalLimit = -0.746128;
+
+const double kPracticeWristUpperLimit = 1.615385;
+const double kCompWristUpperLimit = 1.615385;
+
+const double kPracticeWristLowerLimit = -0.746128;
+const double kCompWristLowerLimit = -0.746128;
+
+const double kWristZeroingSpeed = 0.125;
+const double kWristZeroingOffSpeed = 0.35;
+
+const int kAngleAdjustHallEffect = 2;
+
+// Angle measured from CAD with the top of the angle adjust at the top of the
+// wire guide is 0.773652098 radians.
+
+const double kCompAngleAdjustHallEffectStartAngle[2] = {0.301170496, 1.5};
+const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.297, 1.5};
+
+const double kAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
+
+const double kPracticeAngleAdjustUpperPhysicalLimit = 0.904737;
+const double kCompAngleAdjustUpperPhysicalLimit = 0.904737;
+
+const double kPracticeAngleAdjustLowerPhysicalLimit = 0.270;
+const double kCompAngleAdjustLowerPhysicalLimit = 0.302;
+
+const double kPracticeAngleAdjustUpperLimit = 0.87;
+const double kCompAngleAdjustUpperLimit = 0.87;
+
+const double kPracticeAngleAdjustLowerLimit = 0.31;
+const double kCompAngleAdjustLowerLimit = 0.28;
+
+const double kAngleAdjustZeroingSpeed = -0.2;
+const double kAngleAdjustZeroingOffSpeed = -0.5;
+
+const double kPracticeAngleAdjustDeadband = 0.4;
+const double kCompAngleAdjustDeadband = 0.0;
+
+const int kCompCameraCenter = -2;
+const int kPracticeCameraCenter = -5;
+
+const double kCompDrivetrainEncoderRatio =
+    (15.0 / 50.0) /*output reduction*/ * (36.0 / 24.0) /*encoder gears*/;
+const double kCompLowGearRatio = 14.0 / 60.0 * 15.0 / 50.0;
+const double kCompHighGearRatio = 30.0 / 44.0 * 15.0 / 50.0;
+
+const double kPracticeDrivetrainEncoderRatio =
+    (17.0 / 50.0) /*output reduction*/ * (64.0 / 24.0) /*encoder gears*/;
+const double kPracticeLowGearRatio = 16.0 / 60.0 * 19.0 / 50.0;
+const double kPracticeHighGearRatio = 28.0 / 48.0 * 19.0 / 50.0;
+
+const ShifterHallEffect kCompLeftDriveShifter{0.83, 2.32, 1.2, 1.0};
+const ShifterHallEffect kCompRightDriveShifter{0.865, 2.375, 1.2, 1.0};
+
+const ShifterHallEffect kPracticeLeftDriveShifter{2.082283, 0.834433, 0.60,
+                                                  0.47};
+const ShifterHallEffect kPracticeRightDriveShifter{2.070124, 0.838993, 0.62,
+                                                   0.55};
+
+const Values *DoGetValues() {
+  uint16_t team = ::aos::network::GetTeamNumber();
+  LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
+  switch (team) {
+    case kCompTeamNumber:
+      return new Values{kCompWristHallEffectStartAngle,
+                        kWristHallEffectStopAngle,
+                        kCompWristUpperLimit,
+                        kCompWristLowerLimit,
+                        kCompWristUpperPhysicalLimit,
+                        kCompWristLowerPhysicalLimit,
+                        kWristZeroingSpeed,
+                        kWristZeroingOffSpeed,
+                        kCompAngleAdjustHallEffectStartAngle,
+                        kAngleAdjustHallEffectStopAngle,
+                        kCompAngleAdjustUpperLimit,
+                        kCompAngleAdjustLowerLimit,
+                        kCompAngleAdjustUpperPhysicalLimit,
+                        kCompAngleAdjustLowerPhysicalLimit,
+                        kAngleAdjustZeroingSpeed,
+                        kAngleAdjustZeroingOffSpeed,
+                        kCompAngleAdjustDeadband,
+                        kCompDrivetrainEncoderRatio,
+                        kCompLowGearRatio,
+                        kCompHighGearRatio,
+                        kCompLeftDriveShifter,
+                        kCompRightDriveShifter,
+                        true,
+                        control_loops::MakeVClutchDrivetrainLoop,
+                        control_loops::MakeClutchDrivetrainLoop,
+                        kCompCameraCenter};
+      break;
+    case kPracticeTeamNumber:
+      return new Values{kPracticeWristHallEffectStartAngle,
+                        kWristHallEffectStopAngle,
+                        kPracticeWristUpperLimit,
+                        kPracticeWristLowerLimit,
+                        kPracticeWristUpperPhysicalLimit,
+                        kPracticeWristLowerPhysicalLimit,
+                        kWristZeroingSpeed,
+                        kWristZeroingOffSpeed,
+                        kPracticeAngleAdjustHallEffectStartAngle,
+                        kAngleAdjustHallEffectStopAngle,
+                        kPracticeAngleAdjustUpperLimit,
+                        kPracticeAngleAdjustLowerLimit,
+                        kPracticeAngleAdjustUpperPhysicalLimit,
+                        kPracticeAngleAdjustLowerPhysicalLimit,
+                        kAngleAdjustZeroingSpeed,
+                        kAngleAdjustZeroingOffSpeed,
+                        kPracticeAngleAdjustDeadband,
+                        kPracticeDrivetrainEncoderRatio,
+                        kPracticeLowGearRatio,
+                        kPracticeHighGearRatio,
+                        kPracticeLeftDriveShifter,
+                        kPracticeRightDriveShifter,
+                        false,
+                        control_loops::MakeVDogDrivetrainLoop,
+                        control_loops::MakeDogDrivetrainLoop,
+                        kPracticeCameraCenter};
+      break;
+    default:
+      LOG(FATAL, "unknown team #%" PRIu16 "\n", team);
+  }
+}
+
+}  // namespace
+
+const Values &GetValues() {
+  static ::aos::Once<const Values> once(DoGetValues);
+  return *once.Get();
+}
+
+}  // namespace constants
+}  // namespace frc971
diff --git a/frc971/constants.cpp b/frc971/constants.cpp
deleted file mode 100644
index bd2f078..0000000
--- a/frc971/constants.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "frc971/constants.h"
-
-#include <stddef.h>
-#include <inttypes.h>
-
-#include "aos/common/messages/RobotState.q.h"
-#include "aos/atom_code/output/MotorOutput.h"
-
-namespace frc971 {
-namespace constants {
-
-namespace {
-
-const double kCompHorizontal = -1.77635 + 0.180;
-const double kPracticeHorizontal = -1.77635 + -0.073631;
-const int kCompCameraCenter = -2;
-const int kPracticeCameraCenter = -5;
-
-struct Values {
-  // what horizontal_offset returns
-  double horizontal;
-  // what camera_center returns
-  int camera_center;
-};
-Values *values = NULL;
-// Attempts to retrieve a new Values instance and stores it in values if
-// necessary.
-// Returns a valid Values instance or NULL.
-const Values *GetValues() {
-  if (values == NULL) {
-    LOG(INFO, "creating a Constants for team %"PRIu16"\n",
-        aos::robot_state->team_id);
-    switch (aos::robot_state->team_id) {
-      case kCompTeamNumber:
-        values = new Values{kCompHorizontal, kCompCameraCenter};
-        break;
-      case kPracticeTeamNumber:
-        values = new Values{kPracticeHorizontal, kPracticeCameraCenter};
-        break;
-      default:
-        LOG(ERROR, "unknown team #%"PRIu16"\n",
-            aos::robot_state->team_id);
-        return NULL;
-    }
-  }
-  return values;
-}
-
-}  // namespace
-
-bool horizontal_offset(double *horizontal) {
-  const Values *const values = GetValues();
-  if (values == NULL) return false;
-  *horizontal = values->horizontal;
-  return true;
-}
-bool camera_center(int *center) {
-  const Values *const values = GetValues();
-  if (values == NULL) return false;
-  *center = values->camera_center;
-  return true;
-}
-
-}  // namespace constants
-}  // namespace frc971
diff --git a/frc971/constants.h b/frc971/constants.h
index 1138538..838bb35 100644
--- a/frc971/constants.h
+++ b/frc971/constants.h
@@ -1,24 +1,94 @@
+#ifndef FRC971_CONSTANTS_H_
+#define FRC971_CONSTANTS_H_
+
 #include <stdint.h>
 
+#include "frc971/control_loops/state_feedback_loop.h"
+
 namespace frc971 {
 namespace constants {
 
 // Has all of the numbers that change for both robots and makes it easy to
 // retrieve the values for the current one.
-//
-// All of the public functions to retrieve various values take a pointer to
-// store their output value into and assume that aos::robot_state->get() is
-// not null and is correct.  They return true on success.
 
-const uint16_t kCompTeamNumber = 971;
-const uint16_t kPracticeTeamNumber = 5971;
+const uint16_t kCompTeamNumber = 8971;
+const uint16_t kPracticeTeamNumber = 971;
 
-// Sets *horizontal to how many radians from the hall effect transition point
-// to horizontal for the wrist.
-bool horizontal_offset(double *horizontal);
-// Sets *center to how many pixels off center the vertical line
-// on the camera view is.
-bool camera_center(int *center);
+// Contains the voltages for an analog hall effect sensor on a shifter.
+struct ShifterHallEffect {
+  // The numbers to use for scaling raw voltages to 0-1.
+  double high, low;
+
+  // The numbers for when the dog is clear of each gear.
+  double clear_high, clear_low;
+};
+
+// This structure contains current values for all of the things that change.
+struct Values {
+  // Wrist hall effect positive and negative edges.
+  // How many radians from horizontal to the location of interest.
+  double wrist_hall_effect_start_angle;
+  double wrist_hall_effect_stop_angle;
+
+  // Upper and lower extreme limits of travel for the wrist.
+  // These are the soft stops for up and down.
+  double wrist_upper_limit;
+  double wrist_lower_limit;
+
+  // Physical limits.  These are here for testing.
+  double wrist_upper_physical_limit;
+  double wrist_lower_physical_limit;
+
+  // Zeroing speed.
+  // The speed to move the wrist at when zeroing in rad/sec
+  double wrist_zeroing_speed;
+  // Zeroing off speed (in rad/sec).
+  double wrist_zeroing_off_speed;
+
+  // AngleAdjust hall effect positive and negative edges.
+  // These are the soft stops for up and down.
+  const double (&angle_adjust_hall_effect_start_angle)[2];
+  const double (&angle_adjust_hall_effect_stop_angle)[2];
+
+  // Upper and lower extreme limits of travel for the angle adjust.
+  double angle_adjust_upper_limit;
+  double angle_adjust_lower_limit;
+  // Physical limits.  These are here for testing.
+  double angle_adjust_upper_physical_limit;
+  double angle_adjust_lower_physical_limit;
+
+  // The speed to move the angle adjust when zeroing, in rad/sec
+  double angle_adjust_zeroing_speed;
+  // Zeroing off speed.
+  double angle_adjust_zeroing_off_speed;
+
+  // Deadband voltage.
+  double angle_adjust_deadband;
+
+  // The ratio from the encoder shaft to the drivetrain wheels.
+  double drivetrain_encoder_ratio;
+
+  // The gear ratios from motor shafts to the drivetrain wheels for high and low
+  // gear.
+  double low_gear_ratio;
+  double high_gear_ratio;
+
+  ShifterHallEffect left_drive, right_drive;
+
+  bool clutch_transmission;
+
+  ::std::function<StateFeedbackLoop<2, 2, 2>()> make_v_drivetrain_loop;
+  ::std::function<StateFeedbackLoop<4, 2, 2>()> make_drivetrain_loop;
+
+  // How many pixels off center the vertical line
+  // on the camera view is.
+  int camera_center;
+};
+
+// Creates (once) a Values instance and returns a reference to it.
+const Values &GetValues();
 
 }  // namespace constants
 }  // namespace frc971
+
+#endif  // FRC971_CONSTANTS_H_
diff --git a/frc971/control_loops/DriveTrain.cc b/frc971/control_loops/DriveTrain.cc
deleted file mode 100644
index b627cc0..0000000
--- a/frc971/control_loops/DriveTrain.cc
+++ /dev/null
@@ -1,298 +0,0 @@
-#include "frc971/control_loops/DriveTrain.h"
-
-#include <stdio.h>
-#include <sched.h>
-#include <cmath>
-
-#include "aos/aos_core.h"
-#include "aos/common/logging/logging.h"
-#include "aos/common/queue.h"
-#include "frc971/control_loops/DriveTrain.mat"
-#include "frc971/control_loops/DriveTrain.q.h"
-#include "frc971/queues/GyroAngle.q.h"
-#include "frc971/queues/Piston.q.h"
-
-using frc971::sensors::gyro;
-
-namespace frc971 {
-namespace control_loops {
-
-// Width of the robot.
-const double width = 22.0 / 100.0 * 2.54;
-
-class DrivetrainMotorsSS : public MatrixClass {
- public:
-  DrivetrainMotorsSS (void) {
-    MATRIX_INIT;
-    _offset = 0;
-    _integral_offset = 0;
-    _left_goal = 0.0;
-    _right_goal = 0.0;
-    _raw_left = 0.0;
-    _raw_right = 0.0;
-  }
-  void SetGoal(double left, double left_velocity, double right, double right_velocity) {
-    _left_goal = left;
-    _right_goal = right;
-    R << left + _integral_offset * width / 2.0, left_velocity, right - _integral_offset * width / 2.0, right_velocity;
-  }
-  void SetRawPosition(double left, double right) {
-    _raw_right = right;
-    _raw_left = left;
-    Y << left + _offset + _integral_offset, right - _offset + _integral_offset;
-  }
-  void SetPosition(double left, double right, double gyro, bool control_loop_driving) {
-    // Decay the offset quickly because this gyro is great.
-    _offset = (0.25) * (right - left - gyro * width) / 2.0 + 0.75 * _offset;
-    const double angle_error = (_right_goal - _left_goal) / width - (_raw_right - _offset - _raw_left - _offset) / width;
-    if (!control_loop_driving) {
-      _integral_offset = 0.0;
-    } else if (std::abs(angle_error) < M_PI / 10.0) {
-      _integral_offset -= angle_error * 0.010;
-    } else {
-      _integral_offset *= 0.97;
-    }
-    _gyro = gyro;
-    SetRawPosition(left, right);
-    LOG(DEBUG, "Left %f->%f Right %f->%f Gyro %f aerror %f ioff %f\n", left + _offset, _left_goal, right - _offset, _right_goal, gyro, angle_error, _integral_offset);
-  }
-  double UnDeadband(double value) {
-    const double positive_deadband_power = 0.15 * 12;
-    const double negative_deadband_power = 0.09 * 12;
-    if (value > 0) {
-      value += positive_deadband_power;
-    }
-    if (value < 0) {
-      value -= negative_deadband_power;
-    }
-    if (value > 12.0) {
-      value = 12.0;
-    }
-    if (value < -12.0) {
-      value = -12.0;
-    }
-    return value;
-  }
-
-  void SendMotors(Drivetrain::Output *status) {
-    status->left_voltage = UnDeadband(U[0]);
-    status->right_voltage = UnDeadband(U[1]);
-  }
-  void PrintMotors() const {
-    // LOG(DEBUG, "Left Power %f Right Power %f lg %f rg %f le %f re %f gyro %f\n", U[0], U[1], R[0], R[2], Y[0], Y[1], _gyro);
-    LOG(DEBUG, "lg %f rg %f le %f re %f gyro %f off %f\n", R[0], R[2], Y[0], Y[1], _gyro * 180.0 / M_PI, _offset);
-  }
-
- private:
-  double _integral_offset;
-  double _offset;
-  double _gyro;
-  double _left_goal;
-  double _right_goal;
-  double _raw_left;
-  double _raw_right;
-};
-
-class DrivetrainMotorsOL {
- public:
-  DrivetrainMotorsOL() {
-    _old_wheel = 0.0;
-    quick_stop_accumulator = 0.0;
-    _wheel = 0.0;
-    _throttle = 0.0;
-    _quickturn = false;
-    _highgear = true;
-    _neg_inertia_accumulator = 0.0;
-    _left_pwm = 0.0;
-    _right_pwm = 0.0;
-  }
-  void SetGoal(double wheel, double throttle, bool quickturn, bool highgear) {
-    _wheel = wheel;
-    _throttle = throttle;
-    _quickturn = quickturn;
-    _highgear = highgear;
-    _left_pwm = 0.0;
-    _right_pwm = 0.0;
-  }
-  void Update(void) {
-    double overPower;
-    float sensitivity = 1.7;
-    float angular_power;
-    float linear_power;
-    double wheel;
-
-    double neg_inertia = _wheel - _old_wheel;
-    _old_wheel = _wheel;
-
-    double wheelNonLinearity;
-    if (_highgear) {
-      wheelNonLinearity = 0.7;  // used to be csvReader->TURN_NONLIN_HIGH
-      // Apply a sin function that's scaled to make it feel better.
-      const double angular_range = M_PI / 2.0 * wheelNonLinearity;
-      wheel = sin(angular_range * _wheel) / sin(angular_range);
-      wheel = sin(angular_range * _wheel) / sin(angular_range);
-    } else {
-      wheelNonLinearity = 0.4;  // used to be csvReader->TURN_NONLIN_LOW
-      // Apply a sin function that's scaled to make it feel better.
-      const double angular_range = M_PI / 2.0 * wheelNonLinearity;
-      wheel = sin(angular_range * _wheel) / sin(angular_range);
-      wheel = sin(angular_range * _wheel) / sin(angular_range);
-      wheel = sin(angular_range * _wheel) / sin(angular_range);
-    }
-
-    double neg_inertia_scalar;
-    if (_highgear) {
-      neg_inertia_scalar = 20.0;  // used to be csvReader->NEG_INTERTIA_HIGH
-      sensitivity = 1.22; // used to be csvReader->SENSE_HIGH
-    } else {
-      if (wheel * neg_inertia > 0) {
-        neg_inertia_scalar = 16;  // used to be csvReader->NEG_INERTIA_LOW_MORE
-      } else {
-        if (fabs(wheel) > 0.65) {
-          neg_inertia_scalar = 16;  // used to be csvReader->NEG_INTERTIA_LOW_LESS_EXT
-        } else {
-          neg_inertia_scalar = 5;  // used to be csvReader->NEG_INTERTIA_LOW_LESS
-        }
-      }
-      sensitivity = 1.24;  // used to be csvReader->SENSE_LOW
-
-      if (fabs(_throttle) > 0.1) {  // used to be csvReader->SENSE_CUTTOFF
-        sensitivity = 1 - (1 - sensitivity) / fabs(_throttle);
-      }
-    }
-    double neg_inertia_power = neg_inertia * neg_inertia_scalar;
-    _neg_inertia_accumulator += neg_inertia_power;
-
-    wheel = wheel + _neg_inertia_accumulator;
-    if (_neg_inertia_accumulator > 1) {
-      _neg_inertia_accumulator -= 1;
-    } else if (_neg_inertia_accumulator < -1) {
-      _neg_inertia_accumulator += 1;
-    } else {
-      _neg_inertia_accumulator = 0;
-    }
-
-    linear_power = _throttle;
-
-    const double quickstop_scalar = 6;
-    if (_quickturn) {
-      double qt_angular_power = wheel;
-      const double alpha = 0.1;
-      if (fabs(linear_power) < 0.2) {
-        if (qt_angular_power > 1) qt_angular_power = 1.0;
-        if (qt_angular_power < -1) qt_angular_power = -1.0;
-      } else {
-        qt_angular_power = 0.0;
-      }
-      quick_stop_accumulator = (1 - alpha) * quick_stop_accumulator + alpha * qt_angular_power * quickstop_scalar;
-      overPower = 1.0;
-      if (_highgear) {
-        sensitivity = 1.0;
-      } else {
-        sensitivity = 1.0;
-      }
-      angular_power = wheel;
-    } else {
-      overPower = 0.0;
-      angular_power = fabs(_throttle) * wheel * sensitivity;
-      angular_power -= quick_stop_accumulator;
-      if (quick_stop_accumulator > 1) {
-        quick_stop_accumulator -= 1;
-      } else if (quick_stop_accumulator < -1) {
-        quick_stop_accumulator += 1;
-      } else {
-        quick_stop_accumulator = 0;
-      }
-    }
-
-    _right_pwm = _left_pwm = linear_power;
-    _left_pwm += angular_power;
-    _right_pwm -= angular_power;
-
-    if (_left_pwm > 1.0) {
-      _right_pwm -= overPower*(_left_pwm - 1.0);
-      _left_pwm = 1.0;
-    } else if (_right_pwm > 1.0) {
-      _left_pwm -= overPower*(_right_pwm - 1.0);
-      _right_pwm = 1.0;
-    } else if (_left_pwm < -1.0) {
-      _right_pwm += overPower*(-1.0 - _left_pwm);
-      _left_pwm = -1.0;
-    } else if (_right_pwm < -1.0) {
-      _left_pwm += overPower*(-1.0 - _right_pwm);
-      _right_pwm = -1.0;
-    }
-  }
-
-  void SendMotors(Drivetrain::Output *output) {
-    LOG(DEBUG, "left pwm: %f right pwm: %f wheel: %f throttle: %f, qa %f\n",
-        _left_pwm, _right_pwm, _wheel, _throttle, quick_stop_accumulator);
-    output->left_voltage = _left_pwm * 12.0;
-    output->right_voltage = _right_pwm * 12.0;
-    if (_highgear) {
-      shifters.MakeWithBuilder().set(false).Send();
-    } else {
-      shifters.MakeWithBuilder().set(true).Send();
-    }
-  }
-
- private:
-  double _old_wheel;
-  double _wheel;
-  double _throttle;
-  bool _quickturn;
-  bool _highgear;
-  double _neg_inertia_accumulator;
-  double _left_pwm;
-  double _right_pwm;
-  double quick_stop_accumulator;
-};
-
-void DrivetrainLoop::RunIteration(const Drivetrain::Goal *goal,
-                                  const Drivetrain::Position *position,
-                                  Drivetrain::Output *output,
-                                  Drivetrain::Status * /*status*/) {
-  // TODO(aschuh): These should be members of the class.
-  static DrivetrainMotorsSS dt_closedloop;
-  static DrivetrainMotorsOL dt_openloop;
-
-  bool bad_pos = false;
-  if (position == NULL) {
-    LOG(WARNING, "no pos\n");
-    bad_pos = true;
-  }
-
-  double wheel = goal->steering;
-  double throttle = goal->throttle;
-  bool quickturn = goal->quickturn;
-  bool highgear = goal->highgear;
-
-  bool control_loop_driving = goal->control_loop_driving;
-  double left_goal = goal->left_goal;
-  double right_goal = goal->right_goal;
-
-  dt_closedloop.SetGoal(left_goal, 0.0, right_goal, 0.0);
-  if (!bad_pos) {
-    const double left_encoder = position->left_encoder;
-    const double right_encoder = position->right_encoder;
-    if (gyro.FetchLatest()) {
-      dt_closedloop.SetPosition(left_encoder, right_encoder,
-          gyro->angle, control_loop_driving);
-    } else {
-      dt_closedloop.SetRawPosition(left_encoder, right_encoder);
-    }
-  }
-  dt_closedloop.Update(!bad_pos, bad_pos || (output == NULL));
-  dt_openloop.SetGoal(wheel, throttle, quickturn, highgear);
-  dt_openloop.Update();
-  if (control_loop_driving) {
-    dt_closedloop.SendMotors(output);
-  } else {
-    dt_openloop.SendMotors(output);
-  }
-}
-
-}  // namespace control_loops
-}  // namespace frc971
-
-AOS_RUN_LOOP(frc971::control_loops::DrivetrainLoop)
diff --git a/frc971/control_loops/DriveTrain.mat b/frc971/control_loops/DriveTrain.mat
deleted file mode 100644
index fcc6f45..0000000
--- a/frc971/control_loops/DriveTrain.mat
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "frc971/control_loops/StateFeedbackLoop.h"
-
-typedef StateFeedbackLoop<4, 2> MatrixClass;
-#define MATRIX_INIT A << 1.0000000000, 0.0095410093, 0.0000000000, -0.0000167223, 0.0000000000, 0.9096302600, 0.0000000000, -0.0032396985, 0.0000000000, -0.0000167223, 1.0000000000, 0.0095410093, 0.0000000000, -0.0032396985, 0.0000000000, 0.9096302600; \
-B << 0.0000628338, 0.0000022892, 0.0123712263, 0.0004435007, 0.0000022892, 0.0000628338, 0.0004435007, 0.0123712263; \
-C << 1.0000000000, 0.0000000000, 0.0000000000, 0.0000000000, 0.0000000000, 0.0000000000, 1.0000000000, 0.0000000000; \
-D << 0.0000000000, 0.0000000000, 0.0000000000, 0.0000000000; \
-L << 1.7496302600, -0.0032396985, 72.1296388532, -0.4369906587, -0.0032396985, 1.7496302600, -0.4369906586, 72.1296388532; \
-K << 242.8102455120, 19.7898401032, -8.7045950610, -0.9720464423, -8.7045950610, -0.9720464423, 242.8102455120, 19.7898401032; \
-U_max << 12.0000000000, 12.0000000000; \
-U_min << -12.0000000000, -12.0000000000; \
-
diff --git a/frc971/control_loops/StateFeedbackLoop.h b/frc971/control_loops/StateFeedbackLoop.h
deleted file mode 100644
index ad37f49..0000000
--- a/frc971/control_loops/StateFeedbackLoop.h
+++ /dev/null
@@ -1,131 +0,0 @@
-#ifndef FRC971_CONTROL_LOOPS_STATEFEEDBACKLOOP_H_
-#define FRC971_CONTROL_LOOPS_STATEFEEDBACKLOOP_H_
-
-// wikipedia article is <http://en.wikipedia.org/wiki/State_observer>
-
-#include "Eigen/Dense"
-
-template <int number_of_states, int number_of_outputs>
-class StateFeedbackPlant {
- public:
-  Eigen::Matrix<double, number_of_states, 1> X;
-  Eigen::Matrix<double, number_of_outputs, 1> Y;
-  Eigen::Matrix<double, number_of_outputs, 1> U;
-  Eigen::Matrix<double, number_of_outputs, 1> U_max;
-  Eigen::Matrix<double, number_of_outputs, 1> U_min;
-  Eigen::Matrix<double, number_of_states, number_of_states> A;
-  Eigen::Matrix<double, number_of_states, number_of_outputs> B;
-  Eigen::Matrix<double, number_of_outputs, number_of_states> C;
-  Eigen::Matrix<double, number_of_outputs, number_of_outputs> D;
-  // TODO(aschuh): These following 2 lines are here because MATRIX_INIT
-  // assumes that you have a controller as well as a plant.
-  Eigen::Matrix<double, number_of_states, number_of_outputs> L;
-  Eigen::Matrix<double, number_of_outputs, number_of_states> K;
-
-  StateFeedbackPlant() {
-    X.setZero();
-    Y.setZero();
-    U.setZero();
-  }
-
-  virtual ~StateFeedbackPlant() {}
-
-  // If U is outside the hardware range, limit it before the plant tries to use
-  // it.
-  virtual void CapU() {
-    for (int i = 0; i < number_of_outputs; ++i) {
-      if (U[i] > U_max[i]) {
-        U[i] = U_max[i];
-      } else if (U[i] < U_min[i]) {
-        U[i] = U_min[i];
-      }
-    }
-  }
-  // Computes the new X and Y given the control input.
-  void Update() {
-    CapU();
-    X = A * X + B * U;
-    Y = C * X + D * U;
-  }
-
- protected:
-  // these are accessible from non-templated subclasses
-  static const int number_of_states_var = number_of_states;
-  static const int number_of_outputs_var = number_of_outputs;
-};
-
-template <int number_of_states, int number_of_outputs>
-class StateFeedbackLoop {
- public:
-  Eigen::Matrix<double, number_of_states, 1> X;
-  Eigen::Matrix<double, number_of_states, 1> X_hat;
-  Eigen::Matrix<double, number_of_outputs, 1> Y;
-  Eigen::Matrix<double, number_of_states, 1> R;
-  Eigen::Matrix<double, number_of_outputs, 1> U;
-  Eigen::Matrix<double, number_of_outputs, 1> U_max;
-  Eigen::Matrix<double, number_of_outputs, 1> U_min;
-  Eigen::Matrix<double, number_of_outputs, 1> U_ff;
-  Eigen::Matrix<double, number_of_states, number_of_states> A;
-  Eigen::Matrix<double, number_of_states, number_of_outputs> B;
-  // K in wikipedia article
-  Eigen::Matrix<double, number_of_outputs, number_of_states> C;
-  Eigen::Matrix<double, number_of_outputs, number_of_outputs> D;
-  // B in wikipedia article
-  Eigen::Matrix<double, number_of_states, number_of_outputs> L;
-  // C in wikipedia article
-  Eigen::Matrix<double, number_of_outputs, number_of_states> K;
-
-  StateFeedbackLoop() {
-    // You have to initialize all the matrices to 0 or else all their elements
-    // are undefined.
-    X.setZero();
-    X_hat.setZero();
-    Y.setZero();
-    R.setZero();
-    U.setZero();
-    U_ff.setZero();
-  }
-  virtual ~StateFeedbackLoop() {}
-
-  virtual void FeedForward() {
-    for (int i = 0; i < number_of_outputs; ++i) {
-      U_ff[i] = 0.0;
-    }
-  }
-  // If U is outside the hardware range, limit it before it
-  // gets added to the observer.
-  virtual void CapU() {
-    for (int i = 0; i < number_of_outputs; ++i) {
-      if (U[i] > U_max[i]) {
-        U[i] = U_max[i];
-      } else if (U[i] < U_min[i]) {
-        U[i] = U_min[i];
-      }
-    }
-  }
-  // update_observer is whether or not to use the values in Y.
-  // stop_motors is whether or not to output all 0s.
-  void Update(bool update_observer, bool stop_motors) {
-    if (stop_motors) {
-      for (int i = 0; i < number_of_outputs; ++i) {
-        U[i] = 0.0;
-      }
-    } else {
-      // new power = constant * (goal - current prediction)
-      U.noalias() = K * (R - X_hat);
-      CapU();
-    }
-
-    if (update_observer) {
-      X_hat = (A - L * C) * X_hat + L * Y + B * U;
-    } else {
-      X_hat = A * X_hat + B * U;
-    }
-  }
-
- protected:
-  // these are accessible from non-templated subclasses
-  static const int number_of_states_var = number_of_states;
-  static const int number_of_outputs_var = number_of_outputs;
-};
-#endif  // FRC971_CONTROL_LOOPS_STATEFEEDBACKLOOP_H_
diff --git a/frc971/control_loops/angle_adjust/angle_adjust.cc b/frc971/control_loops/angle_adjust/angle_adjust.cc
new file mode 100644
index 0000000..ffb98f2
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust.cc
@@ -0,0 +1,85 @@
+#include "frc971/control_loops/angle_adjust/angle_adjust.h"
+
+#include <algorithm>
+
+#include "aos/common/control_loop/control_loops.q.h"
+#include "aos/common/logging/logging.h"
+
+#include "frc971/constants.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor_plant.h"
+
+namespace frc971 {
+namespace control_loops {
+
+AngleAdjustMotor::AngleAdjustMotor(
+    control_loops::AngleAdjustLoop *my_angle_adjust)
+    : aos::control_loops::ControlLoop<control_loops::AngleAdjustLoop>(
+        my_angle_adjust),
+      zeroed_joint_(MakeAngleAdjustLoop()) {
+  {
+    using ::frc971::constants::GetValues;
+    ZeroedJoint<2>::ConfigurationData config_data;
+
+    config_data.lower_limit = GetValues().angle_adjust_lower_limit;
+    config_data.upper_limit = GetValues().angle_adjust_upper_limit;
+    memcpy(config_data.hall_effect_start_angle,
+           GetValues().angle_adjust_hall_effect_start_angle,
+           sizeof(config_data.hall_effect_start_angle));
+    config_data.zeroing_off_speed = GetValues().angle_adjust_zeroing_off_speed;
+    config_data.zeroing_speed = GetValues().angle_adjust_zeroing_speed;
+
+    config_data.max_zeroing_voltage = 4.0;
+    config_data.deadband_voltage = GetValues().angle_adjust_deadband;
+
+    zeroed_joint_.set_config_data(config_data);
+  }
+}
+
+// Positive angle is up, and positive power is up.
+void AngleAdjustMotor::RunIteration(
+    const ::aos::control_loops::Goal *goal,
+    const control_loops::AngleAdjustLoop::Position *position,
+    ::aos::control_loops::Output *output,
+    ::aos::control_loops::Status *status) {
+
+  // Disable the motors now so that all early returns will return with the
+  // motors disabled.
+  if (output) {
+    output->voltage = 0;
+  }
+
+  ZeroedJoint<2>::PositionData transformed_position;
+  ZeroedJoint<2>::PositionData *transformed_position_ptr =
+      &transformed_position;
+  if (!position) {
+    transformed_position_ptr = NULL;
+  } else {
+    transformed_position.position = position->angle;
+    transformed_position.hall_effects[0] = position->bottom_hall_effect;
+    transformed_position.hall_effect_positions[0] =
+        position->bottom_calibration;
+    transformed_position.hall_effects[1] = position->middle_hall_effect;
+    transformed_position.hall_effect_positions[1] =
+        position->middle_calibration;
+  }
+
+  const double voltage = zeroed_joint_.Update(transformed_position_ptr,
+      output != NULL,
+      goal->goal, 0.0);
+
+  if (position) {
+    LOG(DEBUG, "pos: %f bottom_hall: %s middle_hall: %s absolute: %f\n",
+        position->angle,
+        position->bottom_hall_effect ? "true" : "false",
+        position->middle_hall_effect ? "true" : "false",
+        zeroed_joint_.absolute_position());
+  }
+
+  if (output) {
+    output->voltage = voltage;
+  }
+  status->done = ::std::abs(zeroed_joint_.absolute_position() - goal->goal) < 0.002;
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/angle_adjust/angle_adjust.gyp b/frc971/control_loops/angle_adjust/angle_adjust.gyp
new file mode 100644
index 0000000..323cb56
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust.gyp
@@ -0,0 +1,78 @@
+{
+  'targets': [
+    {
+      'target_name': 'angle_adjust_loop',
+      'type': 'static_library',
+      'sources': ['angle_adjust_motor.q'],
+      'variables': {
+        'header_path': 'frc971/control_loops/angle_adjust',
+      },
+      'dependencies': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+      ],
+      'includes': ['../../../aos/build/queues.gypi'],
+    },
+    {
+      'target_name': 'angle_adjust_lib',
+      'type': 'static_library',
+      'sources': [
+        'angle_adjust.cc',
+        'angle_adjust_motor_plant.cc',
+        'unaugmented_angle_adjust_motor_plant.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/common/common.gyp:controls',
+        '<(DEPTH)/frc971/frc971.gyp:constants',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        'angle_adjust_loop',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(AOS)/common/common.gyp:controls',
+        'angle_adjust_loop',
+      ],
+    },
+    {
+      'target_name': 'angle_adjust_lib_test',
+      'type': 'executable',
+      'sources': [
+        'angle_adjust_lib_test.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        'angle_adjust_lib',
+        '<(AOS)/common/common.gyp:queue_testutils',
+        'angle_adjust_loop',
+      ],
+    },
+    {
+      'target_name': 'angle_adjust_csv',
+      'type': 'executable',
+      'sources': [
+        'angle_adjust_csv.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/common/common.gyp:time',
+        '<(AOS)/common/common.gyp:timing',
+        'angle_adjust_loop',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+    },
+    {
+      'target_name': 'angle_adjust',
+      'type': 'executable',
+      'sources': [
+        'angle_adjust_main.cc',
+      ],
+      'dependencies': [
+        'angle_adjust_lib',
+        'angle_adjust_loop',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+      ],
+    },
+  ],
+}
diff --git a/frc971/control_loops/angle_adjust/angle_adjust.h b/frc971/control_loops/angle_adjust/angle_adjust.h
new file mode 100644
index 0000000..319e293
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust.h
@@ -0,0 +1,64 @@
+#ifndef FRC971_CONTROL_LOOPS_ANGLE_ADJUST_ANGLE_ADJUST_H_
+#define FRC971_CONTROL_LOOPS_ANGLE_ADJUST_ANGLE_ADJUST_H_
+
+#include <array>
+#include <memory>
+
+#include "aos/common/control_loop/ControlLoop.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor.q.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor_plant.h"
+#include "frc971/control_loops/zeroed_joint.h"
+
+namespace frc971 {
+namespace control_loops {
+
+// Allows the control loop to add the tests to access private members.
+namespace testing {
+class AngleAdjustTest_RezeroWithMissingPos_Test;
+class AngleAdjustTest_DisableGoesUninitialized_Test;
+}
+
+class AngleAdjustMotor
+  : public aos::control_loops::ControlLoop<control_loops::AngleAdjustLoop> {
+ public:
+  explicit AngleAdjustMotor(
+      control_loops::AngleAdjustLoop *my_angle_adjust =
+                                      &control_loops::angle_adjust);
+ protected:
+  virtual void RunIteration(
+    const ::aos::control_loops::Goal *goal,
+    const control_loops::AngleAdjustLoop::Position *position,
+    ::aos::control_loops::Output *output,
+    ::aos::control_loops::Status *status);
+
+  // True if the goal was moved to avoid goal windup.
+  bool capped_goal() const { return zeroed_joint_.capped_goal(); }
+
+  // True if the wrist is zeroing.
+  bool is_zeroing() const { return zeroed_joint_.is_zeroing(); }
+
+  // True if the wrist is zeroing.
+  bool is_moving_off() const { return zeroed_joint_.is_moving_off(); }
+
+  // True if the state machine is uninitialized.
+  bool is_uninitialized() const { return zeroed_joint_.is_uninitialized(); }
+
+  // True if the state machine is ready.
+  bool is_ready() const { return zeroed_joint_.is_ready(); }
+
+ private:
+  // Allows the testing code to access some of private members.
+  friend class testing::AngleAdjustTest_RezeroWithMissingPos_Test;
+  friend class testing::AngleAdjustTest_DisableGoesUninitialized_Test;
+
+  // The zeroed joint to use.
+  ZeroedJoint<2> zeroed_joint_;
+
+  DISALLOW_COPY_AND_ASSIGN(AngleAdjustMotor);
+};
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_ANGLE_ADJUST_ANGLE_ADJUST_H_
diff --git a/frc971/control_loops/angle_adjust/angle_adjust_csv.cc b/frc971/control_loops/angle_adjust/angle_adjust_csv.cc
new file mode 100644
index 0000000..109af56
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust_csv.cc
@@ -0,0 +1,52 @@
+#include "stdio.h"
+
+#include "aos/common/control_loop/Timing.h"
+#include "aos/common/time.h"
+#include "aos/atom_code/init.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor.q.h"
+
+using ::frc971::control_loops::angle_adjust;
+using ::aos::time::Time;
+
+// Records data from the queue and stores it in a .csv file which can then
+// be plotted/processed with relative ease.
+int main(int argc, char * argv[]) {
+  FILE *data_file = NULL;
+  FILE *output_file = NULL;
+
+  if (argc == 2) {
+    data_file = fopen(argv[1], "w");
+    output_file = data_file;
+  } else {
+    printf("Not saving to a CSV file.\n");
+    output_file = stdout;
+  }
+
+  fprintf(data_file, "time, power, position");
+
+  ::aos::Init();
+
+  Time start_time = Time::Now();
+
+  while (true) {
+    ::aos::time::PhasedLoop10MS(2000);
+    angle_adjust.goal.FetchLatest();
+    angle_adjust.status.FetchLatest();
+    angle_adjust.position.FetchLatest();
+    angle_adjust.output.FetchLatest();
+    if (angle_adjust.output.get() &&
+        angle_adjust.position.get()) {
+      fprintf(output_file, "\n%f, %f, %f",
+              (angle_adjust.position->sent_time - start_time).ToSeconds(), 
+              angle_adjust.output->voltage,
+              angle_adjust.position->angle);
+    }
+  }
+
+  if (data_file) {
+    fclose(data_file);
+  }
+
+  ::aos::Cleanup();
+  return 0;
+}
diff --git a/frc971/control_loops/angle_adjust/angle_adjust_data.csv b/frc971/control_loops/angle_adjust/angle_adjust_data.csv
new file mode 100644
index 0000000..3e3a9fb
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust_data.csv
@@ -0,0 +1,273 @@
+0.007086, 0.696383, -0.000596
+0.016561, 0.696383, -0.000596
+0.026648, 0.696383, -0.000596
+0.036501, 0.696383, -0.000596
+0.046475, 0.696383, -0.000596
+0.056429, 0.696383, -0.000596
+0.066661, 0.696383, -0.000596
+0.076538, 0.696383, -0.000596
+0.086562, 0.696383, -0.000596
+0.096496, 0.696383, -0.000596
+0.106453, 0.696383, -0.000596
+0.116673, 0.696383, -0.000596
+0.126529, 0.696383, -0.000596
+0.136500, 0.696383, -0.000596
+0.146462, 0.696383, -0.000596
+0.156442, 0.696383, -0.000596
+0.166658, 0.696383, -0.000596
+0.176508, 0.696383, -0.000596
+0.186466, 0.696383, -0.000596
+0.196514, 0.696383, -0.000596
+0.206469, 0.696383, -0.000596
+0.216679, 0.696383, -0.000596
+0.226464, 0.696383, -0.000596
+0.236401, 0.696383, -0.000596
+0.246476, 0.696383, -0.000596
+0.256391, 0.696383, -0.000596
+0.266650, 0.696383, -0.000596
+0.276517, 0.696383, -0.000596
+0.286565, 0.696383, -0.000596
+0.296526, 0.696383, -0.000596
+0.306469, 0.696383, -0.000596
+0.316703, 0.696383, -0.000596
+0.326546, 0.696383, -0.000596
+0.336500, 0.696383, -0.000596
+0.346466, 0.696383, -0.000596
+0.356397, 0.696383, -0.000596
+0.366658, 0.696383, -0.000596
+0.376517, 0.696383, -0.000596
+0.386461, 0.696383, -0.000596
+0.396497, 0.696383, -0.000596
+0.406516, 0.696383, -0.000596
+0.416662, 0.696383, -0.000596
+0.426498, 0.696383, -0.000596
+0.436506, 0.696383, -0.000596
+0.446560, 0.696383, -0.000596
+0.456494, 0.696383, -0.000596
+0.466635, 0.696383, -0.000596
+0.476505, 0.696383, -0.000596
+0.486529, 0.696383, -0.000596
+0.496494, 0.696383, -0.000596
+0.506479, 0.696383, -0.000596
+0.516679, 0.696383, -0.000596
+0.526550, 0.696383, -0.000596
+0.536505, 0.696383, -0.000596
+0.546452, 0.696383, -0.000596
+0.556481, 0.696383, -0.000596
+0.566531, 0.696383, -0.000596
+0.576513, 0.696383, -0.000596
+0.586463, 0.696383, -0.000596
+0.596771, 0.696383, -0.000596
+0.606503, 0.696383, -0.000596
+0.616679, 0.696383, -0.000596
+0.626483, 0.696383, -0.000596
+0.636496, 0.696383, -0.000596
+0.646654, 0.696383, -0.000596
+0.656423, 0.696383, -0.000596
+0.666661, 0.696383, -0.000596
+0.676531, 0.696383, -0.000596
+0.686526, 0.696383, -0.000596
+0.696670, 0.696383, -0.000596
+0.706628, 0.696383, -0.000596
+0.716675, 0.696383, -0.000596
+0.726719, 0.696383, -0.000596
+0.736498, 0.696383, -0.000596
+0.746484, 0.696383, -0.000596
+0.756468, 0.696383, -0.000596
+0.766526, 0.696383, -0.000596
+0.776498, 0.696383, -0.000596
+0.786469, 0.696383, -0.000596
+0.796251, 0.696383, -0.000596
+0.806312, 0.696383, -0.000596
+0.816579, 0.696383, -0.000596
+0.826352, 0.696383, -0.000596
+0.836395, 0.696383, -0.000596
+0.846460, 0.696383, -0.000596
+0.856333, 0.696383, -0.000596
+0.866312, 0.696383, -0.000596
+0.876541, 0.696383, -0.000596
+0.886231, 0.696383, -0.000596
+0.896378, 0.696383, -0.000596
+0.906549, 0.696383, -0.000596
+0.916219, 0.696383, -0.000596
+0.926300, 0.696383, -0.000596
+0.936212, 0.696383, -0.000596
+0.946392, 12.000000, -0.000596
+0.956205, 12.000000, -0.000596
+0.966382, 12.000000, 0.001192
+0.976384, 12.000000, 0.005962
+0.988371, 12.000000, 0.014906
+0.996207, 12.000000, 0.022657
+1.006429, 12.000000, 0.032794
+1.016788, 12.000000, 0.043526
+1.026528, 12.000000, 0.055451
+1.036616, 12.000000, 0.067376
+1.049418, 12.000000, 0.084071
+1.056874, 12.000000, 0.093015
+1.066581, 12.000000, 0.105536
+1.076708, 12.000000, 0.118653
+1.086697, 12.000000, 0.131771
+1.096754, 12.000000, 0.144888
+1.106694, 12.000000, 0.158006
+1.116795, 12.000000, 0.171123
+1.126945, 12.000000, 0.184241
+1.136491, 12.000000, 0.197358
+1.146490, 12.000000, 0.211072
+1.156720, 8.838210, 0.224189
+1.166497, 4.659384, 0.237307
+1.176550, 1.566925, 0.250424
+1.186490, -1.463977, 0.262945
+1.196706, -4.497083, 0.273081
+1.206413, -6.664959, 0.280833
+1.216504, -8.191987, 0.285603
+1.226718, -8.899323, 0.285603
+1.238720, -8.265740, 0.282025
+1.246502, -7.344013, 0.277851
+1.256515, -5.283271, 0.270696
+1.266504, -3.292020, 0.262945
+1.276639, -1.703019, 0.254598
+1.286435, 0.722641, 0.247443
+1.296401, 2.376863, 0.240884
+1.306274, 3.669941, 0.235518
+1.316431, 4.798566, 0.231940
+1.326280, 5.585790, 0.230748
+1.336257, 5.131469, 0.231344
+1.346265, 5.052962, 0.233133
+1.356246, 4.237080, 0.236710
+1.366233, 3.588899, 0.240288
+1.376252, 2.132660, 0.244462
+1.386339, 1.550053, 0.248039
+1.396224, 0.328756, 0.252213
+1.406339, -0.379540, 0.255194
+1.416340, -1.273041, 0.256983
+1.426200, -1.551323, 0.258175
+1.436332, -1.593706, 0.258772
+1.446348, -1.695210, 0.258175
+1.456324, -1.569522, 0.257579
+1.466365, -0.979101, 0.256387
+1.476513, -0.794073, 0.255194
+1.486723, -0.508791, 0.254002
+1.496495, -0.189683, 0.252809
+1.506430, 0.093002, 0.251617
+1.516565, 0.386294, 0.250424
+1.526518, 0.681860, 0.249828
+1.536477, 0.659148, 0.249828
+1.546440, 0.541822, 0.249828
+1.556459, 0.602564, 0.249828
+1.566511, 0.597167, 0.249828
+1.576515, 0.587492, 0.249828
+1.586463, 0.593212, 0.249828
+1.596495, 0.592427, 0.249828
+1.606519, 0.591648, 0.249828
+1.616647, 0.592179, 0.249828
+1.626482, 0.592082, 0.249828
+1.636498, 0.592021, 0.249828
+1.646521, 0.592070, 0.249828
+1.656480, 0.592059, 0.249828
+1.666552, 0.592055, 0.249828
+1.676484, 0.592059, 0.249828
+1.686525, 0.592058, 0.249828
+1.696670, 0.592057, 0.249828
+1.706459, 0.592058, 0.249828
+1.716735, 0.592058, 0.249828
+1.726493, 0.592058, 0.249828
+1.736508, 0.592058, 0.249828
+1.746452, 0.592058, 0.249828
+1.756477, 0.592058, 0.249828
+1.766815, 0.592058, 0.249828
+1.776500, 0.592058, 0.249828
+1.786441, 0.592058, 0.249828
+1.796462, 0.592058, 0.249828
+1.806512, 0.592058, 0.249828
+1.816550, 0.592058, 0.249828
+1.826504, 0.592058, 0.249828
+1.836496, 0.592058, 0.249828
+1.846519, 0.592058, 0.249828
+1.856477, 0.592058, 0.249828
+1.866533, 0.592058, 0.249828
+1.876513, 0.592058, 0.249828
+1.886541, 0.592058, 0.249828
+1.896490, 0.592058, 0.249828
+1.906479, -12.000000, 0.249828
+1.916446, -12.000000, 0.249828
+1.926530, -12.000000, 0.248635
+1.936520, -12.000000, 0.244462
+1.946463, -12.000000, 0.236710
+1.956469, -12.000000, 0.226574
+1.966515, -12.000000, 0.215842
+1.976560, -12.000000, 0.203917
+1.986476, -12.000000, 0.191396
+1.996480, -12.000000, 0.177682
+2.006460, -12.000000, 0.163968
+2.016545, -12.000000, 0.150254
+2.026495, -12.000000, 0.135944
+2.036471, -12.000000, 0.121635
+2.046473, -12.000000, 0.107325
+2.056469, -12.000000, 0.093015
+2.066524, -12.000000, 0.078705
+2.076516, -12.000000, 0.064395
+2.086512, -12.000000, 0.049489
+2.096561, -11.491993, 0.034582
+2.106457, -4.953303, 0.020272
+2.116661, -2.354450, 0.005366
+2.126490, 1.313071, -0.008347
+2.136461, 4.880571, -0.020272
+2.146526, 7.088633, -0.029216
+2.156469, 9.296628, -0.034582
+2.166524, 9.779309, -0.036371
+2.176504, 9.677380, -0.033986
+2.186457, 8.409415, -0.029216
+2.196463, 7.037205, -0.022657
+2.206499, 4.964211, -0.014906
+2.216552, 3.206835, -0.007155
+2.226456, 0.878265, 0.000596
+2.236471, -0.788450, 0.007751
+2.246517, -2.095142, 0.012521
+2.256472, -3.529778, 0.016099
+2.266416, -3.784184, 0.017887
+2.276485, -3.906740, 0.017291
+2.286520, -3.591089, 0.015502
+2.296497, -2.772296, 0.012521
+2.306461, -2.173367, 0.008944
+2.316561, -1.324239, 0.005962
+2.326547, -0.303999, 0.002385
+2.336490, 0.515297, -0.000596
+2.346453, 1.081194, -0.002981
+2.356491, 1.877482, -0.005366
+2.366526, 1.984534, -0.005962
+2.376468, 2.197044, -0.005962
+2.386411, 1.936623, -0.005962
+2.396484, 2.018387, -0.005366
+2.406517, 1.716757, -0.004770
+2.416569, 1.598133, -0.003577
+2.426463, 1.469285, -0.002981
+2.436457, 0.993349, -0.001789
+2.446504, 0.754160, -0.001192
+2.456498, 0.786747, -0.000596
+2.466418, 0.572920, -0.000596
+2.476482, 0.737242, -0.000596
+2.486521, 0.701741, -0.000596
+2.496489, 0.685572, -0.000596
+2.506441, 0.700476, -0.000596
+2.516718, 0.696605, -0.000596
+2.526498, 0.695450, -0.000596
+2.536473, 0.696784, -0.000596
+2.546448, 0.696379, -0.000596
+2.556479, 0.696304, -0.000596
+2.566517, 0.696421, -0.000596
+2.576491, 0.696380, -0.000596
+2.586447, 0.696376, -0.000596
+2.596495, 0.696386, -0.000596
+2.606515, 0.696382, -0.000596
+2.616555, 0.696382, -0.000596
+2.626465, 0.696383, -0.000596
+2.636463, 0.696383, -0.000596
+2.646513, 0.696383, -0.000596
+2.656499, 0.696383, -0.000596
+2.666488, 0.696383, -0.000596
+2.676556, 0.696383, -0.000596
+2.686505, 0.696383, -0.000596
+2.696457, 0.696383, -0.000596
+2.706448, 0.696383, -0.000596
+2.716562, 0.696383, -0.000596
+2.726498, 0.696383, -0.000596
diff --git a/frc971/control_loops/angle_adjust/angle_adjust_lib_test.cc b/frc971/control_loops/angle_adjust/angle_adjust_lib_test.cc
new file mode 100644
index 0000000..0ea7201
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust_lib_test.cc
@@ -0,0 +1,307 @@
+#include <unistd.h>
+
+#include <memory>
+#include <array>
+
+#include "gtest/gtest.h"
+#include "aos/common/queue.h"
+#include "aos/common/queue_testutils.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor.q.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust.h"
+#include "frc971/control_loops/angle_adjust/unaugmented_angle_adjust_motor_plant.h"
+#include "frc971/constants.h"
+
+
+using ::aos::time::Time;
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+
+
+// Class which simulates the angle_adjust and
+// sends out queue messages containing the position.
+class AngleAdjustMotorSimulation {
+ public:
+  // Constructs a motor simulation.  initial_position is the inital angle of the
+  // angle_adjust, which will be treated as 0 by the encoder.
+  explicit AngleAdjustMotorSimulation(double initial_position)
+      : angle_adjust_plant_(
+          new StateFeedbackPlant<2, 1, 1>(MakeRawAngleAdjustPlant())),
+        my_angle_adjust_loop_(".frc971.control_loops.angle_adjust",
+                       0x65c7ef53, ".frc971.control_loops.angle_adjust.goal",
+                       ".frc971.control_loops.angle_adjust.position",
+                       ".frc971.control_loops.angle_adjust.output",
+                       ".frc971.control_loops.angle_adjust.status") {
+    Reinitialize(initial_position);
+  }
+
+  // Resets the plant so that it starts at initial_position.
+  void Reinitialize(double initial_position) {
+    initial_position_ = initial_position;
+    angle_adjust_plant_->X(0, 0) = initial_position_;
+    angle_adjust_plant_->X(1, 0) = 0.0;
+    angle_adjust_plant_->Y = angle_adjust_plant_->C() * angle_adjust_plant_->X;
+    last_position_ = angle_adjust_plant_->Y(0, 0);
+    last_voltage_ = 0.0;
+    calibration_value_[0] = 0.0;
+    calibration_value_[1] = 0.0;
+  }
+
+  // Returns the absolute angle of the angle_adjust.
+  double GetAbsolutePosition() const {
+    return angle_adjust_plant_->Y(0, 0);
+  }
+
+  // Returns the adjusted angle of the angle_adjust.
+  double GetPosition() const {
+    return GetAbsolutePosition() - initial_position_;
+  }
+
+  // Sends out the position queue messages.
+  void SendPositionMessage() {
+    const double angle = GetPosition();
+
+    ::aos::ScopedMessagePtr<control_loops::AngleAdjustLoop::Position> position =
+        my_angle_adjust_loop_.position.MakeMessage();
+    position->angle = angle;
+
+    const double (&hall_effect_start_angle)[2] =
+        constants::GetValues().angle_adjust_hall_effect_start_angle;
+    const double (&hall_effect_stop_angle)[2] =
+        constants::GetValues().angle_adjust_hall_effect_stop_angle;
+
+    // Signal that the hall effect sensor has been triggered if it is within
+    // the correct range.
+    double abs_position = GetAbsolutePosition();
+    if (abs_position <= hall_effect_start_angle[0] &&
+        abs_position >= hall_effect_stop_angle[0]) {
+      position->bottom_hall_effect = true;
+    } else {
+      position->bottom_hall_effect = false;
+    }
+    if (abs_position <= hall_effect_start_angle[1] &&
+        abs_position >= hall_effect_stop_angle[1]) {
+      position->middle_hall_effect = true;
+    } else {
+      position->middle_hall_effect = false;
+    }
+
+    // Only set calibration if it changed last cycle.  Calibration starts out
+    // with a value of 0.
+    // TODO(aschuh): This won't deal with both edges correctly.
+    if ((last_position_ < hall_effect_start_angle[0] ||
+         last_position_ > hall_effect_stop_angle[0]) &&
+         (position->bottom_hall_effect)) {
+      calibration_value_[0] = hall_effect_start_angle[0] - initial_position_;
+    }
+    if ((last_position_ < hall_effect_start_angle[1] ||
+         last_position_ > hall_effect_stop_angle[1]) &&
+         (position->middle_hall_effect)) {
+      calibration_value_[1] = hall_effect_start_angle[1] - initial_position_;
+    }
+
+    position->bottom_calibration = calibration_value_[0];
+    position->middle_calibration = calibration_value_[1];
+    position.Send();
+  }
+
+  // Simulates the angle_adjust moving for one timestep.
+  void Simulate() {
+    last_position_ = angle_adjust_plant_->Y(0, 0);
+    EXPECT_TRUE(my_angle_adjust_loop_.output.FetchLatest());
+    angle_adjust_plant_->U << last_voltage_;
+    angle_adjust_plant_->Update();
+
+    EXPECT_GE(constants::GetValues().angle_adjust_upper_physical_limit,
+              angle_adjust_plant_->Y(0, 0));
+    EXPECT_LE(constants::GetValues().angle_adjust_lower_physical_limit,
+              angle_adjust_plant_->Y(0, 0));
+    last_voltage_ = my_angle_adjust_loop_.output->voltage;
+  }
+
+  ::std::unique_ptr<StateFeedbackPlant<2, 1, 1>> angle_adjust_plant_;
+
+ private:
+  AngleAdjustLoop my_angle_adjust_loop_;
+  double initial_position_;
+  double last_position_;
+  double last_voltage_;
+  double calibration_value_[2];
+};
+
+class AngleAdjustTest : public ::testing::Test {
+ protected:
+  ::aos::common::testing::GlobalCoreInstance my_core;
+
+  // Create a new instance of the test queue so that it invalidates the queue
+  // that it points to.  Otherwise, we will have a pointer to shared memory that
+  // is no longer valid.
+  AngleAdjustLoop my_angle_adjust_loop_;
+
+  // Create a loop and simulation plant.
+  AngleAdjustMotor angle_adjust_motor_;
+  AngleAdjustMotorSimulation angle_adjust_motor_plant_;
+
+  AngleAdjustTest() :
+    my_angle_adjust_loop_(".frc971.control_loops.angle_adjust",
+                          0x65c7ef53, ".frc971.control_loops.angle_adjust.goal",
+                          ".frc971.control_loops.angle_adjust.position",
+                          ".frc971.control_loops.angle_adjust.output",
+                          ".frc971.control_loops.angle_adjust.status"),
+    angle_adjust_motor_(&my_angle_adjust_loop_),
+    angle_adjust_motor_plant_(0.75) {
+    // Flush the robot state queue so we can use clean shared memory for this
+    // test.
+    ::aos::robot_state.Clear();
+    SendDSPacket(true);
+  }
+
+  void SendDSPacket(bool enabled) {
+    ::aos::robot_state.MakeWithBuilder().enabled(enabled)
+                                        .autonomous(false)
+                                        .team_id(971).Send();
+    ::aos::robot_state.FetchLatest();
+  }
+
+  void VerifyNearGoal() {
+    my_angle_adjust_loop_.goal.FetchLatest();
+    my_angle_adjust_loop_.position.FetchLatest();
+    EXPECT_NEAR(my_angle_adjust_loop_.goal->goal,
+                angle_adjust_motor_plant_.GetAbsolutePosition(),
+                1e-4);
+  }
+
+  virtual ~AngleAdjustTest() {
+    ::aos::robot_state.Clear();
+  }
+};
+
+// Tests that the angle_adjust zeros correctly and goes to a position.
+TEST_F(AngleAdjustTest, ZerosCorrectly) {
+  my_angle_adjust_loop_.goal.MakeWithBuilder().goal(0.4).Send();
+  for (int i = 0; i < 400; ++i) {
+    angle_adjust_motor_plant_.SendPositionMessage();
+    angle_adjust_motor_.Iterate();
+    angle_adjust_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that the angle_adjust zeros correctly starting on the sensor.
+TEST_F(AngleAdjustTest, ZerosStartingOn) {
+  angle_adjust_motor_plant_.Reinitialize(0.30);
+  my_angle_adjust_loop_.goal.MakeWithBuilder().goal(0.4).Send();
+  for (int i = 0; i < 500; ++i) {
+    angle_adjust_motor_plant_.SendPositionMessage();
+    angle_adjust_motor_.Iterate();
+    angle_adjust_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that missing positions are correctly handled.
+TEST_F(AngleAdjustTest, HandleMissingPosition) {
+  my_angle_adjust_loop_.goal.MakeWithBuilder().goal(0.4).Send();
+  for (int i = 0; i < 400; ++i) {
+    if (i % 23) {
+      angle_adjust_motor_plant_.SendPositionMessage();
+    }
+    angle_adjust_motor_.Iterate();
+    angle_adjust_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that losing the encoder for 11 seconds triggers a re-zero.
+TEST_F(AngleAdjustTest, RezeroWithMissingPos) {
+  my_angle_adjust_loop_.goal.MakeWithBuilder().goal(0.4).Send();
+  for (int i = 0; i < 1800; ++i) {
+    // After 3 seconds, simulate the encoder going missing.
+    // This should trigger a re-zero.  To make sure it works, change the goal as
+    // well.
+    if (i < 300 || i > 1400) {
+      angle_adjust_motor_plant_.SendPositionMessage();
+    } else {
+      if (i > 1310) {
+        // Should be re-zeroing now.
+        EXPECT_TRUE(angle_adjust_motor_.is_uninitialized());
+      }
+      my_angle_adjust_loop_.goal.MakeWithBuilder().goal(0.5).Send();
+    }
+    if (i == 1430) {
+      EXPECT_TRUE(angle_adjust_motor_.is_zeroing() ||
+                  angle_adjust_motor_.is_moving_off());
+    }
+
+    angle_adjust_motor_.Iterate();
+    angle_adjust_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that disabling while zeroing sends the state machine into the
+// uninitialized state.
+TEST_F(AngleAdjustTest, DisableGoesUninitialized) {
+  my_angle_adjust_loop_.goal.MakeWithBuilder().goal(0.4).Send();
+  for (int i = 0; i < 800; ++i) {
+    angle_adjust_motor_plant_.SendPositionMessage();
+    // After 0.5 seconds, disable the robot.
+    if (i > 50 && i < 200) {
+      SendDSPacket(false);
+      if (i > 100) {
+        // Give the loop a couple cycled to get the message and then verify that
+        // it is in the correct state.
+        EXPECT_TRUE(angle_adjust_motor_.is_uninitialized());
+      }
+    } else {
+      SendDSPacket(true);
+    }
+    if (i == 202) {
+      // Verify that we are zeroing after the bot gets enabled again.
+      EXPECT_TRUE(angle_adjust_motor_.is_zeroing());
+    }
+
+    angle_adjust_motor_.Iterate();
+    angle_adjust_motor_plant_.Simulate();
+  }
+  VerifyNearGoal();
+}
+
+/*
+// TODO(aschuh): Enable these tests if we install a second hall effect sensor.
+// Tests that the angle_adjust zeros correctly from above the second sensor.
+TEST_F(AngleAdjustTest, ZerosCorrectlyAboveSecond) {
+  angle_adjust_motor_plant_.Reinitialize(1.75);
+  my_angle_adjust_loop_.goal.MakeWithBuilder().goal(1.0).Send();
+  for (int i = 0; i < 400; ++i) {
+    angle_adjust_motor_plant_.SendPositionMessage();
+    angle_adjust_motor_.Iterate();
+    angle_adjust_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that the angle_adjust zeros correctly starting on
+// the second hall effect sensor.
+TEST_F(AngleAdjustTest, ZerosStartingOnSecond) {
+  angle_adjust_motor_plant_.Reinitialize(1.25);
+  my_angle_adjust_loop_.goal.MakeWithBuilder().goal(1.0).Send();
+  for (int i = 0; i < 500; ++i) {
+    angle_adjust_motor_plant_.SendPositionMessage();
+    angle_adjust_motor_.Iterate();
+    angle_adjust_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+*/
+
+}  // namespace testing
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/angle_adjust/angle_adjust_main.cc b/frc971/control_loops/angle_adjust/angle_adjust_main.cc
new file mode 100644
index 0000000..c7f725b
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust_main.cc
@@ -0,0 +1,11 @@
+#include "frc971/control_loops/angle_adjust/angle_adjust.h"
+
+#include "aos/atom_code/init.h"
+
+int main() {
+  ::aos::Init();
+  ::frc971::control_loops::AngleAdjustMotor angle_adjust;
+  angle_adjust.Run();
+  ::aos::Cleanup();
+  return 0;
+}
diff --git a/frc971/control_loops/angle_adjust/angle_adjust_motor.q b/frc971/control_loops/angle_adjust/angle_adjust_motor.q
new file mode 100644
index 0000000..a98419a
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust_motor.q
@@ -0,0 +1,24 @@
+package frc971.control_loops;
+
+import "aos/common/control_loop/control_loops.q";
+
+queue_group AngleAdjustLoop {
+  implements aos.control_loops.ControlLoop;
+
+  message Position {
+    // Angle of the height adjust.
+    double angle;
+    bool bottom_hall_effect;
+    bool middle_hall_effect;
+    // The exact position when the corresponding hall_effect changed.
+    double bottom_calibration;
+    double middle_calibration;
+  };
+
+  queue aos.control_loops.Goal goal;
+  queue Position position;
+  queue aos.control_loops.Output output;
+  queue aos.control_loops.Status status;
+};
+
+queue_group AngleAdjustLoop angle_adjust;
diff --git a/frc971/control_loops/angle_adjust/angle_adjust_motor_plant.cc b/frc971/control_loops/angle_adjust/angle_adjust_motor_plant.cc
new file mode 100644
index 0000000..5ae9e0b
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust_motor_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<3, 1, 1> MakeAngleAdjustPlantCoefficients() {
+  Eigen::Matrix<double, 3, 3> A;
+  A << 1.0, 0.00844804908295, 0.000186726546509, 0.0, 0.706562970689, 0.0353055515475, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 3, 1> B;
+  B << 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 1, 3> C;
+  C << 1.0, 0.0, 0.0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0.0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<3, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<3, 1, 1> MakeAngleAdjustController() {
+  Eigen::Matrix<double, 3, 1> L;
+  L << 1.82656297069, 80.440440048, 562.416026082;
+  Eigen::Matrix<double, 1, 3> K;
+  K << 171.984283883, 5.25098015082, 1.01656297069;
+  return StateFeedbackController<3, 1, 1>(L, K, MakeAngleAdjustPlantCoefficients());
+}
+
+StateFeedbackPlant<3, 1, 1> MakeAngleAdjustPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<3, 1, 1> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<3, 1, 1>(MakeAngleAdjustPlantCoefficients());
+  return StateFeedbackPlant<3, 1, 1>(plants);
+}
+
+StateFeedbackLoop<3, 1, 1> MakeAngleAdjustLoop() {
+  ::std::vector<StateFeedbackController<3, 1, 1> *> controllers(1);
+  controllers[0] = new StateFeedbackController<3, 1, 1>(MakeAngleAdjustController());
+  return StateFeedbackLoop<3, 1, 1>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/angle_adjust/angle_adjust_motor_plant.h b/frc971/control_loops/angle_adjust/angle_adjust_motor_plant.h
new file mode 100644
index 0000000..7141fa9
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/angle_adjust_motor_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_ANGLE_ADJUST_ANGLE_ADJUST_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_ANGLE_ADJUST_ANGLE_ADJUST_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<3, 1, 1> MakeAngleAdjustPlantCoefficients();
+
+StateFeedbackController<3, 1, 1> MakeAngleAdjustController();
+
+StateFeedbackPlant<3, 1, 1> MakeAngleAdjustPlant();
+
+StateFeedbackLoop<3, 1, 1> MakeAngleAdjustLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_ANGLE_ADJUST_ANGLE_ADJUST_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/angle_adjust/unaugmented_angle_adjust_motor_plant.cc b/frc971/control_loops/angle_adjust/unaugmented_angle_adjust_motor_plant.cc
new file mode 100644
index 0000000..9efffc3
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/unaugmented_angle_adjust_motor_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/angle_adjust/unaugmented_angle_adjust_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeAngleAdjustRawPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00844804908295, 0.0, 0.706562970689;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.000186726546509, 0.0353055515475;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<2, 1, 1> MakeAngleAdjustRawController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.60656297069, 51.0341417582;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 264.830871921, 10.681380124;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeAngleAdjustRawPlantCoefficients());
+}
+
+StateFeedbackPlant<2, 1, 1> MakeRawAngleAdjustPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<2, 1, 1> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeAngleAdjustRawPlantCoefficients());
+  return StateFeedbackPlant<2, 1, 1>(plants);
+}
+
+StateFeedbackLoop<2, 1, 1> MakeRawAngleAdjustLoop() {
+  ::std::vector<StateFeedbackController<2, 1, 1> *> controllers(1);
+  controllers[0] = new StateFeedbackController<2, 1, 1>(MakeAngleAdjustRawController());
+  return StateFeedbackLoop<2, 1, 1>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/angle_adjust/unaugmented_angle_adjust_motor_plant.h b/frc971/control_loops/angle_adjust/unaugmented_angle_adjust_motor_plant.h
new file mode 100644
index 0000000..c066e0a
--- /dev/null
+++ b/frc971/control_loops/angle_adjust/unaugmented_angle_adjust_motor_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_ANGLE_ADJUST_UNAUGMENTED_ANGLE_ADJUST_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_ANGLE_ADJUST_UNAUGMENTED_ANGLE_ADJUST_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeAngleAdjustRawPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeAngleAdjustRawController();
+
+StateFeedbackPlant<2, 1, 1> MakeRawAngleAdjustPlant();
+
+StateFeedbackLoop<2, 1, 1> MakeRawAngleAdjustLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_ANGLE_ADJUST_UNAUGMENTED_ANGLE_ADJUST_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/control_loops.gyp b/frc971/control_loops/control_loops.gyp
index a9ddb12..94c73d0 100644
--- a/frc971/control_loops/control_loops.gyp
+++ b/frc971/control_loops/control_loops.gyp
@@ -1,41 +1,15 @@
 {
-  'variables': {
-    'loop_files': [
-      'DriveTrain.q',
-    ]
-  },
   'targets': [
     {
-      'target_name': 'control_loops',
+      'target_name': 'state_feedback_loop',
       'type': 'static_library',
-      'sources': ['<@(loop_files)'],
-      'variables': {
-        'header_path': 'frc971/control_loops',
-      },
+      'sources': [
+        #'state_feedback_loop.h'
+      ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(AOS)/common/common.gyp:control_loop_queues',
-        '<(AOS)/common/common.gyp:queues',
+        '<(EXTERNALS):eigen',
       ],
       'export_dependent_settings': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(AOS)/common/common.gyp:control_loop_queues',
-        '<(AOS)/common/common.gyp:queues',
-      ],
-      'includes': ['../../aos/build/queues.gypi'],
-    },
-    {
-      'target_name': 'DriveTrain',
-      'type': 'executable',
-      'sources': [
-        'DriveTrain.cc',
-      ],
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:logging',
-        '<(AOS)/common/common.gyp:controls',
-        '<(AOS)/build/aos.gyp:libaos',
-        'control_loops',
-        '<(DEPTH)/frc971/queues/queues.gyp:queues',
         '<(EXTERNALS):eigen',
       ],
     },
diff --git a/frc971/control_loops/drivetrain/drivetrain.cc b/frc971/control_loops/drivetrain/drivetrain.cc
new file mode 100644
index 0000000..bcd62f9
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain.cc
@@ -0,0 +1,769 @@
+#include "frc971/control_loops/drivetrain/drivetrain.h"
+
+#include <stdio.h>
+#include <sched.h>
+#include <cmath>
+#include <memory>
+#include "Eigen/Dense"
+
+#include "aos/common/logging/logging.h"
+#include "aos/common/queue.h"
+#include "aos/controls/polytope.h"
+#include "aos/common/commonmath.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+#include "frc971/control_loops/drivetrain/polydrivetrain_cim_plant.h"
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/queues/GyroAngle.q.h"
+#include "frc971/queues/Piston.q.h"
+#include "frc971/constants.h"
+
+using frc971::sensors::gyro;
+
+namespace frc971 {
+namespace control_loops {
+
+// Width of the robot.
+const double width = 22.0 / 100.0 * 2.54;
+
+Eigen::Matrix<double, 2, 1> CoerceGoal(aos::controls::HPolytope<2> &region,
+                                       const Eigen::Matrix<double, 1, 2> &K,
+                                       double w,
+                                       const Eigen::Matrix<double, 2, 1> &R) {
+  if (region.IsInside(R)) {
+    return R;
+  }
+  Eigen::Matrix<double, 2, 1> parallel_vector;
+  Eigen::Matrix<double, 2, 1> perpendicular_vector;
+  perpendicular_vector = K.transpose().normalized();
+  parallel_vector << perpendicular_vector(1, 0), -perpendicular_vector(0, 0);
+
+  aos::controls::HPolytope<1> t_poly(
+      region.H() * parallel_vector,
+      region.k() - region.H() * perpendicular_vector * w);
+
+  Eigen::Matrix<double, 1, Eigen::Dynamic> vertices = t_poly.Vertices();
+  if (vertices.innerSize() > 0) {
+    double min_distance_sqr = 0;
+    Eigen::Matrix<double, 2, 1> closest_point;
+    for (int i = 0; i < vertices.innerSize(); i++) {
+      Eigen::Matrix<double, 2, 1> point;
+      point = parallel_vector * vertices(0, i) + perpendicular_vector * w;
+      const double length = (R - point).squaredNorm();
+      if (i == 0 || length < min_distance_sqr) {
+        closest_point = point;
+        min_distance_sqr = length;
+      }
+    }
+    return closest_point;
+  } else {
+    Eigen::Matrix<double, 2, Eigen::Dynamic> region_vertices =
+        region.Vertices();
+    double min_distance;
+    int closest_i = 0;
+    for (int i = 0; i < region_vertices.outerSize(); i++) {
+      const double length = ::std::abs(
+          (perpendicular_vector.transpose() * (region_vertices.col(i)))(0, 0));
+      if (i == 0 || length < min_distance) {
+        closest_i = i;
+        min_distance = length;
+      }
+    }
+    return region_vertices.col(closest_i);
+  }
+}
+
+class DrivetrainMotorsSS {
+ public:
+  DrivetrainMotorsSS()
+      : loop_(new StateFeedbackLoop<4, 2, 2>(
+            constants::GetValues().make_drivetrain_loop())) {
+    _offset = 0;
+    _integral_offset = 0;
+    _left_goal = 0.0;
+    _right_goal = 0.0;
+    _raw_left = 0.0;
+    _raw_right = 0.0;
+    _control_loop_driving = false;
+  }
+  void SetGoal(double left, double left_velocity, double right, double right_velocity) {
+    _left_goal = left;
+    _right_goal = right;
+    loop_->R << left, left_velocity, right, right_velocity;
+  }
+  void SetRawPosition(double left, double right) {
+    _raw_right = right;
+    _raw_left = left;
+    loop_->Y << left, right;
+  }
+  void SetPosition(
+      double left, double right, double gyro, bool control_loop_driving) {
+    // Decay the offset quickly because this gyro is great.
+    _offset = (0.25) * (right - left - gyro * width) / 2.0 + 0.75 * _offset;
+    //const double angle_error = (_right_goal - _left_goal) / width - (_raw_right - _offset - _raw_left - _offset) / width;
+    // TODO(aschuh): Add in the gyro.
+    _integral_offset = 0.0;
+    _offset = 0.0;
+    _gyro = gyro;
+    _control_loop_driving = control_loop_driving;
+    SetRawPosition(left, right);
+  }
+
+  void Update(bool update_observer, bool stop_motors) {
+    loop_->Update(update_observer, stop_motors);
+  }
+
+  void SendMotors(Drivetrain::Output *output) {
+    if (output) {
+      output->left_voltage = loop_->U(0, 0);
+      output->right_voltage = loop_->U(1, 0);
+    }
+  }
+  void PrintMotors() const {
+    // LOG(DEBUG, "Left Power %f Right Power %f lg %f rg %f le %f re %f gyro %f\n", U[0], U[1], R[0], R[2], Y[0], Y[1], _gyro);
+    ::Eigen::Matrix<double, 4, 1> E = loop_->R - loop_->X_hat;
+    LOG(DEBUG, "E[0, 0]: %f E[1, 0] %f E[2, 0] %f E[3, 0] %f\n", E(0, 0), E(1, 0), E(2, 0), E(3, 0));
+  }
+
+ private:
+  ::std::unique_ptr<StateFeedbackLoop<4, 2, 2>> loop_;
+
+  double _integral_offset;
+  double _offset;
+  double _gyro;
+  double _left_goal;
+  double _right_goal;
+  double _raw_left;
+  double _raw_right;
+  bool _control_loop_driving;
+};
+
+class PolyDrivetrain {
+ public:
+
+  enum Gear {
+    HIGH,
+    LOW,
+    SHIFTING_UP,
+    SHIFTING_DOWN
+  };
+  // Stall Torque in N m
+  static constexpr double kStallTorque = 2.42;
+  // Stall Current in Amps
+  static constexpr double kStallCurrent = 133;
+  // Free Speed in RPM. Used number from last year.
+  static constexpr double kFreeSpeed = 4650.0;
+  // Free Current in Amps
+  static constexpr double kFreeCurrent = 2.7;
+  // Moment of inertia of the drivetrain in kg m^2
+  // Just borrowed from last year.
+  static constexpr double J = 6.4;
+  // Mass of the robot, in kg.
+  static constexpr double m = 68;
+  // Radius of the robot, in meters (from last year).
+  static constexpr double rb = 0.617998644 / 2.0;
+  static constexpr double kWheelRadius = 0.04445;
+  // Resistance of the motor, divided by the number of motors.
+  static constexpr double kR = (12.0 / kStallCurrent / 4 + 0.03) / (0.93 * 0.93);
+  // Motor velocity constant
+  static constexpr double Kv =
+      ((kFreeSpeed / 60.0 * 2.0 * M_PI) / (12.0 - kR * kFreeCurrent));
+  // Torque constant
+  static constexpr double Kt = kStallTorque / kStallCurrent;
+
+  PolyDrivetrain()
+      : U_Poly_((Eigen::Matrix<double, 4, 2>() << /*[[*/ 1, 0 /*]*/,
+                 /*[*/ -1, 0 /*]*/,
+                 /*[*/ 0, 1 /*]*/,
+                 /*[*/ 0, -1 /*]]*/).finished(),
+                (Eigen::Matrix<double, 4, 1>() << /*[[*/ 12 /*]*/,
+                 /*[*/ 12 /*]*/,
+                 /*[*/ 12 /*]*/,
+                 /*[*/ 12 /*]]*/).finished()),
+        loop_(new StateFeedbackLoop<2, 2, 2>(
+            constants::GetValues().make_v_drivetrain_loop())),
+        left_cim_(new StateFeedbackLoop<1, 1, 1>(MakeCIMLoop())),
+        right_cim_(new StateFeedbackLoop<1, 1, 1>(MakeCIMLoop())),
+        ttrust_(1.1),
+        wheel_(0.0),
+        throttle_(0.0),
+        quickturn_(false),
+        stale_count_(0),
+        position_time_delta_(0.01),
+        left_gear_(LOW),
+        right_gear_(LOW),
+        counter_(0) {
+
+    last_position_.Zero();
+    position_.Zero();
+  }
+  static bool IsInGear(Gear gear) { return gear == LOW || gear == HIGH; }
+
+  static double MotorSpeed(double shifter_position, double velocity) {
+    // TODO(austin): G_high, G_low and kWheelRadius
+    if (shifter_position > 0.57) {
+      return velocity / constants::GetValues().high_gear_ratio / kWheelRadius;
+    } else {
+      return velocity / constants::GetValues().low_gear_ratio / kWheelRadius;
+    }
+  }
+
+  Gear ComputeGear(double velocity, Gear current) {
+    const double low_omega = MotorSpeed(0, ::std::abs(velocity));
+    const double high_omega = MotorSpeed(1.0, ::std::abs(velocity));
+
+    double high_torque = ((12.0 - high_omega / Kv) * Kt / kR);
+    double low_torque = ((12.0 - low_omega / Kv) * Kt / kR);
+    double high_power = high_torque * high_omega;
+    double low_power = low_torque * low_omega;
+
+    // TODO(aschuh): Do this right!
+    if ((current == HIGH || high_power > low_power + 160) &&
+        ::std::abs(velocity) > 0.14) {
+      return HIGH;
+    } else {
+      return LOW;
+    }
+  }
+
+  void SetGoal(double wheel, double throttle, bool quickturn, bool highgear) {
+    const double kWheelNonLinearity = 0.3;
+    // Apply a sin function that's scaled to make it feel better.
+    const double angular_range = M_PI_2 * kWheelNonLinearity;
+    wheel_ = sin(angular_range * wheel) / sin(angular_range);
+    wheel_ = sin(angular_range * wheel_) / sin(angular_range);
+    quickturn_ = quickturn;
+
+    static const double kThrottleDeadband = 0.05;
+    if (::std::abs(throttle) < kThrottleDeadband) {
+      throttle_ = 0;
+    } else {
+      throttle_ = copysign((::std::abs(throttle) - kThrottleDeadband) /
+                           (1.0 - kThrottleDeadband), throttle);
+    }
+
+    // TODO(austin): Fix the upshift logic to include states.
+    Gear requested_gear;
+    if (false) {
+      const double current_left_velocity =
+          (position_.left_encoder - last_position_.left_encoder) /
+          position_time_delta_;
+      const double current_right_velocity =
+          (position_.right_encoder - last_position_.right_encoder) /
+          position_time_delta_;
+
+      Gear left_requested = ComputeGear(current_left_velocity, left_gear_);
+      Gear right_requested = ComputeGear(current_right_velocity, right_gear_);
+      requested_gear =
+          (left_requested == HIGH || right_requested == HIGH) ? HIGH : LOW;
+    } else {
+      requested_gear = highgear ? HIGH : LOW;
+    }
+
+    const Gear shift_up =
+        constants::GetValues().clutch_transmission ? HIGH : SHIFTING_UP;
+    const Gear shift_down =
+        constants::GetValues().clutch_transmission ? LOW : SHIFTING_DOWN;
+
+    if (left_gear_ != requested_gear) {
+      if (IsInGear(left_gear_)) {
+        if (requested_gear == HIGH) {
+          left_gear_ = shift_up;
+        } else {
+          left_gear_ = shift_down;
+        }
+      } else {
+        if (requested_gear == HIGH && left_gear_ == SHIFTING_DOWN) {
+          left_gear_ = SHIFTING_UP;
+        } else if (requested_gear == LOW && left_gear_ == SHIFTING_UP) {
+          left_gear_ = SHIFTING_DOWN;
+        }
+      }
+    }
+    if (right_gear_ != requested_gear) {
+      if (IsInGear(right_gear_)) {
+        if (requested_gear == HIGH) {
+          right_gear_ = shift_up;
+        } else {
+          right_gear_ = shift_down;
+        }
+      } else {
+        if (requested_gear == HIGH && right_gear_ == SHIFTING_DOWN) {
+          right_gear_ = SHIFTING_UP;
+        } else if (requested_gear == LOW && right_gear_ == SHIFTING_UP) {
+          right_gear_ = SHIFTING_DOWN;
+        }
+      }
+    }
+  }
+  void SetPosition(const Drivetrain::Position *position) {
+    if (position == NULL) {
+      ++stale_count_;
+    } else {
+      last_position_ = position_;
+      position_ = *position;
+      position_time_delta_ = (stale_count_ + 1) * 0.01;
+      stale_count_ = 0;
+    }
+
+    if (position) {
+      // Switch to the correct controller.
+      // TODO(austin): Un-hard code 0.57
+      if (position->left_shifter_position < 0.57) {
+        if (position->right_shifter_position < 0.57 || right_gear_ == LOW) {
+          LOG(DEBUG, "Loop Left low, Right low\n");
+          loop_->set_controller_index(0);
+        } else {
+          LOG(DEBUG, "Loop Left low, Right high\n");
+          loop_->set_controller_index(1);
+        }
+      } else {
+        if (position->right_shifter_position < 0.57 || left_gear_ == LOW) {
+          LOG(DEBUG, "Loop Left high, Right low\n");
+          loop_->set_controller_index(2);
+        } else {
+          LOG(DEBUG, "Loop Left high, Right high\n");
+          loop_->set_controller_index(3);
+        }
+      }
+      switch (left_gear_) {
+        case LOW:
+          LOG(DEBUG, "Left is in low\n");
+          break;
+        case HIGH:
+          LOG(DEBUG, "Left is in high\n");
+          break;
+        case SHIFTING_UP:
+          LOG(DEBUG, "Left is shifting up\n");
+          break;
+        case SHIFTING_DOWN:
+          LOG(DEBUG, "Left is shifting down\n");
+          break;
+      }
+      switch (right_gear_) {
+        case LOW:
+          LOG(DEBUG, "Right is in low\n");
+          break;
+        case HIGH:
+          LOG(DEBUG, "Right is in high\n");
+          break;
+        case SHIFTING_UP:
+          LOG(DEBUG, "Right is shifting up\n");
+          break;
+        case SHIFTING_DOWN:
+          LOG(DEBUG, "Right is shifting down\n");
+          break;
+      }
+      // TODO(austin): Constants.
+      if (position->left_shifter_position > 0.9 && left_gear_ == SHIFTING_UP) {
+        left_gear_ = HIGH;
+      }
+      if (position->left_shifter_position < 0.1 && left_gear_ == SHIFTING_DOWN) {
+        left_gear_ = LOW;
+      }
+      if (position->right_shifter_position > 0.9 && right_gear_ == SHIFTING_UP) {
+        right_gear_ = HIGH;
+      }
+      if (position->right_shifter_position < 0.1 && right_gear_ == SHIFTING_DOWN) {
+        right_gear_ = LOW;
+      }
+    }
+  }
+
+  double FilterVelocity(double throttle) {
+    const Eigen::Matrix<double, 2, 2> FF =
+        loop_->B().inverse() *
+        (Eigen::Matrix<double, 2, 2>::Identity() - loop_->A());
+
+    constexpr int kHighGearController = 3;
+    const Eigen::Matrix<double, 2, 2> FF_high =
+        loop_->controller(kHighGearController).plant.B.inverse() *
+        (Eigen::Matrix<double, 2, 2>::Identity() -
+         loop_->controller(kHighGearController).plant.A);
+
+    ::Eigen::Matrix<double, 1, 2> FF_sum = FF.colwise().sum();
+    int min_FF_sum_index;
+    const double min_FF_sum = FF_sum.minCoeff(&min_FF_sum_index);
+    const double min_K_sum = loop_->K().col(min_FF_sum_index).sum();
+    const double high_min_FF_sum = FF_high.col(0).sum();
+
+    const double adjusted_ff_voltage = ::aos::Clip(
+        throttle * 12.0 * min_FF_sum / high_min_FF_sum, -12.0, 12.0);
+    return ((adjusted_ff_voltage +
+             ttrust_ * min_K_sum * (loop_->X_hat(0, 0) + loop_->X_hat(1, 0)) /
+                 2.0) /
+            (ttrust_ * min_K_sum + min_FF_sum));
+  }
+
+  double MaxVelocity() {
+    const Eigen::Matrix<double, 2, 2> FF =
+        loop_->B().inverse() *
+        (Eigen::Matrix<double, 2, 2>::Identity() - loop_->A());
+
+    constexpr int kHighGearController = 3;
+    const Eigen::Matrix<double, 2, 2> FF_high =
+        loop_->controller(kHighGearController).plant.B.inverse() *
+        (Eigen::Matrix<double, 2, 2>::Identity() -
+         loop_->controller(kHighGearController).plant.A);
+
+    ::Eigen::Matrix<double, 1, 2> FF_sum = FF.colwise().sum();
+    int min_FF_sum_index;
+    const double min_FF_sum = FF_sum.minCoeff(&min_FF_sum_index);
+    //const double min_K_sum = loop_->K().col(min_FF_sum_index).sum();
+    const double high_min_FF_sum = FF_high.col(0).sum();
+
+    const double adjusted_ff_voltage = ::aos::Clip(
+        12.0 * min_FF_sum / high_min_FF_sum, -12.0, 12.0);
+    return adjusted_ff_voltage / min_FF_sum;
+  }
+
+  void Update() {
+    // TODO(austin): Observer for the current velocity instead of difference
+    // calculations.
+    ++counter_;
+    const double current_left_velocity =
+        (position_.left_encoder - last_position_.left_encoder) /
+        position_time_delta_;
+    const double current_right_velocity =
+        (position_.right_encoder - last_position_.right_encoder) /
+        position_time_delta_;
+    const double left_motor_speed =
+        MotorSpeed(position_.left_shifter_position, current_left_velocity);
+    const double right_motor_speed =
+        MotorSpeed(position_.right_shifter_position, current_right_velocity);
+
+    // Reset the CIM model to the current conditions to be ready for when we shift.
+    if (IsInGear(left_gear_)) {
+      left_cim_->X_hat(0, 0) = left_motor_speed;
+      LOG(DEBUG, "Setting left CIM to %f at robot speed %f\n", left_motor_speed,
+          current_left_velocity);
+    }
+    if (IsInGear(right_gear_)) {
+      right_cim_->X_hat(0, 0) = right_motor_speed;
+      LOG(DEBUG, "Setting right CIM to %f at robot speed %f\n",
+          right_motor_speed, current_right_velocity);
+    }
+    LOG(DEBUG, "robot speed l=%f r=%f\n", current_left_velocity,
+        current_right_velocity);
+
+    if (IsInGear(left_gear_) && IsInGear(right_gear_)) {
+      // FF * X = U (steady state)
+      const Eigen::Matrix<double, 2, 2> FF =
+          loop_->B().inverse() *
+          (Eigen::Matrix<double, 2, 2>::Identity() - loop_->A());
+
+      // Invert the plant to figure out how the velocity filter would have to
+      // work
+      // out in order to filter out the forwards negative inertia.
+      // This math assumes that the left and right power and velocity are
+      // equals,
+      // and that the plant is the same on the left and right.
+      const double fvel = FilterVelocity(throttle_);
+
+      const double sign_svel = wheel_ * ((fvel > 0.0) ? 1.0 : -1.0);
+      double steering_velocity;
+      if (quickturn_) {
+        steering_velocity = wheel_ * MaxVelocity();
+      } else {
+        steering_velocity = ::std::abs(fvel) * wheel_;
+      }
+      const double left_velocity = fvel - steering_velocity;
+      const double right_velocity = fvel + steering_velocity;
+
+      // Integrate velocity to get the position.
+      // This position is used to get integral control.
+      loop_->R << left_velocity, right_velocity;
+
+      if (!quickturn_) {
+        // K * R = w
+        Eigen::Matrix<double, 1, 2> equality_k;
+        equality_k << 1 + sign_svel, -(1 - sign_svel);
+        const double equality_w = 0.0;
+
+        // Construct a constraint on R by manipulating the constraint on U
+        ::aos::controls::HPolytope<2> R_poly = ::aos::controls::HPolytope<2>(
+            U_Poly_.H() * (loop_->K() + FF),
+            U_Poly_.k() + U_Poly_.H() * loop_->K() * loop_->X_hat);
+
+        // Limit R back inside the box.
+        loop_->R = CoerceGoal(R_poly, equality_k, equality_w, loop_->R);
+      }
+
+      const Eigen::Matrix<double, 2, 1> FF_volts = FF * loop_->R;
+      const Eigen::Matrix<double, 2, 1> U_ideal =
+          loop_->K() * (loop_->R - loop_->X_hat) + FF_volts;
+
+      for (int i = 0; i < 2; i++) {
+        loop_->U[i] = ::aos::Clip(U_ideal[i], -12, 12);
+      }
+
+      // TODO(austin): Model this better.
+      // TODO(austin): Feed back?
+      loop_->X_hat = loop_->A() * loop_->X_hat + loop_->B() * loop_->U;
+    } else {
+      // Any motor is not in gear.  Speed match.
+      ::Eigen::Matrix<double, 1, 1> R_left;
+      R_left(0, 0) = left_motor_speed;
+      const double wiggle = (static_cast<double>((counter_ % 4) / 2) - 0.5) * 3.5;
+
+      loop_->U(0, 0) =
+          ::aos::Clip((R_left / Kv)(0, 0) + wiggle, -position_.battery_voltage,
+                      position_.battery_voltage);
+      right_cim_->X_hat = right_cim_->A() * right_cim_->X_hat +
+                          right_cim_->B() * loop_->U(0, 0);
+
+      ::Eigen::Matrix<double, 1, 1> R_right;
+      R_right(0, 0) = right_motor_speed;
+      loop_->U(1, 0) =
+          ::aos::Clip((R_right / Kv)(0, 0) + wiggle, -position_.battery_voltage,
+                      position_.battery_voltage);
+      right_cim_->X_hat = right_cim_->A() * right_cim_->X_hat +
+                          right_cim_->B() * loop_->U(1, 0);
+      loop_->U *= 12.0 / position_.battery_voltage;
+    }
+  }
+
+  void SendMotors(Drivetrain::Output *output) {
+    if (output != NULL) {
+      output->left_voltage = loop_->U(0, 0);
+      output->right_voltage = loop_->U(1, 0);
+    }
+    // Go in high gear if anything wants to be in high gear.
+    // TODO(austin): Seperate these.
+    if (left_gear_ == HIGH || left_gear_ == SHIFTING_UP ||
+        right_gear_ == HIGH || right_gear_ == SHIFTING_UP) {
+      shifters.MakeWithBuilder().set(false).Send();
+    } else {
+      shifters.MakeWithBuilder().set(true).Send();
+    }
+  }
+
+ private:
+  const ::aos::controls::HPolytope<2> U_Poly_;
+
+  ::std::unique_ptr<StateFeedbackLoop<2, 2, 2>> loop_;
+  ::std::unique_ptr<StateFeedbackLoop<1, 1, 1>> left_cim_;
+  ::std::unique_ptr<StateFeedbackLoop<1, 1, 1>> right_cim_;
+
+  const double ttrust_;
+  double wheel_;
+  double throttle_;
+  bool quickturn_;
+  int stale_count_;
+  double position_time_delta_;
+  Gear left_gear_;
+  Gear right_gear_;
+  Drivetrain::Position last_position_;
+  Drivetrain::Position position_;
+  int counter_;
+};
+constexpr double PolyDrivetrain::kStallTorque;
+constexpr double PolyDrivetrain::kStallCurrent;
+constexpr double PolyDrivetrain::kFreeSpeed;
+constexpr double PolyDrivetrain::kFreeCurrent;
+constexpr double PolyDrivetrain::J;
+constexpr double PolyDrivetrain::m;
+constexpr double PolyDrivetrain::rb;
+constexpr double PolyDrivetrain::kWheelRadius;
+constexpr double PolyDrivetrain::kR;
+constexpr double PolyDrivetrain::Kv;
+constexpr double PolyDrivetrain::Kt;
+
+
+
+class DrivetrainMotorsOL {
+ public:
+  DrivetrainMotorsOL() {
+    _old_wheel = 0.0;
+    wheel_ = 0.0;
+    throttle_ = 0.0;
+    quickturn_ = false;
+    highgear_ = true;
+    _neg_inertia_accumulator = 0.0;
+    _left_pwm = 0.0;
+    _right_pwm = 0.0;
+  }
+  void SetGoal(double wheel, double throttle, bool quickturn, bool highgear) {
+    wheel_ = wheel;
+    throttle_ = throttle;
+    quickturn_ = quickturn;
+    highgear_ = highgear;
+    _left_pwm = 0.0;
+    _right_pwm = 0.0;
+  }
+  void Update() {
+    double overPower;
+    float sensitivity = 1.7;
+    float angular_power;
+    float linear_power;
+    double wheel;
+
+    double neg_inertia = wheel_ - _old_wheel;
+    _old_wheel = wheel_;
+
+    double wheelNonLinearity;
+    if (highgear_) {
+      wheelNonLinearity = 0.1;  // used to be csvReader->TURN_NONLIN_HIGH
+      // Apply a sin function that's scaled to make it feel better.
+      const double angular_range = M_PI / 2.0 * wheelNonLinearity;
+      wheel = sin(angular_range * wheel_) / sin(angular_range);
+      wheel = sin(angular_range * wheel) / sin(angular_range);
+    } else {
+      wheelNonLinearity = 0.2;  // used to be csvReader->TURN_NONLIN_LOW
+      // Apply a sin function that's scaled to make it feel better.
+      const double angular_range = M_PI / 2.0 * wheelNonLinearity;
+      wheel = sin(angular_range * wheel_) / sin(angular_range);
+      wheel = sin(angular_range * wheel) / sin(angular_range);
+      wheel = sin(angular_range * wheel) / sin(angular_range);
+    }
+
+    static const double kThrottleDeadband = 0.05;
+    if (::std::abs(throttle_) < kThrottleDeadband) {
+      throttle_ = 0;
+    } else {
+      throttle_ = copysign((::std::abs(throttle_) - kThrottleDeadband) /
+                           (1.0 - kThrottleDeadband), throttle_);
+    }
+
+    double neg_inertia_scalar;
+    if (highgear_) {
+      neg_inertia_scalar = 8.0;  // used to be csvReader->NEG_INTERTIA_HIGH
+      sensitivity = 1.22; // used to be csvReader->SENSE_HIGH
+    } else {
+      if (wheel * neg_inertia > 0) {
+        neg_inertia_scalar = 5;  // used to be csvReader->NEG_INERTIA_LOW_MORE
+      } else {
+        if (::std::abs(wheel) > 0.65) {
+          neg_inertia_scalar = 5;  // used to be csvReader->NEG_INTERTIA_LOW_LESS_EXT
+        } else {
+          neg_inertia_scalar = 5;  // used to be csvReader->NEG_INTERTIA_LOW_LESS
+        }
+      }
+      sensitivity = 1.24;  // used to be csvReader->SENSE_LOW
+    }
+    double neg_inertia_power = neg_inertia * neg_inertia_scalar;
+    _neg_inertia_accumulator += neg_inertia_power;
+
+    wheel = wheel + _neg_inertia_accumulator;
+    if (_neg_inertia_accumulator > 1) {
+      _neg_inertia_accumulator -= 1;
+    } else if (_neg_inertia_accumulator < -1) {
+      _neg_inertia_accumulator += 1;
+    } else {
+      _neg_inertia_accumulator = 0;
+    }
+
+    linear_power = throttle_;
+
+    if (quickturn_) {
+      double qt_angular_power = wheel;
+      if (::std::abs(linear_power) < 0.2) {
+        if (qt_angular_power > 1) qt_angular_power = 1.0;
+        if (qt_angular_power < -1) qt_angular_power = -1.0;
+      } else {
+        qt_angular_power = 0.0;
+      }
+      overPower = 1.0;
+      if (highgear_) {
+        sensitivity = 1.0;
+      } else {
+        sensitivity = 1.0;
+      }
+      angular_power = wheel;
+    } else {
+      overPower = 0.0;
+      angular_power = ::std::abs(throttle_) * wheel * sensitivity;
+    }
+
+    _right_pwm = _left_pwm = linear_power;
+    _left_pwm += angular_power;
+    _right_pwm -= angular_power;
+
+    if (_left_pwm > 1.0) {
+      _right_pwm -= overPower*(_left_pwm - 1.0);
+      _left_pwm = 1.0;
+    } else if (_right_pwm > 1.0) {
+      _left_pwm -= overPower*(_right_pwm - 1.0);
+      _right_pwm = 1.0;
+    } else if (_left_pwm < -1.0) {
+      _right_pwm += overPower*(-1.0 - _left_pwm);
+      _left_pwm = -1.0;
+    } else if (_right_pwm < -1.0) {
+      _left_pwm += overPower*(-1.0 - _right_pwm);
+      _right_pwm = -1.0;
+    }
+  }
+
+  void SendMotors(Drivetrain::Output *output) {
+    LOG(DEBUG, "left pwm: %f right pwm: %f wheel: %f throttle: %f\n",
+        _left_pwm, _right_pwm, wheel_, throttle_);
+    if (output) {
+      output->left_voltage = _left_pwm * 12.0;
+      output->right_voltage = _right_pwm * 12.0;
+    }
+    if (highgear_) {
+      shifters.MakeWithBuilder().set(false).Send();
+    } else {
+      shifters.MakeWithBuilder().set(true).Send();
+    }
+  }
+
+ private:
+  double _old_wheel;
+  double wheel_;
+  double throttle_;
+  bool quickturn_;
+  bool highgear_;
+  double _neg_inertia_accumulator;
+  double _left_pwm;
+  double _right_pwm;
+};
+
+void DrivetrainLoop::RunIteration(const Drivetrain::Goal *goal,
+                                  const Drivetrain::Position *position,
+                                  Drivetrain::Output *output,
+                                  Drivetrain::Status * /*status*/) {
+  // TODO(aschuh): These should be members of the class.
+  static DrivetrainMotorsSS dt_closedloop;
+  static PolyDrivetrain dt_openloop;
+
+  bool bad_pos = false;
+  if (position == nullptr) {
+    LOG(WARNING, "no position\n");
+    bad_pos = true;
+  }
+
+  double wheel = goal->steering;
+  double throttle = goal->throttle;
+  bool quickturn = goal->quickturn;
+  bool highgear = goal->highgear;
+
+  bool control_loop_driving = goal->control_loop_driving;
+  double left_goal = goal->left_goal;
+  double right_goal = goal->right_goal;
+
+  dt_closedloop.SetGoal(left_goal, goal->left_velocity_goal, right_goal,
+                        goal->right_velocity_goal);
+  if (!bad_pos) {
+    const double left_encoder = position->left_encoder;
+    const double right_encoder = position->right_encoder;
+    if (gyro.FetchLatest()) {
+      LOG(DEBUG, "gyro %f\n", gyro->angle);
+      dt_closedloop.SetPosition(left_encoder, right_encoder, gyro->angle,
+                                control_loop_driving);
+    } else {
+      dt_closedloop.SetRawPosition(left_encoder, right_encoder);
+    }
+  }
+  dt_openloop.SetPosition(position);
+  dt_closedloop.Update(position, output == NULL);
+  dt_openloop.SetGoal(wheel, throttle, quickturn, highgear);
+  dt_openloop.Update();
+  if (control_loop_driving) {
+    dt_closedloop.SendMotors(output);
+  } else {
+    dt_openloop.SendMotors(output);
+  }
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/drivetrain/drivetrain.gyp b/frc971/control_loops/drivetrain/drivetrain.gyp
new file mode 100644
index 0000000..53bb16c
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain.gyp
@@ -0,0 +1,86 @@
+{
+  'targets': [
+    {
+      'target_name': 'drivetrain_loop',
+      'type': 'static_library',
+      'sources': ['drivetrain.q'],
+      'variables': {
+        'header_path': 'frc971/control_loops/drivetrain',
+      },
+      'dependencies': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'includes': ['../../../aos/build/queues.gypi'],
+    },
+    {
+      'target_name': 'polydrivetrain_plants',
+      'type': 'static_library',
+      'sources': [
+        'polydrivetrain_dog_motor_plant.cc',
+        'polydrivetrain_clutch_motor_plant.cc',
+        'drivetrain_dog_motor_plant.cc',
+        'drivetrain_clutch_motor_plant.cc',
+      ],
+      'dependencies': [
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+      ],
+    },
+    {
+      'target_name': 'drivetrain_lib',
+      'type': 'static_library',
+      'sources': [
+        'drivetrain.cc',
+        'polydrivetrain_cim_plant.cc',
+      ],
+      'dependencies': [
+        'drivetrain_loop',
+        '<(AOS)/common/common.gyp:controls',
+        '<(DEPTH)/frc971/frc971.gyp:constants',
+        '<(DEPTH)/aos/build/externals.gyp:libcdd',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(DEPTH)/frc971/queues/queues.gyp:queues',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/aos/build/externals.gyp:libcdd',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(AOS)/common/common.gyp:controls',
+        'drivetrain_loop',
+      ],
+    },
+    {
+      'target_name': 'drivetrain_lib_test',
+      'type': 'executable',
+      'sources': [
+        'drivetrain_lib_test.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        'drivetrain_loop',
+        'drivetrain_lib',
+        '<(AOS)/common/common.gyp:queue_testutils',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(DEPTH)/frc971/queues/queues.gyp:queues',
+      ],
+    },
+    {
+      'target_name': 'drivetrain',
+      'type': 'executable',
+      'sources': [
+        'drivetrain_main.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        'drivetrain_lib',
+        'drivetrain_loop',
+      ],
+    },
+  ],
+}
diff --git a/frc971/control_loops/DriveTrain.h b/frc971/control_loops/drivetrain/drivetrain.h
similarity index 63%
rename from frc971/control_loops/DriveTrain.h
rename to frc971/control_loops/drivetrain/drivetrain.h
index 61ea524..249de70 100644
--- a/frc971/control_loops/DriveTrain.h
+++ b/frc971/control_loops/drivetrain/drivetrain.h
@@ -1,21 +1,32 @@
 #ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_H_
 #define FRC971_CONTROL_LOOPS_DRIVETRAIN_H_
 
+#include "Eigen/Dense"
+
+#include "aos/controls/polytope.h"
 #include "aos/common/control_loop/ControlLoop.h"
-#include "frc971/control_loops/DriveTrain.q.h"
+#include "aos/controls/polytope.h"
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
 
 namespace frc971 {
 namespace control_loops {
 
+Eigen::Matrix<double, 2, 1> CoerceGoal(aos::controls::HPolytope<2> &region,
+                                       const Eigen::Matrix<double, 1, 2> &K,
+                                       double w,
+                                       const Eigen::Matrix<double, 2, 1> &R);
+
 class DrivetrainLoop
-    : public aos::control_loops::ControlLoop<control_loops::Drivetrain> {
+    : public aos::control_loops::ControlLoop<control_loops::Drivetrain, true, false> {
  public:
   // Constructs a control loop which can take a Drivetrain or defaults to the
   // drivetrain at frc971::control_loops::drivetrain
   explicit DrivetrainLoop(
       control_loops::Drivetrain *my_drivetrain = &control_loops::drivetrain)
-      : aos::control_loops::ControlLoop<control_loops::Drivetrain>(
-          my_drivetrain) {}
+      : aos::control_loops::ControlLoop<control_loops::Drivetrain, true, false>(
+          my_drivetrain) {
+    ::aos::controls::HPolytope<0>::Init();
+  }
 
  protected:
   // Executes one cycle of the control loop.
diff --git a/frc971/control_loops/DriveTrain.q b/frc971/control_loops/drivetrain/drivetrain.q
similarity index 80%
rename from frc971/control_loops/DriveTrain.q
rename to frc971/control_loops/drivetrain/drivetrain.q
index f56c115..1dcc947 100644
--- a/frc971/control_loops/DriveTrain.q
+++ b/frc971/control_loops/drivetrain/drivetrain.q
@@ -12,12 +12,17 @@
     bool quickturn;
     bool control_loop_driving;
     float left_goal;
+    float left_velocity_goal;
     float right_goal;
+    float right_velocity_goal;
   };
 
   message Position {
     double left_encoder;
     double right_encoder;
+    double left_shifter_position;
+    double right_shifter_position;
+    double battery_voltage;
   };
 
   message Output {
diff --git a/frc971/control_loops/drivetrain/drivetrain_clutch_motor_plant.cc b/frc971/control_loops/drivetrain/drivetrain_clutch_motor_plant.cc
new file mode 100644
index 0000000..b3aa088
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain_clutch_motor_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/drivetrain/drivetrain_clutch_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<4, 2, 2> MakeClutchDrivetrainPlantCoefficients() {
+  Eigen::Matrix<double, 4, 4> A;
+  A << 1.0, 0.00876671940282, 0.0, 0.000204905465153, 0.0, 0.764245148008, 0.0, 0.0373841350548, 0.0, 0.000204905465153, 1.0, 0.00876671940282, 0.0, 0.0373841350548, 0.0, 0.764245148008;
+  Eigen::Matrix<double, 4, 2> B;
+  B << 0.000157874070659, -2.62302512161e-05, 0.0301793267864, -0.00478559834045, -2.62302512161e-05, 0.000157874070659, -0.00478559834045, 0.0301793267864;
+  Eigen::Matrix<double, 2, 4> C;
+  C << 1, 0, 0, 0, 0, 0, 1, 0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0, 0, 0, 0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<4, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<4, 2, 2> MakeClutchDrivetrainController() {
+  Eigen::Matrix<double, 4, 2> L;
+  L << 1.60424514801, 0.0373841350548, 53.4463554671, 4.58647914599, 0.0373841350548, 1.60424514801, 4.58647914599, 53.4463554671;
+  Eigen::Matrix<double, 2, 4> K;
+  K << 292.330461448, 10.4890095334, -85.5980253252, -0.517234397951, -58.0206391358, -1.5636023242, 153.384904309, 5.5616531565;
+  return StateFeedbackController<4, 2, 2>(L, K, MakeClutchDrivetrainPlantCoefficients());
+}
+
+StateFeedbackPlant<4, 2, 2> MakeClutchDrivetrainPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<4, 2, 2> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<4, 2, 2>(MakeClutchDrivetrainPlantCoefficients());
+  return StateFeedbackPlant<4, 2, 2>(plants);
+}
+
+StateFeedbackLoop<4, 2, 2> MakeClutchDrivetrainLoop() {
+  ::std::vector<StateFeedbackController<4, 2, 2> *> controllers(1);
+  controllers[0] = new StateFeedbackController<4, 2, 2>(MakeClutchDrivetrainController());
+  return StateFeedbackLoop<4, 2, 2>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/drivetrain/drivetrain_clutch_motor_plant.h b/frc971/control_loops/drivetrain/drivetrain_clutch_motor_plant.h
new file mode 100644
index 0000000..e9444e6
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain_clutch_motor_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_CLUTCH_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_CLUTCH_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<4, 2, 2> MakeClutchDrivetrainPlantCoefficients();
+
+StateFeedbackController<4, 2, 2> MakeClutchDrivetrainController();
+
+StateFeedbackPlant<4, 2, 2> MakeClutchDrivetrainPlant();
+
+StateFeedbackLoop<4, 2, 2> MakeClutchDrivetrainLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_CLUTCH_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.cc b/frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.cc
new file mode 100644
index 0000000..7822056
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<4, 2, 2> MakeDogDrivetrainPlantCoefficients() {
+  Eigen::Matrix<double, 4, 4> A;
+  A << 1.0, 0.00923787174605, 0.0, 0.000131162317098, 0.0, 0.851672729447, 0.0, 0.0248457251406, 0.0, 0.000131162317098, 1.0, 0.00923787174605, 0.0, 0.0248457251406, 0.0, 0.851672729447;
+  Eigen::Matrix<double, 4, 2> B;
+  B << 0.000126364935405, -2.17474127771e-05, 0.0245934537462, -0.00411955394149, -2.17474127771e-05, 0.000126364935405, -0.00411955394149, 0.0245934537462;
+  Eigen::Matrix<double, 2, 4> C;
+  C << 1, 0, 0, 0, 0, 0, 1, 0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0, 0, 0, 0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<4, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<4, 2, 2> MakeDogDrivetrainController() {
+  Eigen::Matrix<double, 4, 2> L;
+  L << 1.69167272945, 0.0248457251406, 64.4706646869, 3.2355304474, 0.0248457251406, 1.69167272945, 3.2355304474, 64.4706646869;
+  Eigen::Matrix<double, 2, 4> K;
+  K << 248.918529922, 14.4460993245, 41.6953764051, 3.43594323497, 41.6953764051, 3.43594323497, 248.918529922, 14.4460993245;
+  return StateFeedbackController<4, 2, 2>(L, K, MakeDogDrivetrainPlantCoefficients());
+}
+
+StateFeedbackPlant<4, 2, 2> MakeDogDrivetrainPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<4, 2, 2> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<4, 2, 2>(MakeDogDrivetrainPlantCoefficients());
+  return StateFeedbackPlant<4, 2, 2>(plants);
+}
+
+StateFeedbackLoop<4, 2, 2> MakeDogDrivetrainLoop() {
+  ::std::vector<StateFeedbackController<4, 2, 2> *> controllers(1);
+  controllers[0] = new StateFeedbackController<4, 2, 2>(MakeDogDrivetrainController());
+  return StateFeedbackLoop<4, 2, 2>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.h b/frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.h
new file mode 100644
index 0000000..ba3d584
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_DOG_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_DOG_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<4, 2, 2> MakeDogDrivetrainPlantCoefficients();
+
+StateFeedbackController<4, 2, 2> MakeDogDrivetrainController();
+
+StateFeedbackPlant<4, 2, 2> MakeDogDrivetrainPlant();
+
+StateFeedbackLoop<4, 2, 2> MakeDogDrivetrainLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_DOG_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/drivetrain/drivetrain_lib_test.cc b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
new file mode 100644
index 0000000..0f8c87e
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
@@ -0,0 +1,303 @@
+#include <unistd.h>
+
+#include <memory>
+
+#include "gtest/gtest.h"
+#include "aos/common/queue.h"
+#include "aos/common/queue_testutils.h"
+#include "aos/controls/polytope.h"
+
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+#include "frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
+#include "frc971/queues/GyroAngle.q.h"
+
+
+using ::aos::time::Time;
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+
+class Environment : public ::testing::Environment {
+ public:
+  virtual ~Environment() {}
+  // how to set up the environment.
+  virtual void SetUp() {
+    aos::controls::HPolytope<0>::Init();
+  }
+};
+::testing::Environment* const holder_env =
+  ::testing::AddGlobalTestEnvironment(new Environment);
+
+
+// Class which simulates the drivetrain and sends out queue messages containing the
+// position.
+class DrivetrainSimulation {
+ public:
+  // Constructs a motor simulation.
+  // TODO(aschuh) Do we want to test the clutch one too?
+  DrivetrainSimulation()
+      : drivetrain_plant_(
+            new StateFeedbackPlant<4, 2, 2>(MakeDogDrivetrainPlant())),
+        my_drivetrain_loop_(".frc971.control_loops.drivetrain",
+                       0x8a8dde77, ".frc971.control_loops.drivetrain.goal",
+                       ".frc971.control_loops.drivetrain.position",
+                       ".frc971.control_loops.drivetrain.output",
+                       ".frc971.control_loops.drivetrain.status") {
+    Reinitialize();
+  }
+
+  // Resets the plant.
+  void Reinitialize() {
+    drivetrain_plant_->X(0, 0) = 0.0;
+    drivetrain_plant_->X(1, 0) = 0.0;
+    drivetrain_plant_->Y = drivetrain_plant_->C() * drivetrain_plant_->X;
+    last_left_position_ = drivetrain_plant_->Y(0, 0);
+    last_right_position_ = drivetrain_plant_->Y(1, 0);
+  }
+
+  // Returns the position of the drivetrain.
+  double GetLeftPosition() const {
+    return drivetrain_plant_->Y(0, 0);
+  }
+  double GetRightPosition() const {
+    return drivetrain_plant_->Y(1, 0);
+  }
+
+  // Sends out the position queue messages.
+  void SendPositionMessage() {
+    const double left_encoder = GetLeftPosition();
+    const double right_encoder = GetRightPosition();
+
+    ::aos::ScopedMessagePtr<control_loops::Drivetrain::Position> position =
+        my_drivetrain_loop_.position.MakeMessage();
+    position->left_encoder = left_encoder;
+    position->right_encoder = right_encoder;
+    position.Send();
+  }
+
+  // Simulates the drivetrain moving for one timestep.
+  void Simulate() {
+    last_left_position_ = drivetrain_plant_->Y(0, 0);
+    last_right_position_ = drivetrain_plant_->Y(1, 0);
+    EXPECT_TRUE(my_drivetrain_loop_.output.FetchLatest());
+    drivetrain_plant_->U << my_drivetrain_loop_.output->left_voltage,
+                            my_drivetrain_loop_.output->right_voltage;
+    drivetrain_plant_->Update();
+  }
+
+  ::std::unique_ptr<StateFeedbackPlant<4, 2, 2>> drivetrain_plant_;
+ private:
+  Drivetrain my_drivetrain_loop_;
+  double last_left_position_;
+  double last_right_position_;
+};
+
+class DrivetrainTest : public ::testing::Test {
+ protected:
+  ::aos::common::testing::GlobalCoreInstance my_core;
+
+  // Create a new instance of the test queue so that it invalidates the queue
+  // that it points to.  Otherwise, we will have a pointer to shared memory that
+  // is no longer valid.
+  Drivetrain my_drivetrain_loop_;
+
+  // Create a loop and simulation plant.
+  DrivetrainLoop drivetrain_motor_;
+  DrivetrainSimulation drivetrain_motor_plant_;
+
+  DrivetrainTest() : my_drivetrain_loop_(".frc971.control_loops.drivetrain",
+                               0x8a8dde77,
+                               ".frc971.control_loops.drivetrain.goal",
+                               ".frc971.control_loops.drivetrain.position",
+                               ".frc971.control_loops.drivetrain.output",
+                               ".frc971.control_loops.drivetrain.status"),
+                drivetrain_motor_(&my_drivetrain_loop_),
+                drivetrain_motor_plant_() {
+    // Flush the robot state queue so we can use clean shared memory for this
+    // test, also for the gyro.
+    ::aos::robot_state.Clear();
+    ::frc971::sensors::gyro.Clear();
+    SendDSPacket(true);
+  }
+
+  void SendDSPacket(bool enabled) {
+    ::aos::robot_state.MakeWithBuilder().enabled(enabled)
+                                        .autonomous(false)
+                                        .team_id(971).Send();
+    ::aos::robot_state.FetchLatest();
+  }
+
+  void VerifyNearGoal() {
+    my_drivetrain_loop_.goal.FetchLatest();
+    my_drivetrain_loop_.position.FetchLatest();
+    EXPECT_NEAR(my_drivetrain_loop_.goal->left_goal,
+                drivetrain_motor_plant_.GetLeftPosition(),
+                1e-2);
+    EXPECT_NEAR(my_drivetrain_loop_.goal->right_goal,
+                drivetrain_motor_plant_.GetRightPosition(),
+                1e-2);
+  }
+
+  virtual ~DrivetrainTest() {
+    ::aos::robot_state.Clear();
+    ::frc971::sensors::gyro.Clear();
+  }
+};
+
+// Tests that the drivetrain converges on a goal.
+TEST_F(DrivetrainTest, ConvergesCorrectly) {
+  my_drivetrain_loop_.goal.MakeWithBuilder().control_loop_driving(true)
+      .left_goal(-1.0)
+      .right_goal(1.0).Send();
+  for (int i = 0; i < 200; ++i) {
+    drivetrain_motor_plant_.SendPositionMessage();
+    drivetrain_motor_.Iterate();
+    drivetrain_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that it survives disabling.
+TEST_F(DrivetrainTest, SurvivesDisabling) {
+  my_drivetrain_loop_.goal.MakeWithBuilder().control_loop_driving(true)
+      .left_goal(-1.0)
+      .right_goal(1.0).Send();
+  for (int i = 0; i < 500; ++i) {
+    drivetrain_motor_plant_.SendPositionMessage();
+    drivetrain_motor_.Iterate();
+    drivetrain_motor_plant_.Simulate();
+    if (i > 20 && i < 200) {
+      SendDSPacket(false);
+    } else {
+      SendDSPacket(true);
+    }
+  }
+  VerifyNearGoal();
+}
+
+// Tests surviving bad positions.
+TEST_F(DrivetrainTest, SurvivesBadPosition) {
+  my_drivetrain_loop_.goal.MakeWithBuilder().control_loop_driving(true)
+      .left_goal(-1.0)
+      .right_goal(1.0).Send();
+  for (int i = 0; i < 500; ++i) {
+    if (i > 20 && i < 200) {
+    } else {
+      drivetrain_motor_plant_.SendPositionMessage();
+    }
+    drivetrain_motor_.Iterate();
+    drivetrain_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+::aos::controls::HPolytope<2> MakeBox(double x1_min, double x1_max,
+                                      double x2_min, double x2_max) {
+  Eigen::Matrix<double, 4, 2> box_H;
+  box_H << /*[[*/ 1.0, 0.0 /*]*/,
+            /*[*/-1.0, 0.0 /*]*/,
+            /*[*/ 0.0, 1.0 /*]*/,
+            /*[*/ 0.0,-1.0 /*]]*/;
+  Eigen::Matrix<double, 4, 1> box_k;
+  box_k << /*[[*/ x1_max /*]*/,
+            /*[*/-x1_min /*]*/,
+            /*[*/ x2_max /*]*/,
+            /*[*/-x2_min /*]]*/;
+  ::aos::controls::HPolytope<2> t_poly(box_H, box_k);
+  return t_poly;
+}
+
+class CoerceGoalTest : public ::testing::Test {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+};
+
+// WHOOOHH!
+TEST_F(CoerceGoalTest, Inside) {
+  ::aos::controls::HPolytope<2> box = MakeBox(1, 2, 1, 2);
+
+  Eigen::Matrix<double, 1, 2> K;
+  K << /*[[*/ 1, -1 /*]]*/;
+
+  Eigen::Matrix<double, 2, 1> R;
+  R << /*[[*/ 1.5, 1.5 /*]]*/;
+
+  Eigen::Matrix<double, 2, 1> output =
+      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
+
+  EXPECT_EQ(R(0, 0), output(0, 0));
+  EXPECT_EQ(R(1, 0), output(1, 0));
+}
+
+TEST_F(CoerceGoalTest, Outside_Inside_Intersect) {
+  ::aos::controls::HPolytope<2> box = MakeBox(1, 2, 1, 2);
+
+  Eigen::Matrix<double, 1, 2> K;
+  K << 1, -1;
+
+  Eigen::Matrix<double, 2, 1> R;
+  R << 5, 5;
+
+  Eigen::Matrix<double, 2, 1> output =
+      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
+
+  EXPECT_EQ(2.0, output(0, 0));
+  EXPECT_EQ(2.0, output(1, 0));
+}
+
+TEST_F(CoerceGoalTest, Outside_Inside_no_Intersect) {
+  ::aos::controls::HPolytope<2> box = MakeBox(3, 4, 1, 2);
+
+  Eigen::Matrix<double, 1, 2> K;
+  K << 1, -1;
+
+  Eigen::Matrix<double, 2, 1> R;
+  R << 5, 5;
+
+  Eigen::Matrix<double, 2, 1> output =
+      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
+
+  EXPECT_EQ(3.0, output(0, 0));
+  EXPECT_EQ(2.0, output(1, 0));
+}
+
+TEST_F(CoerceGoalTest, Middle_Of_Edge) {
+  ::aos::controls::HPolytope<2> box = MakeBox(0, 4, 1, 2);
+
+  Eigen::Matrix<double, 1, 2> K;
+  K << -1, 1;
+
+  Eigen::Matrix<double, 2, 1> R;
+  R << 5, 5;
+
+  Eigen::Matrix<double, 2, 1> output =
+      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
+
+  EXPECT_EQ(2.0, output(0, 0));
+  EXPECT_EQ(2.0, output(1, 0));
+}
+
+TEST_F(CoerceGoalTest, PerpendicularLine) {
+  ::aos::controls::HPolytope<2> box = MakeBox(1, 2, 1, 2);
+
+  Eigen::Matrix<double, 1, 2> K;
+  K << 1, 1;
+
+  Eigen::Matrix<double, 2, 1> R;
+  R << 5, 5;
+
+  Eigen::Matrix<double, 2, 1> output =
+      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
+
+  EXPECT_EQ(1.0, output(0, 0));
+  EXPECT_EQ(1.0, output(1, 0));
+}
+
+}  // namespace testing
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/drivetrain/drivetrain_main.cc b/frc971/control_loops/drivetrain/drivetrain_main.cc
new file mode 100644
index 0000000..e3fc306
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain_main.cc
@@ -0,0 +1,11 @@
+#include "frc971/control_loops/drivetrain/drivetrain.h"
+
+#include "aos/atom_code/init.h"
+
+int main() {
+  ::aos::Init();
+  frc971::control_loops::DrivetrainLoop drivetrain;
+  drivetrain.Run();
+  ::aos::Cleanup();
+  return 0;
+}
diff --git a/frc971/control_loops/drivetrain/polydrivetrain_cim_plant.cc b/frc971/control_loops/drivetrain/polydrivetrain_cim_plant.cc
new file mode 100644
index 0000000..1287483
--- /dev/null
+++ b/frc971/control_loops/drivetrain/polydrivetrain_cim_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/drivetrain/polydrivetrain_cim_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<1, 1, 1> MakeCIMPlantCoefficients() {
+  Eigen::Matrix<double, 1, 1> A;
+  A << 0.614537580221;
+  Eigen::Matrix<double, 1, 1> B;
+  B << 15.9657598852;
+  Eigen::Matrix<double, 1, 1> C;
+  C << 1;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<1, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<1, 1, 1> MakeCIMController() {
+  Eigen::Matrix<double, 1, 1> L;
+  L << 0.604537580221;
+  Eigen::Matrix<double, 1, 1> K;
+  K << 0.0378646293422;
+  return StateFeedbackController<1, 1, 1>(L, K, MakeCIMPlantCoefficients());
+}
+
+StateFeedbackPlant<1, 1, 1> MakeCIMPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<1, 1, 1> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<1, 1, 1>(MakeCIMPlantCoefficients());
+  return StateFeedbackPlant<1, 1, 1>(plants);
+}
+
+StateFeedbackLoop<1, 1, 1> MakeCIMLoop() {
+  ::std::vector<StateFeedbackController<1, 1, 1> *> controllers(1);
+  controllers[0] = new StateFeedbackController<1, 1, 1>(MakeCIMController());
+  return StateFeedbackLoop<1, 1, 1>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/drivetrain/polydrivetrain_cim_plant.h b/frc971/control_loops/drivetrain/polydrivetrain_cim_plant.h
new file mode 100644
index 0000000..12b2c59
--- /dev/null
+++ b/frc971/control_loops/drivetrain/polydrivetrain_cim_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_CIM_PLANT_H_
+#define FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_CIM_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<1, 1, 1> MakeCIMPlantCoefficients();
+
+StateFeedbackController<1, 1, 1> MakeCIMController();
+
+StateFeedbackPlant<1, 1, 1> MakeCIMPlant();
+
+StateFeedbackLoop<1, 1, 1> MakeCIMLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_CIM_PLANT_H_
diff --git a/frc971/control_loops/drivetrain/polydrivetrain_clutch_motor_plant.cc b/frc971/control_loops/drivetrain/polydrivetrain_clutch_motor_plant.cc
new file mode 100644
index 0000000..82962f0
--- /dev/null
+++ b/frc971/control_loops/drivetrain/polydrivetrain_clutch_motor_plant.cc
@@ -0,0 +1,125 @@
+#include "frc971/control_loops/drivetrain/polydrivetrain_clutch_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeClutchVelocityDrivetrainLowLowPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 0.764245148008, 0.0373841350548, 0.0373841350548, 0.764245148008;
+  Eigen::Matrix<double, 2, 2> B;
+  B << 0.0301793267864, -0.00478559834045, -0.00478559834045, 0.0301793267864;
+  Eigen::Matrix<double, 2, 2> C;
+  C << 1.0, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0.0, 0.0, 0.0, 0.0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<2, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeClutchVelocityDrivetrainLowHighPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 0.763446428918, 0.00494258902788, 0.042202491067, 0.968991856576;
+  Eigen::Matrix<double, 2, 2> B;
+  B << 0.0302815719967, -0.00184882243178, -0.00540240320973, 0.011598890947;
+  Eigen::Matrix<double, 2, 2> C;
+  C << 1.0, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0.0, 0.0, 0.0, 0.0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<2, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeClutchVelocityDrivetrainHighLowPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 0.968991856576, 0.042202491067, 0.00494258902788, 0.763446428918;
+  Eigen::Matrix<double, 2, 2> B;
+  B << 0.011598890947, -0.00540240320973, -0.00184882243178, 0.0302815719967;
+  Eigen::Matrix<double, 2, 2> C;
+  C << 1.0, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0.0, 0.0, 0.0, 0.0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<2, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeClutchVelocityDrivetrainHighHighPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 0.968881997557, 0.00555499847336, 0.00555499847336, 0.968881997557;
+  Eigen::Matrix<double, 2, 2> B;
+  B << 0.0116399847578, -0.0020779000091, -0.0020779000091, 0.0116399847578;
+  Eigen::Matrix<double, 2, 2> C;
+  C << 1.0, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0.0, 0.0, 0.0, 0.0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<2, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<2, 2, 2> MakeClutchVelocityDrivetrainLowLowController() {
+  Eigen::Matrix<double, 2, 2> L;
+  L << 0.744245148008, 0.0373841350548, 0.0373841350548, 0.744245148008;
+  Eigen::Matrix<double, 2, 2> K;
+  K << 5.78417881324, 2.15594244513, 2.15594244513, 5.78417881324;
+  return StateFeedbackController<2, 2, 2>(L, K, MakeClutchVelocityDrivetrainLowLowPlantCoefficients());
+}
+
+StateFeedbackController<2, 2, 2> MakeClutchVelocityDrivetrainLowHighController() {
+  Eigen::Matrix<double, 2, 2> L;
+  L << 0.742469928763, 0.0421768815418, 0.0421768815418, 0.949968356732;
+  Eigen::Matrix<double, 2, 2> K;
+  K << 5.78418649682, 2.16715237139, 6.33258809821, 32.8220766317;
+  return StateFeedbackController<2, 2, 2>(L, K, MakeClutchVelocityDrivetrainLowHighPlantCoefficients());
+}
+
+StateFeedbackController<2, 2, 2> MakeClutchVelocityDrivetrainHighLowController() {
+  Eigen::Matrix<double, 2, 2> L;
+  L << 0.954934950673, 0.00591596315544, 0.00591596315544, 0.737503334821;
+  Eigen::Matrix<double, 2, 2> K;
+  K << 32.8220766317, 6.33258809821, 2.16715237139, 5.78418649682;
+  return StateFeedbackController<2, 2, 2>(L, K, MakeClutchVelocityDrivetrainHighLowPlantCoefficients());
+}
+
+StateFeedbackController<2, 2, 2> MakeClutchVelocityDrivetrainHighHighController() {
+  Eigen::Matrix<double, 2, 2> L;
+  L << 0.948881997557, 0.00555499847336, 0.00555499847336, 0.948881997557;
+  Eigen::Matrix<double, 2, 2> K;
+  K << 32.8220767657, 6.33643373411, 6.33643373411, 32.8220767657;
+  return StateFeedbackController<2, 2, 2>(L, K, MakeClutchVelocityDrivetrainHighHighPlantCoefficients());
+}
+
+StateFeedbackPlant<2, 2, 2> MakeVClutchDrivetrainPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<2, 2, 2> *> plants(4);
+  plants[0] = new StateFeedbackPlantCoefficients<2, 2, 2>(MakeClutchVelocityDrivetrainLowLowPlantCoefficients());
+  plants[1] = new StateFeedbackPlantCoefficients<2, 2, 2>(MakeClutchVelocityDrivetrainLowHighPlantCoefficients());
+  plants[2] = new StateFeedbackPlantCoefficients<2, 2, 2>(MakeClutchVelocityDrivetrainHighLowPlantCoefficients());
+  plants[3] = new StateFeedbackPlantCoefficients<2, 2, 2>(MakeClutchVelocityDrivetrainHighHighPlantCoefficients());
+  return StateFeedbackPlant<2, 2, 2>(plants);
+}
+
+StateFeedbackLoop<2, 2, 2> MakeVClutchDrivetrainLoop() {
+  ::std::vector<StateFeedbackController<2, 2, 2> *> controllers(4);
+  controllers[0] = new StateFeedbackController<2, 2, 2>(MakeClutchVelocityDrivetrainLowLowController());
+  controllers[1] = new StateFeedbackController<2, 2, 2>(MakeClutchVelocityDrivetrainLowHighController());
+  controllers[2] = new StateFeedbackController<2, 2, 2>(MakeClutchVelocityDrivetrainHighLowController());
+  controllers[3] = new StateFeedbackController<2, 2, 2>(MakeClutchVelocityDrivetrainHighHighController());
+  return StateFeedbackLoop<2, 2, 2>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/drivetrain/polydrivetrain_clutch_motor_plant.h b/frc971/control_loops/drivetrain/polydrivetrain_clutch_motor_plant.h
new file mode 100644
index 0000000..85c87c1
--- /dev/null
+++ b/frc971/control_loops/drivetrain/polydrivetrain_clutch_motor_plant.h
@@ -0,0 +1,32 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_CLUTCH_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_CLUTCH_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeClutchVelocityDrivetrainLowLowPlantCoefficients();
+
+StateFeedbackController<2, 2, 2> MakeClutchVelocityDrivetrainLowLowController();
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeClutchVelocityDrivetrainLowHighPlantCoefficients();
+
+StateFeedbackController<2, 2, 2> MakeClutchVelocityDrivetrainLowHighController();
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeClutchVelocityDrivetrainHighLowPlantCoefficients();
+
+StateFeedbackController<2, 2, 2> MakeClutchVelocityDrivetrainHighLowController();
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeClutchVelocityDrivetrainHighHighPlantCoefficients();
+
+StateFeedbackController<2, 2, 2> MakeClutchVelocityDrivetrainHighHighController();
+
+StateFeedbackPlant<2, 2, 2> MakeVClutchDrivetrainPlant();
+
+StateFeedbackLoop<2, 2, 2> MakeVClutchDrivetrainLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_CLUTCH_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.cc b/frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.cc
new file mode 100644
index 0000000..b3d4277
--- /dev/null
+++ b/frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.cc
@@ -0,0 +1,125 @@
+#include "frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeDogVelocityDrivetrainLowLowPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 0.851672729447, 0.0248457251406, 0.0248457251406, 0.851672729447;
+  Eigen::Matrix<double, 2, 2> B;
+  B << 0.0245934537462, -0.00411955394149, -0.00411955394149, 0.0245934537462;
+  Eigen::Matrix<double, 2, 2> C;
+  C << 1.0, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0.0, 0.0, 0.0, 0.0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<2, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeDogVelocityDrivetrainLowHighPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 0.851389310398, 0.00553670185935, 0.0264939835067, 0.967000817219;
+  Eigen::Matrix<double, 2, 2> B;
+  B << 0.0246404461385, -0.00200815724925, -0.00439284398274, 0.0119687766843;
+  Eigen::Matrix<double, 2, 2> C;
+  C << 1.0, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0.0, 0.0, 0.0, 0.0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<2, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeDogVelocityDrivetrainHighLowPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 0.967000817219, 0.0264939835067, 0.00553670185935, 0.851389310398;
+  Eigen::Matrix<double, 2, 2> B;
+  B << 0.0119687766843, -0.00439284398274, -0.00200815724925, 0.0246404461385;
+  Eigen::Matrix<double, 2, 2> C;
+  C << 1.0, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0.0, 0.0, 0.0, 0.0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<2, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeDogVelocityDrivetrainHighHighPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 0.966936300149, 0.00589655754287, 0.00589655754287, 0.966936300149;
+  Eigen::Matrix<double, 2, 2> B;
+  B << 0.0119921769728, -0.00213867661221, -0.00213867661221, 0.0119921769728;
+  Eigen::Matrix<double, 2, 2> C;
+  C << 1.0, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 2, 2> D;
+  D << 0.0, 0.0, 0.0, 0.0;
+  Eigen::Matrix<double, 2, 1> U_max;
+  U_max << 12.0, 12.0;
+  Eigen::Matrix<double, 2, 1> U_min;
+  U_min << -12.0, -12.0;
+  return StateFeedbackPlantCoefficients<2, 2, 2>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<2, 2, 2> MakeDogVelocityDrivetrainLowLowController() {
+  Eigen::Matrix<double, 2, 2> L;
+  L << 0.831672729447, 0.0248457251406, 0.0248457251406, 0.831672729447;
+  Eigen::Matrix<double, 2, 2> K;
+  K << 10.7028500331, 2.80305051463, 2.80305051463, 10.7028500331;
+  return StateFeedbackController<2, 2, 2>(L, K, MakeDogVelocityDrivetrainLowLowPlantCoefficients());
+}
+
+StateFeedbackController<2, 2, 2> MakeDogVelocityDrivetrainLowHighController() {
+  Eigen::Matrix<double, 2, 2> L;
+  L << 0.831852326508, 0.0264837489415, 0.0264837489415, 0.946537801108;
+  Eigen::Matrix<double, 2, 2> K;
+  K << 10.7028511964, 2.80768406175, 6.14180888507, 31.6936764099;
+  return StateFeedbackController<2, 2, 2>(L, K, MakeDogVelocityDrivetrainLowHighPlantCoefficients());
+}
+
+StateFeedbackController<2, 2, 2> MakeDogVelocityDrivetrainHighLowController() {
+  Eigen::Matrix<double, 2, 2> L;
+  L << 0.951097545753, 0.0063707209266, 0.0063707209266, 0.827292581863;
+  Eigen::Matrix<double, 2, 2> K;
+  K << 31.6936764099, 6.14180888507, 2.80768406175, 10.7028511964;
+  return StateFeedbackController<2, 2, 2>(L, K, MakeDogVelocityDrivetrainHighLowPlantCoefficients());
+}
+
+StateFeedbackController<2, 2, 2> MakeDogVelocityDrivetrainHighHighController() {
+  Eigen::Matrix<double, 2, 2> L;
+  L << 0.946936300149, 0.00589655754287, 0.00589655754287, 0.946936300149;
+  Eigen::Matrix<double, 2, 2> K;
+  K << 31.6936764663, 6.14392885659, 6.14392885659, 31.6936764663;
+  return StateFeedbackController<2, 2, 2>(L, K, MakeDogVelocityDrivetrainHighHighPlantCoefficients());
+}
+
+StateFeedbackPlant<2, 2, 2> MakeVDogDrivetrainPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<2, 2, 2> *> plants(4);
+  plants[0] = new StateFeedbackPlantCoefficients<2, 2, 2>(MakeDogVelocityDrivetrainLowLowPlantCoefficients());
+  plants[1] = new StateFeedbackPlantCoefficients<2, 2, 2>(MakeDogVelocityDrivetrainLowHighPlantCoefficients());
+  plants[2] = new StateFeedbackPlantCoefficients<2, 2, 2>(MakeDogVelocityDrivetrainHighLowPlantCoefficients());
+  plants[3] = new StateFeedbackPlantCoefficients<2, 2, 2>(MakeDogVelocityDrivetrainHighHighPlantCoefficients());
+  return StateFeedbackPlant<2, 2, 2>(plants);
+}
+
+StateFeedbackLoop<2, 2, 2> MakeVDogDrivetrainLoop() {
+  ::std::vector<StateFeedbackController<2, 2, 2> *> controllers(4);
+  controllers[0] = new StateFeedbackController<2, 2, 2>(MakeDogVelocityDrivetrainLowLowController());
+  controllers[1] = new StateFeedbackController<2, 2, 2>(MakeDogVelocityDrivetrainLowHighController());
+  controllers[2] = new StateFeedbackController<2, 2, 2>(MakeDogVelocityDrivetrainHighLowController());
+  controllers[3] = new StateFeedbackController<2, 2, 2>(MakeDogVelocityDrivetrainHighHighController());
+  return StateFeedbackLoop<2, 2, 2>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h b/frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h
new file mode 100644
index 0000000..613bff4
--- /dev/null
+++ b/frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h
@@ -0,0 +1,32 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_DOG_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_DOG_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeDogVelocityDrivetrainLowLowPlantCoefficients();
+
+StateFeedbackController<2, 2, 2> MakeDogVelocityDrivetrainLowLowController();
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeDogVelocityDrivetrainLowHighPlantCoefficients();
+
+StateFeedbackController<2, 2, 2> MakeDogVelocityDrivetrainLowHighController();
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeDogVelocityDrivetrainHighLowPlantCoefficients();
+
+StateFeedbackController<2, 2, 2> MakeDogVelocityDrivetrainHighLowController();
+
+StateFeedbackPlantCoefficients<2, 2, 2> MakeDogVelocityDrivetrainHighHighPlantCoefficients();
+
+StateFeedbackController<2, 2, 2> MakeDogVelocityDrivetrainHighHighController();
+
+StateFeedbackPlant<2, 2, 2> MakeVDogDrivetrainPlant();
+
+StateFeedbackLoop<2, 2, 2> MakeVDogDrivetrainLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_DOG_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/index/index.cc b/frc971/control_loops/index/index.cc
new file mode 100644
index 0000000..9a03657
--- /dev/null
+++ b/frc971/control_loops/index/index.cc
@@ -0,0 +1,1075 @@
+#include "frc971/control_loops/index/index.h"
+
+#include <stdio.h>
+
+#include <algorithm>
+
+#include "aos/common/control_loop/control_loops.q.h"
+#include "aos/common/logging/logging.h"
+#include "aos/common/inttypes.h"
+
+#include "frc971/constants.h"
+#include "frc971/control_loops/index/index_motor_plant.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+
+using ::aos::time::Time;
+
+namespace frc971 {
+namespace control_loops {
+
+double IndexMotor::Frisbee::ObserveNoTopDiscSensor(double index_position) {
+  // The absolute disc position in meters.
+  double disc_position = absolute_position(index_position);
+  if (IndexMotor::kTopDiscDetectStart <= disc_position &&
+      disc_position <= IndexMotor::kTopDiscDetectStop) {
+    // Whoops, this shouldn't be happening.
+    // Move the disc off the way that makes most sense.
+    double distance_to_above = IndexMotor::ConvertDiscPositionToIndex(
+        ::std::abs(disc_position - IndexMotor::kTopDiscDetectStop));
+    double distance_to_below = IndexMotor::ConvertDiscPositionToIndex(
+        ::std::abs(disc_position - IndexMotor::kTopDiscDetectStart));
+    if (distance_to_above < distance_to_below) {
+      LOG(INFO, "Moving disc to top slow.\n");
+      // Move it up.
+      index_start_position_ -= distance_to_above;
+      return -distance_to_above;
+    } else {
+      LOG(INFO, "Moving disc to bottom slow.\n");
+      index_start_position_ += distance_to_below;
+      return distance_to_below;
+    }
+  }
+  return 0.0;
+}
+
+IndexMotor::IndexMotor(control_loops::IndexLoop *my_index)
+    : aos::control_loops::ControlLoop<control_loops::IndexLoop>(my_index),
+      wrist_loop_(new IndexStateFeedbackLoop(MakeIndexLoop())),
+      hopper_disc_count_(0),
+      total_disc_count_(0),
+      shot_disc_count_(0),
+      safe_goal_(Goal::HOLD),
+      loader_goal_(LoaderGoal::READY),
+      loader_state_(LoaderState::READY),
+      loader_up_(false),
+      disc_clamped_(false),
+      disc_ejected_(false),
+      is_shooting_(false),
+      last_bottom_disc_detect_(false),
+      last_top_disc_detect_(false),
+      hopper_clear_(true),
+      no_prior_position_(true),
+      missing_position_count_(0) {
+}
+
+/*static*/ const double IndexMotor::kTransferStartPosition = 0.0;
+/*static*/ const double IndexMotor::kIndexStartPosition = 0.2159;
+/*static*/ const double IndexMotor::kIndexFreeLength =
+      IndexMotor::ConvertDiscAngleToDiscPosition((360 * 2 + 14) * M_PI / 180);
+/*static*/ const double IndexMotor::kLoaderFreeStopPosition =
+      kIndexStartPosition + kIndexFreeLength;
+/*static*/ const double IndexMotor::kReadyToPreload =
+      kLoaderFreeStopPosition - ConvertDiscAngleToDiscPosition(M_PI / 6.0);
+/*static*/ const double IndexMotor::kReadyToLiftPosition =
+    kLoaderFreeStopPosition + 0.2921;
+/*static*/ const double IndexMotor::kGrabberLength = 0.03175;
+/*static*/ const double IndexMotor::kGrabberStartPosition =
+    kReadyToLiftPosition - kGrabberLength;
+/*static*/ const double IndexMotor::kGrabberMovementVelocity = 0.7;
+/*static*/ const double IndexMotor::kLifterStopPosition =
+    kReadyToLiftPosition + 0.161925;
+/*static*/ const double IndexMotor::kLifterMovementVelocity = 1.0;
+/*static*/ const double IndexMotor::kEjectorStopPosition =
+    kLifterStopPosition + 0.01;
+/*static*/ const double IndexMotor::kEjectorMovementVelocity = 1.0;
+/*static*/ const double IndexMotor::kBottomDiscDetectStart = 0.00;
+/*static*/ const double IndexMotor::kBottomDiscDetectStop = 0.13;
+/*static*/ const double IndexMotor::kBottomDiscIndexDelay = 0.032;
+/*static*/ const ::aos::time::Time IndexMotor::kTransferOffDelay =
+    ::aos::time::Time::InSeconds(0.3);
+
+// TODO(aschuh): Verify these with the sensor actually on.
+/*static*/ const double IndexMotor::kTopDiscDetectStart =
+    (IndexMotor::kLoaderFreeStopPosition -
+     IndexMotor::ConvertDiscAngleToDiscPosition(49 * M_PI / 180));
+/*static*/ const double IndexMotor::kTopDiscDetectStop =
+    (IndexMotor::kLoaderFreeStopPosition +
+     IndexMotor::ConvertDiscAngleToDiscPosition(19 * M_PI / 180));
+
+// I measured the angle between 2 discs.  That then gives me the distance
+// between 2 posedges (or negedges).  Then subtract off the width of the
+// positive pulse, and that gives the width of the negative pulse.
+/*static*/ const double IndexMotor::kTopDiscDetectMinSeperation =
+    (IndexMotor::ConvertDiscAngleToDiscPosition(120 * M_PI / 180) -
+     (IndexMotor::kTopDiscDetectStop - IndexMotor::kTopDiscDetectStart));
+
+const /*static*/ double IndexMotor::kDiscRadius = 10.875 * 0.0254 / 2;
+const /*static*/ double IndexMotor::kRollerRadius = 2.0 * 0.0254 / 2;
+const /*static*/ double IndexMotor::kTransferRollerRadius = 1.25 * 0.0254 / 2;
+
+/*static*/ const int IndexMotor::kGrabbingDelay = 5;
+/*static*/ const int IndexMotor::kLiftingDelay = 5;
+/*static*/ const int IndexMotor::kLiftingTimeout = 100;
+/*static*/ const int IndexMotor::kShootingDelay = 25;
+/*static*/ const int IndexMotor::kLoweringDelay = 4;
+/*static*/ const int IndexMotor::kLoweringTimeout = 120;
+
+// TODO(aschuh): Tune these.
+/*static*/ const double
+    IndexMotor::IndexStateFeedbackLoop::kMinMotionVoltage = 11.0;
+/*static*/ const double
+    IndexMotor::IndexStateFeedbackLoop::kNoMotionCuttoffCount = 20;
+
+/*static*/ double IndexMotor::ConvertDiscAngleToIndex(const double angle) {
+  return (angle * (1 + (kDiscRadius * 2 + kRollerRadius) / kRollerRadius));
+}
+
+/*static*/ double IndexMotor::ConvertDiscAngleToDiscPosition(
+    const double angle) {
+  return angle * (kDiscRadius + kRollerRadius);
+}
+
+/*static*/ double IndexMotor::ConvertDiscPositionToDiscAngle(
+    const double position) {
+  return position / (kDiscRadius + kRollerRadius);
+}
+
+/*static*/ double IndexMotor::ConvertIndexToDiscAngle(const double angle) {
+  return (angle / (1 + (kDiscRadius * 2 + kRollerRadius) / kRollerRadius));
+}
+
+/*static*/ double IndexMotor::ConvertIndexToDiscPosition(const double angle) {
+  return IndexMotor::ConvertDiscAngleToDiscPosition(
+      ConvertIndexToDiscAngle(angle));
+}
+
+/*static*/ double IndexMotor::ConvertTransferToDiscPosition(
+    const double angle) {
+  const double gear_ratio =  (1 + (kDiscRadius * 2 + kTransferRollerRadius) /
+                              kTransferRollerRadius);
+  return angle / gear_ratio * (kDiscRadius + kTransferRollerRadius);
+}
+
+/*static*/ double IndexMotor::ConvertDiscPositionToIndex(
+    const double position) {
+  return IndexMotor::ConvertDiscAngleToIndex(
+      ConvertDiscPositionToDiscAngle(position));
+}
+
+bool IndexMotor::MinDiscPosition(double *disc_position, Frisbee **found_disc) {
+  bool found_start = false;
+  for (unsigned int i = 0; i < frisbees_.size(); ++i) {
+    Frisbee &frisbee = frisbees_[i];
+    if (!found_start) {
+      if (frisbee.has_position()) {
+        *disc_position = frisbee.position();
+        if (found_disc) {
+          *found_disc = &frisbee;
+        }
+        found_start = true;
+      }
+    } else {
+      if (frisbee.position() <= *disc_position) {
+        *disc_position = frisbee.position();
+        if (found_disc) {
+          *found_disc = &frisbee;
+        }
+      }
+    }
+  }
+  return found_start;
+}
+
+bool IndexMotor::MaxDiscPosition(double *disc_position, Frisbee **found_disc) {
+  bool found_start = false;
+  for (unsigned int i = 0; i < frisbees_.size(); ++i) {
+    Frisbee &frisbee = frisbees_[i];
+    if (!found_start) {
+      if (frisbee.has_position()) {
+        *disc_position = frisbee.position();
+        if (found_disc) {
+          *found_disc = &frisbee;
+        }
+        found_start = true;
+      }
+    } else {
+      if (frisbee.position() > *disc_position) {
+        *disc_position = frisbee.position();
+        if (found_disc) {
+          *found_disc = &frisbee;
+        }
+      }
+    }
+  }
+  return found_start;
+}
+
+void IndexMotor::IndexStateFeedbackLoop::CapU() {
+  // If the voltage has been low for a large number of cycles, cut the motor
+  // power.  This is generally very bad controls practice since this isn't LTI,
+  // but we don't really care about tracking anything other than large step
+  // inputs, and the loader doesn't need to be that accurate.
+  if (::std::abs(U(0, 0)) < kMinMotionVoltage) {
+    ++low_voltage_count_;
+    if (low_voltage_count_ > kNoMotionCuttoffCount) {
+      U(0, 0) = 0.0;
+    }
+  } else {
+    low_voltage_count_ = 0;
+  }
+
+  for (int i = 0; i < kNumOutputs; ++i) {
+    if (U(i, 0) > U_max(i, 0)) {
+      U(i, 0) = U_max(i, 0);
+    } else if (U(i, 0) < U_min(i, 0)) {
+      U(i, 0) = U_min(i, 0);
+    }
+  }
+}
+
+
+// Positive angle is towards the shooter, and positive power is towards the
+// shooter.
+void IndexMotor::RunIteration(
+    const control_loops::IndexLoop::Goal *goal,
+    const control_loops::IndexLoop::Position *position,
+    control_loops::IndexLoop::Output *output,
+    control_loops::IndexLoop::Status *status) {
+  Time now = Time::Now();
+  // Make goal easy to work with and sanity check it.
+  Goal goal_enum = static_cast<Goal>(goal->goal_state);
+  if (goal->goal_state < 0 || goal->goal_state > 5) {
+    LOG(ERROR,
+        "Goal state is %" PRId32 " which is out of range.  Going to HOLD.\n",
+        goal->goal_state);
+    goal_enum = Goal::HOLD;
+  }
+
+  // Disable the motors now so that all early returns will return with the
+  // motors disabled.
+  double intake_voltage = 0.0;
+  double transfer_voltage = 0.0;
+  if (output) {
+    output->intake_voltage = 0.0;
+    output->transfer_voltage = 0.0;
+    output->index_voltage = 0.0;
+  }
+
+  status->ready_to_intake = false;
+
+  // Set the controller to use to be the one designed for the current number of
+  // discs in the hopper.  This is safe since the controller prevents the index
+  // from being set out of bounds and picks the closest controller.
+  wrist_loop_->set_controller_index(frisbees_.size());
+
+  // Compute a safe index position that we can use.
+  if (position) {
+    wrist_loop_->Y << position->index_position;
+    // Set the goal to be the current position if this is the first time through
+    // so we don't always spin the indexer to the 0 position before starting.
+    if (no_prior_position_) {
+      LOG(INFO, "no prior position; resetting\n");
+      wrist_loop_->R << wrist_loop_->Y(0, 0), 0.0;
+      wrist_loop_->X_hat(0, 0) = wrist_loop_->Y(0, 0);
+      no_prior_position_ = false;
+      last_bottom_disc_posedge_count_ = position->bottom_disc_posedge_count;
+      last_bottom_disc_negedge_count_ = position->bottom_disc_negedge_count;
+      last_bottom_disc_negedge_wait_count_ =
+          position->bottom_disc_negedge_wait_count;
+      last_top_disc_posedge_count_ = position->top_disc_posedge_count;
+      last_top_disc_negedge_count_ = position->top_disc_negedge_count;
+      last_top_disc_detect_ = position->top_disc_detect;
+      // The open positions for the upper is right here and isn't a hard edge.
+      upper_open_region_.Restart(wrist_loop_->Y(0, 0));
+      lower_open_region_.Restart(wrist_loop_->Y(0, 0));
+    }
+
+    // If the cRIO is gone for over 1/2 of a second, assume that it rebooted.
+    if (missing_position_count_ > 50) {
+      LOG(INFO, "assuming cRIO rebooted\n");
+      last_bottom_disc_posedge_count_ = position->bottom_disc_posedge_count;
+      last_bottom_disc_negedge_count_ = position->bottom_disc_negedge_count;
+      last_bottom_disc_negedge_wait_count_ =
+          position->bottom_disc_negedge_wait_count;
+      last_top_disc_posedge_count_ = position->top_disc_posedge_count;
+      last_top_disc_negedge_count_ = position->top_disc_negedge_count;
+      last_top_disc_detect_ = position->top_disc_detect;
+      // We can't really trust the open range any more if the crio rebooted.
+      upper_open_region_.Restart(wrist_loop_->Y(0, 0));
+      lower_open_region_.Restart(wrist_loop_->Y(0, 0));
+      // Adjust the disc positions so that they don't have to move.
+      const double disc_offset =
+          position->index_position - wrist_loop_->X_hat(0, 0);
+      for (auto frisbee = frisbees_.begin();
+           frisbee != frisbees_.end(); ++frisbee) {
+        frisbee->OffsetDisc(disc_offset);
+      }
+      wrist_loop_->X_hat(0, 0) = wrist_loop_->Y(0, 0);
+    }
+    missing_position_count_ = 0;
+    if (last_top_disc_detect_) {
+      if (last_top_disc_posedge_count_ != position->top_disc_posedge_count) {
+        LOG(INFO, "Ignoring a top disc posedge\n");
+      }
+      last_top_disc_posedge_count_ = position->top_disc_posedge_count;
+    }
+    if (!last_top_disc_detect_) {
+      if (last_top_disc_negedge_count_ != position->top_disc_negedge_count) {
+        LOG(INFO, "Ignoring a top disc negedge\n");
+      }
+      last_top_disc_negedge_count_ = position->top_disc_negedge_count;
+    }
+  } else {
+    ++missing_position_count_;
+  }
+  const double index_position = wrist_loop_->X_hat(0, 0);
+
+  if (position) {
+    // Reset the open region if we saw a negedge.
+    if (position->bottom_disc_negedge_wait_count !=
+        last_bottom_disc_negedge_wait_count_) {
+      // Saw a negedge, must be a new region.
+      lower_open_region_.Restart(position->bottom_disc_negedge_wait_position);
+    }
+    // Reset the open region if we saw a negedge.
+    if (position->top_disc_negedge_count != last_top_disc_negedge_count_) {
+      // Saw a negedge, must be a new region.
+      upper_open_region_.Restart(position->top_disc_negedge_position);
+    }
+
+    // No disc.  Expand the open region.
+    if (!position->bottom_disc_detect) {
+      lower_open_region_.Expand(index_position);
+    }
+
+    // No disc.  Expand the open region.
+    if (!position->top_disc_detect) {
+      upper_open_region_.Expand(index_position);
+    }
+
+    if (!position->top_disc_detect) {
+      // We don't see a disc.  Verify that there are no discs that we should be
+      // seeing.
+      // Assume that discs will move slow enough that we won't miss one as it
+      // goes by.  They will either pile up above or below the sensor.
+
+      double cumulative_offset = 0.0;
+      for (auto frisbee = frisbees_.rbegin(), rend = frisbees_.rend();
+           frisbee != rend; ++frisbee) {
+        frisbee->OffsetDisc(cumulative_offset);
+        double amount_moved = frisbee->ObserveNoTopDiscSensor(
+            wrist_loop_->X_hat(0, 0));
+        cumulative_offset += amount_moved;
+      }
+    }
+
+    if (position->top_disc_posedge_count != last_top_disc_posedge_count_) {
+      LOG(INFO, "Saw a top posedge\n");
+      const double index_position = wrist_loop_->X_hat(0, 0) -
+          position->index_position + position->top_disc_posedge_position;
+      // TODO(aschuh): Sanity check this number...
+      // Requires storing when the disc was last seen with the sensor off, and
+      // figuring out what to do if things go south.
+
+      // 1 if discs are going up, 0 if we have no clue, and -1 if they are going
+      // down.
+      int disc_direction = 0;
+      if (wrist_loop_->X_hat(1, 0) > 100.0) {
+        disc_direction = 1;
+      } else if (wrist_loop_->X_hat(1, 0) < -100.0) {
+        disc_direction = -1;
+      } else {
+        // Save the upper and lower positions that we last saw a disc at.
+        // If there is a big buffer above, must be a disc from below.
+        // If there is a big buffer below, must be a disc from above.
+        // This should work to replace the velocity threshold above.
+
+        const double open_width = upper_open_region_.width();
+        const double relative_upper_open_precentage =
+            (upper_open_region_.upper_bound() - index_position) / open_width;
+        const double relative_lower_open_precentage =
+            (index_position - upper_open_region_.lower_bound()) / open_width;
+
+        if (ConvertIndexToDiscPosition(open_width) <
+            kTopDiscDetectMinSeperation * 0.9) {
+          LOG(ERROR, "Discs are way too close to each other.  Doing nothing\n");
+        } else if (relative_upper_open_precentage > 0.75) {
+          // Looks like it is a disc going down from above since we are near
+          // the upper edge.
+          disc_direction = -1;
+          LOG(INFO, "Disc edge going down\n");
+        } else if (relative_lower_open_precentage > 0.75) {
+          // Looks like it is a disc going up from below since we are near
+          // the lower edge.
+          disc_direction = 1;
+          LOG(INFO, "Disc edge going up\n");
+        } else {
+          LOG(ERROR,
+              "Got an edge in the middle of what should be an open region.\n");
+          LOG(ERROR, "Open width: %f upper precentage %f %%\n",
+              open_width, relative_upper_open_precentage);
+        }
+      }
+
+      if (disc_direction > 0) {
+        // Moving up at a reasonable clip.
+        // Find the highest disc that is below the top disc sensor.
+        // While we are at it, count the number above and log an error if there
+        // are too many.
+        if (frisbees_.size() == 0) {
+          Frisbee new_frisbee;
+          new_frisbee.has_been_indexed_ = true;
+          new_frisbee.index_start_position_ = index_position -
+              ConvertDiscPositionToIndex(kTopDiscDetectStart -
+                                         kIndexStartPosition);
+          ++hopper_disc_count_;
+          ++total_disc_count_;
+          frisbees_.push_front(new_frisbee);
+          LOG(WARNING, "Added a disc to the hopper at the top sensor\n");
+        }
+
+        int above_disc_count = 0;
+        double highest_position = 0;
+        Frisbee *highest_frisbee_below_sensor = NULL;
+        for (auto frisbee = frisbees_.rbegin(), rend = frisbees_.rend();
+             frisbee != rend; ++frisbee) {
+          const double disc_position = frisbee->absolute_position(
+              index_position);
+          // It is save to use the top position for the cuttoff, since the
+          // sensor being low will result in discs being pushed off of it.
+          if (disc_position >= kTopDiscDetectStop) {
+            ++above_disc_count;
+          } else if (!highest_frisbee_below_sensor ||
+                     disc_position > highest_position) {
+            highest_frisbee_below_sensor = &*frisbee;
+            highest_position = disc_position;
+          }
+        }
+
+        if (!highest_frisbee_below_sensor) {
+          Frisbee new_frisbee;
+          new_frisbee.has_been_indexed_ = true;
+          new_frisbee.index_start_position_ = index_position -
+              ConvertDiscPositionToIndex(kTopDiscDetectStart -
+                                         kIndexStartPosition);
+          highest_position = kTopDiscDetectStart;
+          ++hopper_disc_count_;
+          ++total_disc_count_;
+          frisbees_.push_front(new_frisbee);
+          LOG(WARNING, "Added a disc to the hopper at the top sensor because the one we know about is up top\n");
+        }
+
+        if (above_disc_count > 1) {
+          LOG(ERROR, "We have 2 discs above the top sensor.\n");
+        }
+        // We now have the disc.  Shift all the ones below the sensor up by the
+        // computed delta.
+        const double disc_delta = IndexMotor::ConvertDiscPositionToIndex(
+            highest_position - kTopDiscDetectStart);
+        for (auto frisbee = frisbees_.rbegin(), rend = frisbees_.rend();
+             frisbee != rend; ++frisbee) {
+          const double disc_position = frisbee->absolute_position(
+              index_position);
+          if (disc_position < kTopDiscDetectStop) {
+            LOG(INFO, "Moving disc down by %f meters, since it is at %f and top is [%f, %f]\n",
+                ConvertIndexToDiscPosition(disc_delta),
+                disc_position, kTopDiscDetectStart,
+                kTopDiscDetectStop);
+            frisbee->OffsetDisc(disc_delta);
+          }
+        }
+        if (highest_frisbee_below_sensor) {
+          LOG(INFO, "Currently have %d discs, saw posedge moving up.  "
+              "Moving down by %f to %f\n", frisbees_.size(),
+              ConvertIndexToDiscPosition(disc_delta),
+              highest_frisbee_below_sensor->absolute_position(
+                  wrist_loop_->X_hat(0, 0)));
+        } else {
+          LOG(INFO, "Currently have %d discs, saw posedge moving up.  "
+              "Moving down by %f\n", frisbees_.size(),
+              ConvertIndexToDiscPosition(disc_delta));
+        }
+      } else if (disc_direction < 0) {
+        // Moving down at a reasonable clip.
+        // There can only be 1 disc up top that would give us a posedge.
+        // Find it and place it at the one spot that it can be.
+        double min_disc_position = 0;
+        Frisbee *min_frisbee = NULL;
+        MinDiscPosition(&min_disc_position, &min_frisbee);
+        if (!min_frisbee) {
+          // Uh, oh, we see a disc but there isn't one...
+          LOG(ERROR, "Saw a disc up top but there isn't one in the hopper\n");
+        } else {
+          const double disc_position = min_frisbee->absolute_position(
+              index_position);
+
+          const double disc_delta_meters = disc_position - kTopDiscDetectStop;
+          const double disc_delta = IndexMotor::ConvertDiscPositionToIndex(
+              disc_delta_meters);
+          LOG(INFO, "Posedge going down.  Moving top disc down by %f\n",
+              disc_delta_meters);
+          for (auto frisbee = frisbees_.begin(), end = frisbees_.end();
+               frisbee != end; ++frisbee) {
+            frisbee->OffsetDisc(disc_delta);
+          }
+        }
+      } else {
+        LOG(ERROR, "Not sure how to handle the upper posedge, doing nothing\n");
+      }
+    }
+  }
+
+  // Bool to track if it is safe for the goal to change yet.
+  bool safe_to_change_state = true;
+  if (!position) {
+    // This fixes a nasty indexer bug.
+    // If we didn't get a position this cycle, we don't run the code below which
+    // checks the state of the disc detect sensor and whether all the discs are
+    // indexed.  It is therefore not safe to change state and loose track of
+    // that disc.
+    safe_to_change_state = false;
+  }
+  switch (safe_goal_) {
+    case Goal::HOLD:
+      // The goal should already be good, so sit tight with everything the same
+      // as it was.
+      break;
+    case Goal::READY_LOWER:
+    case Goal::INTAKE:
+      hopper_clear_ = false;
+      {
+        if (position) {
+          // Posedge of the disc entering the beam break.
+          if (position->bottom_disc_posedge_count !=
+              last_bottom_disc_posedge_count_) {
+            transfer_frisbee_.Reset();
+            transfer_frisbee_.bottom_posedge_time_ = now;
+            LOG(INFO, "Posedge of bottom disc %f\n",
+                transfer_frisbee_.bottom_posedge_time_.ToSeconds());
+            ++hopper_disc_count_;
+            ++total_disc_count_;
+          }
+
+          // Disc exited the beam break now.
+          if (position->bottom_disc_negedge_count !=
+              last_bottom_disc_negedge_count_) {
+            transfer_frisbee_.bottom_negedge_time_ = now;
+            LOG(INFO, "Negedge of bottom disc %f\n",
+                transfer_frisbee_.bottom_negedge_time_.ToSeconds());
+            frisbees_.push_front(transfer_frisbee_);
+          }
+
+          if (position->bottom_disc_detect) {
+            intake_voltage = 0.0;
+            transfer_voltage = 12.0;
+            // Must wait until the disc gets out before we can change state.
+            safe_to_change_state = false;
+
+            // TODO(aschuh): A disc on the way through needs to start moving
+            // the indexer if it isn't already moving.  Maybe?
+
+            Time elapsed_posedge_time = now -
+                transfer_frisbee_.bottom_posedge_time_;
+            if (elapsed_posedge_time >= Time::InSeconds(0.3)) {
+              // It has been too long.  The disc must be jammed.
+              LOG(ERROR, "Been way too long.  Jammed disc?\n");
+              intake_voltage = -12.0;
+              transfer_voltage = -12.0;
+            }
+          }
+
+          // Check all non-indexed discs and see if they should be indexed.
+          for (auto frisbee = frisbees_.begin();
+               frisbee != frisbees_.end(); ++frisbee) {
+            if (!frisbee->has_been_indexed_) {
+              if (last_bottom_disc_negedge_wait_count_ !=
+                  position->bottom_disc_negedge_wait_count) {
+                // We have an index difference.
+                // Save the indexer position, and the time.
+                if (last_bottom_disc_negedge_wait_count_ + 1 !=
+                  position->bottom_disc_negedge_wait_count) {
+                  LOG(ERROR, "Funny, we got 2 edges since we last checked.\n");
+                }
+
+                // Save the captured position as the position at which the disc
+                // touched the indexer.
+                LOG(INFO, "Grabbed on the index now at %f\n", index_position);
+                frisbee->has_been_indexed_ = true;
+                frisbee->index_start_position_ =
+                    position->bottom_disc_negedge_wait_position;
+              }
+            }
+          }
+        }
+        for (auto frisbee = frisbees_.begin();
+             frisbee != frisbees_.end(); ++frisbee) {
+          if (!frisbee->has_been_indexed_) {
+            intake_voltage = 0.0;
+            transfer_voltage = 12.0;
+
+            // All discs must be indexed before it is safe to stop indexing.
+            safe_to_change_state = false;
+          }
+        }
+
+        // Figure out where the indexer should be to move the discs down to
+        // the right position.
+        double max_disc_position = 0;
+        if (MaxDiscPosition(&max_disc_position, NULL)) {
+          LOG(DEBUG, "There is a disc down here!\n");
+          // TODO(aschuh): Figure out what to do if grabbing the next one
+          // would cause things to jam into the loader.
+          // Say we aren't ready any more.  Undefined behavior will result if
+          // that isn't observed.
+          double bottom_disc_position =
+              max_disc_position + ConvertDiscAngleToIndex(M_PI);
+          wrist_loop_->R << bottom_disc_position, 0.0;
+
+          // Verify that we are close enough to the goal so that we should be
+          // fine accepting the next disc.
+          double disc_error_meters = ConvertIndexToDiscPosition(
+              wrist_loop_->X_hat(0, 0) - bottom_disc_position);
+          // We are ready for the next disc if the first one is in the first
+          // half circle of the indexer.  It will take time for the disc to
+          // come into the indexer, so we will be able to move it out of the
+          // way in time.
+          // This choice also makes sure that we don't claim that we aren't
+          // ready between full speed intaking.
+          if (-ConvertDiscAngleToIndex(M_PI) < disc_error_meters &&
+              disc_error_meters < 0.04) {
+            // We are only ready if we aren't being asked to change state or
+            // are full.
+            status->ready_to_intake =
+                (safe_goal_ == goal_enum) && hopper_disc_count_ < 4;
+          } else {
+            status->ready_to_intake = false;
+          }
+        } else {
+          // No discs!  We are always ready for more if we aren't being
+          // asked to change state.
+          status->ready_to_intake = (safe_goal_ == goal_enum);
+        }
+
+        // Turn on the transfer roller if we are ready.
+        if (status->ready_to_intake && hopper_disc_count_ < 4 &&
+            safe_goal_ == Goal::INTAKE) {
+          intake_voltage = transfer_voltage = 12.0;
+        }
+      }
+      LOG(DEBUG, "INTAKE\n");
+      break;
+    case Goal::REINITIALIZE:
+      LOG(WARNING, "Reinitializing the indexer\n");
+      break;
+    case Goal::READY_SHOOTER:
+    case Goal::SHOOT:
+      // Don't let us leave the shoot or preload state if there are 4 discs in
+      // the hopper.
+      if (hopper_disc_count_ >= 4 && goal_enum != Goal::SHOOT) {
+        safe_to_change_state = false;
+      }
+      // Check if we have any discs to shoot or load and handle them.
+      double min_disc_position = 0;
+      if (MinDiscPosition(&min_disc_position, NULL)) {
+        const double ready_disc_position = min_disc_position +
+            ConvertDiscPositionToIndex(kReadyToPreload - kIndexStartPosition);
+
+        const double grabbed_disc_position =
+            min_disc_position +
+            ConvertDiscPositionToIndex(kReadyToLiftPosition -
+                                       kIndexStartPosition + 0.07);
+
+        // Check the state of the loader FSM.
+        // If it is ready to load discs, position the disc so that it is ready
+        // to be grabbed.
+        // If it isn't ready, there is a disc in there.  It needs to finish it's
+        // cycle first.
+        if (loader_state_ != LoaderState::READY) {
+          // We already have a disc in the loader.
+          // Stage the discs back a bit.
+          wrist_loop_->R << ready_disc_position, 0.0;
+
+          // Shoot if we are grabbed and being asked to shoot.
+          if (loader_state_ == LoaderState::GRABBED &&
+              safe_goal_ == Goal::SHOOT) {
+            loader_goal_ = LoaderGoal::SHOOT_AND_RESET;
+            is_shooting_ = true;
+          }
+
+          // Must wait until it has been grabbed to continue.
+          if (loader_state_ == LoaderState::GRABBING) {
+            safe_to_change_state = false;
+          }
+        } else {
+          // No disc up top right now.
+          wrist_loop_->R << grabbed_disc_position, 0.0;
+
+          // See if the disc has gotten pretty far up yet.
+          if (wrist_loop_->X_hat(0, 0) > ready_disc_position) {
+            // Point of no return.  We are committing to grabbing it now.
+            safe_to_change_state = false;
+            const double robust_grabbed_disc_position =
+                (grabbed_disc_position -
+                 ConvertDiscPositionToIndex(kGrabberLength));
+
+            // If close, start grabbing and/or shooting.
+            if (wrist_loop_->X_hat(0, 0) > robust_grabbed_disc_position) {
+              // Start the state machine.
+              if (safe_goal_ == Goal::SHOOT) {
+                loader_goal_ = LoaderGoal::SHOOT_AND_RESET;
+              } else {
+                loader_goal_ = LoaderGoal::GRAB;
+              }
+              // This frisbee is now gone.  Take it out of the queue.
+              frisbees_.pop_back();
+            }
+          }
+        }
+      } else {
+        if (loader_state_ != LoaderState::READY) {
+          // Shoot if we are grabbed and being asked to shoot.
+          if (loader_state_ == LoaderState::GRABBED &&
+              safe_goal_ == Goal::SHOOT) {
+            loader_goal_ = LoaderGoal::SHOOT_AND_RESET;
+          }
+        } else {
+          // Ok, no discs in sight.  Spin the hopper up by 150% of it's full
+          // range and verify that we don't see anything.
+          const double hopper_clear_verification_position =
+              ::std::max(upper_open_region_.lower_bound(),
+                         lower_open_region_.lower_bound()) +
+              ConvertDiscPositionToIndex(kIndexFreeLength) * 1.5;
+
+          wrist_loop_->R << hopper_clear_verification_position, 0.0;
+          if (::std::abs(wrist_loop_->X_hat(0, 0) -
+                         hopper_clear_verification_position) <
+              ConvertDiscPositionToIndex(0.05)) {
+            // We are at the end of the range.  There are no more discs here.
+            while (frisbees_.size() > 0) {
+              LOG(ERROR, "Dropping an extra disc since it can't exist\n");
+              LOG(ERROR, "Upper is [%f %f]\n",
+                  upper_open_region_.upper_bound(),
+                  upper_open_region_.lower_bound());
+              LOG(ERROR, "Lower is [%f %f]\n",
+                  lower_open_region_.upper_bound(),
+                  lower_open_region_.lower_bound());
+              frisbees_.pop_back();
+              --hopper_disc_count_;
+              --total_disc_count_;
+            }
+            if (hopper_disc_count_ != 0) {
+              LOG(ERROR,
+                  "Emptied the hopper out but there are still discs there\n");
+              hopper_disc_count_ = 0;
+            }
+            hopper_clear_ = true;
+          }
+        }
+      }
+
+      {
+        const double hopper_clear_verification_position =
+            ::std::max(upper_open_region_.lower_bound(),
+                       lower_open_region_.lower_bound()) +
+            ConvertDiscPositionToIndex(kIndexFreeLength) * 1.5;
+
+        if (wrist_loop_->X_hat(0, 0) >
+            hopper_clear_verification_position +
+            ConvertDiscPositionToIndex(0.05)) {
+          // We are at the end of the range.  There are no more discs here.
+          while (frisbees_.size() > 0) {
+            LOG(ERROR, "Dropping an extra disc since it can't exist\n");
+            LOG(ERROR, "Upper is [%f %f]\n",
+                upper_open_region_.upper_bound(),
+                upper_open_region_.lower_bound());
+            LOG(ERROR, "Lower is [%f %f]\n",
+                lower_open_region_.upper_bound(),
+                lower_open_region_.lower_bound());
+            frisbees_.pop_back();
+            --hopper_disc_count_;
+            --total_disc_count_;
+          }
+          if (hopper_disc_count_ != 0) {
+            LOG(ERROR,
+                "Emptied the hopper out but there are still %" PRId32 " discs there\n",
+                hopper_disc_count_);
+            hopper_disc_count_ = 0;
+          }
+          hopper_clear_ = true;
+        }
+      }
+
+      LOG(DEBUG, "READY_SHOOTER or SHOOT\n");
+      break;
+  }
+
+  // Wait for a period of time to make sure that the disc gets sucked
+  // in properly.  We need to do this regardless of what the indexer is doing.
+  for (auto frisbee = frisbees_.begin();
+      frisbee != frisbees_.end(); ++frisbee) {
+    if (now - frisbee->bottom_negedge_time_ < kTransferOffDelay) {
+      transfer_voltage = 12.0;
+    }
+  }
+
+  // If we have 4 discs, it is time to preload.
+  if (safe_to_change_state && hopper_disc_count_ >= 4) {
+    switch (safe_goal_) {
+      case Goal::HOLD:
+      case Goal::READY_LOWER:
+      case Goal::INTAKE:
+        safe_goal_ = Goal::READY_SHOOTER;
+        safe_to_change_state = false;
+        LOG(INFO, "We have %" PRId32 " discs, time to preload automatically\n",
+            hopper_disc_count_);
+        break;
+      case Goal::READY_SHOOTER:
+      case Goal::SHOOT:
+      case Goal::REINITIALIZE:
+        break;
+    }
+  }
+
+  // The only way out of the loader is to shoot the disc.  The FSM can only go
+  // forwards.
+  switch (loader_state_) {
+    case LoaderState::READY:
+      LOG(DEBUG, "Loader READY\n");
+      // Open and down, ready to accept a disc.
+      loader_up_ = false;
+      disc_clamped_ = false;
+      disc_ejected_ = false;
+      disc_stuck_in_loader_ = false;
+      if (loader_goal_ == LoaderGoal::GRAB ||
+          loader_goal_ == LoaderGoal::SHOOT_AND_RESET || goal->force_fire) {
+        if (goal->force_fire) {
+          LOG(INFO, "Told to force fire, moving on\n");
+        } else if (loader_goal_ == LoaderGoal::GRAB) {
+          LOG(INFO, "Told to GRAB, moving on\n");
+        } else {
+          LOG(INFO, "Told to SHOOT_AND_RESET, moving on\n");
+        }
+        loader_state_ = LoaderState::GRABBING;
+        loader_countdown_ = kGrabbingDelay;
+      } else {
+        break;
+      }
+    case LoaderState::GRABBING:
+      LOG(DEBUG, "Loader GRABBING %d\n", loader_countdown_);
+      // Closing the grabber.
+      loader_up_ = false;
+      disc_clamped_ = true;
+      disc_ejected_ = false;
+      if (loader_countdown_ > 0) {
+        --loader_countdown_;
+        break;
+      } else {
+        loader_state_ = LoaderState::GRABBED;
+      }
+    case LoaderState::GRABBED:
+      LOG(DEBUG, "Loader GRABBED\n");
+      // Grabber closed.
+      loader_up_ = false;
+      disc_clamped_ = true;
+      disc_ejected_ = false;
+      if (loader_goal_ == LoaderGoal::SHOOT_AND_RESET || goal->force_fire) {
+        if (shooter.status.FetchLatest() || shooter.status.get()) {
+          // TODO(aschuh): If we aren't shooting nicely, wait until the shooter
+          // is up to speed rather than just spinning.
+          if (shooter.status->average_velocity > 130 && shooter.status->ready) {
+            loader_state_ = LoaderState::LIFTING;
+            loader_countdown_ = kLiftingDelay;
+            loader_timeout_ = 0;
+            LOG(INFO, "Told to SHOOT_AND_RESET, moving on\n");
+          } else {
+            LOG(WARNING, "Told to SHOOT_AND_RESET, shooter too slow at %f\n",
+                shooter.status->average_velocity);
+            break;
+          }
+        } else {
+          LOG(ERROR, "Told to SHOOT_AND_RESET, no shooter data, moving on.\n");
+          loader_state_ = LoaderState::LIFTING;
+          loader_countdown_ = kLiftingDelay;
+          loader_timeout_ = 0;
+        }
+      } else if (loader_goal_ == LoaderGoal::READY) {
+        LOG(ERROR, "Can't go to ready when we have something grabbed.\n");
+        break;
+      } else {
+        break;
+      }
+    case LoaderState::LIFTING:
+      LOG(DEBUG, "Loader LIFTING %d %d\n", loader_countdown_, loader_timeout_);
+      // Lifting the disc.
+      loader_up_ = true;
+      disc_clamped_ = true;
+      disc_ejected_ = false;
+      if (position->loader_top) {
+        if (loader_countdown_ > 0) {
+          --loader_countdown_;
+          loader_timeout_ = 0;
+          break;
+        } else {
+          loader_state_ = LoaderState::LIFTED;
+        }
+      } else {
+        // Restart the countdown if it bounces back down or whatever.
+        loader_countdown_ = kLiftingDelay;
+        ++loader_timeout_;
+        if (loader_timeout_ > kLiftingTimeout) {
+          LOG(ERROR, "Loader timeout while LIFTING %d\n", loader_timeout_);
+          loader_state_ = LoaderState::LOWERING;
+          loader_countdown_ = kLoweringDelay;
+          loader_timeout_ = 0;
+          disc_stuck_in_loader_ = true;
+        } else {
+          break;
+        }
+      }
+    case LoaderState::LIFTED:
+      LOG(DEBUG, "Loader LIFTED\n");
+      // Disc lifted.  Time to eject it out.
+      loader_up_ = true;
+      disc_clamped_ = true;
+      disc_ejected_ = false;
+      loader_state_ = LoaderState::SHOOTING;
+      loader_countdown_ = kShootingDelay;
+    case LoaderState::SHOOTING:
+      LOG(DEBUG, "Loader SHOOTING %d\n", loader_countdown_);
+      // Ejecting the disc into the shooter.
+      loader_up_ = true;
+      disc_clamped_ = false;
+      disc_ejected_ = true;
+      if (loader_countdown_ > 0) {
+        --loader_countdown_;
+        break;
+      } else {
+        loader_state_ = LoaderState::SHOOT;
+      }
+    case LoaderState::SHOOT:
+      LOG(DEBUG, "Loader SHOOT\n");
+      // The disc has been shot.
+      loader_up_ = true;
+      disc_clamped_ = false;
+      disc_ejected_ = true;
+      loader_state_ = LoaderState::LOWERING;
+      loader_countdown_ = kLoweringDelay;
+      loader_timeout_ = 0;
+    case LoaderState::LOWERING:
+      LOG(DEBUG, "Loader LOWERING %d %d\n", loader_countdown_, loader_timeout_);
+      // Lowering the loader back down.
+      loader_up_ = false;
+      disc_clamped_ = false;
+      // We don't want to eject if we're stuck because it will force the disc
+      // into the green loader wheel.
+      disc_ejected_ = disc_stuck_in_loader_ ? false : true;
+      if (position->loader_bottom) {
+        if (loader_countdown_ > 0) {
+          --loader_countdown_;
+          loader_timeout_ = 0;
+          break;
+        } else {
+          loader_state_ = LoaderState::LOWERED;
+          --hopper_disc_count_;
+          ++shot_disc_count_;
+        }
+      } else {
+        // Restart the countdown if it bounces back up or something.
+        loader_countdown_ = kLoweringDelay;
+        ++loader_timeout_;
+        if (loader_timeout_ > kLoweringTimeout) {
+          LOG(ERROR, "Loader timeout while LOWERING %d\n", loader_timeout_);
+          loader_state_ = LoaderState::LOWERED;
+          disc_stuck_in_loader_ = true;
+        } else {
+          break;
+        }
+      }
+    case LoaderState::LOWERED:
+      LOG(DEBUG, "Loader LOWERED\n");
+      loader_up_ = false;
+      disc_ejected_ = false;
+      is_shooting_ = false;
+      if (disc_stuck_in_loader_) {
+        disc_stuck_in_loader_ = false;
+        disc_clamped_ = true;
+        loader_state_ = LoaderState::GRABBED;
+      } else {
+        disc_clamped_ = false;
+        loader_state_ = LoaderState::READY;
+        // Once we have shot, we need to hang out in READY until otherwise
+        // notified.
+        loader_goal_ = LoaderGoal::READY;
+      }
+      break;
+  }
+
+  // Update the observer.
+  wrist_loop_->Update(position != NULL, output == NULL);
+
+  if (position) {
+    LOG(DEBUG, "pos=%f\n", position->index_position);
+    last_bottom_disc_detect_ = position->bottom_disc_detect;
+    last_top_disc_detect_ = position->top_disc_detect;
+    last_bottom_disc_posedge_count_ = position->bottom_disc_posedge_count;
+    last_bottom_disc_negedge_count_ = position->bottom_disc_negedge_count;
+    last_bottom_disc_negedge_wait_count_ =
+        position->bottom_disc_negedge_wait_count;
+    last_top_disc_posedge_count_ = position->top_disc_posedge_count;
+    last_top_disc_negedge_count_ = position->top_disc_negedge_count;
+  }
+
+  // Clear everything if we are supposed to re-initialize.
+  if (goal_enum == Goal::REINITIALIZE) {
+    safe_goal_ = Goal::REINITIALIZE;
+    no_prior_position_ = true;
+    hopper_disc_count_ = 0;
+    total_disc_count_ = 0;
+    shot_disc_count_ = 0;
+    loader_state_ = LoaderState::READY;
+    loader_goal_ = LoaderGoal::READY;
+    loader_countdown_ = 0;
+    loader_up_ = false;
+    disc_clamped_ = false;
+    disc_ejected_ = false;
+
+    intake_voltage = 0.0;
+    transfer_voltage = 0.0;
+    wrist_loop_->U(0, 0) = 0.0;
+    frisbees_.clear();
+  }
+
+  status->hopper_disc_count = hopper_disc_count_;
+  status->total_disc_count = total_disc_count_;
+  status->shot_disc_count = shot_disc_count_;
+  status->preloaded = (loader_state_ != LoaderState::READY);
+  status->is_shooting = is_shooting_;
+  status->hopper_clear = hopper_clear_;
+
+  if (output) {
+    output->intake_voltage = intake_voltage;
+    if (goal->override_transfer) {
+      output->transfer_voltage = goal->transfer_voltage;
+    } else {
+      output->transfer_voltage = transfer_voltage;
+    }
+    if (goal->override_index) {
+      output->index_voltage = goal->index_voltage;
+    } else {
+      output->index_voltage = wrist_loop_->U(0, 0);
+    }
+    output->loader_up = loader_up_;
+    output->disc_clamped = disc_clamped_;
+    output->disc_ejected = disc_ejected_;
+  }
+
+  if (safe_to_change_state) {
+    safe_goal_ = goal_enum;
+  }
+  if (hopper_disc_count_ < 0) {
+    LOG(ERROR, "NEGATIVE DISCS.  VERY VERY BAD\n");
+  }
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/index/index.gyp b/frc971/control_loops/index/index.gyp
new file mode 100644
index 0000000..014f266
--- /dev/null
+++ b/frc971/control_loops/index/index.gyp
@@ -0,0 +1,69 @@
+{
+  'targets': [
+    {
+      'target_name': 'index_loop',
+      'type': 'static_library',
+      'sources': ['index_motor.q'],
+      'variables': {
+        'header_path': 'frc971/control_loops/index',
+      },
+      'dependencies': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'includes': ['../../../aos/build/queues.gypi'],
+    },
+    {
+      'target_name': 'index_lib',
+      'type': 'static_library',
+      'sources': [
+        'index.cc',
+        'index_motor_plant.cc',
+      ],
+      'dependencies': [
+        'index_loop',
+        '<(AOS)/common/common.gyp:controls',
+        '<(DEPTH)/frc971/frc971.gyp:constants',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(DEPTH)/frc971/control_loops/shooter/shooter.gyp:shooter_loop',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(AOS)/common/common.gyp:controls',
+        'index_loop',
+      ],
+    },
+    {
+      'target_name': 'index_lib_test',
+      'type': 'executable',
+      'sources': [
+        'index_lib_test.cc',
+        'transfer_motor_plant.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        'index_loop',
+        'index_lib',
+        '<(AOS)/common/common.gyp:queue_testutils',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(DEPTH)/frc971/control_loops/shooter/shooter.gyp:shooter_loop',
+      ],
+    },
+    {
+      'target_name': 'index',
+      'type': 'executable',
+      'sources': [
+        'index_main.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        'index_lib',
+        'index_loop',
+      ],
+    },
+  ],
+}
diff --git a/frc971/control_loops/index/index.h b/frc971/control_loops/index/index.h
new file mode 100644
index 0000000..e6902d8
--- /dev/null
+++ b/frc971/control_loops/index/index.h
@@ -0,0 +1,361 @@
+#ifndef FRC971_CONTROL_LOOPS_INDEX_INDEX_H_
+#define FRC971_CONTROL_LOOPS_INDEX_INDEX_H_
+
+#include <deque>
+#include "aos/common/libstdc++/memory"
+
+#include "aos/common/control_loop/ControlLoop.h"
+#include "aos/common/time.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+#include "frc971/control_loops/index/index_motor.q.h"
+#include "frc971/control_loops/index/index_motor_plant.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+class IndexTest_InvalidStateTest_Test;
+class IndexTest_LostDisc_Test;
+}
+
+// This class represents a region of space.
+class Region {
+ public:
+  Region () : upper_bound_(0.0), lower_bound_(0.0) {}
+
+  // Restarts the region tracking by starting over with a 0 width region with
+  // the bounds at [edge, edge].
+  void Restart(double edge) {
+    upper_bound_ = edge;
+    lower_bound_ = edge;
+  }
+
+  // Expands the region to include the new point.
+  void Expand(double new_point) {
+    if (new_point > upper_bound_) {
+      upper_bound_ = new_point;
+    } else if (new_point < lower_bound_) {
+      lower_bound_ = new_point;
+    }
+  }
+
+  // Returns the width of the region.
+  double width() const { return upper_bound_ - lower_bound_; }
+  // Returns the upper and lower bounds.
+  double upper_bound() const { return upper_bound_; }
+  double lower_bound() const { return lower_bound_; }
+
+ private:
+  // Upper bound of the region.
+  double upper_bound_;
+  // Lower bound of the region.
+  double lower_bound_;
+};
+
+class IndexMotor
+    : public aos::control_loops::ControlLoop<control_loops::IndexLoop> {
+ public:
+  explicit IndexMotor(
+      control_loops::IndexLoop *my_index = &control_loops::index_loop);
+
+  static const double kTransferStartPosition;
+  static const double kIndexStartPosition;
+  // The distance from where the disc first grabs on the indexer to where it
+  // just bairly clears the loader.
+  static const double kIndexFreeLength;
+  // The distance to where the disc just starts to enter the loader.
+  static const double kLoaderFreeStopPosition;
+  // The distance to where the next disc gets positioned while the current disc
+  // is shooting.
+  static const double kReadyToPreload;
+
+  // Distance that the grabber pulls the disc in by.
+  static const double kGrabberLength;
+  // Distance to where the grabber takes over.
+  static const double kGrabberStartPosition;
+
+  // The distance to where the disc hits the back of the loader and is ready to
+  // lift.
+  static const double kReadyToLiftPosition;
+
+  static const double kGrabberMovementVelocity;
+  // TODO(aschuh): This depends on the shooter angle...
+  // Distance to where the shooter is up and ready to shoot.
+  static const double kLifterStopPosition;
+  static const double kLifterMovementVelocity;
+
+  // Distance to where the disc has been launched.
+  // TODO(aschuh): This depends on the shooter angle...
+  static const double kEjectorStopPosition;
+  static const double kEjectorMovementVelocity;
+
+  // Start and stop position of the bottom disc detect sensor in meters.
+  static const double kBottomDiscDetectStart;
+  static const double kBottomDiscDetectStop;
+  // Delay between the negedge of the disc detect and when it engages on the
+  // indexer.
+  static const double kBottomDiscIndexDelay;
+
+  // Time after seeing the fourth disc that we need to wait before turning the
+  // transfer roller off.
+  static const ::aos::time::Time kTransferOffDelay;
+
+  static const double kTopDiscDetectStart;
+  static const double kTopDiscDetectStop;
+
+  // Minimum distance between 2 frisbees as seen by the top disc detect sensor.
+  static const double kTopDiscDetectMinSeperation;
+
+  // Converts the angle of the indexer to the angle of the disc.
+  static double ConvertIndexToDiscAngle(const double angle);
+  // Converts the angle of the indexer to the position that the center of the
+  // disc has traveled.
+  static double ConvertIndexToDiscPosition(const double angle);
+
+  // Converts the angle of the transfer roller to the position that the center
+  // of the disc has traveled.
+  static double ConvertTransferToDiscPosition(const double angle);
+
+  // Converts the distance around the indexer to the position of
+  // the index roller.
+  static double ConvertDiscPositionToIndex(const double position);
+  // Converts the angle around the indexer to the position of the index roller.
+  static double ConvertDiscAngleToIndex(const double angle);
+  // Converts the angle around the indexer to the position of the disc in the
+  // indexer.
+  static double ConvertDiscAngleToDiscPosition(const double angle);
+  // Converts the distance around the indexer to the angle of the disc around
+  // the indexer.
+  static double ConvertDiscPositionToDiscAngle(const double position);
+
+  // Disc radius in meters.
+  static const double kDiscRadius;
+  // Roller radius in meters.
+  static const double kRollerRadius;
+  // Transfer roller radius in meters.
+  static const double kTransferRollerRadius;
+
+  // Time that it takes to grab the disc in cycles.
+  static const int kGrabbingDelay;
+  // Time that it takes to finish lifting the loader after the sensor is
+  // triggered in cycles.
+  static const int kLiftingDelay;
+  // Time until we give up lifting and move on in cycles.
+  static const int kLiftingTimeout;
+  // Time that it takes to shoot the disc in cycles.
+  static const int kShootingDelay;
+  // Time that it takes to finish lowering the loader after the sensor is
+  // triggered in cycles.
+  static const int kLoweringDelay;
+  // Time until we give up lowering and move on in cycles.
+  // It's a long time because we really don't want to ever hit this.
+  static const int kLoweringTimeout;
+
+  // Object representing a Frisbee tracked by the indexer.
+  class Frisbee {
+   public:
+    Frisbee()
+        : bottom_posedge_time_(0, 0),
+          bottom_negedge_time_(0, 0) {
+      Reset();
+    }
+
+    // Resets a Frisbee so it can be reused.
+    void Reset() {
+      bottom_posedge_time_ = ::aos::time::Time(0, 0);
+      bottom_negedge_time_ = ::aos::time::Time(0, 0);
+      has_been_indexed_ = false;
+      index_start_position_ = 0.0;
+    }
+
+    // Returns true if the position is valid.
+    bool has_position() const {
+      return has_been_indexed_;
+    }
+
+    // Returns the most up to date and accurate position that we have for the
+    // disc.  This is the indexer position that the disc grabbed at.
+    double position() const {
+      return index_start_position_;
+    }
+
+    // Returns the absolute position of the disc in meters in the hopper given
+    // that the indexer is at the provided position.
+    double absolute_position(const double index_position) const {
+      return IndexMotor::ConvertIndexToDiscPosition(
+          index_position - index_start_position_) +
+          IndexMotor::kIndexStartPosition;
+    }
+
+    // Shifts the disc down the indexer by the provided offset.  This is to
+    // handle when the cRIO reboots.
+    void OffsetDisc(double offset) {
+      index_start_position_ += offset;
+    }
+
+    // Potentially offsets the position with the knowledge that no discs are
+    // currently blocking the top sensor.  This knowledge can be used to move
+    // this disc if it is believed to be blocking the top sensor.
+    // Returns the amount that the disc moved due to this observation.
+    double ObserveNoTopDiscSensor(double index_position);
+
+    // Posedge and negedge disc times.
+    ::aos::time::Time bottom_posedge_time_;
+    ::aos::time::Time bottom_negedge_time_;
+
+    // True if the disc has a valid index position.
+    bool has_been_indexed_;
+    // Location of the index when the disc first contacted it.
+    double index_start_position_;
+  };
+
+  // Returns where the indexer thinks the frisbees are.
+  const ::std::deque<Frisbee> &frisbees() const { return frisbees_; }
+
+ protected:
+  virtual void RunIteration(
+      const control_loops::IndexLoop::Goal *goal,
+      const control_loops::IndexLoop::Position *position,
+      control_loops::IndexLoop::Output *output,
+      control_loops::IndexLoop::Status *status);
+
+ private:
+  friend class testing::IndexTest_InvalidStateTest_Test;
+  friend class testing::IndexTest_LostDisc_Test;
+
+  // This class implements the CapU function correctly given all the extra
+  // information that we know about from the wrist motor.
+  class IndexStateFeedbackLoop : public StateFeedbackLoop<2, 1, 1> {
+   public:
+    IndexStateFeedbackLoop(StateFeedbackLoop<2, 1, 1> loop)
+        : StateFeedbackLoop<2, 1, 1>(loop),
+          low_voltage_count_(0) {
+    }
+
+    // Voltage below which the indexer won't move with a disc in it.
+    static const double kMinMotionVoltage;
+    // Maximum number of cycles to apply a low voltage to the motor.
+    static const double kNoMotionCuttoffCount;
+
+    // Caps U, but disables the motor after a number of cycles of inactivity.
+    virtual void CapU();
+   private:
+    // Number of cycles that we have seen a small voltage being applied.
+    uint32_t low_voltage_count_;
+  };
+
+  // Sets disc_position to the minimum or maximum disc position.
+  // Sets found_disc to point to the frisbee that was found, and ignores it if
+  // found_disc is NULL.
+  // Returns true if there were discs, and false if there weren't.
+  // On false, disc_position is left unmodified.
+  bool MinDiscPosition(double *disc_position, Frisbee **found_disc);
+  bool MaxDiscPosition(double *disc_position, Frisbee **found_disc);
+
+  // The state feedback control loop to talk to for the index.
+  ::std::unique_ptr<IndexStateFeedbackLoop> wrist_loop_;
+
+  // Count of the number of discs that we have collected.
+  int32_t hopper_disc_count_;
+  int32_t total_disc_count_;
+  int32_t shot_disc_count_;
+
+  enum class Goal {
+    // Hold position, in a low power state.
+    HOLD = 0,
+    // Get ready to load discs by shifting the discs down.
+    READY_LOWER = 1,
+    // Ready the discs, spin up the transfer roller, and accept discs.
+    INTAKE = 2,
+    // Get ready to shoot, and place a disc in the loader.
+    READY_SHOOTER = 3,
+    // Shoot at will.
+    SHOOT = 4,
+    // Reinitialize.
+    REINITIALIZE = 5
+  };
+
+  // These two enums command and track the loader loading discs into the
+  // shooter.
+  enum class LoaderState {
+    // Open and down, ready to accept a disc.
+    READY,
+    // Closing the grabber.
+    GRABBING,
+    // Grabber closed.
+    GRABBED,
+    // Lifting the disc.
+    LIFTING,
+    // Disc lifted.
+    LIFTED,
+    // Ejecting the disc into the shooter.
+    SHOOTING,
+    // The disc has been shot.
+    SHOOT,
+    // Lowering the loader back down.
+    LOWERING,
+    // The indexer is lowered.
+    LOWERED
+  };
+
+  // TODO(aschuh): If we are grabbed and asked to be ready, now what?
+  // LOG ?
+  enum class LoaderGoal {
+    // Get the loader ready to accept another disc.
+    READY,
+    // Grab a disc now.
+    GRAB,
+    // Lift it up, shoot, and reset.
+    // Waits to shoot until the shooter is stable.
+    // Resets the goal to READY once one disc has been shot.
+    SHOOT_AND_RESET
+  };
+
+  // The current goal
+  Goal safe_goal_;
+
+  // Loader goal, state, and counter.
+  LoaderGoal loader_goal_;
+  LoaderState loader_state_;
+  int loader_countdown_, loader_timeout_;
+  // Whether or not we (might have) failed to shoot a disc that's now (probably)
+  // still in the loader.
+  bool disc_stuck_in_loader_;
+
+  // Current state of the pistons.
+  bool loader_up_;
+  bool disc_clamped_;
+  bool disc_ejected_;
+
+  bool is_shooting_;
+
+  // The frisbee that is flying through the transfer rollers.
+  Frisbee transfer_frisbee_;
+
+  // Bottom disc detect from the last valid packet for detecting edges.
+  bool last_bottom_disc_detect_;
+  bool last_top_disc_detect_;
+  bool hopper_clear_;
+  int32_t last_bottom_disc_posedge_count_;
+  int32_t last_bottom_disc_negedge_count_;
+  int32_t last_bottom_disc_negedge_wait_count_;
+  int32_t last_top_disc_posedge_count_;
+  int32_t last_top_disc_negedge_count_;
+
+  // Frisbees are in order such that the newest frisbee is on the front.
+  ::std::deque<Frisbee> frisbees_;
+
+  // True if we haven't seen a position before.
+  bool no_prior_position_;
+  // Number of position messages that we have missed in a row.
+  uint32_t missing_position_count_;
+
+  // The no-disc regions for both the bottom and top beam break sensors.
+  Region upper_open_region_;
+  Region lower_open_region_;
+
+  DISALLOW_COPY_AND_ASSIGN(IndexMotor);
+};
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_INDEX_INDEX_H_
diff --git a/frc971/control_loops/index/index_lib_test.cc b/frc971/control_loops/index/index_lib_test.cc
new file mode 100644
index 0000000..035589d
--- /dev/null
+++ b/frc971/control_loops/index/index_lib_test.cc
@@ -0,0 +1,1340 @@
+#include <unistd.h>
+
+#include <memory>
+
+#include "gtest/gtest.h"
+#include "aos/common/queue.h"
+#include "aos/common/queue_testutils.h"
+#include "frc971/control_loops/index/index_motor.q.h"
+#include "frc971/control_loops/index/index.h"
+#include "frc971/control_loops/index/index_motor_plant.h"
+#include "frc971/control_loops/index/transfer_motor_plant.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+#include "frc971/constants.h"
+
+
+using ::aos::time::Time;
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+
+class Frisbee {
+ public:
+  // Creates a frisbee starting at the specified position in the frisbee path,
+  // and with the transfer and index rollers at the specified positions.
+  Frisbee(double transfer_roller_position,
+          double index_roller_position,
+          double position = IndexMotor::kBottomDiscDetectStart - 0.001)
+      : transfer_roller_position_(transfer_roller_position),
+        index_roller_position_(index_roller_position),
+        position_(position),
+        has_been_shot_(false),
+        has_bottom_disc_negedge_wait_position_(false),
+        bottom_disc_negedge_wait_position_(0.0),
+        after_negedge_time_left_(IndexMotor::kBottomDiscIndexDelay),
+        counted_negedge_wait_(false),
+        has_top_disc_posedge_position_(false),
+        top_disc_posedge_position_(0.0),
+        has_top_disc_negedge_position_(false),
+        top_disc_negedge_position_(0.0) {
+  }
+
+  // Returns true if the frisbee is controlled by the transfer roller.
+  bool IsTouchingTransfer(double position) const {
+    return (position >= IndexMotor::kBottomDiscDetectStart &&
+            position <= IndexMotor::kIndexStartPosition);
+  }
+  bool IsTouchingTransfer() const { return IsTouchingTransfer(position_); }
+
+  // Returns true if the frisbee is in a place where it is unsafe to grab.
+  bool IsUnsafeToGrab() const {
+    return (position_ > (IndexMotor::kLoaderFreeStopPosition) &&
+            position_ < IndexMotor::kGrabberStartPosition);
+  }
+
+  // Returns true if the frisbee is controlled by the indexing roller.
+  bool IsTouchingIndex(double position) const {
+    return (position >= IndexMotor::kIndexStartPosition &&
+            position < IndexMotor::kGrabberStartPosition);
+  }
+  bool IsTouchingIndex() const { return IsTouchingIndex(position_); }
+
+  // Returns true if the frisbee is in a position such that the disc can be
+  // lifted.
+  bool IsUnsafeToLift() const {
+    return (position_ >= IndexMotor::kLoaderFreeStopPosition &&
+            position_ <= IndexMotor::kReadyToLiftPosition);
+  }
+
+  // Returns true if the frisbee is in a position such that the grabber will
+  // pull it into the loader.
+  bool IsTouchingGrabber() const {
+    return (position_ >= IndexMotor::kGrabberStartPosition &&
+            position_ < IndexMotor::kReadyToLiftPosition);
+  }
+
+  // Returns true if the frisbee is in a position such that the disc can be
+  // lifted.
+  bool IsTouchingLoader() const {
+    return (position_ >= IndexMotor::kReadyToLiftPosition &&
+            position_ < IndexMotor::kLifterStopPosition);
+  }
+
+  // Returns true if the frisbee is touching the ejector.
+  bool IsTouchingEjector() const {
+    return (position_ >= IndexMotor::kLifterStopPosition &&
+            position_ < IndexMotor::kEjectorStopPosition);
+  }
+
+  // Returns true if the disc is triggering the bottom disc detect sensor.
+  bool bottom_disc_detect(double position) const {
+    return (position >= IndexMotor::kBottomDiscDetectStart &&
+            position <= IndexMotor::kBottomDiscDetectStop);
+  }
+  bool bottom_disc_detect() const { return bottom_disc_detect(position_); }
+
+  // Returns true if the disc is triggering the top disc detect sensor.
+  bool top_disc_detect(double position) const {
+    return (position >= IndexMotor::kTopDiscDetectStart &&
+            position <= IndexMotor::kTopDiscDetectStop);
+  }
+  bool top_disc_detect() const { return top_disc_detect(position_); }
+
+  // Returns true if the bottom disc sensor will negedge after the disc moves
+  // by dx.
+  bool will_negedge_bottom_disc_detect(double disc_dx) {
+    if (bottom_disc_detect()) {
+      return !bottom_disc_detect(position_ + disc_dx);
+    }
+    return false;
+  }
+
+  // Returns true if the bottom disc sensor will posedge after the disc moves
+  // by dx.
+  bool will_posedge_top_disc_detect(double disc_dx) {
+    if (!top_disc_detect()) {
+      return top_disc_detect(position_ + disc_dx);
+    }
+    return false;
+  }
+
+  // Returns true if the bottom disc sensor will negedge after the disc moves
+  // by dx.
+  bool will_negedge_top_disc_detect(double disc_dx) {
+    if (top_disc_detect()) {
+      return !top_disc_detect(position_ + disc_dx);
+    }
+    return false;
+  }
+
+  // Handles potentially dealing with the delayed negedge.
+  // Computes the index position when time expires using the cached old indexer
+  // position, the elapsed time, and the average velocity.
+  void HandleAfterNegedge(
+      double index_velocity, double elapsed_time, double time_left) {
+    if (!has_bottom_disc_negedge_wait_position_) {
+      if (after_negedge_time_left_ < time_left) {
+        // Assume constant velocity and compute the position.
+        bottom_disc_negedge_wait_position_ =
+            index_roller_position_ +
+            index_velocity * (elapsed_time + after_negedge_time_left_);
+        after_negedge_time_left_ = 0.0;
+        has_bottom_disc_negedge_wait_position_ = true;
+      } else {
+        after_negedge_time_left_ -= time_left;
+      }
+    }
+  }
+
+  // Updates the position of the disc assuming that it has started on the
+  // transfer.  The elapsed time is the simulated amount of time that has
+  // elapsed since the simulation timestep started and this method was called.
+  // time_left is the amount of time left to spend during this timestep.
+  double UpdateTransferPositionForTime(double transfer_roller_velocity,
+                                       double index_roller_velocity,
+                                       double elapsed_time,
+                                       double time_left) {
+    double disc_dx = IndexMotor::ConvertTransferToDiscPosition(
+        transfer_roller_velocity * time_left);
+    bool shrunk_time = false;
+    if (!IsTouchingTransfer(position_ + disc_dx)) {
+      shrunk_time = true;
+      time_left = (IndexMotor::kIndexStartPosition - position_) /
+          transfer_roller_velocity;
+      disc_dx = IndexMotor::ConvertTransferToDiscPosition(
+          transfer_roller_velocity * time_left);
+    }
+
+    if (will_negedge_bottom_disc_detect(disc_dx)) {
+      // Compute the time from the negedge to the end of the cycle assuming
+      // constant velocity.
+      const double elapsed_time =
+          (position_ + disc_dx - IndexMotor::kBottomDiscDetectStop) /
+          disc_dx * time_left;
+
+      // I am not implementing very short delays until this fails.
+      assert(elapsed_time <= after_negedge_time_left_);
+      after_negedge_time_left_ -= elapsed_time;
+    } else if (position_ >= IndexMotor::kBottomDiscDetectStop) {
+      HandleAfterNegedge(index_roller_velocity, elapsed_time, time_left);
+    }
+
+    if (shrunk_time) {
+      EXPECT_LT(0, transfer_roller_velocity);
+      position_ = IndexMotor::kIndexStartPosition;
+    } else {
+      position_ += disc_dx;
+    }
+    LOG(DEBUG, "Transfer Roller: Disc is at %f\n", position_);
+    return time_left;
+  }
+
+  // Updates the position of the disc assuming that it has started on the
+  // indexer.  The elapsed time is the simulated amount of time that has
+  // elapsed since the simulation timestep started and this method was called.
+  // time_left is the amount of time left to spend during this timestep.
+  double UpdateIndexPositionForTime(double index_roller_velocity,
+                                    double elapsed_time,
+                                    double time_left) {
+    double index_dx = IndexMotor::ConvertIndexToDiscPosition(
+        index_roller_velocity * time_left);
+    bool shrunk_time = false;
+    if (!IsTouchingIndex(position_ + index_dx)) {
+      shrunk_time = true;
+      time_left = (IndexMotor::kGrabberStartPosition - position_) /
+          index_roller_velocity;
+      index_dx = IndexMotor::ConvertTransferToDiscPosition(
+          index_roller_velocity * time_left);
+    }
+
+    if (position_ >= IndexMotor::kBottomDiscDetectStop) {
+      HandleAfterNegedge(index_roller_velocity, elapsed_time, time_left);
+    }
+
+    if (will_posedge_top_disc_detect(index_dx)) {
+      // Wohoo!  Find the edge.
+      // Assume constant velocity and compute the position.
+      double edge_position = index_roller_velocity > 0 ?
+          IndexMotor::kTopDiscDetectStart : IndexMotor::kTopDiscDetectStop;
+      const double disc_time =
+          (edge_position - position_) / index_roller_velocity;
+      top_disc_posedge_position_ = index_roller_position_ +
+          IndexMotor::ConvertDiscPositionToIndex(
+          index_roller_velocity * (elapsed_time + disc_time));
+      has_top_disc_posedge_position_ = true;
+      LOG(INFO, "Posedge on top sensor at %f\n", top_disc_posedge_position_);
+    }
+
+    if (will_negedge_top_disc_detect(index_dx)) {
+      // Wohoo!  Find the edge.
+      // Assume constant velocity and compute the position.
+      double edge_position = index_roller_velocity > 0 ?
+          IndexMotor::kTopDiscDetectStop : IndexMotor::kTopDiscDetectStart;
+      const double disc_time =
+          (edge_position - position_) / index_roller_velocity;
+      top_disc_negedge_position_ = index_roller_position_ +
+          IndexMotor::ConvertDiscPositionToIndex(
+          index_roller_velocity * (elapsed_time + disc_time));
+      has_top_disc_negedge_position_ = true;
+      LOG(INFO, "Negedge on top sensor at %f\n", top_disc_negedge_position_);
+    }
+
+    if (shrunk_time) {
+      if (index_roller_velocity > 0) {
+        position_ = IndexMotor::kGrabberStartPosition;
+      } else {
+        position_ = IndexMotor::kIndexStartPosition;
+      }
+    } else {
+      position_ += index_dx;
+    }
+    LOG(DEBUG, "Index: Disc is at %f\n", position_);
+    return time_left;
+  }
+
+  // Updates the position given velocities, piston comands, and the time left in
+  // the simulation cycle.
+  void UpdatePositionForTime(double transfer_roller_velocity,
+                             double index_roller_velocity,
+                             bool clamped,
+                             bool lifted,
+                             bool ejected,
+                             double time_left) {
+    double elapsed_time = 0.0;
+    // We are making this assumption below
+    ASSERT_LE(IndexMotor::kBottomDiscDetectStop,
+              IndexMotor::kIndexStartPosition);
+    if (IsTouchingTransfer() || position() < 0.0) {
+      double deltat = UpdateTransferPositionForTime(
+          transfer_roller_velocity, index_roller_velocity,
+          elapsed_time, time_left);
+      time_left -= deltat;
+      elapsed_time += deltat;
+    }
+
+    if (IsTouchingIndex() && time_left >= 0) {
+      // Verify that we aren't trying to grab or lift when it isn't safe.
+      EXPECT_FALSE(clamped && IsUnsafeToGrab());
+      EXPECT_FALSE(lifted && IsUnsafeToLift());
+
+      double deltat = UpdateIndexPositionForTime(
+          index_roller_velocity, elapsed_time, time_left);
+      time_left -= deltat;
+      elapsed_time += deltat;
+    }
+    if (IsTouchingGrabber()) {
+      if (clamped) {
+        const double grabber_dx =
+            IndexMotor::kGrabberMovementVelocity * time_left;
+        position_ = ::std::min(position_ + grabber_dx,
+                               IndexMotor::kReadyToLiftPosition);
+      }
+      EXPECT_FALSE(lifted) << "Can't lift while in grabber";
+      EXPECT_FALSE(ejected) << "Can't eject while in grabber";
+      LOG(DEBUG, "Grabber: Disc is at %f\n", position_);
+    } else if (IsTouchingLoader()) {
+      if (lifted) {
+        const double lifter_dx =
+            IndexMotor::kLifterMovementVelocity * time_left;
+        position_ = ::std::min(position_ + lifter_dx,
+                               IndexMotor::kLifterStopPosition);
+      }
+      EXPECT_TRUE(clamped);
+      EXPECT_FALSE(ejected);
+      LOG(DEBUG, "Loader: Disc is at %f\n", position_);
+    } else if (IsTouchingEjector()) {
+      EXPECT_TRUE(lifted);
+      if (ejected) {
+        const double ejector_dx =
+            IndexMotor::kEjectorMovementVelocity * time_left;
+        position_ = ::std::min(position_ + ejector_dx,
+                               IndexMotor::kEjectorStopPosition);
+        EXPECT_FALSE(clamped);
+      }
+      LOG(DEBUG, "Ejector: Disc is at %f\n", position_);
+    } else if (position_ == IndexMotor::kEjectorStopPosition) {
+      LOG(DEBUG, "Shot: Disc is at %f\n", position_);
+      has_been_shot_ = true;
+    }
+  }
+
+  // Updates the position of the frisbee in the frisbee path.
+  void UpdatePosition(double transfer_roller_position,
+                      double index_roller_position,
+                      bool clamped,
+                      bool lifted,
+                      bool ejected) {
+    const double transfer_roller_velocity =
+      (transfer_roller_position - transfer_roller_position_) / 0.01;
+    const double index_roller_velocity =
+      (index_roller_position - index_roller_position_) / 0.01;
+    UpdatePositionForTime(transfer_roller_velocity,
+                          index_roller_velocity,
+                          clamped,
+                          lifted,
+                          ejected,
+                          0.01);
+    transfer_roller_position_ = transfer_roller_position;
+    index_roller_position_ = index_roller_position;
+  }
+
+  // Returns if the disc has been shot and can be removed from the robot.
+  bool has_been_shot() const {
+    return has_been_shot_;
+  }
+
+  // Returns the position of the disc in the system.
+  double position() const {
+    return position_;
+  }
+
+  // Sets whether or not we have counted the delayed negedge.
+  void set_counted_negedge_wait(bool counted_negedge_wait) {
+    counted_negedge_wait_ = counted_negedge_wait;
+  }
+
+  // Returns if we have counted the delayed negedge.
+  bool counted_negedge_wait() { return counted_negedge_wait_; }
+
+  // Returns true if the negedge wait position is valid.
+  bool has_bottom_disc_negedge_wait_position() {
+    return has_bottom_disc_negedge_wait_position_;
+  }
+
+  // Returns the negedge wait position.
+  double bottom_disc_negedge_wait_position() {
+    return bottom_disc_negedge_wait_position_;
+  }
+
+  // Returns the last position where a posedge was seen.
+  double top_disc_posedge_position() { return top_disc_posedge_position_; }
+
+  // Returns the last position where a negedge was seen.
+  double top_disc_negedge_position() { return top_disc_negedge_position_; }
+
+  // True if the top disc has seen a posedge.
+  // Reading this flag clears it.
+  bool has_top_disc_posedge_position() {
+    bool prev = has_top_disc_posedge_position_;
+    has_top_disc_posedge_position_ = false;
+    return prev;
+  }
+
+  // True if the top disc has seen a negedge.
+  // Reading this flag clears it.
+  bool has_top_disc_negedge_position() {
+    bool prev = has_top_disc_negedge_position_;
+    has_top_disc_negedge_position_ = false;
+    return prev;
+  }
+
+  // Simulates the index roller moving without the disc moving.
+  void OffsetIndex(double offset) {
+    index_roller_position_ += offset;
+  }
+
+ private:
+  // Previous transfer roller position for computing deltas.
+  double transfer_roller_position_;
+  // Previous index roller position for computing deltas.
+  double index_roller_position_;
+  // Position in the robot.
+  double position_;
+  // True if the disc has been shot.
+  bool has_been_shot_;
+  // True if the delay after the negedge of the beam break has occured.
+  bool has_bottom_disc_negedge_wait_position_;
+  // Posiiton of the indexer when the delayed negedge occures.
+  double bottom_disc_negedge_wait_position_;
+  // Time left after the negedge before we need to sample the indexer position.
+  double after_negedge_time_left_;
+  // Bool for the user to record if they have counted the negedge from this
+  // disc.
+  bool counted_negedge_wait_;
+  // True if the top disc sensor posedge has occured and
+  // hasn't been counted yet.
+  bool has_top_disc_posedge_position_;
+  // The position at which the posedge occured.
+  double top_disc_posedge_position_;
+  // True if the top disc sensor negedge has occured and
+  // hasn't been counted yet.
+  bool has_top_disc_negedge_position_;
+  // The position at which the negedge occured.
+  double top_disc_negedge_position_;
+};
+
+
+// Class which simulates the index and sends out queue messages containing the
+// position.
+class IndexMotorSimulation {
+ public:
+  // Constructs a motor simulation.  initial_position is the inital angle of the
+  // index, which will be treated as 0 by the encoder.
+  IndexMotorSimulation()
+      : index_plant_(new StateFeedbackPlant<2, 1, 1>(MakeIndexPlant())),
+        transfer_plant_(new StateFeedbackPlant<2, 1, 1>(MakeTransferPlant())),
+        bottom_disc_posedge_count_(0),
+        bottom_disc_negedge_count_(0),
+        bottom_disc_negedge_wait_count_(0),
+        bottom_disc_negedge_wait_position_(0),
+        top_disc_posedge_count_(0),
+        top_disc_posedge_position_(0.0),
+        top_disc_negedge_count_(0),
+        top_disc_negedge_position_(0.0),
+        my_index_loop_(".frc971.control_loops.index",
+                       0x1a7b7094, ".frc971.control_loops.index.goal",
+                       ".frc971.control_loops.index.position",
+                       ".frc971.control_loops.index.output",
+                       ".frc971.control_loops.index.status") {
+  }
+
+  // Starts a disc offset from the start of the index.
+  void InsertDisc(double offset = IndexMotor::kBottomDiscDetectStart - 0.001) {
+    Frisbee new_frisbee(transfer_roller_position(),
+                        index_roller_position(),
+                        offset);
+    ASSERT_FALSE(new_frisbee.bottom_disc_detect());
+    ASSERT_FALSE(new_frisbee.top_disc_detect());
+    frisbees.push_back(new_frisbee);
+  }
+
+  // Returns true if the bottom disc sensor is triggered.
+  bool BottomDiscDetect() const {
+    bool bottom_disc_detect = false;
+    for (auto frisbee = frisbees.begin();
+         frisbee != frisbees.end(); ++frisbee) {
+      bottom_disc_detect |= frisbee->bottom_disc_detect();
+    }
+    return bottom_disc_detect;
+  }
+
+  // Returns true if the top disc sensor is triggered.
+  bool TopDiscDetect() const {
+    bool top_disc_detect = false;
+    for (auto frisbee = frisbees.begin();
+         frisbee != frisbees.end(); ++frisbee) {
+      top_disc_detect |= frisbee->top_disc_detect();
+    }
+    return top_disc_detect;
+  }
+
+  // Updates all discs, and verifies that the state of the system is sane.
+  void UpdateDiscs(bool clamped, bool lifted, bool ejected) {
+    for (auto frisbee = frisbees.begin();
+         frisbee != frisbees.end(); ++frisbee) {
+      const bool old_bottom_disc_detect = frisbee->bottom_disc_detect();
+      frisbee->UpdatePosition(transfer_roller_position(),
+                              index_roller_position(),
+                              clamped,
+                              lifted,
+                              ejected);
+
+      // Look for disc detect edges and report them.
+      const bool bottom_disc_detect = frisbee->bottom_disc_detect();
+      if (old_bottom_disc_detect && !bottom_disc_detect) {
+        LOG(INFO, "Negedge of disc\n");
+        ++bottom_disc_negedge_count_;
+      }
+
+      if (!old_bottom_disc_detect && frisbee->bottom_disc_detect()) {
+        LOG(INFO, "Posedge of disc\n");
+        ++bottom_disc_posedge_count_;
+      }
+
+      // See if the frisbee has a delayed negedge and encoder value to report
+      // back.
+      if (frisbee->has_bottom_disc_negedge_wait_position()) {
+        if (!frisbee->counted_negedge_wait()) {
+          bottom_disc_negedge_wait_position_ =
+              frisbee->bottom_disc_negedge_wait_position();
+          ++bottom_disc_negedge_wait_count_;
+          frisbee->set_counted_negedge_wait(true);
+        }
+      }
+      if (frisbee->has_top_disc_posedge_position()) {
+        ++top_disc_posedge_count_;
+        top_disc_posedge_position_ = frisbee->top_disc_posedge_position();
+      }
+      if (frisbee->has_top_disc_negedge_position()) {
+        ++top_disc_negedge_count_;
+        top_disc_negedge_position_ = frisbee->top_disc_negedge_position();
+      }
+    }
+
+    // Make sure nobody is too close to anybody else.
+    Frisbee *last_frisbee = NULL;
+    for (auto frisbee = frisbees.begin();
+         frisbee != frisbees.end(); ++frisbee) {
+      if (last_frisbee) {
+        const double distance = frisbee->position() - last_frisbee->position();
+        double min_distance;
+        if (frisbee->IsTouchingTransfer() ||
+            last_frisbee->IsTouchingTransfer()) {
+          min_distance = 0.3;
+        } else {
+          min_distance =
+              IndexMotor::ConvertDiscAngleToDiscPosition(M_PI * 2.0 / 3.0);
+        }
+
+        EXPECT_LT(min_distance, ::std::abs(distance)) << "Discs too close";
+      }
+      last_frisbee = &*frisbee;
+    }
+
+    // Remove any shot frisbees.
+    for (int i = 0; i < static_cast<int>(frisbees.size()); ++i) {
+      if (frisbees[i].has_been_shot()) {
+        shot_frisbees.push_back(frisbees[i]);
+        frisbees.erase(frisbees.begin() + i);
+        --i;
+      }
+    }
+  }
+
+  // Sends out the position queue messages.
+  void SendPositionMessage() {
+    ::aos::ScopedMessagePtr<control_loops::IndexLoop::Position> position =
+        my_index_loop_.position.MakeMessage();
+    position->index_position = index_roller_position();
+    position->bottom_disc_detect = BottomDiscDetect();
+    position->top_disc_detect = TopDiscDetect();
+    position->bottom_disc_posedge_count = bottom_disc_posedge_count_;
+    position->bottom_disc_negedge_count = bottom_disc_negedge_count_;
+    position->bottom_disc_negedge_wait_count = bottom_disc_negedge_wait_count_;
+    position->bottom_disc_negedge_wait_position =
+        bottom_disc_negedge_wait_position_;
+    position->top_disc_posedge_count = top_disc_posedge_count_;
+    position->top_disc_posedge_position = top_disc_posedge_position_;
+    position->top_disc_negedge_count = top_disc_negedge_count_;
+    position->top_disc_negedge_position = top_disc_negedge_position_;
+    LOG(DEBUG,
+        "bdd: %x tdd: %x posedge %d negedge %d "
+        "delaycount %d delaypos %f topcount %d toppos %f "
+        "topcount %d toppos %f\n",
+        position->bottom_disc_detect,
+        position->top_disc_detect,
+        position->bottom_disc_posedge_count,
+        position->bottom_disc_negedge_count,
+        position->bottom_disc_negedge_wait_count,
+        position->bottom_disc_negedge_wait_position,
+        position->top_disc_posedge_count,
+        position->top_disc_posedge_position,
+        position->top_disc_negedge_count,
+        position->top_disc_negedge_position);
+    position.Send();
+  }
+
+  // Simulates the index moving for one timestep.
+  void Simulate() {
+    EXPECT_TRUE(my_index_loop_.output.FetchLatest());
+
+    index_plant_->set_plant_index(frisbees.size());
+    index_plant_->U << my_index_loop_.output->index_voltage;
+    index_plant_->Update();
+
+    transfer_plant_->U << my_index_loop_.output->transfer_voltage;
+    transfer_plant_->Update();
+    LOG(DEBUG, "tv: %f iv: %f tp : %f ip: %f\n",
+        my_index_loop_.output->transfer_voltage,
+        my_index_loop_.output->index_voltage,
+        transfer_roller_position(), index_roller_position());
+
+    UpdateDiscs(my_index_loop_.output->disc_clamped,
+                my_index_loop_.output->loader_up,
+                my_index_loop_.output->disc_ejected);
+  }
+
+  // Simulates the index roller moving without the disc moving.
+  void OffsetIndices(double offset) {
+    for (auto frisbee = frisbees.begin();
+         frisbee != frisbees.end(); ++frisbee) {
+      frisbee->OffsetIndex(offset);
+    }
+  }
+
+  // Plants for the index and transfer rollers.
+  ::std::unique_ptr<StateFeedbackPlant<2, 1, 1>> index_plant_;
+  ::std::unique_ptr<StateFeedbackPlant<2, 1, 1>> transfer_plant_;
+
+  // Posedge and negedge counts for the beam break.
+  int32_t bottom_disc_posedge_count_;
+  int32_t bottom_disc_negedge_count_;
+
+  // Delayed negedge count and corrisponding position.
+  int32_t bottom_disc_negedge_wait_count_;
+  int32_t bottom_disc_negedge_wait_position_;
+
+  // Posedge count and position for the upper disc sensor.
+  int32_t top_disc_posedge_count_;
+  double top_disc_posedge_position_;
+
+  // Negedge count and position for the upper disc sensor.
+  int32_t top_disc_negedge_count_;
+  double top_disc_negedge_position_;
+
+  // Returns the absolute angle of the index.
+  double index_roller_position() const {
+    return index_plant_->Y(0, 0);
+  }
+
+  // Returns the absolute angle of the index.
+  double transfer_roller_position() const {
+    return transfer_plant_->Y(0, 0);
+  }
+
+  // Frisbees being tracked in the robot.
+  ::std::vector<Frisbee> frisbees;
+  // Frisbees that have been shot.
+  ::std::vector<Frisbee> shot_frisbees;
+
+ private:
+  // Control loop for the indexer.
+  IndexLoop my_index_loop_;
+};
+
+
+class IndexTest : public ::testing::Test {
+ protected:
+  IndexTest() : my_index_loop_(".frc971.control_loops.index",
+                               0x1a7b7094, ".frc971.control_loops.index.goal",
+                               ".frc971.control_loops.index.position",
+                               ".frc971.control_loops.index.output",
+                               ".frc971.control_loops.index.status"),
+                index_motor_(&my_index_loop_),
+                index_motor_plant_(),
+                loop_count_(0) {
+    // Flush the robot state queue so we can use clean shared memory for this
+    // test.
+    ::aos::robot_state.Clear();
+    ::frc971::control_loops::shooter.goal.Clear();
+    ::frc971::control_loops::shooter.status.Clear();
+    ::frc971::control_loops::shooter.output.Clear();
+    ::frc971::control_loops::shooter.position.Clear();
+    SendDSPacket(true);
+    Time::EnableMockTime(Time(0, 0));
+  }
+
+  virtual ~IndexTest() {
+    ::aos::robot_state.Clear();
+    ::frc971::control_loops::shooter.goal.Clear();
+    ::frc971::control_loops::shooter.status.Clear();
+    ::frc971::control_loops::shooter.output.Clear();
+    ::frc971::control_loops::shooter.position.Clear();
+    Time::DisableMockTime();
+  }
+
+  // Sends a DS packet with the enable bit set to enabled.
+  void SendDSPacket(bool enabled) {
+    ::aos::robot_state.MakeWithBuilder().enabled(enabled)
+                                        .autonomous(false)
+                                        .team_id(971).Send();
+    ::aos::robot_state.FetchLatest();
+  }
+
+  // Updates the current mock time.
+  void UpdateTime() {
+    loop_count_ += 1;
+    Time::SetMockTime(Time::InMS(10 * loop_count_));
+  }
+
+  // Lets N cycles of time pass.
+  void SimulateNCycles(int cycles) {
+    for (int i = 0; i < cycles; ++i) {
+      index_motor_plant_.SendPositionMessage();
+      index_motor_.Iterate();
+      index_motor_plant_.Simulate();
+      SendDSPacket(true);
+      UpdateTime();
+    }
+  }
+
+  // Loads n discs into the indexer at the bottom.
+  void LoadNDiscs(int n) {
+    my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+    // Spin it up.
+    SimulateNCycles(100);
+
+    my_index_loop_.status.FetchLatest();
+    EXPECT_TRUE(my_index_loop_.status->ready_to_intake);
+
+    // Stuff N discs in, waiting between each one for a tiny bit of time so they
+    // don't get too close.
+    int num_grabbed = 0;
+    int wait_counter = 0;
+    while (num_grabbed < n) {
+      index_motor_plant_.SendPositionMessage();
+      index_motor_.Iterate();
+      if (!index_motor_plant_.BottomDiscDetect()) {
+        if (wait_counter > 0) {
+          --wait_counter;
+        } else {
+          index_motor_plant_.InsertDisc();
+          ++num_grabbed;
+          wait_counter = 10;
+        }
+      }
+      index_motor_plant_.Simulate();
+      SendDSPacket(true);
+      UpdateTime();
+    }
+
+    // Settle.
+    int settling_time =
+        static_cast<int>(IndexMotor::kTransferOffDelay.ToSeconds() * 100.0) + 2;
+    for (int i = 0; i < 100; ++i) {
+      index_motor_plant_.SendPositionMessage();
+      index_motor_.Iterate();
+      my_index_loop_.output.FetchLatest();
+      my_index_loop_.status.FetchLatest();
+      if (i <= settling_time || my_index_loop_.status->hopper_disc_count < 4) {
+        EXPECT_EQ(12.0, my_index_loop_.output->transfer_voltage);
+      } else {
+        EXPECT_EQ(0.0, my_index_loop_.output->transfer_voltage);
+      }
+      index_motor_plant_.Simulate();
+      SendDSPacket(true);
+      UpdateTime();
+    }
+  }
+
+  // Loads 2 discs, and then offsets them.  We then send the first disc to the
+  // grabber, and the second disc back down to the bottom.  Verify that both
+  // discs get found correctly.  Positive numbers shift the discs up.
+  void TestDualLostDiscs(double top_disc_offset, double bottom_disc_offset) {
+    LoadNDiscs(2);
+
+    // Move them in the indexer so they need to be re-found.
+    // The top one is moved further than the bottom one so that both edges need to
+    // be inspected.
+    index_motor_plant_.frisbees[0].OffsetIndex(
+         IndexMotor::ConvertDiscPositionToIndex(top_disc_offset));
+    index_motor_plant_.frisbees[1].OffsetIndex(
+         IndexMotor::ConvertDiscPositionToIndex(bottom_disc_offset));
+
+    // Lift the discs up to the top.  Wait a while to let the system settle and
+    // verify that they don't collide.
+    my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+    SimulateNCycles(300);
+
+    // Verify that the disc has been grabbed.
+    my_index_loop_.output.FetchLatest();
+    EXPECT_TRUE(my_index_loop_.output->disc_clamped);
+    // And that we are preloaded.
+    my_index_loop_.status.FetchLatest();
+    EXPECT_TRUE(my_index_loop_.status->preloaded);
+
+    // Pull the disc back down.
+    my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+    SimulateNCycles(300);
+
+    EXPECT_NEAR(IndexMotor::kReadyToLiftPosition,
+        index_motor_plant_.frisbees[0].position(), 0.01);
+    EXPECT_NEAR(
+        (IndexMotor::kIndexStartPosition +
+         IndexMotor::ConvertDiscAngleToDiscPosition(M_PI)),
+        index_motor_plant_.frisbees[1].position(), 0.02);
+
+    // Verify that we found the disc as accurately as the FPGA allows.
+    my_index_loop_.position.FetchLatest();
+    EXPECT_NEAR(
+        index_motor_.frisbees()[0].absolute_position(
+            my_index_loop_.position->index_position),
+        index_motor_plant_.frisbees[1].position(), 0.0001);
+  }
+
+  // Copy of core that works in this process only.
+  ::aos::common::testing::GlobalCoreInstance my_core;
+
+  // Create a new instance of the test queue so that it invalidates the queue
+  // that it points to.  Otherwise, we will have a pointer to shared memory that
+  // is no longer valid.
+  IndexLoop my_index_loop_;
+
+  // Create a loop and simulation plant.
+  IndexMotor index_motor_;
+  IndexMotorSimulation index_motor_plant_;
+
+  // Number of loop cycles that have been executed for tracking the current
+  // time.
+  int loop_count_;
+};
+
+// Tests that the index grabs 1 disc and places it at the correct position.
+TEST_F(IndexTest, GrabSingleDisc) {
+  my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+  for (int i = 0; i < 250; ++i) {
+    index_motor_plant_.SendPositionMessage();
+    index_motor_.Iterate();
+    if (i == 100) {
+      EXPECT_EQ(0, index_motor_plant_.index_roller_position());
+      index_motor_plant_.InsertDisc();
+    }
+    if (i > 0) {
+      EXPECT_TRUE(my_index_loop_.status.FetchLatest());
+      EXPECT_TRUE(my_index_loop_.status->ready_to_intake);
+    }
+    index_motor_plant_.Simulate();
+    SendDSPacket(true);
+    UpdateTime();
+  }
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 1);
+  EXPECT_EQ(static_cast<size_t>(1), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(
+      IndexMotor::kIndexStartPosition + IndexMotor::ConvertDiscAngleToDiscPosition(M_PI),
+      index_motor_plant_.frisbees[0].position(), 0.05);
+}
+
+// Tests that the index grabs 1 disc and places it at the correct position when
+// told to hold immediately after the disc starts into the bot.
+TEST_F(IndexTest, GrabAndHold) {
+  my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+  for (int i = 0; i < 200; ++i) {
+    index_motor_plant_.SendPositionMessage();
+    index_motor_.Iterate();
+    if (i == 100) {
+      EXPECT_EQ(0, index_motor_plant_.index_roller_position());
+      index_motor_plant_.InsertDisc();
+    } else if (i == 102) {
+      // The disc has been seen.  Tell the indexer to now hold.
+      my_index_loop_.goal.MakeWithBuilder().goal_state(0).Send();
+    } else if (i > 102) {
+      my_index_loop_.status.FetchLatest();
+      EXPECT_FALSE(my_index_loop_.status->ready_to_intake);
+    }
+    index_motor_plant_.Simulate();
+    SendDSPacket(true);
+    UpdateTime();
+  }
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 1);
+  EXPECT_EQ(0, my_index_loop_.status->shot_disc_count);
+  EXPECT_EQ(static_cast<size_t>(1), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(
+      (IndexMotor::kIndexStartPosition +
+       IndexMotor::ConvertDiscAngleToDiscPosition(M_PI)),
+      index_motor_plant_.frisbees[0].position(), 0.04);
+}
+
+// Tests that the index grabs two discs and places them at the correct
+// positions.
+TEST_F(IndexTest, GrabTwoDiscs) {
+  LoadNDiscs(2);
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 2);
+  EXPECT_EQ(static_cast<size_t>(2), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(
+      (IndexMotor::kIndexStartPosition +
+       IndexMotor::ConvertDiscAngleToDiscPosition(M_PI)),
+      index_motor_plant_.frisbees[1].position(), 0.10);
+  EXPECT_NEAR(
+      IndexMotor::ConvertDiscAngleToDiscPosition(M_PI),
+      (index_motor_plant_.frisbees[0].position() -
+       index_motor_plant_.frisbees[1].position()), 0.10);
+}
+
+// Tests that the index grabs 2 discs, and loads one up into the loader to get
+// ready to shoot.  It then pulls the second disc back down to be ready to
+// intake more.
+TEST_F(IndexTest, ReadyGrabsOneDisc) {
+  LoadNDiscs(2);
+
+  // Lift the discs up to the top.  Wait a while to let the system settle and
+  // verify that they don't collide.
+  my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+  SimulateNCycles(300);
+
+  // Verify that the disc has been grabbed.
+  my_index_loop_.output.FetchLatest();
+  EXPECT_TRUE(my_index_loop_.output->disc_clamped);
+  // And that we are preloaded.
+  my_index_loop_.status.FetchLatest();
+  EXPECT_TRUE(my_index_loop_.status->preloaded);
+
+  // Pull the disc back down and verify that the transfer roller doesn't turn on
+  // until we are ready.
+  my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+  for (int i = 0; i < 100; ++i) {
+    index_motor_plant_.SendPositionMessage();
+    index_motor_.Iterate();
+
+    EXPECT_TRUE(my_index_loop_.status.FetchLatest());
+    EXPECT_TRUE(my_index_loop_.output.FetchLatest());
+    if (!my_index_loop_.status->ready_to_intake) {
+      EXPECT_EQ(my_index_loop_.output->transfer_voltage, 0)
+          << "Transfer should be off until indexer is ready";
+    }
+
+    index_motor_plant_.Simulate();
+    SendDSPacket(true);
+    UpdateTime();
+  }
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 2);
+  EXPECT_EQ(my_index_loop_.status->total_disc_count, 2);
+  my_index_loop_.output.FetchLatest();
+  EXPECT_TRUE(my_index_loop_.output->disc_clamped);
+
+  EXPECT_EQ(static_cast<size_t>(2), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(IndexMotor::kReadyToLiftPosition,
+      index_motor_plant_.frisbees[0].position(), 0.01);
+  LOG(INFO, "Top disc error is %f\n",
+      IndexMotor::kReadyToLiftPosition -
+      index_motor_plant_.frisbees[0].position());
+  EXPECT_NEAR(
+      (IndexMotor::kIndexStartPosition +
+       IndexMotor::ConvertDiscAngleToDiscPosition(M_PI)),
+      index_motor_plant_.frisbees[1].position(), 0.02);
+  LOG(INFO, "Bottom disc error is %f\n",
+      (IndexMotor::kIndexStartPosition +
+       IndexMotor::ConvertDiscAngleToDiscPosition(M_PI))-
+      index_motor_plant_.frisbees[1].position());
+}
+
+// Tests that the index grabs 1 disc and continues to pull it in correctly when
+// in the READY_LOWER state.  The transfer roller should be disabled then.
+TEST_F(IndexTest, GrabAndReady) {
+  my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+  for (int i = 0; i < 200; ++i) {
+    index_motor_plant_.SendPositionMessage();
+    index_motor_.Iterate();
+    if (i == 100) {
+      EXPECT_EQ(0, index_motor_plant_.index_roller_position());
+      index_motor_plant_.InsertDisc();
+    } else if (i == 102) {
+      my_index_loop_.goal.MakeWithBuilder().goal_state(1).Send();
+    } else if (i > 150) {
+      my_index_loop_.status.FetchLatest();
+      EXPECT_TRUE(my_index_loop_.status->ready_to_intake);
+      my_index_loop_.output.FetchLatest();
+      EXPECT_EQ(my_index_loop_.output->transfer_voltage, 0.0);
+    }
+    index_motor_plant_.Simulate();
+    SendDSPacket(true);
+    UpdateTime();
+  }
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 1);
+  EXPECT_EQ(static_cast<size_t>(1), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(
+      (IndexMotor::kIndexStartPosition +
+       IndexMotor::ConvertDiscAngleToDiscPosition(M_PI)),
+      index_motor_plant_.frisbees[0].position(), 0.04);
+}
+
+// Tests that grabbing 4 discs ends up with 4 discs in the bot and us no longer
+// ready.
+TEST_F(IndexTest, GrabFourDiscs) {
+  LoadNDiscs(4);
+
+  my_index_loop_.output.FetchLatest();
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.output->transfer_voltage, 0.0);
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 4);
+  EXPECT_FALSE(my_index_loop_.status->ready_to_intake);
+  EXPECT_EQ(static_cast<size_t>(4), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(
+      IndexMotor::kReadyToLiftPosition,
+      index_motor_plant_.frisbees[0].position(), 0.001);
+
+  EXPECT_NEAR(
+      IndexMotor::kReadyToPreload,
+      index_motor_plant_.frisbees[1].position(), 0.01);
+
+  EXPECT_NEAR(
+      IndexMotor::ConvertDiscAngleToDiscPosition(M_PI),
+      (index_motor_plant_.frisbees[1].position() -
+       index_motor_plant_.frisbees[2].position()), 0.10);
+  EXPECT_NEAR(
+      IndexMotor::ConvertDiscAngleToDiscPosition(M_PI),
+      (index_motor_plant_.frisbees[2].position() -
+       index_motor_plant_.frisbees[3].position()), 0.10);
+}
+
+// Tests that shooting 4 discs works.
+TEST_F(IndexTest, ShootFourDiscs) {
+  LoadNDiscs(4);
+
+  EXPECT_EQ(static_cast<size_t>(4), index_motor_plant_.frisbees.size());
+
+  my_index_loop_.goal.MakeWithBuilder().goal_state(4).Send();
+
+  // Lifting and shooting takes a while...
+  SimulateNCycles(300);
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 0);
+  EXPECT_EQ(my_index_loop_.status->total_disc_count, 4);
+  my_index_loop_.output.FetchLatest();
+  EXPECT_FALSE(my_index_loop_.output->disc_clamped);
+  EXPECT_FALSE(my_index_loop_.output->loader_up);
+  EXPECT_FALSE(my_index_loop_.output->disc_ejected);
+
+  EXPECT_EQ(static_cast<size_t>(4), index_motor_plant_.shot_frisbees.size());
+}
+
+// Tests that discs aren't pulled out of the loader half way through being
+// grabbed when being asked to index.
+TEST_F(IndexTest, PreloadToIndexEarlyTransition) {
+  LoadNDiscs(2);
+
+  // Lift the discs up to the top.  Wait a while to let the system settle and
+  // verify that they don't collide.
+  my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+  for (int i = 0; i < 300; ++i) {
+    index_motor_plant_.SendPositionMessage();
+    index_motor_.Iterate();
+    index_motor_plant_.Simulate();
+    SendDSPacket(true);
+    UpdateTime();
+    // Drop out of the loop as soon as it enters the loader.
+    // This will require it to finish the job before intaking more.
+    my_index_loop_.status.FetchLatest();
+    if (index_motor_plant_.frisbees[0].position() >
+        IndexMotor::kLoaderFreeStopPosition) {
+      break;
+    }
+  }
+
+  // Pull the disc back down and verify that the transfer roller doesn't turn on
+  // until we are ready.
+  my_index_loop_.goal.MakeWithBuilder().goal_state(1).Send();
+  SimulateNCycles(100);
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 2);
+  EXPECT_EQ(my_index_loop_.status->total_disc_count, 2);
+  my_index_loop_.output.FetchLatest();
+  EXPECT_TRUE(my_index_loop_.output->disc_clamped);
+
+  EXPECT_EQ(static_cast<size_t>(2), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(IndexMotor::kReadyToLiftPosition,
+      index_motor_plant_.frisbees[0].position(), 0.01);
+  EXPECT_NEAR(
+      (IndexMotor::kIndexStartPosition +
+       IndexMotor::ConvertDiscAngleToDiscPosition(M_PI)),
+      index_motor_plant_.frisbees[1].position(), 0.10);
+}
+
+// Tests that disabling while grabbing a disc doesn't cause problems.
+TEST_F(IndexTest, HandleDisable) {
+  my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+  for (int i = 0; i < 200; ++i) {
+    index_motor_plant_.SendPositionMessage();
+    index_motor_.Iterate();
+    if (i == 100) {
+      EXPECT_EQ(0, index_motor_plant_.index_roller_position());
+      index_motor_plant_.InsertDisc();
+    } else if (i == 102) {
+      my_index_loop_.goal.MakeWithBuilder().goal_state(1).Send();
+    } else if (i > 150) {
+      my_index_loop_.status.FetchLatest();
+      EXPECT_TRUE(my_index_loop_.status->ready_to_intake);
+      my_index_loop_.output.FetchLatest();
+      EXPECT_EQ(my_index_loop_.output->transfer_voltage, 0.0);
+    }
+    index_motor_plant_.Simulate();
+    SendDSPacket(i < 102 || i > 110);
+    UpdateTime();
+  }
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 1);
+  EXPECT_EQ(static_cast<size_t>(1), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(
+      (IndexMotor::kIndexStartPosition +
+       IndexMotor::ConvertDiscAngleToDiscPosition(M_PI)),
+      index_motor_plant_.frisbees[0].position(), 0.04);
+}
+
+// Tests that we can shoot after grabbing in the loader.
+TEST_F(IndexTest, GrabbedToShoot) {
+  LoadNDiscs(2);
+
+  // Lift the discs up to the top.  Wait a while to let the system settle and
+  // verify that they don't collide.
+  my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+  SimulateNCycles(300);
+
+  // Verify that it is preloaded.
+  my_index_loop_.status.FetchLatest();
+  EXPECT_TRUE(my_index_loop_.status->preloaded);
+
+  // Shoot them all.
+  my_index_loop_.goal.MakeWithBuilder().goal_state(4).Send();
+  SimulateNCycles(200);
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 0);
+  EXPECT_EQ(my_index_loop_.status->total_disc_count, 2);
+  EXPECT_FALSE(my_index_loop_.status->preloaded);
+}
+
+// Tests that the cRIO can reboot and we don't loose discs.
+TEST_F(IndexTest, cRIOReboot) {
+  LoadNDiscs(2);
+
+  SimulateNCycles(100);
+  for (int i = 0; i < 100; ++i) {
+    // No position for a while is a cRIO reboot.
+    index_motor_.Iterate();
+    index_motor_plant_.Simulate();
+    SendDSPacket(false);
+    UpdateTime();
+  }
+
+  // Shift the plant.
+  const double kPlantOffset = 5000.0;
+  index_motor_plant_.index_plant_->Y(0, 0) += kPlantOffset;
+  index_motor_plant_.index_plant_->X(0, 0) += kPlantOffset;
+  index_motor_plant_.bottom_disc_posedge_count_ = 971;
+  index_motor_plant_.bottom_disc_negedge_count_ = 971;
+  index_motor_plant_.bottom_disc_negedge_wait_count_ = 971;
+  index_motor_plant_.bottom_disc_negedge_wait_position_ = -1502;
+
+  // Shift the discs
+  index_motor_plant_.OffsetIndices(kPlantOffset);
+  // Let time elapse to see if the loop wants to move the discs or not.
+  SimulateNCycles(1000);
+
+  // Verify that 2 discs are at the bottom of the hopper.
+  EXPECT_TRUE(my_index_loop_.status.FetchLatest());
+  EXPECT_EQ(my_index_loop_.status->hopper_disc_count, 2);
+  EXPECT_EQ(static_cast<size_t>(2), index_motor_plant_.frisbees.size());
+  EXPECT_NEAR(
+      (IndexMotor::kIndexStartPosition +
+       IndexMotor::ConvertDiscAngleToDiscPosition(M_PI)),
+      index_motor_plant_.frisbees[1].position(), 0.10);
+  EXPECT_NEAR(
+      IndexMotor::ConvertDiscAngleToDiscPosition(M_PI),
+      (index_motor_plant_.frisbees[0].position() -
+       index_motor_plant_.frisbees[1].position()), 0.10);
+}
+
+// Tests that invalid states are rejected.
+TEST_F(IndexTest, InvalidStateTest) {
+  my_index_loop_.goal.MakeWithBuilder().goal_state(10).Send();
+  SimulateNCycles(2);
+  // Verify that the goal is correct.
+  EXPECT_GE(4, static_cast<int>(index_motor_.safe_goal_));
+  EXPECT_LE(0, static_cast<int>(index_motor_.safe_goal_));
+}
+
+// Tests that the motor is turned off after a number of cycles of low power.
+TEST_F(IndexTest, ZeroPowerAfterTimeout) {
+  LoadNDiscs(4);
+  SimulateNCycles(100);
+
+  // Verify that the motor is hard off.  This relies on floating point math
+  // never really getting to 0 unless you set it explicitly.
+  my_index_loop_.output.FetchLatest();
+  EXPECT_EQ(my_index_loop_.output->index_voltage, 0.0);
+}
+
+// Tests that preloading 2 discs relocates the discs if they shift on the
+// indexer.  Test shifting all 4 ways.
+TEST_F(IndexTest, ShiftedDiscsAreRefound) {
+  TestDualLostDiscs(0.10, 0.15);
+}
+
+TEST_F(IndexTest, ShiftedDiscsAreRefoundOtherSeperation) {
+  TestDualLostDiscs(0.15, 0.10);
+}
+
+TEST_F(IndexTest, ShiftedDownDiscsAreRefound) {
+  TestDualLostDiscs(-0.15, -0.10);
+}
+
+TEST_F(IndexTest, ShiftedDownDiscsAreRefoundOtherSeperation) {
+  TestDualLostDiscs(-0.10, -0.15);
+}
+
+// Verifies that the indexer is ready to intake imediately after loading.
+TEST_F(IndexTest, IntakingAfterLoading) {
+  LoadNDiscs(1);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+  SimulateNCycles(200);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+  SimulateNCycles(10);
+  my_index_loop_.output.FetchLatest();
+  EXPECT_EQ(12.0, my_index_loop_.output->transfer_voltage);
+  my_index_loop_.status.FetchLatest();
+  EXPECT_TRUE(my_index_loop_.status->ready_to_intake);
+}
+
+// Verifies that the indexer is ready to intake imediately after loading.
+TEST_F(IndexTest, CanShootOneDiscAfterReady) {
+  LoadNDiscs(1);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+  SimulateNCycles(200);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(4).Send();
+  SimulateNCycles(100);
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(1, my_index_loop_.status->total_disc_count);
+  EXPECT_EQ(0, my_index_loop_.status->hopper_disc_count);
+}
+
+// Verifies that the indexer is ready to intake imediately after loading.
+TEST_F(IndexTest, GotExtraDisc) {
+  LoadNDiscs(1);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+  SimulateNCycles(200);
+
+  double index_roller_position = index_motor_plant_.index_roller_position();
+  index_motor_plant_.InsertDisc(IndexMotor::kTopDiscDetectStart - 0.1);
+  index_motor_plant_.InsertDisc(IndexMotor::kTopDiscDetectStart - 0.6);
+  SimulateNCycles(100);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(4).Send();
+  SimulateNCycles(300);
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(3, my_index_loop_.status->total_disc_count);
+  EXPECT_EQ(0, my_index_loop_.status->hopper_disc_count);
+  EXPECT_LT(IndexMotor::ConvertDiscAngleToIndex(4 * M_PI),
+            index_motor_plant_.index_roller_position() - index_roller_position);
+}
+
+// Verifies that the indexer is ready to intake imediately after loading.
+TEST_F(IndexTest, LostDisc) {
+  LoadNDiscs(3);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+  SimulateNCycles(200);
+
+  index_motor_plant_.frisbees.erase(
+      index_motor_plant_.frisbees.begin() + 1);
+
+  double index_roller_position = index_motor_plant_.index_roller_position();
+  my_index_loop_.goal.MakeWithBuilder().goal_state(4).Send();
+  SimulateNCycles(300);
+
+  my_index_loop_.status.FetchLatest();
+  EXPECT_EQ(2, my_index_loop_.status->total_disc_count);
+  EXPECT_EQ(0, my_index_loop_.status->hopper_disc_count);
+  EXPECT_LT(IndexMotor::ConvertDiscAngleToIndex(3 * M_PI),
+            index_motor_plant_.index_roller_position() - index_roller_position);
+  EXPECT_EQ(0u, index_motor_.frisbees_.size());
+  my_index_loop_.output.FetchLatest();
+  EXPECT_EQ(0.0, my_index_loop_.output->index_voltage);
+}
+
+// Verifies that the indexer is ready to intake imediately after loading.
+TEST_F(IndexTest, CRIOReboot) {
+  index_motor_plant_.index_plant_->Y(0, 0) = 5000.0;
+  index_motor_plant_.index_plant_->X(0, 0) = 5000.0;
+  LoadNDiscs(1);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+  SimulateNCycles(200);
+  my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+  SimulateNCycles(10);
+  my_index_loop_.output.FetchLatest();
+  EXPECT_EQ(12.0, my_index_loop_.output->transfer_voltage);
+  my_index_loop_.status.FetchLatest();
+  EXPECT_TRUE(my_index_loop_.status->ready_to_intake);
+  EXPECT_EQ(1, my_index_loop_.status->hopper_disc_count);
+}
+
+// Verifies that the indexer can shoot a disc and then intake and shoot another
+// one.  This verifies that the code that forgets discs works correctly.
+TEST_F(IndexTest, CanShootIntakeAndShoot) {
+  for (int i = 1; i < 4; ++i) {
+    LoadNDiscs(1);
+    my_index_loop_.goal.MakeWithBuilder().goal_state(3).Send();
+    SimulateNCycles(200);
+    my_index_loop_.goal.MakeWithBuilder().goal_state(4).Send();
+    SimulateNCycles(500);
+    my_index_loop_.status.FetchLatest();
+    EXPECT_EQ(i, my_index_loop_.status->total_disc_count);
+    EXPECT_EQ(0, my_index_loop_.status->hopper_disc_count);
+    EXPECT_EQ(i, my_index_loop_.status->shot_disc_count);
+  }
+}
+
+// Tests that missing position packets don't cause the transfer motor
+// to turn off.
+TEST_F(IndexTest, NoPositionDoesNotTurnOff) {
+  my_index_loop_.goal.MakeWithBuilder().goal_state(2).Send();
+  for (int i = 0; i < 250; ++i) {
+    if (i % 10) {
+      index_motor_plant_.SendPositionMessage();
+    }
+    index_motor_.Iterate();
+
+    if (i > 1 && i % 10) {
+      EXPECT_TRUE(my_index_loop_.output.FetchLatest());
+      EXPECT_EQ(12.0, my_index_loop_.output->transfer_voltage);
+    }
+    index_motor_plant_.Simulate();
+    SendDSPacket(true);
+    UpdateTime();
+  }
+}
+
+}  // namespace testing
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/index/index_main.cc b/frc971/control_loops/index/index_main.cc
new file mode 100644
index 0000000..c542268
--- /dev/null
+++ b/frc971/control_loops/index/index_main.cc
@@ -0,0 +1,11 @@
+#include "frc971/control_loops/index/index.h"
+
+#include "aos/atom_code/init.h"
+
+int main() {
+  ::aos::Init();
+  frc971::control_loops::IndexMotor indexer;
+  indexer.Run();
+  ::aos::Cleanup();
+  return 0;
+}
diff --git a/frc971/control_loops/index/index_motor.q b/frc971/control_loops/index/index_motor.q
new file mode 100644
index 0000000..9530a4f
--- /dev/null
+++ b/frc971/control_loops/index/index_motor.q
@@ -0,0 +1,96 @@
+package frc971.control_loops;
+
+import "aos/common/control_loop/control_loops.q";
+
+queue_group IndexLoop {
+  implements aos.control_loops.ControlLoop;
+
+  message Goal {
+    // The state for the indexer to be in.
+    // 0 means hold position, in a low power state.
+    // 1 means get ready to load discs by shifting the discs down.
+    // 2 means ready the discs, spin up the transfer roller, and accept discs.
+    // 3 means get ready to shoot, and place a disc grabbed in the loader.
+    // 4 means shoot at will.
+    // 5 means re-initialize
+    int32_t goal_state;
+    // Forces the loader to fire.
+    bool force_fire;
+
+    // If true, set the indexer voltage to index_voltage.
+    bool override_index;
+    double index_voltage;
+    bool override_transfer;
+    double transfer_voltage;
+  };
+
+  message Position {
+    // Index position
+    double index_position;
+
+    // Current values of both sensors.
+    bool top_disc_detect;
+    bool bottom_disc_detect;
+    // Counts for positive and negative edges on the bottom sensor.
+    int32_t bottom_disc_posedge_count;
+    int32_t bottom_disc_negedge_count;
+    // The most recent encoder position read after the most recent
+    // negedge and a count of how many times it's been updated.
+    double bottom_disc_negedge_wait_position;
+    int32_t bottom_disc_negedge_wait_count;
+    // The most recent index position at the posedge of the top disc detect
+    // and a count of how many edges have been seen.
+    int32_t top_disc_posedge_count;
+    double top_disc_posedge_position;
+    // The most recent index position at the negedge of the top disc detect
+    // and a count of how many edges have been seen.
+    int32_t top_disc_negedge_count;
+    double top_disc_negedge_position;
+
+    // Whether the hall effects for the loader are triggered (have a magnet in
+	// front of them).
+	bool loader_top;
+	bool loader_bottom;
+  };
+
+  message Output {
+    // Intake roller(s) output voltage.
+    // Positive means into the robot.
+    double intake_voltage;
+    // Transfer roller output voltage.
+    // Positive means into the robot.
+    double transfer_voltage;
+    // Index roller.  Positive means up towards the shooter.
+    double index_voltage;
+    // Loader pistons.
+    bool disc_clamped;
+    bool loader_up;
+    bool disc_ejected;
+  };
+
+  message Status {
+    // Number of discs in the hopper
+    int32_t hopper_disc_count;
+    // Number of discs seen by the hopper.
+    int32_t total_disc_count;
+    // Number of discs shot by the shooter.
+    int32_t shot_disc_count;
+    // Disc ready in the loader.
+    bool preloaded;
+    // Indexer ready to accept more discs.
+    bool ready_to_intake;
+	// True from when we're committed to shooting util after the disk is clear
+	// of the robot.
+	bool is_shooting;
+	// Goes false when we first get a disk and back true after we finish
+	// clearing.
+	bool hopper_clear;
+  };
+
+  queue Goal goal;
+  queue Position position;
+  queue Output output;
+  queue Status status;
+};
+
+queue_group IndexLoop index_loop;
diff --git a/frc971/control_loops/index/index_motor_plant.cc b/frc971/control_loops/index/index_motor_plant.cc
new file mode 100644
index 0000000..10fa60c
--- /dev/null
+++ b/frc971/control_loops/index/index_motor_plant.cc
@@ -0,0 +1,151 @@
+#include "frc971/control_loops/index/index_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex0DiscPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00832470485812, 0.0, 0.68478614982;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.06201698456, 11.6687573378;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex1DiscPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00867533005665, 0.0, 0.747315209983;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.0490373507155, 9.35402266105;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex2DiscPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00867533005665, 0.0, 0.747315209983;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.0490373507155, 9.35402266105;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex3DiscPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00901822957243, 0.0, 0.810292182273;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.0363437103863, 7.02270693014;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex4DiscPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00927953099869, 0.0, 0.859452713637;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.0266707124098, 5.20285570613;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<2, 1, 1> MakeIndex0DiscController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.58478614982, 48.4122215588;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 1.90251621122, 0.0460029989298;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeIndex0DiscPlantCoefficients());
+}
+
+StateFeedbackController<2, 1, 1> MakeIndex1DiscController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.64731520998, 56.0569452572;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 2.37331047876, 0.0642434141389;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeIndex1DiscPlantCoefficients());
+}
+
+StateFeedbackController<2, 1, 1> MakeIndex2DiscController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.64731520998, 56.0569452572;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 2.37331047876, 0.0642434141389;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeIndex2DiscPlantCoefficients());
+}
+
+StateFeedbackController<2, 1, 1> MakeIndex3DiscController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.71029218227, 64.1044007344;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 3.16117420545, 0.0947502706704;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeIndex3DiscPlantCoefficients());
+}
+
+StateFeedbackController<2, 1, 1> MakeIndex4DiscController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.75945271364, 70.6153894746;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 4.26688750446, 0.137549804289;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeIndex4DiscPlantCoefficients());
+}
+
+StateFeedbackPlant<2, 1, 1> MakeIndexPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<2, 1, 1> *> plants(5);
+  plants[0] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeIndex0DiscPlantCoefficients());
+  plants[1] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeIndex1DiscPlantCoefficients());
+  plants[2] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeIndex2DiscPlantCoefficients());
+  plants[3] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeIndex3DiscPlantCoefficients());
+  plants[4] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeIndex4DiscPlantCoefficients());
+  return StateFeedbackPlant<2, 1, 1>(plants);
+}
+
+StateFeedbackLoop<2, 1, 1> MakeIndexLoop() {
+  ::std::vector<StateFeedbackController<2, 1, 1> *> controllers(5);
+  controllers[0] = new StateFeedbackController<2, 1, 1>(MakeIndex0DiscController());
+  controllers[1] = new StateFeedbackController<2, 1, 1>(MakeIndex1DiscController());
+  controllers[2] = new StateFeedbackController<2, 1, 1>(MakeIndex2DiscController());
+  controllers[3] = new StateFeedbackController<2, 1, 1>(MakeIndex3DiscController());
+  controllers[4] = new StateFeedbackController<2, 1, 1>(MakeIndex4DiscController());
+  return StateFeedbackLoop<2, 1, 1>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/index/index_motor_plant.h b/frc971/control_loops/index/index_motor_plant.h
new file mode 100644
index 0000000..e82db6a
--- /dev/null
+++ b/frc971/control_loops/index/index_motor_plant.h
@@ -0,0 +1,36 @@
+#ifndef FRC971_CONTROL_LOOPS_INDEX_INDEX_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_INDEX_INDEX_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex0DiscPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeIndex0DiscController();
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex1DiscPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeIndex1DiscController();
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex2DiscPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeIndex2DiscController();
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex3DiscPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeIndex3DiscController();
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeIndex4DiscPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeIndex4DiscController();
+
+StateFeedbackPlant<2, 1, 1> MakeIndexPlant();
+
+StateFeedbackLoop<2, 1, 1> MakeIndexLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_INDEX_INDEX_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/index/transfer_motor_plant.cc b/frc971/control_loops/index/transfer_motor_plant.cc
new file mode 100644
index 0000000..0852b26
--- /dev/null
+++ b/frc971/control_loops/index/transfer_motor_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/index/transfer_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeTransferPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00867533005665, 0.0, 0.747315209983;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.0490373507155, 9.35402266105;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<2, 1, 1> MakeTransferController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.64731520998, 56.0569452572;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 1.06905877421, 0.0368709177253;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeTransferPlantCoefficients());
+}
+
+StateFeedbackPlant<2, 1, 1> MakeTransferPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<2, 1, 1> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeTransferPlantCoefficients());
+  return StateFeedbackPlant<2, 1, 1>(plants);
+}
+
+StateFeedbackLoop<2, 1, 1> MakeTransferLoop() {
+  ::std::vector<StateFeedbackController<2, 1, 1> *> controllers(1);
+  controllers[0] = new StateFeedbackController<2, 1, 1>(MakeTransferController());
+  return StateFeedbackLoop<2, 1, 1>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/index/transfer_motor_plant.h b/frc971/control_loops/index/transfer_motor_plant.h
new file mode 100644
index 0000000..596f9b3
--- /dev/null
+++ b/frc971/control_loops/index/transfer_motor_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_INDEX_TRANSFER_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_INDEX_TRANSFER_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeTransferPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeTransferController();
+
+StateFeedbackPlant<2, 1, 1> MakeTransferPlant();
+
+StateFeedbackLoop<2, 1, 1> MakeTransferLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_INDEX_TRANSFER_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/matlab/drivetrain_controller.m b/frc971/control_loops/matlab/drivetrain_controller.m
index 11a5a4b..b51af99 100644
--- a/frc971/control_loops/matlab/drivetrain_controller.m
+++ b/frc971/control_loops/matlab/drivetrain_controller.m
@@ -1,12 +1,18 @@
 close all;
 load 'drivetrain_spin_low'
 load 'drivetrain_strait_low'
+% Max power amps of CIM or maybe half the mass of the robot in lbs or the whole robot in kg.
 m = 68;
+% Must be in meters. Maybe width of robot (distance of center wheels from center).
 rb = 0.617998644 / 2.0;
+% Moment of Inertia
 J = 7;
 stall_current = 133.0;
+% Resistance of the motor, divided by the number of motors.
 R = 12.0 / stall_current / 4 / 0.43;
+% Motor Constant
 Km = (12.0 - R * 2.7) / (4650.0 / 60.0 * 2.0 * pi);
+% Torque Constant
 Kt = 0.008;
 r = 0.04445; % 3.5 inches diameter
 G_low = 60.0 / 15.0 * 50.0 / 15.0;
@@ -15,6 +21,9 @@
 
 G = G_low;
 
+% must refer to how each side of the robot affects the other? Units of 1 / kg
+% I think that if the center of mass is in the center of the robot, then
+% msp will evaluate to 2/(mass of robot) and msn will evaluate to 0.
 msp = (1.0 / m + rb ^ 2.0 / J);
 msn = (1.0 / m - rb ^ 2.0 / J);
 tc = -Km * Kt * G ^ 2.0 / (R * r ^ 2.0);
diff --git a/frc971/control_loops/python/angle_adjust.py b/frc971/control_loops/python/angle_adjust.py
new file mode 100755
index 0000000..36cb49d
--- /dev/null
+++ b/frc971/control_loops/python/angle_adjust.py
@@ -0,0 +1,153 @@
+#!/usr/bin/python
+
+import control_loop
+import numpy
+import sys
+from matplotlib import pylab
+
+class AngleAdjust(control_loop.ControlLoop):
+  def __init__(self, name="AngleAdjustRaw"):
+    super(AngleAdjust, self).__init__(name)
+    # Stall Torque in N m
+    self.stall_torque = .428
+    # Stall Current in Amps
+    self.stall_current = 63.8
+    # Free Speed in RPM
+    self.free_speed = 14900.0
+    # Free Current in Amps
+    self.free_current = 1.2
+    # Moment of inertia of the angle adjust about the shooter's pivot in kg m^2
+    self.J = 9.4
+    # Resistance of the motor
+    self.R = 12.0 / self.stall_current
+    # Motor velocity constant
+    self.Kv = ((self.free_speed / 60.0 * 2.0 * numpy.pi) /
+               (12.0 - self.R * self.free_current))
+    # Torque constant
+    self.Kt = self.stall_torque / self.stall_current
+    # Gear ratio of the gearbox multiplied by the ratio of the radii of
+    # the output and the angle adjust curve, which is essentially another gear.
+    self.G = (1.0 / 50.0) * (0.01905 / 0.41964)
+    # Control loop time step
+    self.dt = 0.01
+
+    # State feedback matrices
+    self.A_continuous = numpy.matrix(
+        [[0, 1],
+         [0, -self.Kt / self.Kv / (self.J * self.G * self.G * self.R)]])
+    self.B_continuous = numpy.matrix(
+        [[0],
+         [self.Kt / (self.J * self.G * self.R)]])
+    self.C = numpy.matrix([[1, 0]])
+    self.D = numpy.matrix([[0]])
+
+    self.A, self.B = self.ContinuousToDiscrete(
+        self.A_continuous, self.B_continuous, self.dt)
+
+    self.PlaceControllerPoles([.45, .83])
+
+    print "Unaugmented controller poles at"
+    print self.K
+
+    self.rpl = .05
+    self.ipl = 0.008
+    self.PlaceObserverPoles([self.rpl + 1j * self.ipl,
+                             self.rpl - 1j * self.ipl])
+
+    self.U_max = numpy.matrix([[12.0]])
+    self.U_min = numpy.matrix([[-12.0]])
+
+    self.InitializeState()
+
+class AngleAdjustDeltaU(AngleAdjust):
+  def __init__(self, name="AngleAdjust"):
+    super(AngleAdjustDeltaU, self).__init__(name)
+    A_unaugmented = self.A
+    B_unaugmented = self.B
+
+    self.A = numpy.matrix([[0.0, 0.0, 0.0],
+                           [0.0, 0.0, 0.0],
+                           [0.0, 0.0, 1.0]])
+    self.A[0:2, 0:2] = A_unaugmented
+    self.A[0:2, 2] = B_unaugmented
+
+    self.B = numpy.matrix([[0.0],
+                           [0.0],
+                           [1.0]])
+
+    self.C = numpy.matrix([[1.0, 0.0, 0.0]])
+    self.D = numpy.matrix([[0.0]])
+
+    self.PlaceControllerPoles([0.60, 0.31, 0.78])
+
+    print "K"
+    print self.K
+    print "Placed controller poles are"
+    print numpy.linalg.eig(self.A - self.B * self.K)[0]
+
+    self.rpl = .05
+    self.ipl = 0.008
+    self.PlaceObserverPoles([self.rpl + 1j * self.ipl,
+                             self.rpl - 1j * self.ipl, 0.78])
+    print "Placed observer poles are"
+    print numpy.linalg.eig(self.A - self.L * self.C)[0]
+
+    self.U_max = numpy.matrix([[12.0]])
+    self.U_min = numpy.matrix([[-12.0]])
+
+    self.InitializeState()
+
+
+def main(argv):
+  # Simulate the response of the system to a step input.
+  angle_adjust_data = numpy.genfromtxt(
+      'angle_adjust/angle_adjust_data.csv', delimiter=',')
+  angle_adjust = AngleAdjust()
+  simulated_x = []
+  real_x = []
+  initial_x = angle_adjust_data[0, 2]
+  for i in xrange(angle_adjust_data.shape[0]):
+    angle_adjust.Update(numpy.matrix([[angle_adjust_data[i, 1] - 0.7]]))
+    simulated_x.append(angle_adjust.X[0, 0])
+    x_offset = angle_adjust_data[i, 2] - initial_x
+    real_x.append(x_offset)
+
+  sim_delay = 2
+  pylab.plot(range(sim_delay, angle_adjust_data.shape[0] + sim_delay),
+             simulated_x, label='Simulation')
+  pylab.plot(range(angle_adjust_data.shape[0]), real_x, label='Reality')
+  pylab.legend()
+  pylab.show()
+
+  # Simulate the closed loop response of the system to a step input.
+  angle_adjust = AngleAdjustDeltaU()
+  close_loop_x = []
+  R = numpy.matrix([[1.0], [0.0], [0.0]])
+  for _ in xrange(100):
+    U = numpy.clip(angle_adjust.K * (R - angle_adjust.X_hat), angle_adjust.U_min, angle_adjust.U_max)
+    angle_adjust.UpdateObserver(U)
+    angle_adjust.Update(U)
+    close_loop_x.append(angle_adjust.X[0, 0])
+
+  pylab.plot(range(100), close_loop_x)
+  pylab.show()
+
+  # Write the generated constants out to a file.
+  if len(argv) != 5:
+    print "Expected .cc file name and .h file name"
+  else:
+    loop_writer = control_loop.ControlLoopWriter("RawAngleAdjust",
+                                                 [AngleAdjust()])
+    if argv[3][-3:] == '.cc':
+      loop_writer.Write(argv[4], argv[3])
+    else:
+      loop_writer.Write(argv[3], argv[4])
+
+    loop_writer = control_loop.ControlLoopWriter("AngleAdjust", [angle_adjust])
+    if argv[1][-3:] == '.cc':
+      loop_writer.Write(argv[2], argv[1])
+    else:
+      loop_writer.Write(argv[1], argv[2])
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/frc971/control_loops/python/control_loop.py b/frc971/control_loops/python/control_loop.py
new file mode 100644
index 0000000..754ba62
--- /dev/null
+++ b/frc971/control_loops/python/control_loop.py
@@ -0,0 +1,295 @@
+import controls
+import numpy
+
+class ControlLoopWriter(object):
+  def __init__(self, gain_schedule_name, loops, namespaces=None):
+    """Constructs a control loop writer.
+
+    Args:
+      gain_schedule_name: string, Name of the overall controller.
+      loops: array[ControlLoop], a list of control loops to gain schedule
+        in order.
+      namespaces: array[string], a list of names of namespaces to nest in
+        order.  If None, the default will be used.
+    """
+    self._gain_schedule_name = gain_schedule_name
+    self._loops = loops
+    if namespaces:
+      self._namespaces = namespaces
+    else:
+      self._namespaces = ['frc971', 'control_loops']
+
+    self._namespace_start = '\n'.join(
+        ['namespace %s {' % name for name in self._namespaces])
+
+    self._namespace_end = '\n'.join(
+        ['}  // namespace %s' % name for name in reversed(self._namespaces)])
+
+  def _HeaderGuard(self, header_file):
+    return ('FRC971_CONTROL_LOOPS_' +
+            header_file.upper().replace('.', '_').replace('/', '_') +
+            '_')
+
+  def Write(self, header_file, cc_file):
+    """Writes the loops to the specified files."""
+    self.WriteHeader(header_file)
+    self.WriteCC(header_file, cc_file)
+
+  def _GenericType(self, typename):
+    """Returns a loop template using typename for the type."""
+    num_states = self._loops[0].A.shape[0]
+    num_inputs = self._loops[0].B.shape[1]
+    num_outputs = self._loops[0].C.shape[0]
+    return '%s<%d, %d, %d>' % (
+        typename, num_states, num_inputs, num_outputs)
+
+  def _ControllerType(self):
+    """Returns a template name for StateFeedbackController."""
+    return self._GenericType('StateFeedbackController')
+
+  def _LoopType(self):
+    """Returns a template name for StateFeedbackLoop."""
+    return self._GenericType('StateFeedbackLoop')
+
+  def _PlantType(self):
+    """Returns a template name for StateFeedbackPlant."""
+    return self._GenericType('StateFeedbackPlant')
+
+  def _CoeffType(self):
+    """Returns a template name for StateFeedbackPlantCoefficients."""
+    return self._GenericType('StateFeedbackPlantCoefficients')
+
+  def WriteHeader(self, header_file):
+    """Writes the header file to the file named header_file."""
+    with open(header_file, 'w') as fd:
+      header_guard = self._HeaderGuard(header_file)
+      fd.write('#ifndef %s\n'
+               '#define %s\n\n' % (header_guard, header_guard))
+      fd.write('#include \"frc971/control_loops/state_feedback_loop.h\"\n')
+      fd.write('\n')
+
+      fd.write(self._namespace_start)
+      fd.write('\n\n')
+      for loop in self._loops:
+        fd.write(loop.DumpPlantHeader())
+        fd.write('\n')
+        fd.write(loop.DumpControllerHeader())
+        fd.write('\n')
+
+      fd.write('%s Make%sPlant();\n\n' %
+               (self._PlantType(), self._gain_schedule_name))
+
+      fd.write('%s Make%sLoop();\n\n' %
+               (self._LoopType(), self._gain_schedule_name))
+
+      fd.write(self._namespace_end)
+      fd.write('\n\n')
+      fd.write("#endif  // %s\n" % header_guard)
+
+  def WriteCC(self, header_file_name, cc_file):
+    """Writes the cc file to the file named cc_file."""
+    with open(cc_file, 'w') as fd:
+      fd.write('#include \"frc971/control_loops/%s\"\n' % header_file_name)
+      fd.write('\n')
+      fd.write('#include <vector>\n')
+      fd.write('\n')
+      fd.write('#include \"frc971/control_loops/state_feedback_loop.h\"\n')
+      fd.write('\n')
+      fd.write(self._namespace_start)
+      fd.write('\n\n')
+      for loop in self._loops:
+        fd.write(loop.DumpPlant())
+        fd.write('\n')
+
+      for loop in self._loops:
+        fd.write(loop.DumpController())
+        fd.write('\n')
+
+      fd.write('%s Make%sPlant() {\n' %
+               (self._PlantType(), self._gain_schedule_name))
+      fd.write('  ::std::vector<%s *> plants(%d);\n' % (
+          self._CoeffType(), len(self._loops)))
+      for index, loop in enumerate(self._loops):
+        fd.write('  plants[%d] = new %s(%s);\n' %
+                 (index, self._CoeffType(),
+                  loop.PlantFunction()))
+      fd.write('  return %s(plants);\n' % self._PlantType())
+      fd.write('}\n\n')
+
+      fd.write('%s Make%sLoop() {\n' %
+               (self._LoopType(), self._gain_schedule_name))
+      fd.write('  ::std::vector<%s *> controllers(%d);\n' % (
+          self._ControllerType(), len(self._loops)))
+      for index, loop in enumerate(self._loops):
+        fd.write('  controllers[%d] = new %s(%s);\n' %
+                 (index, self._ControllerType(),
+                  loop.ControllerFunction()))
+      fd.write('  return %s(controllers);\n' % self._LoopType())
+      fd.write('}\n\n')
+
+      fd.write(self._namespace_end)
+      fd.write('\n')
+
+
+class ControlLoop(object):
+  def __init__(self, name):
+    """Constructs a control loop object.
+
+    Args:
+      name: string, The name of the loop to use when writing the C++ files.
+    """
+    self._name = name
+
+  def ContinuousToDiscrete(self, A_continuous, B_continuous, dt):
+    """Calculates the discrete time values for A and B.
+
+      Args:
+        A_continuous: numpy.matrix, The continuous time A matrix
+        B_continuous: numpy.matrix, The continuous time B matrix
+        dt: float, The time step of the control loop
+
+      Returns:
+        (A, B), numpy.matrix, the control matricies.
+    """
+    return controls.c2d(A_continuous, B_continuous, dt)
+
+  def InitializeState(self):
+    """Sets X, Y, and X_hat to zero defaults."""
+    self.X = numpy.zeros((self.A.shape[0], 1))
+    self.Y = self.C * self.X
+    self.X_hat = numpy.zeros((self.A.shape[0], 1))
+
+  def PlaceControllerPoles(self, poles):
+    """Places the controller poles.
+
+    Args:
+      poles: array, An array of poles.  Must be complex conjegates if they have
+        any imaginary portions.
+    """
+    self.K = controls.dplace(self.A, self.B, poles)
+
+  def PlaceObserverPoles(self, poles):
+    """Places the observer poles.
+
+    Args:
+      poles: array, An array of poles.  Must be complex conjegates if they have
+        any imaginary portions.
+    """
+    self.L = controls.dplace(self.A.T, self.C.T, poles).T
+
+  def Update(self, U):
+    """Simulates one time step with the provided U."""
+    U = numpy.clip(U, self.U_min, self.U_max)
+    self.X = self.A * self.X + self.B * U
+    self.Y = self.C * self.X + self.D * U
+
+  def UpdateObserver(self, U):
+    """Updates the observer given the provided U."""
+    self.X_hat = (self.A * self.X_hat + self.B * U +
+                  self.L * (self.Y - self.C * self.X_hat - self.D * U))
+
+  def _DumpMatrix(self, matrix_name, matrix):
+    """Dumps the provided matrix into a variable called matrix_name.
+
+    Args:
+      matrix_name: string, The variable name to save the matrix to.
+      matrix: The matrix to dump.
+
+    Returns:
+      string, The C++ commands required to populate a variable named matrix_name
+        with the contents of matrix.
+    """
+    ans = ['  Eigen::Matrix<double, %d, %d> %s;\n' % (
+        matrix.shape[0], matrix.shape[1], matrix_name)]
+    first = True
+    for x in xrange(matrix.shape[0]):
+      for y in xrange(matrix.shape[1]):
+	element = matrix[x, y]
+        if first:
+          ans.append('  %s << ' % matrix_name)
+          first = False
+        else:
+          ans.append(', ')
+        ans.append(str(element))
+
+    ans.append(';\n')
+    return ''.join(ans)
+
+  def DumpPlantHeader(self):
+    """Writes out a c++ header declaration which will create a Plant object.
+
+    Returns:
+      string, The header declaration for the function.
+    """
+    num_states = self.A.shape[0]
+    num_inputs = self.B.shape[1]
+    num_outputs = self.C.shape[0]
+    return 'StateFeedbackPlantCoefficients<%d, %d, %d> Make%sPlantCoefficients();\n' % (
+        num_states, num_inputs, num_outputs, self._name)
+
+  def DumpPlant(self):
+    """Writes out a c++ function which will create a PlantCoefficients object.
+
+    Returns:
+      string, The function which will create the object.
+    """
+    num_states = self.A.shape[0]
+    num_inputs = self.B.shape[1]
+    num_outputs = self.C.shape[0]
+    ans = ['StateFeedbackPlantCoefficients<%d, %d, %d>'
+           ' Make%sPlantCoefficients() {\n' % (
+        num_states, num_inputs, num_outputs, self._name)]
+
+    ans.append(self._DumpMatrix('A', self.A))
+    ans.append(self._DumpMatrix('B', self.B))
+    ans.append(self._DumpMatrix('C', self.C))
+    ans.append(self._DumpMatrix('D', self.D))
+    ans.append(self._DumpMatrix('U_max', self.U_max))
+    ans.append(self._DumpMatrix('U_min', self.U_min))
+
+    ans.append('  return StateFeedbackPlantCoefficients<%d, %d, %d>'
+               '(A, B, C, D, U_max, U_min);\n' % (num_states, num_inputs,
+                                                  num_outputs))
+    ans.append('}\n')
+    return ''.join(ans)
+
+  def PlantFunction(self):
+    """Returns the name of the plant coefficient function."""
+    return 'Make%sPlantCoefficients()' % self._name
+
+  def ControllerFunction(self):
+    """Returns the name of the controller function."""
+    return 'Make%sController()' % self._name
+
+  def DumpControllerHeader(self):
+    """Writes out a c++ header declaration which will create a Controller object.
+
+    Returns:
+      string, The header declaration for the function.
+    """
+    num_states = self.A.shape[0]
+    num_inputs = self.B.shape[1]
+    num_outputs = self.C.shape[0]
+    return 'StateFeedbackController<%d, %d, %d> %s;\n' % (
+        num_states, num_inputs, num_outputs, self.ControllerFunction())
+
+  def DumpController(self):
+    """Returns a c++ function which will create a Controller object.
+
+    Returns:
+      string, The function which will create the object.
+    """
+    num_states = self.A.shape[0]
+    num_inputs = self.B.shape[1]
+    num_outputs = self.C.shape[0]
+    ans = ['StateFeedbackController<%d, %d, %d> %s {\n' % (
+        num_states, num_inputs, num_outputs, self.ControllerFunction())]
+
+    ans.append(self._DumpMatrix('L', self.L))
+    ans.append(self._DumpMatrix('K', self.K))
+
+    ans.append('  return StateFeedbackController<%d, %d, %d>'
+               '(L, K, Make%sPlantCoefficients());\n' % (num_states, num_inputs,
+                                             num_outputs, self._name))
+    ans.append('}\n')
+    return ''.join(ans)
diff --git a/frc971/control_loops/python/controls.py b/frc971/control_loops/python/controls.py
index 7d34a85..a40bfe2 100644
--- a/frc971/control_loops/python/controls.py
+++ b/frc971/control_loops/python/controls.py
@@ -81,3 +81,21 @@
                              num_uncontrollable_eigenvalues)
 
   return K
+
+
+def c2d(A, B, dt):
+  """Converts from continuous time state space representation to discrete time.
+     Evaluates e^(A dt) for the discrete time version of A, and
+     integral(e^(A t) * B, 0, dt).
+     Returns (A, B).  C and D are unchanged."""
+  e, P = numpy.linalg.eig(A)
+  diag = numpy.matrix(numpy.eye(A.shape[0]))
+  diage = numpy.matrix(numpy.eye(A.shape[0]))
+  for eig, count in zip(e, range(0, A.shape[0])):
+    diag[count, count] = numpy.exp(eig * dt)
+    if abs(eig) < 1.0e-16:
+      diage[count, count] = dt
+    else:
+      diage[count, count] = (numpy.exp(eig * dt) - 1.0) / eig
+
+  return (P * diag * numpy.linalg.inv(P), P * diage * numpy.linalg.inv(P) * B)
diff --git a/frc971/control_loops/python/drivetrain.py b/frc971/control_loops/python/drivetrain.py
new file mode 100755
index 0000000..fcca56a
--- /dev/null
+++ b/frc971/control_loops/python/drivetrain.py
@@ -0,0 +1,226 @@
+#!/usr/bin/python
+
+import control_loop
+import numpy
+import sys
+from matplotlib import pylab
+
+
+class CIM(control_loop.ControlLoop):
+  def __init__(self):
+    super(CIM, self).__init__("CIM")
+    # Stall Torque in N m
+    self.stall_torque = 2.42
+    # Stall Current in Amps
+    self.stall_current = 133
+    # Free Speed in RPM
+    self.free_speed = 4650.0
+    # Free Current in Amps
+    self.free_current = 2.7
+    # Moment of inertia of the CIM in kg m^2
+    self.J = 0.0001
+    # Resistance of the motor, divided by 2 to account for the 2 motors
+    self.R = 12.0 / self.stall_current
+    # Motor velocity constant
+    self.Kv = ((self.free_speed / 60.0 * 2.0 * numpy.pi) /
+              (12.0 - self.R * self.free_current))
+    # Torque constant
+    self.Kt = self.stall_torque / self.stall_current
+    # Control loop time step
+    self.dt = 0.01
+
+    # State feedback matrices
+    self.A_continuous = numpy.matrix(
+        [[-self.Kt / self.Kv / (self.J * self.R)]])
+    self.B_continuous = numpy.matrix(
+        [[self.Kt / (self.J * self.R)]])
+    self.C = numpy.matrix([[1]])
+    self.D = numpy.matrix([[0]])
+
+    self.A, self.B = self.ContinuousToDiscrete(self.A_continuous,
+                                               self.B_continuous, self.dt)
+
+    self.PlaceControllerPoles([0.01])
+    self.PlaceObserverPoles([0.01])
+
+    self.U_max = numpy.matrix([[12.0]])
+    self.U_min = numpy.matrix([[-12.0]])
+
+    self.InitializeState()
+
+
+class Drivetrain(control_loop.ControlLoop):
+  def __init__(self, left_low=True, right_low=True, is_clutch=False):
+    super(Drivetrain, self).__init__(("Clutch" if is_clutch else "Dog" )+"Drivetrain")
+    # Stall Torque in N m
+    self.stall_torque = 2.42
+    # Stall Current in Amps
+    self.stall_current = 133
+    # Free Speed in RPM. Used number from last year.
+    self.free_speed = 4650.0
+    # Free Current in Amps
+    self.free_current = 2.7
+    # Moment of inertia of the drivetrain in kg m^2
+    # Just borrowed from last year.
+    self.J = 4.5
+    # Mass of the robot, in kg.
+    self.m = 68
+    # Radius of the robot, in meters (from last year).
+    self.rb = 0.617998644 / 2.0
+    # Radius of the wheels, in meters.
+    self.r = .04445
+    # Resistance of the motor, divided by the number of motors.
+    self.R = (12.0 / self.stall_current / 4 + 0.03) / (0.93 ** 2.0)
+    # Motor velocity constant
+    self.Kv = ((self.free_speed / 60.0 * 2.0 * numpy.pi) /
+               (12.0 - self.R * self.free_current))
+    # Torque constant
+    self.Kt = self.stall_torque / self.stall_current
+    # Gear ratios
+    if is_clutch:
+      self.G_low = 14.0 / 60.0 * 15.0 / 50.0
+      self.G_high = 30.0 / 44.0 * 15.0 / 50.0
+    else:
+      self.G_low = 16.0 / 60.0 * 17.0 / 50.0
+      self.G_high = 28.0 / 48.0 * 17.0 / 50.0
+    if left_low:
+      self.Gl = self.G_low
+    else:
+      self.Gl = self.G_high
+    if right_low:
+      self.Gr = self.G_low
+    else:
+      self.Gr = self.G_high
+    # Control loop time step
+    self.dt = 0.01
+
+    # These describe the way that a given side of a robot will be influenced
+    # by the other side. Units of 1 / kg.
+    self.msp = 1.0 / self.m + self.rb * self.rb / self.J
+    self.msn = 1.0 / self.m - self.rb * self.rb / self.J
+    # The calculations which we will need for A and B.
+    self.tcl = -self.Kt / self.Kv / (self.Gl * self.Gl * self.R * self.r * self.r)
+    self.tcr = -self.Kt / self.Kv / (self.Gr * self.Gr * self.R * self.r * self.r)
+    self.mpl = self.Kt / (self.Gl * self.R * self.r)
+    self.mpr = self.Kt / (self.Gr * self.R * self.r)
+
+    # State feedback matrices
+    # X will be of the format
+    # [[positionl], [velocityl], [positionr], velocityr]]
+    self.A_continuous = numpy.matrix(
+        [[0, 1, 0, 0],
+         [0, self.msp * self.tcl, 0, self.msn * self.tcr],
+         [0, 0, 0, 1],
+         [0, self.msn * self.tcl, 0, self.msp * self.tcr]])
+    self.B_continuous = numpy.matrix(
+        [[0, 0],
+         [self.msp * self.mpl, self.msn * self.mpr],
+         [0, 0],
+         [self.msn * self.mpl, self.msp * self.mpr]])
+    self.C = numpy.matrix([[1, 0, 0, 0],
+                           [0, 0, 1, 0]])
+    self.D = numpy.matrix([[0, 0],
+                           [0, 0]])
+
+    self.A, self.B = self.ContinuousToDiscrete(
+        self.A_continuous, self.B_continuous, self.dt)
+
+    # Poles from last year.
+    self.hp = 0.65
+    self.lp = 0.83
+    self.PlaceControllerPoles([self.hp, self.hp, self.lp, self.lp])
+
+    self.hlp = 0.07
+    self.llp = 0.09
+    self.PlaceObserverPoles([self.hlp, self.hlp, self.llp, self.llp])
+
+    self.U_max = numpy.matrix([[12.0], [12.0]])
+    self.U_min = numpy.matrix([[-12.0], [-12.0]])
+    self.InitializeState()
+
+def main(argv):
+  # Simulate the response of the system to a step input.
+  drivetrain = Drivetrain()
+  simulated_left = []
+  simulated_right = []
+  for _ in xrange(100):
+    drivetrain.Update(numpy.matrix([[12.0], [12.0]]))
+    simulated_left.append(drivetrain.X[0, 0])
+    simulated_right.append(drivetrain.X[2, 0])
+
+  #pylab.plot(range(100), simulated_left)
+  #pylab.plot(range(100), simulated_right)
+  #pylab.show()
+
+  # Simulate forwards motion.
+  drivetrain = Drivetrain()
+  close_loop_left = []
+  close_loop_right = []
+  R = numpy.matrix([[1.0], [0.0], [1.0], [0.0]])
+  for _ in xrange(100):
+    U = numpy.clip(drivetrain.K * (R - drivetrain.X_hat),
+                   drivetrain.U_min, drivetrain.U_max)
+    drivetrain.UpdateObserver(U)
+    drivetrain.Update(U)
+    close_loop_left.append(drivetrain.X[0, 0])
+    close_loop_right.append(drivetrain.X[2, 0])
+
+  #pylab.plot(range(100), close_loop_left)
+  #pylab.plot(range(100), close_loop_right)
+  #pylab.show()
+
+  # Try turning in place
+  drivetrain = Drivetrain()
+  close_loop_left = []
+  close_loop_right = []
+  R = numpy.matrix([[-1.0], [0.0], [1.0], [0.0]])
+  for _ in xrange(100):
+    U = numpy.clip(drivetrain.K * (R - drivetrain.X_hat),
+                   drivetrain.U_min, drivetrain.U_max)
+    drivetrain.UpdateObserver(U)
+    drivetrain.Update(U)
+    close_loop_left.append(drivetrain.X[0, 0])
+    close_loop_right.append(drivetrain.X[2, 0])
+
+  #pylab.plot(range(100), close_loop_left)
+  #pylab.plot(range(100), close_loop_right)
+  #pylab.show()
+
+  # Try turning just one side.
+  drivetrain = Drivetrain()
+  close_loop_left = []
+  close_loop_right = []
+  R = numpy.matrix([[0.0], [0.0], [1.0], [0.0]])
+  for _ in xrange(100):
+    U = numpy.clip(drivetrain.K * (R - drivetrain.X_hat),
+                   drivetrain.U_min, drivetrain.U_max)
+    drivetrain.UpdateObserver(U)
+    drivetrain.Update(U)
+    close_loop_left.append(drivetrain.X[0, 0])
+    close_loop_right.append(drivetrain.X[2, 0])
+
+  #pylab.plot(range(100), close_loop_left)
+  #pylab.plot(range(100), close_loop_right)
+  #pylab.show()
+
+  # Write the generated constants out to a file.
+  dog_drivetrain = Drivetrain(is_clutch=False)
+  clutch_drivetrain = Drivetrain(is_clutch=True)
+
+  if len(argv) != 5:
+    print "Expected .h file name and .cc file name"
+  else:
+    dog_loop_writer = control_loop.ControlLoopWriter("DogDrivetrain", [dog_drivetrain])
+    if argv[1][-3:] == '.cc':
+      dog_loop_writer.Write(argv[2], argv[1])
+    else:
+      dog_loop_writer.Write(argv[1], argv[2])
+
+    clutch_loop_writer = control_loop.ControlLoopWriter("ClutchDrivetrain", [clutch_drivetrain])
+    if argv[3][-3:] == '.cc':
+      clutch_loop_writer.Write(argv[4], argv[3])
+    else:
+      clutch_loop_writer.Write(argv[3], argv[4])
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/frc971/control_loops/python/index.py b/frc971/control_loops/python/index.py
new file mode 100755
index 0000000..f165afe
--- /dev/null
+++ b/frc971/control_loops/python/index.py
@@ -0,0 +1,104 @@
+#!/usr/bin/python
+
+import control_loop
+import numpy
+import sys
+from matplotlib import pylab
+
+class Index(control_loop.ControlLoop):
+  def __init__(self, J=0.00013, name="Index"):
+    super(Index, self).__init__(name)
+    # Stall Torque in N m
+    self.stall_torque = 0.4862
+    # Stall Current in Amps
+    self.stall_current = 85
+    # Free Speed in RPM
+    self.free_speed = 19300.0
+    # Free Current in Amps
+    self.free_current = 1.5
+    # Moment of inertia of the index in kg m^2
+    self.J = J
+    # Resistance of the motor
+    self.R = 12.0 / self.stall_current + 0.024 + .003
+    # Motor velocity constant
+    self.Kv = ((self.free_speed / 60.0 * 2.0 * numpy.pi) /
+               (13.5 - self.R * self.free_current))
+    # Torque constant
+    self.Kt = self.stall_torque / self.stall_current
+    # Gear ratio
+    self.G = 1.0 / ((40.0 / 11.0) * (34.0 / 30.0))
+    # Control loop time step
+    self.dt = 0.01
+
+    # State feedback matrices
+    self.A_continuous = numpy.matrix(
+        [[0, 1],
+         [0, -self.Kt / self.Kv / (self.J * self.G * self.G * self.R)]])
+    self.B_continuous = numpy.matrix(
+        [[0],
+         [self.Kt / (self.J * self.G * self.R)]])
+    self.C = numpy.matrix([[1, 0]])
+    self.D = numpy.matrix([[0]])
+
+    self.ContinuousToDiscrete(self.A_continuous, self.B_continuous,
+                              self.dt, self.C)
+
+    self.PlaceControllerPoles([.40, .63])
+
+    self.rpl = .05
+    self.ipl = 0.008
+    self.PlaceObserverPoles([self.rpl + 1j * self.ipl,
+                             self.rpl - 1j * self.ipl])
+
+    self.U_max = numpy.matrix([[12.0]])
+    self.U_min = numpy.matrix([[-12.0]])
+
+
+def main(argv):
+  # Simulate the response of the system to a step input.
+  index = Index()
+  simulated_x = []
+  simulated_v = []
+  for _ in xrange(100):
+    index.Update(numpy.matrix([[12.0]]))
+    simulated_x.append(index.X[0, 0])
+    simulated_v.append(index.X[1, 0])
+
+  pylab.plot(range(100), simulated_v)
+  pylab.show()
+
+  # Simulate the closed loop response of the system to a step input.
+  index = Index()
+  close_loop_x = []
+  R = numpy.matrix([[1.0], [0.0]])
+  for _ in xrange(100):
+    U = numpy.clip(index.K * (R - index.X_hat), index.U_min, index.U_max)
+    index.UpdateObserver(U)
+    index.Update(U)
+    close_loop_x.append(index.X[0, 0])
+
+  pylab.plot(range(100), close_loop_x)
+  pylab.show()
+
+  # Set the constants for the number of discs that we expect to see.
+  # The c++ code expects that the index in the array will be the number of
+  # discs.
+  index0 = Index(0.00010, "Index0Disc")
+  index1 = Index(0.00013, "Index1Disc")
+  index2 = Index(0.00013, "Index2Disc")
+  index3 = Index(0.00018, "Index3Disc")
+  index4 = Index(0.00025, "Index4Disc")
+
+  # Write the generated constants out to a file.
+  if len(argv) != 3:
+    print "Expected .h file name and .c file name"
+  else:
+    loop_writer = control_loop.ControlLoopWriter(
+        "Index", [index0, index1, index2, index3, index4])
+    if argv[1][-3:] == '.cc':
+      loop_writer.Write(argv[2], argv[1])
+    else:
+      loop_writer.Write(argv[1], argv[2])
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/frc971/control_loops/python/libcdd.py b/frc971/control_loops/python/libcdd.py
index a217728..6305aaf 100644
--- a/frc971/control_loops/python/libcdd.py
+++ b/frc971/control_loops/python/libcdd.py
@@ -119,7 +119,7 @@
 
   # Return None on error.
   # The error values are enums, so they aren't exposed.
-  if error.value != NO_ERRORS:
+  if error.value != DD_NO_ERRORS:
     # Dump out the errors to stderr
     libcdd._Z21dd_WriteErrorMessagesP8_IO_FILE12dd_ErrorType(
         ctypes.pythonapi.PyFile_AsFile(ctypes.py_object(sys.stdout)),
diff --git a/frc971/control_loops/python/polydrivetrain.py b/frc971/control_loops/python/polydrivetrain.py
new file mode 100755
index 0000000..5ffcff4
--- /dev/null
+++ b/frc971/control_loops/python/polydrivetrain.py
@@ -0,0 +1,512 @@
+#!/usr/bin/python
+
+import numpy
+import sys
+import polytope
+import drivetrain
+import control_loop
+import controls
+from matplotlib import pylab
+
+__author__ = 'Austin Schuh (austin.linux@gmail.com)'
+
+
+def CoerceGoal(region, K, w, R):
+  """Intersects a line with a region, and finds the closest point to R.
+
+  Finds a point that is closest to R inside the region, and on the line
+  defined by K X = w.  If it is not possible to find a point on the line,
+  finds a point that is inside the region and closest to the line.  This
+  function assumes that
+
+  Args:
+    region: HPolytope, the valid goal region.
+    K: numpy.matrix (2 x 1), the matrix for the equation [K1, K2] [x1; x2] = w
+    w: float, the offset in the equation above.
+    R: numpy.matrix (2 x 1), the point to be closest to.
+
+  Returns:
+    numpy.matrix (2 x 1), the point.
+  """
+
+  if region.IsInside(R):
+    return R
+
+  perpendicular_vector = K.T / numpy.linalg.norm(K)
+  parallel_vector = numpy.matrix([[perpendicular_vector[1, 0]],
+                                  [-perpendicular_vector[0, 0]]])
+  
+  # We want to impose the constraint K * X = w on the polytope H * X <= k.
+  # We do this by breaking X up into parallel and perpendicular components to
+  # the half plane.  This gives us the following equation.
+  #
+  #  parallel * (parallel.T \dot X) + perpendicular * (perpendicular \dot X)) = X
+  #
+  # Then, substitute this into the polytope.
+  #
+  #  H * (parallel * (parallel.T \dot X) + perpendicular * (perpendicular \dot X)) <= k
+  #
+  # Substitute K * X = w
+  #
+  # H * parallel * (parallel.T \dot X) + H * perpendicular * w <= k
+  #
+  # Move all the knowns to the right side.
+  #
+  # H * parallel * ([parallel1 parallel2] * X) <= k - H * perpendicular * w
+  #
+  # Let t = parallel.T \dot X, the component parallel to the surface.
+  #
+  # H * parallel * t <= k - H * perpendicular * w
+  #
+  # This is a polytope which we can solve, and use to figure out the range of X
+  # that we care about!
+
+  t_poly = polytope.HPolytope(
+      region.H * parallel_vector,
+      region.k - region.H * perpendicular_vector * w)
+
+  vertices = t_poly.Vertices()
+
+  if vertices.shape[0]:
+    # The region exists!
+    # Find the closest vertex
+    min_distance = numpy.infty
+    closest_point = None
+    for vertex in vertices:
+      point = parallel_vector * vertex + perpendicular_vector * w
+      length = numpy.linalg.norm(R - point)
+      if length < min_distance:
+        min_distance = length
+        closest_point = point
+
+    return closest_point
+  else:
+    # Find the vertex of the space that is closest to the line.
+    region_vertices = region.Vertices()
+    min_distance = numpy.infty
+    closest_point = None
+    for vertex in region_vertices:
+      point = vertex.T
+      length = numpy.abs((perpendicular_vector.T * point)[0, 0])
+      if length < min_distance:
+        min_distance = length
+        closest_point = point
+
+    return closest_point
+
+
+class VelocityDrivetrainModel(control_loop.ControlLoop):
+  def __init__(self, left_low=True, right_low=True, name="VelocityDrivetrainModel", is_clutch=False):
+    super(VelocityDrivetrainModel, self).__init__(name)
+    self._drivetrain = drivetrain.Drivetrain(left_low=left_low,
+                                             right_low=right_low,
+                                             is_clutch=is_clutch)
+    self.dt = 0.01
+    self.A_continuous = numpy.matrix(
+        [[self._drivetrain.A_continuous[1, 1], self._drivetrain.A_continuous[1, 3]],
+         [self._drivetrain.A_continuous[3, 1], self._drivetrain.A_continuous[3, 3]]])
+
+    self.B_continuous = numpy.matrix(
+        [[self._drivetrain.B_continuous[1, 0], self._drivetrain.B_continuous[1, 1]],
+         [self._drivetrain.B_continuous[3, 0], self._drivetrain.B_continuous[3, 1]]])
+    self.C = numpy.matrix(numpy.eye(2));
+    self.D = numpy.matrix(numpy.zeros((2, 2)));
+
+    self.A, self.B = self.ContinuousToDiscrete(self.A_continuous,
+                                               self.B_continuous, self.dt)
+
+    # FF * X = U (steady state)
+    self.FF = self.B.I * (numpy.eye(2) - self.A)
+
+    self.PlaceControllerPoles([0.6, 0.6])
+    self.PlaceObserverPoles([0.02, 0.02])
+
+    self.G_high = self._drivetrain.G_high
+    self.G_low = self._drivetrain.G_low
+    self.R = self._drivetrain.R
+    self.r = self._drivetrain.r
+    self.Kv = self._drivetrain.Kv
+    self.Kt = self._drivetrain.Kt
+
+    self.U_max = self._drivetrain.U_max
+    self.U_min = self._drivetrain.U_min
+
+
+class VelocityDrivetrain(object):
+  HIGH = 'high'
+  LOW = 'low'
+  SHIFTING_UP = 'up'
+  SHIFTING_DOWN = 'down'
+
+  def __init__(self, is_clutch):
+    prefix = 'Clutch' if is_clutch else 'Dog'
+    self.drivetrain_low_low = VelocityDrivetrainModel(
+        left_low=True, right_low=True, name=prefix+'VelocityDrivetrainLowLow', is_clutch=is_clutch)
+    self.drivetrain_low_high = VelocityDrivetrainModel(left_low=True, right_low=False, name=prefix+'VelocityDrivetrainLowHigh', is_clutch=is_clutch)
+    self.drivetrain_high_low = VelocityDrivetrainModel(left_low=False, right_low=True, name = prefix+'VelocityDrivetrainHighLow', is_clutch=is_clutch)
+    self.drivetrain_high_high = VelocityDrivetrainModel(left_low=False, right_low=False, name = prefix+'VelocityDrivetrainHighHigh', is_clutch=is_clutch)
+
+    # X is [lvel, rvel]
+    self.X = numpy.matrix(
+        [[0.0],
+         [0.0]])
+
+    self.U_poly = polytope.HPolytope(
+        numpy.matrix([[1, 0],
+                      [-1, 0],
+                      [0, 1],
+                      [0, -1]]),
+        numpy.matrix([[12],
+                      [12],
+                      [12],
+                      [12]]))
+
+    self.U_max = numpy.matrix(
+        [[12.0],
+         [12.0]])
+    self.U_min = numpy.matrix(
+        [[-12.0000000000],
+         [-12.0000000000]])
+
+    self.dt = 0.01
+
+    self.R = numpy.matrix(
+        [[0.0],
+         [0.0]])
+
+    # ttrust is the comprimise between having full throttle negative inertia,
+    # and having no throttle negative inertia.  A value of 0 is full throttle
+    # inertia.  A value of 1 is no throttle negative inertia.
+    self.ttrust = 1.0
+
+    self.left_gear = VelocityDrivetrain.LOW
+    self.right_gear = VelocityDrivetrain.LOW
+    self.left_shifter_position = 0.0
+    self.right_shifter_position = 0.0
+    self.left_cim = drivetrain.CIM()
+    self.right_cim = drivetrain.CIM()
+
+  def IsInGear(self, gear):
+    return gear is VelocityDrivetrain.HIGH or gear is VelocityDrivetrain.LOW
+
+  def MotorRPM(self, shifter_position, velocity):
+    if shifter_position > 0.5:
+      return (velocity / self.CurrentDrivetrain().G_high /
+              self.CurrentDrivetrain().r)
+    else:
+      return (velocity / self.CurrentDrivetrain().G_low /
+              self.CurrentDrivetrain().r)
+
+  def CurrentDrivetrain(self):
+    if self.left_shifter_position > 0.5:
+      if self.right_shifter_position > 0.5:
+        return self.drivetrain_high_high
+      else:
+        return self.drivetrain_high_low
+    else:
+      if self.right_shifter_position > 0.5:
+        return self.drivetrain_low_high
+      else:
+        return self.drivetrain_low_low
+
+  def SimShifter(self, gear, shifter_position):
+    if gear is VelocityDrivetrain.HIGH or gear is VelocityDrivetrain.SHIFTING_UP:
+      shifter_position = min(shifter_position + 0.5, 1.0)
+    else:
+      shifter_position = max(shifter_position - 0.5, 0.0)
+
+    if shifter_position == 1.0:
+      gear = VelocityDrivetrain.HIGH
+    elif shifter_position == 0.0:
+      gear = VelocityDrivetrain.LOW
+
+    return gear, shifter_position
+
+  def ComputeGear(self, wheel_velocity, should_print=False, current_gear=False, gear_name=None):
+    high_omega = (wheel_velocity / self.CurrentDrivetrain().G_high /
+                  self.CurrentDrivetrain().r)
+    low_omega = (wheel_velocity / self.CurrentDrivetrain().G_low /
+                 self.CurrentDrivetrain().r)
+    #print gear_name, "Motor Energy Difference.", 0.5 * 0.000140032647 * (low_omega * low_omega - high_omega * high_omega), "joules"
+    high_torque = ((12.0 - high_omega / self.CurrentDrivetrain().Kv) *
+                   self.CurrentDrivetrain().Kt / self.CurrentDrivetrain().R)
+    low_torque = ((12.0 - low_omega / self.CurrentDrivetrain().Kv) *
+                  self.CurrentDrivetrain().Kt / self.CurrentDrivetrain().R)
+    high_power = high_torque * high_omega
+    low_power = low_torque * low_omega
+    #if should_print:
+    #  print gear_name, "High omega", high_omega, "Low omega", low_omega
+    #  print gear_name, "High torque", high_torque, "Low torque", low_torque
+    #  print gear_name, "High power", high_power, "Low power", low_power
+
+    # Shift algorithm improvements.
+    # TODO(aschuh):
+    # It takes time to shift.  Shifting down for 1 cycle doesn't make sense
+    # because you will end up slower than without shifting.  Figure out how
+    # to include that info.
+    # If the driver is still in high gear, but isn't asking for the extra power
+    # from low gear, don't shift until he asks for it.
+    goal_gear_is_high = high_power > low_power
+    #goal_gear_is_high = True
+
+    if not self.IsInGear(current_gear):
+      print gear_name, 'Not in gear.'
+      return current_gear
+    else:
+      is_high = current_gear is VelocityDrivetrain.HIGH
+      if is_high != goal_gear_is_high:
+        if goal_gear_is_high:
+          print gear_name, 'Shifting up.'
+          return VelocityDrivetrain.SHIFTING_UP
+        else:
+          print gear_name, 'Shifting down.'
+          return VelocityDrivetrain.SHIFTING_DOWN
+      else:
+        return current_gear
+
+  def FilterVelocity(self, throttle):
+    # Invert the plant to figure out how the velocity filter would have to work
+    # out in order to filter out the forwards negative inertia.
+    # This math assumes that the left and right power and velocity are equal.
+
+    # The throttle filter should filter such that the motor in the highest gear
+    # should be controlling the time constant.
+    # Do this by finding the index of FF that has the lowest value, and computing
+    # the sums using that index.
+    FF_sum = self.CurrentDrivetrain().FF.sum(axis=1)
+    min_FF_sum_index = numpy.argmin(FF_sum)
+    min_FF_sum = FF_sum[min_FF_sum_index, 0]
+    min_K_sum = self.CurrentDrivetrain().K[min_FF_sum_index, :].sum()
+    # Compute the FF sum for high gear.
+    high_min_FF_sum = self.drivetrain_high_high.FF[0, :].sum()
+
+    # U = self.K[0, :].sum() * (R - x_avg) + self.FF[0, :].sum() * R
+    # throttle * 12.0 = (self.K[0, :].sum() + self.FF[0, :].sum()) * R
+    #                   - self.K[0, :].sum() * x_avg
+
+    # R = (throttle * 12.0 + self.K[0, :].sum() * x_avg) /
+    #     (self.K[0, :].sum() + self.FF[0, :].sum())
+
+    # U = (K + FF) * R - K * X
+    # (K + FF) ^-1 * (U + K * X) = R
+
+    # Scale throttle by min_FF_sum / high_min_FF_sum.  This will make low gear
+    # have the same velocity goal as high gear, and so that the robot will hold
+    # the same speed for the same throttle for all gears.
+    adjusted_ff_voltage = numpy.clip(throttle * 12.0 * min_FF_sum / high_min_FF_sum, -12.0, 12.0)
+    return ((adjusted_ff_voltage + self.ttrust * min_K_sum * (self.X[0, 0] + self.X[1, 0]) / 2.0)
+            / (self.ttrust * min_K_sum + min_FF_sum))
+
+  def Update(self, throttle, steering):
+    # Shift into the gear which sends the most power to the floor.
+    # This is the same as sending the most torque down to the floor at the
+    # wheel.
+
+    self.left_gear = self.ComputeGear(self.X[0, 0], should_print=True,
+                                      current_gear=self.left_gear,
+                                      gear_name="left")
+    self.right_gear = self.ComputeGear(self.X[1, 0], should_print=True,
+                                       current_gear=self.right_gear,
+                                       gear_name="right")
+    if self.IsInGear(self.left_gear):
+      self.left_cim.X[0, 0] = self.MotorRPM(self.left_shifter_position, self.X[0, 0])
+
+    if self.IsInGear(self.right_gear):
+      self.right_cim.X[0, 0] = self.MotorRPM(self.right_shifter_position, self.X[0, 0])
+
+    if self.IsInGear(self.left_gear) and self.IsInGear(self.right_gear):
+      # Filter the throttle to provide a nicer response.
+      fvel = self.FilterVelocity(throttle)
+
+      # Constant radius means that angualar_velocity / linear_velocity = constant.
+      # Compute the left and right velocities.
+      left_velocity = fvel - steering * numpy.abs(fvel)
+      right_velocity = fvel + steering * numpy.abs(fvel)
+
+      # Write this constraint in the form of K * R = w
+      # angular velocity / linear velocity = constant
+      # (left - right) / (left + right) = constant
+      # left - right = constant * left + constant * right
+
+      # (fvel - steering * numpy.abs(fvel) - fvel - steering * numpy.abs(fvel)) /
+      #  (fvel - steering * numpy.abs(fvel) + fvel + steering * numpy.abs(fvel)) =
+      #       constant
+      # (- 2 * steering * numpy.abs(fvel)) / (2 * fvel) = constant
+      # (-steering * sign(fvel)) = constant
+      # (-steering * sign(fvel)) * (left + right) = left - right
+      # (steering * sign(fvel) + 1) * left + (steering * sign(fvel) - 1) * right = 0
+
+      equality_k = numpy.matrix(
+          [[1 + steering * numpy.sign(fvel), -(1 - steering * numpy.sign(fvel))]])
+      equality_w = 0.0
+
+      self.R[0, 0] = left_velocity
+      self.R[1, 0] = right_velocity
+
+      # Construct a constraint on R by manipulating the constraint on U
+      # Start out with H * U <= k
+      # U = FF * R + K * (R - X)
+      # H * (FF * R + K * R - K * X) <= k
+      # H * (FF + K) * R <= k + H * K * X
+      R_poly = polytope.HPolytope(
+          self.U_poly.H * (self.CurrentDrivetrain().K + self.CurrentDrivetrain().FF),
+          self.U_poly.k + self.U_poly.H * self.CurrentDrivetrain().K * self.X)
+
+      # Limit R back inside the box.
+      self.boxed_R = CoerceGoal(R_poly, equality_k, equality_w, self.R)
+
+      FF_volts = self.CurrentDrivetrain().FF * self.boxed_R
+      self.U_ideal = self.CurrentDrivetrain().K * (self.boxed_R - self.X) + FF_volts
+    else:
+      print 'Not all in gear'
+      if not self.IsInGear(self.left_gear) and not self.IsInGear(self.right_gear):
+        # TODO(austin): Use battery volts here.
+        R_left = self.MotorRPM(self.left_shifter_position, self.X[0, 0])
+        self.U_ideal[0, 0] = numpy.clip(
+            self.left_cim.K * (R_left - self.left_cim.X) + R_left / self.left_cim.Kv,
+            self.left_cim.U_min, self.left_cim.U_max)
+        self.left_cim.Update(self.U_ideal[0, 0])
+
+        R_right = self.MotorRPM(self.right_shifter_position, self.X[1, 0])
+        self.U_ideal[1, 0] = numpy.clip(
+            self.right_cim.K * (R_right - self.right_cim.X) + R_right / self.right_cim.Kv,
+            self.right_cim.U_min, self.right_cim.U_max)
+        self.right_cim.Update(self.U_ideal[1, 0])
+      else:
+        assert False
+
+    self.U = numpy.clip(self.U_ideal, self.U_min, self.U_max)
+
+    # TODO(austin): Model the robot as not accelerating when you shift...
+    # This hack only works when you shift at the same time.
+    if self.IsInGear(self.left_gear) and self.IsInGear(self.right_gear):
+      self.X = self.CurrentDrivetrain().A * self.X + self.CurrentDrivetrain().B * self.U
+
+    self.left_gear, self.left_shifter_position = self.SimShifter(
+        self.left_gear, self.left_shifter_position)
+    self.right_gear, self.right_shifter_position = self.SimShifter(
+        self.right_gear, self.right_shifter_position)
+
+    print "U is", self.U[0, 0], self.U[1, 0]
+    print "Left shifter", self.left_gear, self.left_shifter_position, "Right shifter", self.right_gear, self.right_shifter_position
+
+
+def main(argv):
+  dog_vdrivetrain = VelocityDrivetrain(False)
+  clutch_vdrivetrain = VelocityDrivetrain(True)
+
+  if len(argv) != 7:
+    print "Expected .h file name and .cc file name"
+  else:
+    dog_loop_writer = control_loop.ControlLoopWriter(
+        "VDogDrivetrain", [dog_vdrivetrain.drivetrain_low_low,
+                           dog_vdrivetrain.drivetrain_low_high,
+                           dog_vdrivetrain.drivetrain_high_low,
+                           dog_vdrivetrain.drivetrain_high_high])
+
+    if argv[1][-3:] == '.cc':
+      dog_loop_writer.Write(argv[2], argv[1])
+    else:
+      dog_loop_writer.Write(argv[1], argv[2])
+
+    clutch_loop_writer = control_loop.ControlLoopWriter(
+        "VClutchDrivetrain", [clutch_vdrivetrain.drivetrain_low_low,
+                              clutch_vdrivetrain.drivetrain_low_high,
+                              clutch_vdrivetrain.drivetrain_high_low,
+                              clutch_vdrivetrain.drivetrain_high_high])
+
+    if argv[3][-3:] == '.cc':
+      clutch_loop_writer.Write(argv[4], argv[3])
+    else:
+      clutch_loop_writer.Write(argv[3], argv[4])
+
+    cim_writer = control_loop.ControlLoopWriter(
+        "CIM", [drivetrain.CIM()])
+
+    if argv[5][-3:] == '.cc':
+      cim_writer.Write(argv[6], argv[5])
+    else:
+      cim_writer.Write(argv[5], argv[6])
+    return
+
+  vl_plot = []
+  vr_plot = []
+  ul_plot = []
+  ur_plot = []
+  radius_plot = []
+  t_plot = []
+  left_gear_plot = []
+  right_gear_plot = []
+  vdrivetrain.left_shifter_position = 0.0
+  vdrivetrain.right_shifter_position = 0.0
+  vdrivetrain.left_gear = VelocityDrivetrain.LOW
+  vdrivetrain.right_gear = VelocityDrivetrain.LOW
+
+  print "K is", vdrivetrain.CurrentDrivetrain().K
+
+  if vdrivetrain.left_gear is VelocityDrivetrain.HIGH:
+    print "Left is high"
+  else:
+    print "Left is low"
+  if vdrivetrain.right_gear is VelocityDrivetrain.HIGH:
+    print "Right is high"
+  else:
+    print "Right is low"
+
+  for t in numpy.arange(0, 4.0, vdrivetrain.dt):
+    if t < 1.0:
+      vdrivetrain.Update(throttle=1.00, steering=0.0)
+    elif t < 1.2:
+      vdrivetrain.Update(throttle=1.00, steering=0.0)
+    else:
+      vdrivetrain.Update(throttle=1.00, steering=0.0)
+    t_plot.append(t)
+    vl_plot.append(vdrivetrain.X[0, 0])
+    vr_plot.append(vdrivetrain.X[1, 0])
+    ul_plot.append(vdrivetrain.U[0, 0])
+    ur_plot.append(vdrivetrain.U[1, 0])
+    left_gear_plot.append((vdrivetrain.left_gear is VelocityDrivetrain.HIGH) * 2.0 - 10.0)
+    right_gear_plot.append((vdrivetrain.right_gear is VelocityDrivetrain.HIGH) * 2.0 - 10.0)
+
+    fwd_velocity = (vdrivetrain.X[1, 0] + vdrivetrain.X[0, 0]) / 2
+    turn_velocity = (vdrivetrain.X[1, 0] - vdrivetrain.X[0, 0])
+    if abs(fwd_velocity) < 0.0000001:
+      radius_plot.append(turn_velocity)
+    else:
+      radius_plot.append(turn_velocity / fwd_velocity)
+
+  cim_velocity_plot = []
+  cim_voltage_plot = []
+  cim_time = []
+  cim = drivetrain.CIM()
+  R = numpy.matrix([[300]])
+  for t in numpy.arange(0, 0.5, cim.dt):
+    U = numpy.clip(cim.K * (R - cim.X) + R / cim.Kv, cim.U_min, cim.U_max)
+    cim.Update(U)
+    cim_velocity_plot.append(cim.X[0, 0])
+    cim_voltage_plot.append(U[0, 0] * 10)
+    cim_time.append(t)
+  #pylab.plot(cim_time, cim_velocity_plot, label='cim spinup')
+  #pylab.plot(cim_time, cim_voltage_plot, label='cim voltage')
+  #pylab.legend()
+  #pylab.show()
+
+  # TODO(austin):
+  # Shifting compensation.
+
+  # Tighten the turn.
+  # Closed loop drive.
+
+  pylab.plot(t_plot, vl_plot, label='left velocity')
+  pylab.plot(t_plot, vr_plot, label='right velocity')
+  pylab.plot(t_plot, ul_plot, label='left voltage')
+  pylab.plot(t_plot, ur_plot, label='right voltage')
+  pylab.plot(t_plot, radius_plot, label='radius')
+  pylab.plot(t_plot, left_gear_plot, label='left gear high')
+  pylab.plot(t_plot, right_gear_plot, label='right gear high')
+  pylab.legend()
+  pylab.show()
+  return 0
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/frc971/control_loops/python/polydrivetrain_test.py b/frc971/control_loops/python/polydrivetrain_test.py
new file mode 100755
index 0000000..434cdca
--- /dev/null
+++ b/frc971/control_loops/python/polydrivetrain_test.py
@@ -0,0 +1,82 @@
+#!/usr/bin/python
+
+import polydrivetrain
+import numpy
+from numpy.testing import *
+import polytope
+import unittest
+
+__author__ = 'Austin Schuh (austin.linux@gmail.com)'
+
+
+class TestVelocityDrivetrain(unittest.TestCase):
+  def MakeBox(self, x1_min, x1_max, x2_min, x2_max):
+    H = numpy.matrix([[1, 0],
+                      [-1, 0],
+                      [0, 1],
+                      [0, -1]])
+    K = numpy.matrix([[x1_max],
+                      [-x1_min],
+                      [x2_max],
+                      [-x2_min]])
+    return polytope.HPolytope(H, K)
+
+  def test_coerce_inside(self):
+    """Tests coercion when the point is inside the box."""
+    box = self.MakeBox(1, 2, 1, 2)
+
+    # x1 = x2
+    K = numpy.matrix([[1, -1]])
+    w = 0
+
+    assert_array_equal(polydrivetrain.CoerceGoal(box, K, w,
+                                                 numpy.matrix([[1.5], [1.5]])),
+                       numpy.matrix([[1.5], [1.5]]))
+
+  def test_coerce_outside_intersect(self):
+    """Tests coercion when the line intersects the box."""
+    box = self.MakeBox(1, 2, 1, 2)
+
+    # x1 = x2
+    K = numpy.matrix([[1, -1]])
+    w = 0
+
+    assert_array_equal(polydrivetrain.CoerceGoal(box, K, w, numpy.matrix([[5], [5]])),
+                       numpy.matrix([[2.0], [2.0]]))
+
+  def test_coerce_outside_no_intersect(self):
+    """Tests coercion when the line does not intersect the box."""
+    box = self.MakeBox(3, 4, 1, 2)
+
+    # x1 = x2
+    K = numpy.matrix([[1, -1]])
+    w = 0
+
+    assert_array_equal(polydrivetrain.CoerceGoal(box, K, w, numpy.matrix([[5], [5]])),
+                       numpy.matrix([[3.0], [2.0]]))
+
+  def test_coerce_middle_of_edge(self):
+    """Tests coercion when the line intersects the middle of an edge."""
+    box = self.MakeBox(0, 4, 1, 2)
+
+    # x1 = x2
+    K = numpy.matrix([[-1, 1]])
+    w = 0
+
+    assert_array_equal(polydrivetrain.CoerceGoal(box, K, w, numpy.matrix([[5], [5]])),
+                       numpy.matrix([[2.0], [2.0]]))
+
+  def test_coerce_perpendicular_line(self):
+    """Tests coercion when the line does not intersect and is in quadrant 2."""
+    box = self.MakeBox(1, 2, 1, 2)
+
+    # x1 = -x2
+    K = numpy.matrix([[1, 1]])
+    w = 0
+
+    assert_array_equal(polydrivetrain.CoerceGoal(box, K, w, numpy.matrix([[5], [5]])),
+                       numpy.matrix([[1.0], [1.0]]))
+
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/frc971/control_loops/python/shooter.py b/frc971/control_loops/python/shooter.py
new file mode 100755
index 0000000..83beb90
--- /dev/null
+++ b/frc971/control_loops/python/shooter.py
@@ -0,0 +1,140 @@
+#!/usr/bin/python
+
+import numpy
+import sys
+from matplotlib import pylab
+import control_loop
+
+class Shooter(control_loop.ControlLoop):
+  def __init__(self):
+    super(Shooter, self).__init__("Shooter")
+    # Stall Torque in N m
+    self.stall_torque = 0.49819248
+    # Stall Current in Amps
+    self.stall_current = 85
+    # Free Speed in RPM
+    self.free_speed = 19300.0 - 1500.0
+    # Free Current in Amps
+    self.free_current = 1.4
+    # Moment of inertia of the shooter wheel in kg m^2
+    self.J = 0.0032
+    # Resistance of the motor, divided by 2 to account for the 2 motors
+    self.R = 12.0 / self.stall_current / 2
+    # Motor velocity constant
+    self.Kv = ((self.free_speed / 60.0 * 2.0 * numpy.pi) /
+              (12.0 - self.R * self.free_current))
+    # Torque constant
+    self.Kt = self.stall_torque / self.stall_current
+    # Gear ratio
+    self.G = 11.0 / 34.0
+    # Control loop time step
+    self.dt = 0.01
+
+    # State feedback matrices
+    self.A_continuous = numpy.matrix(
+        [[0, 1],
+         [0, -self.Kt / self.Kv / (self.J * self.G * self.G * self.R)]])
+    self.B_continuous = numpy.matrix(
+        [[0],
+         [self.Kt / (self.J * self.G * self.R)]])
+    self.C = numpy.matrix([[1, 0]])
+    self.D = numpy.matrix([[0]])
+
+    self.ContinuousToDiscrete(self.A_continuous, self.B_continuous,
+                              self.dt, self.C)
+
+    self.PlaceControllerPoles([.6, .981])
+
+    self.rpl = .45
+    self.ipl = 0.07
+    self.PlaceObserverPoles([self.rpl + 1j * self.ipl,
+                             self.rpl - 1j * self.ipl])
+
+    self.U_max = numpy.matrix([[12.0]])
+    self.U_min = numpy.matrix([[-12.0]])
+
+
+def main(argv):
+  # Simulate the response of the system to a step input.
+  shooter_data = numpy.genfromtxt('shooter/shooter_data.csv', delimiter=',')
+  shooter = Shooter()
+  simulated_x = []
+  real_x = []
+  x_vel = []
+  initial_x = shooter_data[0, 2]
+  last_x = initial_x
+  for i in xrange(shooter_data.shape[0]):
+    shooter.Update(numpy.matrix([[shooter_data[i, 1]]]))
+    simulated_x.append(shooter.X[0, 0])
+    x_offset = shooter_data[i, 2] - initial_x
+    real_x.append(x_offset)
+    x_vel.append((shooter_data[i, 2] - last_x) * 100.0)
+    last_x = shooter_data[i, 2]
+
+  sim_delay = 1
+  pylab.plot(range(sim_delay, shooter_data.shape[0] + sim_delay),
+             simulated_x, label='Simulation')
+  pylab.plot(range(shooter_data.shape[0]), real_x, label='Reality')
+  pylab.plot(range(shooter_data.shape[0]), x_vel, label='Velocity')
+  pylab.legend()
+  pylab.show()
+
+  # Simulate the closed loop response of the system to a step input.
+  shooter = Shooter()
+  close_loop_x = []
+  close_loop_U = []
+  velocity_goal = 300
+  R = numpy.matrix([[0.0], [velocity_goal]])
+  for _ in pylab.linspace(0,1.99,200):
+    # Iterate the position up.
+    R = numpy.matrix([[R[0, 0] + 10.5], [velocity_goal]])
+    # Prevents the position goal from going beyond what is necessary.
+    velocity_weight_scalar = 0.35
+    max_reference = (
+        (shooter.U_max[0, 0] - velocity_weight_scalar *
+         (velocity_goal - shooter.X_hat[1, 0]) * shooter.K[0, 1]) /
+         shooter.K[0, 0] +
+         shooter.X_hat[0, 0])
+    min_reference = (
+        (shooter.U_min[0, 0] - velocity_weight_scalar *
+         (velocity_goal - shooter.X_hat[1, 0]) * shooter.K[0, 1]) /
+         shooter.K[0, 0] +
+         shooter.X_hat[0, 0])
+    R[0, 0] = numpy.clip(R[0, 0], min_reference, max_reference)
+    U = numpy.clip(shooter.K * (R - shooter.X_hat),
+                   shooter.U_min, shooter.U_max)
+    shooter.UpdateObserver(U)
+    shooter.Update(U)
+    close_loop_x.append(shooter.X[1, 0])
+    close_loop_U.append(U[0, 0])
+
+  #pylab.plotfile("shooter.csv", (0,1))
+  #pylab.plot(pylab.linspace(0,1.99,200), close_loop_U, 'ro')
+  #pylab.plotfile("shooter.csv", (0,2))
+  pylab.plot(pylab.linspace(0,1.99,200), close_loop_x, 'ro')
+  pylab.show()
+
+  # Simulate spin down.
+  spin_down_x = [];
+  R = numpy.matrix([[50.0], [0.0]])
+  for _ in xrange(150):
+    U = 0
+    shooter.UpdateObserver(U)
+    shooter.Update(U)
+    spin_down_x.append(shooter.X[1, 0])
+
+  #pylab.plot(range(150), spin_down_x)
+  #pylab.show()
+
+  if len(argv) != 3:
+    print "Expected .h file name and .cc file name"
+  else:
+    loop_writer = control_loop.ControlLoopWriter("Shooter", [shooter])
+    if argv[1][-3:] == '.cc':
+      loop_writer.Write(argv[2], argv[1])
+    else:
+      loop_writer.Write(argv[1], argv[2])
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/frc971/control_loops/python/transfer.py b/frc971/control_loops/python/transfer.py
new file mode 100755
index 0000000..d7818a3
--- /dev/null
+++ b/frc971/control_loops/python/transfer.py
@@ -0,0 +1,94 @@
+#!/usr/bin/python
+
+import control_loop
+import numpy
+import sys
+from matplotlib import pylab
+
+class Transfer(control_loop.ControlLoop):
+  def __init__(self):
+    super(Transfer, self).__init__("Transfer")
+    # Stall Torque in N m
+    self.stall_torque = 0.4862
+    # Stall Current in Amps
+    self.stall_current = 85
+    # Free Speed in RPM
+    self.free_speed = 19300.0
+    # Free Current in Amps
+    self.free_current = 1.5
+    # Moment of inertia of the transfer in kg m^2
+    self.J = 0.00013
+    # Resistance of the motor
+    self.R = 12.0 / self.stall_current + 0.024 + .003
+    # Motor velocity constant
+    self.Kv = ((self.free_speed / 60.0 * 2.0 * numpy.pi) /
+               (13.5 - self.R * self.free_current))
+    # Torque constant
+    self.Kt = self.stall_torque / self.stall_current
+    # Gear ratio
+    self.G = 1.0 / ((40.0 / 11.0) * (34.0 / 30.0))
+    # Control loop time step
+    self.dt = 0.01
+
+    # State feedback matrices
+    self.A_continuous = numpy.matrix(
+        [[0, 1],
+         [0, -self.Kt / self.Kv / (self.J * self.G * self.G * self.R)]])
+    self.B_continuous = numpy.matrix(
+        [[0],
+         [self.Kt / (self.J * self.G * self.R)]])
+    self.C = numpy.matrix([[1, 0]])
+    self.D = numpy.matrix([[0]])
+
+    self.ContinuousToDiscrete(self.A_continuous, self.B_continuous,
+                              self.dt, self.C)
+
+    self.PlaceControllerPoles([.75, .6])
+
+    self.rpl = .05
+    self.ipl = 0.008
+    self.PlaceObserverPoles([self.rpl + 1j * self.ipl,
+                             self.rpl - 1j * self.ipl])
+
+    self.U_max = numpy.matrix([[12.0]])
+    self.U_min = numpy.matrix([[-12.0]])
+
+
+def main(argv):
+  # Simulate the response of the system to a step input.
+  transfer = Transfer()
+  simulated_x = []
+  simulated_v = []
+  for _ in xrange(100):
+    transfer.Update(numpy.matrix([[12.0]]))
+    simulated_x.append(transfer.X[0, 0])
+    simulated_v.append(transfer.X[1, 0])
+
+  pylab.plot(range(100), simulated_v)
+  pylab.show()
+
+  # Simulate the closed loop response of the system to a step input.
+  transfer = Transfer()
+  close_loop_x = []
+  R = numpy.matrix([[1.0], [0.0]])
+  for _ in xrange(100):
+    U = numpy.clip(transfer.K * (R - transfer.X_hat), transfer.U_min, transfer.U_max)
+    transfer.UpdateObserver(U)
+    transfer.Update(U)
+    close_loop_x.append(transfer.X[0, 0])
+
+  #pylab.plot(range(100), close_loop_x)
+  #pylab.show()
+
+  # Write the generated constants out to a file.
+  if len(argv) != 3:
+    print "Expected .cc file name and .h file name"
+  else:
+    loop_writer = control_loop.ControlLoopWriter("Transfer", [transfer])
+    if argv[1][-3:] == '.cc':
+      loop_writer.Write(argv[2], argv[1])
+    else:
+      loop_writer.Write(argv[1], argv[2])
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/frc971/control_loops/python/wrist.py b/frc971/control_loops/python/wrist.py
new file mode 100755
index 0000000..d752000
--- /dev/null
+++ b/frc971/control_loops/python/wrist.py
@@ -0,0 +1,154 @@
+#!/usr/bin/python
+
+import control_loop
+import numpy
+import sys
+from matplotlib import pylab
+
+class Wrist(control_loop.ControlLoop):
+  def __init__(self, name="RawWrist"):
+    super(Wrist, self).__init__(name)
+    # Stall Torque in N m
+    self.stall_torque = 1.4
+    # Stall Current in Amps
+    self.stall_current = 86
+    # Free Speed in RPM
+    self.free_speed = 6200.0
+    # Free Current in Amps
+    self.free_current = 1.5
+    # Moment of inertia of the wrist in kg m^2
+    # TODO(aschuh): Measure this in reality.  It doesn't seem high enough.
+    # James measured 0.51, but that can't be right given what I am seeing.
+    self.J = 2.0
+    # Resistance of the motor
+    self.R = 12.0 / self.stall_current + 0.024 + .003
+    # Motor velocity constant
+    self.Kv = ((self.free_speed / 60.0 * 2.0 * numpy.pi) /
+               (13.5 - self.R * self.free_current))
+    # Torque constant
+    self.Kt = self.stall_torque / self.stall_current
+    # Gear ratio
+    self.G = 1.0 / ((84.0 / 20.0) * (50.0 / 14.0) * (40.0 / 14.0) * (40.0 / 12.0))
+    # Control loop time step
+    self.dt = 0.01
+
+    # State feedback matrices
+    self.A_continuous = numpy.matrix(
+        [[0, 1],
+         [0, -self.Kt / self.Kv / (self.J * self.G * self.G * self.R)]])
+    self.B_continuous = numpy.matrix(
+        [[0],
+         [self.Kt / (self.J * self.G * self.R)]])
+    self.C = numpy.matrix([[1, 0]])
+    self.D = numpy.matrix([[0]])
+
+    self.A, self.B = self.ContinuousToDiscrete(
+        self.A_continuous, self.B_continuous, self.dt)
+
+    self.PlaceControllerPoles([0.85, 0.45])
+
+    self.rpl = .05
+    self.ipl = 0.008
+    self.PlaceObserverPoles([self.rpl + 1j * self.ipl,
+                             self.rpl - 1j * self.ipl])
+
+    self.U_max = numpy.matrix([[12.0]])
+    self.U_min = numpy.matrix([[-12.0]])
+
+    self.InitializeState()
+
+
+class WristDeltaU(Wrist):
+  def __init__(self, name="Wrist"):
+    super(WristDeltaU, self).__init__(name)
+    A_unaugmented = self.A
+    B_unaugmented = self.B
+
+    self.A = numpy.matrix([[0.0, 0.0, 0.0],
+                           [0.0, 0.0, 0.0],
+                           [0.0, 0.0, 1.0]])
+    self.A[0:2, 0:2] = A_unaugmented
+    self.A[0:2, 2] = B_unaugmented
+
+    self.B = numpy.matrix([[0.0],
+                           [0.0],
+                           [1.0]])
+
+    self.C = numpy.matrix([[1.0, 0.0, 0.0]])
+    self.D = numpy.matrix([[0.0]])
+
+    self.PlaceControllerPoles([0.55, 0.35, 0.80])
+
+    print "K"
+    print self.K
+    print "Placed controller poles are"
+    print numpy.linalg.eig(self.A - self.B * self.K)[0]
+
+    self.rpl = .05
+    self.ipl = 0.008
+    self.PlaceObserverPoles([self.rpl + 1j * self.ipl,
+                             self.rpl - 1j * self.ipl, 0.90])
+    print "Placed observer poles are"
+    print numpy.linalg.eig(self.A - self.L * self.C)[0]
+
+    self.U_max = numpy.matrix([[12.0]])
+    self.U_min = numpy.matrix([[-12.0]])
+
+    self.InitializeState()
+
+
+def ClipDeltaU(wrist, delta_u):
+  old_u = numpy.matrix([[wrist.X[2, 0]]])
+  new_u = numpy.clip(old_u + delta_u, wrist.U_min, wrist.U_max)
+  return new_u - old_u
+
+def main(argv):
+  # Simulate the response of the system to a step input.
+  wrist = WristDeltaU()
+  simulated_x = []
+  for _ in xrange(100):
+    wrist.Update(numpy.matrix([[12.0]]))
+    simulated_x.append(wrist.X[0, 0])
+
+  pylab.plot(range(100), simulated_x)
+  pylab.show()
+
+  # Simulate the closed loop response of the system to a step input.
+  wrist = WristDeltaU()
+  close_loop_x = []
+  close_loop_u = []
+  R = numpy.matrix([[1.0], [0.0], [0.0]])
+  wrist.X[2, 0] = -5
+  for _ in xrange(100):
+    U = numpy.clip(wrist.K * (R - wrist.X_hat), wrist.U_min, wrist.U_max)
+    U = ClipDeltaU(wrist, U)
+    wrist.UpdateObserver(U)
+    wrist.Update(U)
+    close_loop_x.append(wrist.X[0, 0] * 10)
+    close_loop_u.append(wrist.X[2, 0])
+
+  pylab.plot(range(100), close_loop_x)
+  pylab.plot(range(100), close_loop_u)
+  pylab.show()
+
+  # Write the generated constants out to a file.
+  if len(argv) != 5:
+    print "Expected .h file name and .cc file name for"
+    print "both the plant and unaugmented plant"
+  else:
+    unaug_wrist = Wrist("RawWrist")
+    unaug_loop_writer = control_loop.ControlLoopWriter("RawWrist",
+                                                       [unaug_wrist])
+    if argv[3][-3:] == '.cc':
+      unaug_loop_writer.Write(argv[4], argv[3])
+    else:
+      unaug_loop_writer.Write(argv[3], argv[4])
+
+    loop_writer = control_loop.ControlLoopWriter("Wrist", [wrist])
+    if argv[1][-3:] == '.cc':
+      loop_writer.Write(argv[2], argv[1])
+    else:
+      loop_writer.Write(argv[1], argv[2])
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/frc971/control_loops/shooter/shooter.cc b/frc971/control_loops/shooter/shooter.cc
new file mode 100644
index 0000000..035880e
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter.cc
@@ -0,0 +1,121 @@
+#include "frc971/control_loops/shooter/shooter.h"
+
+#include "aos/common/control_loop/control_loops.q.h"
+#include "aos/common/logging/logging.h"
+
+#include "frc971/control_loops/shooter/shooter_motor_plant.h"
+#include "frc971/control_loops/index/index_motor.q.h"
+
+namespace frc971 {
+namespace control_loops {
+
+ShooterMotor::ShooterMotor(control_loops::ShooterLoop *my_shooter)
+    : aos::control_loops::ControlLoop<control_loops::ShooterLoop>(my_shooter),
+    loop_(new StateFeedbackLoop<2, 1, 1>(MakeShooterLoop())),
+    history_position_(0),
+    position_goal_(0.0),
+    last_position_(0.0),
+    last_velocity_goal_(0) {
+  memset(history_, 0, sizeof(history_));
+}
+
+/*static*/ const double ShooterMotor::dt = 0.01;
+/*static*/ const double ShooterMotor::kMaxSpeed =
+    10000.0 * (2.0 * M_PI) / 60.0 * 15.0 / 34.0;
+
+void ShooterMotor::RunIteration(
+    const control_loops::ShooterLoop::Goal *goal,
+    const control_loops::ShooterLoop::Position *position,
+    ::aos::control_loops::Output *output,
+    control_loops::ShooterLoop::Status *status) {
+  double velocity_goal = std::min(goal->velocity, kMaxSpeed);
+  const double current_position =
+      (position == NULL ? loop_->X_hat(0, 0) : position->position);
+  double output_voltage = 0.0;
+
+  if (index_loop.status.FetchLatest() || index_loop.status.get()) {
+    if (index_loop.status->is_shooting) {
+      if (velocity_goal != last_velocity_goal_ &&
+          velocity_goal < 130) {
+        velocity_goal = last_velocity_goal_;
+      }
+    }
+  } else {
+    LOG(WARNING, "assuming index isn't shooting\n");
+  }
+  last_velocity_goal_ = velocity_goal;
+
+  // Track the current position if the velocity goal is small.
+  if (velocity_goal <= 1.0) {
+    position_goal_ = current_position;
+  }
+
+  loop_->Y << current_position;
+
+  // Add the position to the history.
+  history_[history_position_] = current_position;
+  history_position_ = (history_position_ + 1) % kHistoryLength;
+
+  // Prevents integral windup by limiting the position error such that the
+  // error can't produce much more than full power.
+  const double kVelocityWeightScalar = 0.35;
+  const double max_reference =
+      (loop_->U_max(0, 0) - kVelocityWeightScalar *
+       (velocity_goal - loop_->X_hat(1, 0)) * loop_->K(0, 1))
+      / loop_->K(0, 0) + loop_->X_hat(0, 0);
+  const double min_reference =
+      (loop_->U_min(0, 0) - kVelocityWeightScalar *
+       (velocity_goal - loop_->X_hat(1, 0)) * loop_->K(0, 1))
+      / loop_->K(0, 0) + loop_->X_hat(0, 0);
+
+  position_goal_ = ::std::max(::std::min(position_goal_, max_reference),
+                              min_reference);
+  loop_->R << position_goal_, velocity_goal;
+  position_goal_ += velocity_goal * dt;
+
+  loop_->Update(position, output == NULL);
+
+  // Kill power at low velocity goals.
+  if (velocity_goal < 1.0) {
+    loop_->U[0] = 0.0;
+  } else {
+    output_voltage = loop_->U[0];
+  }
+
+  LOG(DEBUG,
+      "PWM: %f, raw_pos: %f rotations: %f "
+      "junk velocity: %f, xhat[0]: %f xhat[1]: %f, R[0]: %f R[1]: %f\n",
+      output_voltage, current_position,
+      current_position / (2 * M_PI),
+      (current_position - last_position_) / dt,
+      loop_->X_hat[0], loop_->X_hat[1], loop_->R[0], loop_->R[1]);
+
+  // Calculates the velocity over the last kHistoryLength * .01 seconds
+  // by taking the difference between the current and next history positions.
+  int old_history_position = ((history_position_ == 0) ?
+        kHistoryLength : history_position_) - 1;
+  average_velocity_ = (history_[old_history_position] -
+      history_[history_position_]) * 100.0 / (double)(kHistoryLength - 1);
+
+  status->average_velocity = average_velocity_;
+
+  // Determine if the velocity is close enough to the goal to be ready.
+  if (std::abs(velocity_goal - average_velocity_) < 10.0 &&
+      velocity_goal != 0.0) {
+    LOG(DEBUG, "Steady: ");
+    status->ready = true;
+  } else {
+    LOG(DEBUG, "Not ready: ");
+    status->ready = false;
+  }
+  LOG(DEBUG, "avg = %f goal = %f\n", average_velocity_, velocity_goal);
+  
+  last_position_ = current_position;
+
+  if (output) {
+    output->voltage = output_voltage;
+  }
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/shooter/shooter.gyp b/frc971/control_loops/shooter/shooter.gyp
new file mode 100644
index 0000000..64e3a20
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter.gyp
@@ -0,0 +1,79 @@
+{
+  'targets': [
+    {
+      'target_name': 'shooter_loop',
+      'type': 'static_library',
+      'sources': ['shooter_motor.q'],
+      'variables': {
+        'header_path': 'frc971/control_loops/shooter',
+      },
+      'dependencies': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'includes': ['../../../aos/build/queues.gypi'],
+    },
+    {
+      'target_name': 'shooter_lib',
+      'type': 'static_library',
+      'sources': [
+        'shooter.cc',
+        'shooter_motor_plant.cc',
+      ],
+      'dependencies': [
+        'shooter_loop',
+        '<(AOS)/common/common.gyp:controls',
+        '<(DEPTH)/frc971/frc971.gyp:constants',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(DEPTH)/frc971/control_loops/index/index.gyp:index_loop',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(AOS)/common/common.gyp:controls',
+        'shooter_loop',
+      ],
+    },
+    {
+      'target_name': 'shooter_lib_test',
+      'type': 'executable',
+      'sources': [
+        'shooter_lib_test.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        'shooter_loop',
+        'shooter_lib',
+        '<(AOS)/common/common.gyp:queue_testutils',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+      ],
+    },
+    {
+      'target_name': 'shooter_csv',
+      'type': 'executable',
+      'sources': [
+        'shooter_csv.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/common/common.gyp:time',
+        '<(AOS)/common/common.gyp:timing',
+        'shooter_loop',
+      ],
+    },
+    {
+      'target_name': 'shooter',
+      'type': 'executable',
+      'sources': [
+        'shooter_main.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        'shooter_lib',
+        'shooter_loop',
+      ],
+    },
+  ],
+}
diff --git a/frc971/control_loops/shooter/shooter.h b/frc971/control_loops/shooter/shooter.h
new file mode 100644
index 0000000..7947f7a
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter.h
@@ -0,0 +1,57 @@
+#ifndef FRC971_CONTROL_LOOPS_SHOOTER_H_
+#define FRC971_CONTROL_LOOPS_SHOOTER_H_
+
+#include <memory>
+
+#include "aos/common/control_loop/ControlLoop.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+#include "frc971/control_loops/shooter/shooter_motor_plant.h"
+
+namespace frc971 {
+namespace control_loops {
+
+class ShooterMotor
+    : public aos::control_loops::ControlLoop<control_loops::ShooterLoop> {
+ public:
+  explicit ShooterMotor(
+      control_loops::ShooterLoop *my_shooter = &control_loops::shooter);
+
+  // Control loop time step.
+  static const double dt;
+
+  // Maximum speed of the shooter wheel which the encoder is rated for in
+  // rad/sec.
+  static const double kMaxSpeed;
+
+ protected:
+  virtual void RunIteration(
+      const control_loops::ShooterLoop::Goal *goal,
+      const control_loops::ShooterLoop::Position *position,
+      ::aos::control_loops::Output *output,
+      control_loops::ShooterLoop::Status *status);
+
+ private:
+  // The state feedback control loop to talk to.
+  ::std::unique_ptr<StateFeedbackLoop<2, 1, 1>> loop_;
+
+  // History array and stuff for determining average velocity and whether
+  // we are ready to shoot.
+  static const int kHistoryLength = 5;
+  double history_[kHistoryLength];
+  ptrdiff_t history_position_;
+  double average_velocity_;
+
+  double position_goal_;
+  double last_position_;
+
+  // For making sure it keeps spinning if we're shooting.
+  double last_velocity_goal_;
+
+  DISALLOW_COPY_AND_ASSIGN(ShooterMotor);
+};
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif // FRC971_CONTROL_LOOPS_SHOOTER_H_
diff --git a/frc971/control_loops/shooter/shooter_csv.cc b/frc971/control_loops/shooter/shooter_csv.cc
new file mode 100644
index 0000000..26f2866
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter_csv.cc
@@ -0,0 +1,50 @@
+#include "stdio.h"
+
+#include "aos/common/control_loop/Timing.h"
+#include "aos/common/time.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+
+using ::frc971::control_loops::shooter;
+using ::aos::time::Time;
+
+int main(int argc, char * argv[]) {
+  FILE *data_file = NULL;
+  FILE *output_file = NULL;
+
+  if (argc == 2) {
+    data_file = fopen(argv[1], "w");
+    output_file = data_file;
+  } else {
+    printf("Logging to stdout instead\n");
+    output_file = stdout;
+  }
+
+  fprintf(data_file, "time, power, position");
+
+  ::aos::Init();
+
+  Time start_time = Time::Now();
+
+  while (true) {
+    ::aos::time::PhasedLoop10MS(2000);
+    shooter.goal.FetchLatest();
+    shooter.status.FetchLatest();
+    shooter.position.FetchLatest();
+    shooter.output.FetchLatest();
+    if (shooter.output.get() &&
+        shooter.position.get()) {
+      fprintf(output_file, "\n%f, %f, %f",
+              (shooter.position->sent_time - start_time).ToSeconds(),
+              shooter.output->voltage,
+              shooter.position->position);
+    }
+  }
+
+  if (data_file) {
+    fclose(data_file);
+  }
+
+  ::aos::Cleanup();
+  return 0;
+}
+
diff --git a/frc971/control_loops/shooter/shooter_data.csv b/frc971/control_loops/shooter/shooter_data.csv
new file mode 100644
index 0000000..3515070
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter_data.csv
@@ -0,0 +1,638 @@
+0.009404, 0.000000, 1484.878965
+0.019423, 0.000000, 1484.878965
+0.029389, 0.000000, 1484.878965
+0.039354, 0.000000, 1484.878965
+0.049887, 0.000000, 1484.878965
+0.059522, 0.000000, 1484.878965
+0.069479, 0.000000, 1484.878965
+0.079381, 0.000000, 1484.878965
+0.089338, 0.000000, 1484.878965
+0.099357, 0.000000, 1484.878965
+0.109409, 0.000000, 1484.878965
+0.119355, 0.000000, 1484.878965
+0.129358, 0.000000, 1484.878965
+0.139354, 0.000000, 1484.878965
+0.149480, 0.000000, 1484.878965
+0.159363, 0.000000, 1484.878965
+0.169341, 0.000000, 1484.878965
+0.179367, 0.000000, 1484.878965
+0.189636, 0.000000, 1484.878965
+0.199875, 0.000000, 1484.878965
+0.210070, 0.000000, 1484.878965
+0.219349, 0.000000, 1484.878965
+0.229544, 0.000000, 1484.878965
+0.239404, 0.000000, 1484.878965
+0.249410, 0.000000, 1484.878965
+0.259839, 0.000000, 1484.878965
+0.269492, 0.000000, 1484.878965
+0.279847, 0.000000, 1484.878965
+0.290056, 0.000000, 1484.878965
+0.299362, 0.000000, 1484.878965
+0.309457, 0.000000, 1484.878965
+0.319829, 0.000000, 1484.878965
+0.329446, 0.000000, 1484.878965
+0.339818, 0.000000, 1484.878965
+0.349444, 0.000000, 1484.878965
+0.359899, 0.000000, 1484.878965
+0.370053, 0.000000, 1484.878965
+0.379510, 0.000000, 1484.878965
+0.390136, 0.000000, 1484.878965
+0.399366, 0.000000, 1484.878965
+0.409472, 0.000000, 1484.878965
+0.419898, 0.000000, 1484.878965
+0.430131, 0.000000, 1484.878965
+0.439363, 0.000000, 1484.878965
+0.449459, 0.000000, 1484.878965
+0.459840, 0.000000, 1484.878965
+0.469382, 0.000000, 1484.878965
+0.479846, 0.000000, 1484.878965
+0.489432, 0.000000, 1484.878965
+0.499342, 0.000000, 1484.878965
+0.509350, 0.000000, 1484.878965
+0.519406, 0.000000, 1484.878965
+0.530084, 0.000000, 1484.878965
+0.539341, 0.000000, 1484.878965
+0.549406, 0.000000, 1484.878965
+0.559401, 0.000000, 1484.878965
+0.569409, 0.000000, 1484.878965
+0.579831, 0.000000, 1484.878965
+0.589469, 0.000000, 1484.878965
+0.599356, 0.000000, 1484.878965
+0.610099, 0.000000, 1484.878965
+0.619333, 0.000000, 1484.878965
+0.629479, 0.000000, 1484.878965
+0.639805, 0.000000, 1484.878965
+0.650053, 0.000000, 1484.878965
+0.659423, 0.000000, 1484.878965
+0.669413, 0.000000, 1484.878965
+0.679822, 0.000000, 1484.878965
+0.690045, 0.000000, 1484.878965
+0.699411, 0.000000, 1484.878965
+0.709584, 0.000000, 1484.878965
+0.719866, 0.000000, 1484.878965
+0.729475, 0.000000, 1484.878965
+0.739328, 0.000000, 1484.878965
+0.749396, 0.000000, 1484.878965
+0.759836, 0.000000, 1484.878965
+0.769492, 0.000000, 1484.878965
+0.779340, 0.000000, 1484.878965
+0.789401, 0.000000, 1484.878965
+0.799405, 0.000000, 1484.878965
+0.809407, 0.000000, 1484.878965
+0.819830, 0.000000, 1484.878965
+0.829411, 0.000000, 1484.878965
+0.839413, 0.000000, 1484.878965
+0.849409, 0.000000, 1484.878965
+0.859349, 0.000000, 1484.878965
+0.869453, 0.000000, 1484.878965
+0.879831, 0.000000, 1484.878965
+0.889426, 0.000000, 1484.878965
+0.899332, 0.000000, 1484.878965
+0.909439, 0.000000, 1484.878965
+0.919830, 0.000000, 1484.878965
+0.929464, 0.000000, 1484.878965
+0.939328, 0.000000, 1484.878965
+0.949440, 0.000000, 1484.878965
+0.959871, 0.000000, 1484.878965
+0.969393, 0.000000, 1484.878965
+0.980080, 0.000000, 1484.878965
+0.989440, 0.000000, 1484.878965
+0.999370, 0.000000, 1484.878965
+1.009338, 0.000000, 1484.878965
+1.019368, 0.000000, 1484.878965
+1.029492, 0.000000, 1484.878965
+1.039816, 0.000000, 1484.878965
+1.049430, 0.000000, 1484.878965
+1.059324, 0.000000, 1484.878965
+1.069351, 0.000000, 1484.878965
+1.079867, 0.000000, 1484.878965
+1.089417, 0.000000, 1484.878965
+1.099324, 0.000000, 1484.878965
+1.109348, 0.000000, 1484.878965
+1.119389, 0.000000, 1484.878965
+1.129331, 0.000000, 1484.878965
+1.139306, 0.000000, 1484.878965
+1.149394, 0.000000, 1484.878965
+1.159374, 0.000000, 1484.878965
+1.169335, 0.000000, 1484.878965
+1.179817, 0.000000, 1484.878965
+1.189415, 0.000000, 1484.878965
+1.199338, 0.000000, 1484.878965
+1.209349, 0.000000, 1484.878965
+1.219333, 0.000000, 1484.878965
+1.229518, 0.000000, 1484.878965
+1.239329, 0.000000, 1484.878965
+1.249334, 0.000000, 1484.878965
+1.259316, 0.000000, 1484.878965
+1.269388, 0.000000, 1484.878965
+1.279357, 0.000000, 1484.878965
+1.289451, 0.000000, 1484.878965
+1.299350, 0.000000, 1484.878965
+1.309350, 0.000000, 1484.878965
+1.319848, 0.000000, 1484.878965
+1.329384, 0.000000, 1484.878965
+1.339375, 0.000000, 1484.878965
+1.349359, 0.000000, 1484.878965
+1.359384, 0.000000, 1484.878965
+1.369428, 0.000000, 1484.878965
+1.379443, 0.000000, 1484.878965
+1.389498, 0.000000, 1484.878965
+1.399332, 0.000000, 1484.878965
+1.409393, 0.000000, 1484.878965
+1.419325, 0.000000, 1484.878965
+1.430129, 0.000000, 1484.878965
+1.439419, 0.000000, 1484.878965
+1.449510, 0.000000, 1484.878965
+1.459828, 0.000000, 1484.878965
+1.469377, 0.000000, 1484.878965
+1.479834, 0.000000, 1484.878965
+1.489367, 0.000000, 1484.878965
+1.499316, 0.000000, 1484.878965
+1.509405, 0.000000, 1484.878965
+1.519341, 0.000000, 1484.878965
+1.529334, 0.000000, 1484.878965
+1.539305, 0.000000, 1484.878965
+1.550118, 0.000000, 1484.878965
+1.559386, 0.000000, 1484.878965
+1.569647, 0.000000, 1484.878965
+1.579395, 0.000000, 1484.878965
+1.589381, 0.000000, 1484.878965
+1.599819, 0.000000, 1484.878965
+1.609401, 0.000000, 1484.878965
+1.619404, 0.000000, 1484.878965
+1.629335, 0.000000, 1484.878965
+1.639327, 0.000000, 1484.878965
+1.649334, 0.000000, 1484.878965
+1.659341, 0.000000, 1484.878965
+1.669328, 0.000000, 1484.878965
+1.679850, 0.000000, 1484.878965
+1.689423, 0.000000, 1484.878965
+1.699320, 0.000000, 1484.878965
+1.710128, 0.000000, 1484.878965
+1.719388, 0.000000, 1484.878965
+1.730042, 0.000000, 1484.878965
+1.739338, 0.000000, 1484.878965
+1.749483, 0.000000, 1484.878965
+1.759420, 0.000000, 1484.878965
+1.769334, 0.000000, 1484.878965
+1.779289, 0.000000, 1484.878965
+1.789325, 0.000000, 1484.878965
+1.799395, 0.000000, 1484.878965
+1.809493, 0.000000, 1484.878965
+1.819312, 0.000000, 1484.878965
+1.829402, 0.000000, 1484.878965
+1.839317, 0.000000, 1484.878965
+1.849330, 0.000000, 1484.878965
+1.859354, 0.000000, 1484.878965
+1.869394, 0.000000, 1484.878965
+1.879816, 0.000000, 1484.878965
+1.889374, 0.000000, 1484.878965
+1.899381, 0.000000, 1484.878965
+1.909332, 0.000000, 1484.878965
+1.919359, 0.000000, 1484.878965
+1.929338, 0.000000, 1484.878965
+1.939359, 0.000000, 1484.878965
+1.949332, 0.000000, 1484.878965
+1.959325, 0.000000, 1484.878965
+1.969341, 0.000000, 1484.878965
+1.979362, 0.000000, 1484.878965
+1.989330, 0.000000, 1484.878965
+1.999479, 0.000000, 1484.878965
+2.009392, 0.000000, 1484.878965
+2.019318, 0.000000, 1484.878965
+2.029320, 0.000000, 1484.878965
+2.039323, 0.000000, 1484.878965
+2.049387, 0.000000, 1484.878965
+2.059818, 0.000000, 1484.878965
+2.069766, 0.000000, 1484.878965
+2.079835, 0.000000, 1484.878965
+2.089372, 0.000000, 1484.878965
+2.099322, 0.000000, 1484.878965
+2.109357, 0.000000, 1484.878965
+2.119387, 0.000000, 1484.878965
+2.129327, 0.000000, 1484.878965
+2.139458, 0.000000, 1484.878965
+2.149392, 0.000000, 1484.878965
+2.159826, 0.000000, 1484.878965
+2.169591, 0.000000, 1484.878965
+2.179656, 0.000000, 1484.878965
+2.189392, 0.000000, 1484.878965
+2.199491, 0.000000, 1484.878965
+2.209541, 0.000000, 1484.878965
+2.219287, 0.000000, 1484.878965
+2.229123, 0.000000, 1484.878965
+2.239347, 0.000000, 1484.878965
+2.249390, 0.000000, 1484.878965
+2.259407, 0.000000, 1484.878965
+2.269393, 0.000000, 1484.878965
+2.279375, 0.000000, 1484.878965
+2.289416, 0.000000, 1484.878965
+2.299368, 0.000000, 1484.878965
+2.309379, 0.000000, 1484.878965
+2.319382, 0.000000, 1484.878965
+2.329435, 0.000000, 1484.878965
+2.339329, 0.000000, 1484.878965
+2.349389, 0.000000, 1484.878965
+2.359454, 0.000000, 1484.878965
+2.369832, 0.000000, 1484.878965
+2.379390, 0.000000, 1484.878965
+2.389381, 0.000000, 1484.878965
+2.399429, 0.000000, 1484.878965
+2.409394, 0.000000, 1484.878965
+2.419367, 0.000000, 1484.878965
+2.429384, 0.000000, 1484.878965
+2.439408, 0.000000, 1484.878965
+2.449391, 0.000000, 1484.878965
+2.459343, 0.000000, 1484.878965
+2.469424, 0.000000, 1484.878965
+2.479357, 0.000000, 1484.878965
+2.489388, 0.000000, 1484.878965
+2.499413, 0.000000, 1484.878965
+2.510081, 0.000000, 1484.878965
+2.519397, 0.000000, 1484.878965
+2.529342, 0.000000, 1484.878965
+2.539372, 0.000000, 1484.878965
+2.549674, 0.000000, 1484.878965
+2.559586, 0.000000, 1484.878965
+2.569807, 0.000000, 1484.878965
+2.579362, 0.000000, 1484.878965
+2.589325, 0.000000, 1484.878965
+2.599300, 0.000000, 1484.878965
+2.609436, 0.000000, 1484.878965
+2.619476, 0.000000, 1484.878965
+2.629668, 0.000000, 1484.878965
+2.639301, 0.000000, 1484.878965
+2.649411, 0.000000, 1484.878965
+2.659301, 0.000000, 1484.878965
+2.669336, 0.000000, 1484.878965
+2.679460, 0.000000, 1484.878965
+2.689691, 0.000000, 1484.878965
+2.699310, 0.000000, 1484.878965
+2.710046, 0.000000, 1484.878965
+2.719584, 0.000000, 1484.878965
+2.729333, 0.000000, 1484.878965
+2.739288, 0.000000, 1484.878965
+2.749320, 0.000000, 1484.878965
+2.759517, 0.000000, 1484.878965
+2.769811, 0.000000, 1484.878965
+2.779463, 0.000000, 1484.878965
+2.789708, 0.000000, 1484.878965
+2.799310, 12.000000, 1484.878965
+2.809361, 12.000000, 1484.878965
+2.819345, 12.000000, 1484.943934
+2.829470, 12.000000, 1485.117183
+2.839666, 12.000000, 1485.355402
+2.849432, 12.000000, 1485.680245
+2.859547, 12.000000, 1486.091712
+2.869422, 12.000000, 1486.589805
+2.879352, 12.000000, 1487.152866
+2.889431, 12.000000, 1487.802552
+2.899538, 12.000000, 1488.538863
+2.909416, 12.000000, 1489.340142
+2.919676, 12.000000, 1490.163078
+2.929470, 11.856977, 1491.072638
+2.939341, 10.941776, 1492.090480
+2.949422, 9.709468, 1493.086665
+2.959343, 9.484298, 1494.212787
+2.969480, 9.024482, 1495.360566
+2.979482, 8.408468, 1496.616625
+2.989402, 7.584528, 1497.851029
+2.999839, 7.318006, 1499.193713
+3.009487, 6.726255, 1500.601366
+3.019345, 5.691274, 1502.030675
+3.029433, 5.445505, 1503.503297
+3.039661, 5.201068, 1505.019231
+3.049419, 4.805405, 1506.556821
+3.059323, 4.164102, 1508.116067
+3.069465, 3.901448, 1509.696970
+3.079658, 3.715078, 1511.321185
+3.089408, 3.656437, 1512.902087
+3.099346, 3.325052, 1514.504646
+3.109498, 3.310343, 1516.128861
+3.119381, 3.348580, 1517.753076
+3.129434, 3.031678, 1519.377291
+3.139461, 3.165136, 1520.979850
+3.149456, 3.276186, 1522.604064
+3.159650, 3.130954, 1524.228279
+3.169436, 3.017931, 1525.852494
+3.179542, 2.968543, 1527.455053
+3.189425, 3.107515, 1529.079268
+3.199654, 3.010200, 1530.681827
+3.209442, 3.078322, 1532.306042
+3.219518, 2.953745, 1533.908601
+3.229434, 3.021034, 1535.511159
+3.239303, 4.196084, 1537.113718
+3.249474, 2.523334, 1538.716277
+3.259481, 2.549791, 1540.318836
+3.269395, 2.856174, 1541.943051
+3.279668, 2.830169, 1543.545609
+3.289491, 2.903769, 1545.148168
+3.299343, 2.930722, 1546.729071
+3.309430, 2.915555, 1548.331629
+3.319847, 2.887528, 1549.934188
+3.329444, 3.022588, 1551.515091
+3.339468, 2.922583, 1553.095993
+3.349700, 3.155171, 1554.676896
+3.359307, 2.959473, 1556.257798
+3.369439, 2.963462, 1557.817045
+3.379865, 3.151337, 1559.397947
+3.389482, 3.237455, 1560.957194
+3.399670, 3.075969, 1562.538096
+3.409431, 3.127616, 1564.097342
+3.419355, 3.012946, 1565.656589
+3.429472, 3.094794, 1567.237491
+3.439645, 2.986884, 1568.796738
+3.449433, 3.228489, 1570.355984
+3.459540, 3.042079, 1571.915230
+3.469425, 3.052375, 1573.474477
+3.479338, 3.083112, 1575.055379
+3.489491, 2.926137, 1576.614626
+3.499576, 2.990285, 1578.152216
+3.509412, 3.204911, 1579.711462
+3.519368, 3.134930, 1581.270709
+3.529436, 3.050871, 1582.829955
+3.539512, 3.012085, 1584.389201
+3.549482, 3.160836, 1585.948448
+3.559848, 3.076263, 1587.486038
+3.569480, 2.996910, 1589.045284
+3.579466, 2.963210, 1590.604530
+3.589392, 3.113684, 1592.142121
+3.599645, 3.029053, 1593.679711
+3.609466, 3.111230, 1595.238957
+3.619478, 3.001191, 1596.776547
+3.629414, 3.083010, 1598.335794
+3.639639, 2.977469, 1599.873384
+3.649431, 3.061646, 1601.410974
+3.659343, 2.956478, 1602.970220
+3.669437, 3.040410, 1604.507810
+3.679660, 3.096927, 1606.067057
+3.689414, 3.104633, 1607.582991
+3.699466, 3.092523, 1609.120581
+3.709581, 3.079314, 1610.658171
+3.719844, 3.069195, 1612.195761
+3.729455, 3.060854, 1613.755008
+3.739454, 2.890971, 1615.270942
+3.749456, 3.120861, 1616.808532
+3.759652, 2.943141, 1618.367778
+3.769565, 2.963262, 1619.905368
+3.779406, 3.162518, 1621.442958
+3.789419, 3.096059, 1622.958892
+3.799647, 2.857986, 1624.496482
+3.809451, 3.063847, 1626.034073
+3.819535, 3.048330, 1627.550007
+3.829423, 3.158748, 1629.087597
+3.839290, 3.053598, 1630.625187
+3.849534, 2.974064, 1632.162777
+3.859585, 2.947301, 1633.678711
+3.869342, 3.104581, 1635.194645
+3.879651, 3.025376, 1636.753891
+3.889461, 3.112302, 1638.269825
+3.899471, 3.006920, 1639.785759
+3.909503, 3.093474, 1641.323349
+3.919650, 2.992726, 1642.860940
+3.929493, 3.081710, 1644.376873
+3.939457, 2.981346, 1645.914464
+3.949675, 2.908199, 1647.430398
+3.959566, 3.045687, 1648.946332
+3.969420, 3.126825, 1650.505578
+3.979850, 2.816686, 1652.021512
+3.989429, 3.120514, 1653.537446
+3.999650, 3.009544, 1655.053380
+4.009434, 3.053283, 1656.590970
+4.019490, 2.769875, 1658.106904
+4.029473, 2.932334, 1659.644494
+4.039639, 2.903060, 1661.182084
+4.049524, 3.176347, 1662.698018
+4.059463, 2.998063, 1664.213952
+4.069518, 3.013137, 1665.729886
+4.079855, 3.051287, 1667.267476
+4.089451, 3.065561, 1668.783410
+4.099514, 2.901543, 1670.299344
+4.109450, 2.971613, 1671.793622
+4.119835, 3.035151, 1673.331212
+4.129459, 3.052225, 1674.847146
+4.139393, 2.884954, 1676.363080
+4.149517, 3.114730, 1677.879014
+4.159643, 3.101587, 1679.373292
+4.169483, 3.212047, 1680.889226
+4.179478, 2.947840, 1682.405160
+4.189417, 3.111024, 1683.921094
+4.199352, 3.081820, 1685.415371
+4.209534, 3.196368, 1686.931305
+4.219472, 2.937203, 1688.447239
+4.229358, 3.102203, 1689.963173
+4.239581, 4.044265, 1691.479107
+4.249471, 2.568287, 1692.995041
+4.259564, 2.592233, 1694.510975
+4.269489, 2.874029, 1696.048565
+4.279649, 2.848913, 1697.564499
+4.289504, 3.102328, 1699.058777
+4.299467, 2.913154, 1700.574711
+4.309396, 2.926342, 1702.090645
+4.319635, 3.127416, 1703.584923
+4.329463, 3.066398, 1705.122513
+4.339462, 3.157757, 1706.616790
+4.349523, 3.054520, 1708.132724
+4.359685, 2.982710, 1709.627002
+4.369520, 3.124646, 1711.142936
+4.379481, 2.887285, 1712.658870
+4.389476, 3.058346, 1714.174804
+4.399662, 3.028207, 1715.647426
+4.409523, 3.140828, 1717.163360
+4.419532, 3.042732, 1718.679293
+4.429478, 3.131501, 1720.195227
+4.439668, 3.033777, 1721.667849
+4.449451, 3.127131, 1723.183783
+4.459519, 3.031674, 1724.699717
+4.469529, 3.125338, 1726.193995
+4.479652, 3.029621, 1727.709929
+4.489541, 3.123096, 1729.204206
+4.499285, 2.865452, 1730.720140
+4.509567, 3.035110, 1732.236074
+4.519358, 3.169872, 1733.752008
+4.529256, 3.046239, 1735.246286
+4.539423, 2.956041, 1736.762220
+4.549418, 3.092368, 1738.278154
+4.559287, 3.017417, 1739.772432
+4.569392, 3.113609, 1741.266709
+4.579389, 3.015401, 1742.804300
+4.589391, 3.107141, 1744.298577
+4.599271, 3.010950, 1745.792855
+4.609237, 3.104538, 1747.308789
+4.619397, 2.847040, 1748.803067
+4.629258, 3.016751, 1750.340657
+4.639391, 3.151513, 1751.834935
+4.649382, 3.027871, 1753.329212
+4.659249, 2.937667, 1754.845146
+4.669717, 3.073994, 1756.361080
+4.679709, 2.837164, 1757.877014
+4.689305, 3.009530, 1759.371292
+4.699414, 2.979957, 1760.865570
+4.709265, 3.254504, 1762.381504
+4.719267, 2.918277, 1763.875782
+4.729387, 3.014535, 1765.391715
+4.739263, 2.964507, 1766.885993
+4.749394, 3.242657, 1768.401927
+4.759241, 3.073913, 1769.917861
+4.769396, 2.934311, 1771.412139
+4.779436, 2.891905, 1772.928073
+4.789376, 3.055522, 1774.444007
+4.799259, 2.823787, 1775.938285
+4.809430, 2.993720, 1777.454219
+4.819715, 2.961969, 1778.948496
+4.829635, 3.235854, 1780.442774
+4.839637, 3.061570, 1781.958708
+4.849506, 3.081810, 1783.474642
+4.859505, 2.801335, 1784.968920
+4.869352, 3.134735, 1786.484854
+4.879650, 3.036602, 1787.979131
+4.889446, 3.084670, 1789.495065
+4.899459, 2.966217, 1790.989343
+4.909516, 3.056512, 1792.483621
+4.919642, 2.963315, 1793.999555
+4.929515, 3.058695, 1795.493833
+4.939540, 2.963436, 1796.988110
+4.949486, 3.056827, 1798.504044
+4.959635, 2.960935, 1800.019978
+4.969264, 3.054371, 1801.514256
+4.979559, 3.120496, 1803.030190
+4.989369, 2.975943, 1804.502812
+4.999639, 3.049612, 1806.018745
+5.009522, 3.114635, 1807.513023
+5.019539, 2.811284, 1809.028957
+5.029502, 3.124778, 1810.523235
+5.039639, 3.020720, 1812.017513
+5.049531, 3.069436, 1813.511790
+5.059571, 2.952407, 1815.006068
+5.069509, 3.205185, 1816.522002
+5.079646, 3.035861, 1818.016280
+5.089525, 3.224397, 1819.532214
+5.099572, 2.870103, 1821.026492
+5.109284, 3.134886, 1822.542426
+5.119546, 3.015399, 1824.036703
+5.129816, 3.065232, 1825.530981
+5.139566, 2.951614, 1827.025259
+5.149507, 3.044046, 1828.541193
+5.159648, 2.951048, 1830.035471
+5.169497, 3.208013, 1831.551405
+5.179545, 2.874516, 1833.045682
+5.189501, 3.137284, 1834.539960
+5.199633, 3.012938, 1836.034238
+5.209521, 3.222545, 1837.528516
+5.219560, 3.032578, 1839.044450
+5.229503, 3.056672, 1840.538727
+5.239594, 4.237957, 1842.033005
+5.249532, 2.592533, 1843.527283
+5.259542, 2.486074, 1845.043217
+5.269566, 2.894539, 1846.515838
+5.279650, 3.123100, 1848.010116
+5.289252, 3.165125, 1849.504394
+5.299546, 3.307151, 1850.998672
+5.309525, 3.213976, 1852.471293
+5.319632, 3.141194, 1853.943915
+5.329458, 3.284019, 1855.459849
+5.339575, 3.050528, 1856.932470
+5.349266, 3.226635, 1858.448404
+5.359682, 3.201591, 1859.921026
+5.369278, 3.319115, 1861.436960
+5.379549, 3.063938, 1862.931237
+5.389254, 3.071781, 1864.447171
+5.399651, 2.961775, 1865.919793
+5.409641, 3.063785, 1867.435727
+5.419564, 0.000000, 1868.930005
+5.429518, 0.000000, 1870.424282
+5.439596, 0.000000, 1871.918560
+5.449485, 0.000000, 1873.347869
+5.459469, 0.000000, 1874.733866
+5.469640, 0.000000, 1876.098207
+5.479575, 0.000000, 1877.419235
+5.489492, 0.000000, 1878.675294
+5.499454, 0.000000, 1879.909698
+5.509441, 0.000000, 1881.100789
+5.519669, 0.000000, 1882.270223
+5.529268, 0.000000, 1883.396346
+5.539531, 0.000000, 1884.479156
+5.549491, 0.000000, 1885.518653
+5.559591, 0.000000, 1886.536495
+5.569479, 0.000000, 1887.532680
+5.579553, 0.000000, 1888.485553
+5.589263, 0.000000, 1889.416769
+5.599628, 0.000000, 1890.283017
+5.609531, 0.000000, 1891.149265
+5.619452, 0.000000, 1891.993857
+5.629254, 0.000000, 1892.795136
+5.639595, 0.000000, 1893.574759
+5.649382, 0.000000, 1894.332726
+5.659518, 0.000000, 1895.047381
+5.669510, 0.000000, 1895.740379
+5.679630, 0.000000, 1896.433378
+5.689513, 0.000000, 1897.083064
+5.699559, 0.000000, 1897.689437
+5.709897, 0.000000, 1898.295811
+5.719663, 0.000000, 1898.880528
+5.729785, 0.000000, 1899.443590
+5.739550, 0.000000, 1899.984995
+5.749477, 0.000000, 1900.504743
+5.759631, 0.000000, 1901.002836
+5.769499, 0.000000, 1901.500928
+5.779545, 0.000000, 1901.955709
+5.789477, 0.000000, 1902.388833
+5.799588, 0.000000, 1902.821957
+5.809530, 0.000000, 1903.233424
+5.819550, 0.000000, 1903.623236
+5.829288, 0.000000, 1903.991391
+5.839583, 0.000000, 1904.359547
+5.849261, 0.000000, 1904.706046
+5.859488, 0.000000, 1905.030889
+5.869375, 0.000000, 1905.334076
+5.879665, 0.000000, 1905.658919
+5.889507, 0.000000, 1905.918793
+5.899530, 0.000000, 1906.200324
+5.909520, 0.000000, 1906.460198
+5.919633, 0.000000, 1906.720073
+5.929467, 0.000000, 1906.958291
+5.939535, 0.000000, 1907.174853
+5.949423, 0.000000, 1907.391415
+5.959583, 0.000000, 1907.586320
+5.969500, 0.000000, 1907.781226
+5.979548, 0.000000, 1907.954476
+5.989236, 0.000000, 1908.106069
+5.999631, 0.000000, 1908.279319
+6.009506, 0.000000, 1908.409256
+6.019548, 0.000000, 1908.560849
+6.029525, 0.000000, 1908.669130
+6.039582, 0.000000, 1908.799068
+6.049527, 0.000000, 1908.907349
+6.059538, 0.000000, 1909.015630
+6.069537, 0.000000, 1909.102254
+6.079650, 0.000000, 1909.188879
+6.089474, 0.000000, 1909.253848
+6.099533, 0.000000, 1909.318816
+6.109497, 0.000000, 1909.383785
+6.119587, 0.000000, 1909.448754
+6.129255, 0.000000, 1909.492066
+6.139524, 0.000000, 1909.513722
+6.149479, 0.000000, 1909.557035
+6.159584, 0.000000, 1909.578691
+6.169260, 0.000000, 1909.600347
+6.179536, 0.000000, 1909.600347
+6.189396, 0.000000, 1909.600347
+6.199574, 0.000000, 1909.600347
+6.209506, 0.000000, 1909.600347
+6.219521, 0.000000, 1909.600347
+6.229482, 0.000000, 1909.600347
+6.239565, 0.000000, 1909.600347
+6.249254, 0.000000, 1909.600347
+6.259521, 0.000000, 1909.600347
+6.269506, 0.000000, 1909.600347
+6.279589, 0.000000, 1909.600347
+6.289535, 0.000000, 1909.600347
+6.299542, 0.000000, 1909.600347
+6.309460, 0.000000, 1909.600347
+6.319858, 0.000000, 1909.600347
+6.329537, 0.000000, 1909.600347
+6.339535, 0.000000, 1909.600347
+6.349231, 0.000000, 1909.600347
+6.359649, 0.000000, 1909.600347
+6.369534, 0.000000, 1909.600347
+6.379535, 0.000000, 1909.600347
diff --git a/frc971/control_loops/shooter/shooter_lib_test.cc b/frc971/control_loops/shooter/shooter_lib_test.cc
new file mode 100644
index 0000000..beb62f1
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter_lib_test.cc
@@ -0,0 +1,193 @@
+#include <unistd.h>
+
+#include <memory>
+
+#include "gtest/gtest.h"
+#include "aos/common/queue.h"
+#include "aos/common/queue_testutils.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+#include "frc971/control_loops/shooter/shooter.h"
+#include "frc971/constants.h"
+
+using ::aos::time::Time;
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+
+// Class which simulates the shooter and sends out queue messages with the
+// position.
+class ShooterMotorSimulation {
+ public:
+  // Constructs a shooter simulation. I'm not sure how the construction of
+  // the queue (my_shooter_loop_) actually works (same format as wrist).
+  ShooterMotorSimulation()
+      : shooter_plant_(new StateFeedbackPlant<2, 1, 1>(MakeShooterPlant())),
+        my_shooter_loop_(".frc971.control_loops.shooter",
+          0x78d8e372, ".frc971.control_loops.shooter.goal",
+          ".frc971.control_loops.shooter.position",
+          ".frc971.control_loops.shooter.output",
+          ".frc971.control_loops.shooter.status") {
+  }
+
+  // Sends a queue message with the position of the shooter.
+  void SendPositionMessage() {
+    ::aos::ScopedMessagePtr<control_loops::ShooterLoop::Position> position =
+      my_shooter_loop_.position.MakeMessage();
+    position->position = shooter_plant_->Y(0, 0);
+    position.Send();
+  }
+
+  // Simulates shooter for a single timestep.
+  void Simulate() {
+    EXPECT_TRUE(my_shooter_loop_.output.FetchLatest());
+    shooter_plant_->U << my_shooter_loop_.output->voltage;
+    shooter_plant_->Update();
+  }
+
+  ::std::unique_ptr<StateFeedbackPlant<2, 1, 1>> shooter_plant_;
+
+ private:
+  ShooterLoop my_shooter_loop_;
+};
+
+class ShooterTest : public ::testing::Test {
+ protected:
+  ShooterTest() : my_shooter_loop_(".frc971.control_loops.shooter",
+                                   0x78d8e372,
+                                   ".frc971.control_loops.shooter.goal",
+                                   ".frc971.control_loops.shooter.position",
+                                   ".frc971.control_loops.shooter.output",
+                                   ".frc971.control_loops.shooter.status"),
+                  shooter_motor_(&my_shooter_loop_),
+                  shooter_motor_plant_() {
+    // Flush the robot state queue so we can use clean shared memory for this
+    // test.
+    ::aos::robot_state.Clear();
+    SendDSPacket(true);
+  }
+
+  virtual ~ShooterTest() {
+    ::aos::robot_state.Clear();
+  }
+
+  // Update the robot state. Without this, the Iteration of the control loop
+  // will stop all the motors and the shooter won't go anywhere.
+  void SendDSPacket(bool enabled) {
+    ::aos::robot_state.MakeWithBuilder().enabled(enabled)
+                                        .autonomous(false)
+                                        .team_id(971).Send();
+    ::aos::robot_state.FetchLatest();
+  }
+
+  void VerifyNearGoal() {
+    my_shooter_loop_.goal.FetchLatest();
+    my_shooter_loop_.status.FetchLatest();
+    EXPECT_NEAR(my_shooter_loop_.goal->velocity,
+                my_shooter_loop_.status->average_velocity,
+                10.0);
+  }
+
+  // Bring up and down Core.
+  ::aos::common::testing::GlobalCoreInstance my_core;
+
+  // Create a new instance of the test queue so that it invalidates the queue
+  // that it points to.  Otherwise, we will have a pointed to
+  // shared memory that is no longer valid.
+  ShooterLoop my_shooter_loop_;
+
+  // Create a control loop and simulation.
+  ShooterMotor shooter_motor_;
+  ShooterMotorSimulation shooter_motor_plant_;
+};
+
+// Tests that the shooter does nothing when the goal is zero.
+TEST_F(ShooterTest, DoesNothing) {
+  my_shooter_loop_.goal.MakeWithBuilder().velocity(0.0).Send();
+  SendDSPacket(true);
+  shooter_motor_plant_.SendPositionMessage();
+  shooter_motor_.Iterate();
+  shooter_motor_plant_.Simulate();
+  VerifyNearGoal();
+  my_shooter_loop_.output.FetchLatest();
+  EXPECT_EQ(my_shooter_loop_.output->voltage, 0.0);
+}
+
+// Tests that the shooter spins up to speed and that it then spins down
+// without applying any power.
+TEST_F(ShooterTest, SpinUpAndDown) {
+  my_shooter_loop_.goal.MakeWithBuilder().velocity(450.0).Send();
+  bool is_done = false;
+  while (!is_done) {
+    shooter_motor_plant_.SendPositionMessage();
+    shooter_motor_.Iterate();
+    shooter_motor_plant_.Simulate();
+    SendDSPacket(true);
+    EXPECT_TRUE(my_shooter_loop_.status.FetchLatest());
+    is_done = my_shooter_loop_.status->ready;
+  }
+  VerifyNearGoal();
+
+  my_shooter_loop_.goal.MakeWithBuilder().velocity(0.0).Send();
+  for (int i = 0; i < 100; ++i) {
+    shooter_motor_plant_.SendPositionMessage();
+    shooter_motor_.Iterate();
+    shooter_motor_plant_.Simulate();
+    SendDSPacket(true);
+    EXPECT_TRUE(my_shooter_loop_.output.FetchLatest());
+    EXPECT_EQ(0.0, my_shooter_loop_.output->voltage);
+  }
+}
+
+// Test to make sure that it does not exceed the encoder's rated speed.
+TEST_F(ShooterTest, RateLimitTest) {
+  my_shooter_loop_.goal.MakeWithBuilder().velocity(1000.0).Send();
+  bool is_done = false;
+  while (!is_done) {
+    shooter_motor_plant_.SendPositionMessage();
+    shooter_motor_.Iterate();
+    shooter_motor_plant_.Simulate();
+    SendDSPacket(true);
+    EXPECT_TRUE(my_shooter_loop_.status.FetchLatest());
+    is_done = my_shooter_loop_.status->ready;
+  }
+
+  my_shooter_loop_.goal.FetchLatest();
+  my_shooter_loop_.status.FetchLatest();
+  EXPECT_GT(shooter_motor_.kMaxSpeed,
+            shooter_motor_plant_.shooter_plant_->X(1, 0));
+}
+
+// Tests that the shooter can spin up nicely while missing position packets.
+TEST_F(ShooterTest, MissingPositionMessages) {
+  my_shooter_loop_.goal.MakeWithBuilder().velocity(200.0).Send();
+  for (int i = 0; i < 100; ++i) {
+    if (i % 7) {
+      shooter_motor_plant_.SendPositionMessage();
+    }
+    shooter_motor_.Iterate();
+    shooter_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+
+  VerifyNearGoal();
+}
+
+// Tests that the shooter can spin up nicely while disabled for a while.
+TEST_F(ShooterTest, Disabled) {
+  my_shooter_loop_.goal.MakeWithBuilder().velocity(200.0).Send();
+  for (int i = 0; i < 100; ++i) {
+    if (i % 7) {
+      shooter_motor_plant_.SendPositionMessage();
+    }
+    shooter_motor_.Iterate();
+    shooter_motor_plant_.Simulate();
+    SendDSPacket(i > 50);
+  }
+
+  VerifyNearGoal();
+}
+
+}  // namespace testing
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/shooter/shooter_main.cc b/frc971/control_loops/shooter/shooter_main.cc
new file mode 100644
index 0000000..c52db73
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter_main.cc
@@ -0,0 +1,11 @@
+#include "frc971/control_loops/shooter/shooter.h"
+
+#include "aos/atom_code/init.h"
+
+int main() {
+  ::aos::Init();
+  frc971::control_loops::ShooterMotor shooter;
+  shooter.Run();
+  ::aos::Cleanup();
+  return 0;
+}
diff --git a/frc971/control_loops/shooter/shooter_motor.q b/frc971/control_loops/shooter/shooter_motor.q
new file mode 100644
index 0000000..f2abf25
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter_motor.q
@@ -0,0 +1,31 @@
+package frc971.control_loops;
+
+import "aos/common/control_loop/control_loops.q";
+
+queue_group ShooterLoop {
+  implements aos.control_loops.ControlLoop;
+
+  message Goal {
+    // Goal velocity in rad/sec
+    double velocity;
+  };
+
+  message Status {
+    // True if the shooter is up to speed.
+    bool ready;
+    // The average velocity over the last 0.1 seconds.
+    double average_velocity;
+  };
+
+  message Position {
+    // The angle of the shooter wheel measured in rad/sec.
+    double position;
+  };
+
+  queue Goal goal;
+  queue Position position;
+  queue aos.control_loops.Output output;
+  queue Status status;
+};
+
+queue_group ShooterLoop shooter;
diff --git a/frc971/control_loops/shooter/shooter_motor_plant.cc b/frc971/control_loops/shooter/shooter_motor_plant.cc
new file mode 100644
index 0000000..1a623f3
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter_motor_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/shooter/shooter_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeShooterPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00992127884628, 0.0, 0.984297191531;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.00398899915072, 0.795700859132;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<2, 1, 1> MakeShooterController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.08429719153, 29.2677479765;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 0.955132813139, 0.50205697652;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeShooterPlantCoefficients());
+}
+
+StateFeedbackPlant<2, 1, 1> MakeShooterPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<2, 1, 1> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeShooterPlantCoefficients());
+  return StateFeedbackPlant<2, 1, 1>(plants);
+}
+
+StateFeedbackLoop<2, 1, 1> MakeShooterLoop() {
+  ::std::vector<StateFeedbackController<2, 1, 1> *> controllers(1);
+  controllers[0] = new StateFeedbackController<2, 1, 1>(MakeShooterController());
+  return StateFeedbackLoop<2, 1, 1>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/shooter/shooter_motor_plant.h b/frc971/control_loops/shooter/shooter_motor_plant.h
new file mode 100644
index 0000000..3588605
--- /dev/null
+++ b/frc971/control_loops/shooter/shooter_motor_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_SHOOTER_SHOOTER_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_SHOOTER_SHOOTER_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeShooterPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeShooterController();
+
+StateFeedbackPlant<2, 1, 1> MakeShooterPlant();
+
+StateFeedbackLoop<2, 1, 1> MakeShooterLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_SHOOTER_SHOOTER_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/state_feedback_loop.h b/frc971/control_loops/state_feedback_loop.h
new file mode 100644
index 0000000..38ca89c
--- /dev/null
+++ b/frc971/control_loops/state_feedback_loop.h
@@ -0,0 +1,332 @@
+#ifndef FRC971_CONTROL_LOOPS_STATEFEEDBACKLOOP_H_
+#define FRC971_CONTROL_LOOPS_STATEFEEDBACKLOOP_H_
+
+#include <assert.h>
+
+#include <vector>
+
+#include "Eigen/Dense"
+
+template <int number_of_states, int number_of_inputs, int number_of_outputs>
+class StateFeedbackPlantCoefficients {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
+
+  const Eigen::Matrix<double, number_of_states, number_of_states> A;
+  const Eigen::Matrix<double, number_of_states, number_of_inputs> B;
+  const Eigen::Matrix<double, number_of_outputs, number_of_states> C;
+  const Eigen::Matrix<double, number_of_outputs, number_of_inputs> D;
+  const Eigen::Matrix<double, number_of_inputs, 1> U_min;
+  const Eigen::Matrix<double, number_of_inputs, 1> U_max;
+
+  StateFeedbackPlantCoefficients(const StateFeedbackPlantCoefficients &other)
+      : A(other.A),
+        B(other.B),
+        C(other.C),
+        D(other.D),
+        U_min(other.U_min),
+        U_max(other.U_max) {
+  }
+
+  StateFeedbackPlantCoefficients(
+      const Eigen::Matrix<double, number_of_states, number_of_states> &A,
+      const Eigen::Matrix<double, number_of_states, number_of_inputs> &B,
+      const Eigen::Matrix<double, number_of_outputs, number_of_states> &C,
+      const Eigen::Matrix<double, number_of_outputs, number_of_inputs> &D,
+      const Eigen::Matrix<double, number_of_outputs, 1> &U_max,
+      const Eigen::Matrix<double, number_of_outputs, 1> &U_min)
+      : A(A),
+        B(B),
+        C(C),
+        D(D),
+        U_min(U_min),
+        U_max(U_max) {
+  }
+
+ protected:
+  // these are accessible from non-templated subclasses
+  static const int kNumStates = number_of_states;
+  static const int kNumOutputs = number_of_outputs;
+  static const int kNumInputs = number_of_inputs;
+};
+
+template <int number_of_states, int number_of_inputs, int number_of_outputs>
+class StateFeedbackPlant {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
+  ::std::vector<StateFeedbackPlantCoefficients<
+      number_of_states, number_of_inputs, number_of_outputs> *> coefficients_;
+
+  const Eigen::Matrix<double, number_of_states, number_of_states> &A() const {
+    return coefficients().A;
+  }
+  double A(int i, int j) const { return A()(i, j); }
+  const Eigen::Matrix<double, number_of_states, number_of_inputs> &B() const {
+    return coefficients().B;
+  }
+  double B(int i, int j) const { return B()(i, j); }
+  const Eigen::Matrix<double, number_of_outputs, number_of_states> &C() const {
+    return coefficients().C;
+  }
+  double C(int i, int j) const { return C()(i, j); }
+  const Eigen::Matrix<double, number_of_outputs, number_of_inputs> &D() const {
+    return coefficients().D;
+  }
+  double D(int i, int j) const { return D()(i, j); }
+  const Eigen::Matrix<double, number_of_inputs, 1> &U_min() const {
+    return coefficients().U_min;
+  }
+  double U_min(int i, int j) const { return U_min()(i, j); }
+  const Eigen::Matrix<double, number_of_inputs, 1> &U_max() const {
+    return coefficients().U_max;
+  }
+  double U_max(int i, int j) const { return U_max()(i, j); }
+
+  const StateFeedbackPlantCoefficients<
+      number_of_states, number_of_inputs, number_of_outputs>
+          &coefficients() const {
+    return *coefficients_[plant_index_];
+  }
+
+  int plant_index() const { return plant_index_; }
+  void set_plant_index(int plant_index) {
+    if (plant_index < 0) {
+      plant_index_ = 0;
+    } else if (plant_index >= static_cast<int>(coefficients_.size())) {
+      plant_index_ = static_cast<int>(coefficients_.size()) - 1;
+    } else {
+      plant_index_ = plant_index;
+    }
+  }
+
+  void Reset() {
+    X.setZero();
+    Y.setZero();
+    U.setZero();
+  }
+
+  Eigen::Matrix<double, number_of_states, 1> X;
+  Eigen::Matrix<double, number_of_outputs, 1> Y;
+  Eigen::Matrix<double, number_of_inputs, 1> U;
+
+  StateFeedbackPlant(
+      const ::std::vector<StateFeedbackPlantCoefficients<
+          number_of_states, number_of_inputs,
+          number_of_outputs> *> &coefficients)
+      : coefficients_(coefficients),
+        plant_index_(0) {
+    Reset();
+  }
+
+  StateFeedbackPlant(StateFeedbackPlant &&other)
+      : plant_index_(0) {
+    Reset();
+    ::std::swap(coefficients_, other.coefficients_);
+  }
+
+  virtual ~StateFeedbackPlant() {}
+
+  // Assert that U is within the hardware range.
+  virtual void CheckU() {
+    for (int i = 0; i < kNumOutputs; ++i) {
+      assert(U(i, 0) <= U_max(i, 0));
+      assert(U(i, 0) >= U_min(i, 0));
+    }
+  }
+
+  // Computes the new X and Y given the control input.
+  void Update() {
+    // Powers outside of the range are more likely controller bugs than things
+    // that the plant should deal with.
+    CheckU();
+    X = A() * X + B() * U;
+    Y = C() * X + D() * U;
+  }
+
+ protected:
+  // these are accessible from non-templated subclasses
+  static const int kNumStates = number_of_states;
+  static const int kNumOutputs = number_of_outputs;
+  static const int kNumInputs = number_of_inputs;
+
+ private:
+  int plant_index_;
+};
+
+// A Controller is a structure which holds a plant and the K and L matrices.
+// This is designed such that multiple controllers can share one set of state to
+// support gain scheduling easily.
+template <int number_of_states, int number_of_inputs, int number_of_outputs>
+struct StateFeedbackController {
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
+  const Eigen::Matrix<double, number_of_states, number_of_outputs> L;
+  const Eigen::Matrix<double, number_of_outputs, number_of_states> K;
+  StateFeedbackPlantCoefficients<number_of_states, number_of_inputs,
+                                 number_of_outputs> plant;
+
+  StateFeedbackController(
+      const Eigen::Matrix<double, number_of_states, number_of_outputs> &L,
+      const Eigen::Matrix<double, number_of_outputs, number_of_states> &K,
+      const StateFeedbackPlantCoefficients<number_of_states, number_of_inputs,
+                                           number_of_outputs> &plant)
+      : L(L),
+        K(K),
+        plant(plant) {
+  }
+};
+
+template <int number_of_states, int number_of_inputs, int number_of_outputs>
+class StateFeedbackLoop {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
+
+  const Eigen::Matrix<double, number_of_states, number_of_states> &A() const {
+    return controller().plant.A;
+  }
+  double A(int i, int j) const { return A()(i, j); }
+  const Eigen::Matrix<double, number_of_states, number_of_inputs> &B() const {
+    return controller().plant.B;
+  }
+  double B(int i, int j) const { return B()(i, j); }
+  const Eigen::Matrix<double, number_of_outputs, number_of_states> &C() const {
+    return controller().plant.C;
+  }
+  double C(int i, int j) const { return C()(i, j); }
+  const Eigen::Matrix<double, number_of_outputs, number_of_inputs> &D() const {
+    return controller().plant.D;
+  }
+  double D(int i, int j) const { return D()(i, j); }
+  const Eigen::Matrix<double, number_of_outputs, number_of_states> &K() const {
+    return controller().K;
+  }
+  double K(int i, int j) const { return K()(i, j); }
+  const Eigen::Matrix<double, number_of_states, number_of_outputs> &L() const {
+    return controller().L;
+  }
+  double L(int i, int j) const { return L()(i, j); }
+  const Eigen::Matrix<double, number_of_inputs, 1> &U_min() const {
+    return controller().plant.U_min;
+  }
+  double U_min(int i, int j) const { return U_min()(i, j); }
+  const Eigen::Matrix<double, number_of_inputs, 1> &U_max() const {
+    return controller().plant.U_max;
+  }
+  double U_max(int i, int j) const { return U_max()(i, j); }
+
+  Eigen::Matrix<double, number_of_states, 1> X_hat;
+  Eigen::Matrix<double, number_of_states, 1> R;
+  Eigen::Matrix<double, number_of_inputs, 1> U;
+  Eigen::Matrix<double, number_of_inputs, 1> U_uncapped;
+  Eigen::Matrix<double, number_of_outputs, 1> U_ff;
+  Eigen::Matrix<double, number_of_outputs, 1> Y;
+
+  const StateFeedbackController<number_of_states, number_of_inputs,
+                                number_of_outputs> &controller() const {
+    return *controllers_[controller_index_];
+  }
+
+  const StateFeedbackController<number_of_states, number_of_inputs,
+                                number_of_outputs> &controller(
+                                    int index) const {
+    return *controllers_[index];
+  }
+
+  void Reset() {
+    X_hat.setZero();
+    R.setZero();
+    U.setZero();
+    U_uncapped.setZero();
+    U_ff.setZero();
+    Y.setZero();
+  }
+
+  StateFeedbackLoop(const StateFeedbackController<
+      number_of_states, number_of_inputs, number_of_outputs> &controller)
+      : controller_index_(0) {
+    controllers_.push_back(new StateFeedbackController<
+        number_of_states, number_of_inputs, number_of_outputs>(controller));
+    Reset();
+  }
+
+  StateFeedbackLoop(const ::std::vector<StateFeedbackController<
+      number_of_states, number_of_inputs, number_of_outputs> *> &controllers)
+      : controllers_(controllers), controller_index_(0) {
+    Reset();
+  }
+
+  StateFeedbackLoop(
+      const Eigen::Matrix<double, number_of_states, number_of_outputs> &L,
+      const Eigen::Matrix<double, number_of_outputs, number_of_states> &K,
+      const StateFeedbackPlantCoefficients<number_of_states, number_of_inputs,
+                               number_of_outputs> &plant)
+      : controller_index_(0) {
+    controllers_.push_back(
+        new StateFeedbackController<number_of_states, number_of_inputs,
+                                    number_of_outputs>(L, K, plant));
+
+    Reset();
+  }
+  virtual ~StateFeedbackLoop() {}
+
+  virtual void FeedForward() {
+    for (int i = 0; i < number_of_outputs; ++i) {
+      U_ff[i] = 0.0;
+    }
+  }
+
+  // If U is outside the hardware range, limit it before the plant tries to use
+  // it.
+  virtual void CapU() {
+    for (int i = 0; i < kNumOutputs; ++i) {
+      if (U(i, 0) > U_max(i, 0)) {
+        U(i, 0) = U_max(i, 0);
+      } else if (U(i, 0) < U_min(i, 0)) {
+        U(i, 0) = U_min(i, 0);
+      }
+    }
+  }
+
+  // update_observer is whether or not to use the values in Y.
+  // stop_motors is whether or not to output all 0s.
+  void Update(bool update_observer, bool stop_motors) {
+    if (stop_motors) {
+      U.setZero();
+    } else {
+      U = U_uncapped = K() * (R - X_hat);
+      CapU();
+    }
+
+    if (update_observer) {
+      X_hat = (A() - L() * C()) * X_hat + L() * Y + B() * U;
+    } else {
+      X_hat = A() * X_hat + B() * U;
+    }
+  }
+
+  // Sets the current controller to be index and verifies that it isn't out of
+  // range.
+  void set_controller_index(int index) {
+    if (index < 0) {
+      controller_index_ = 0;
+    } else if (index >= static_cast<int>(controllers_.size())) {
+      controller_index_ = static_cast<int>(controllers_.size()) - 1;
+    } else {
+      controller_index_ = index;
+    }
+  }
+
+  void controller_index() const { return controller_index_; }
+
+ protected:
+  ::std::vector<StateFeedbackController<number_of_states, number_of_inputs,
+                                        number_of_outputs> *> controllers_;
+
+  // these are accessible from non-templated subclasses
+  static const int kNumStates = number_of_states;
+  static const int kNumOutputs = number_of_outputs;
+  static const int kNumInputs = number_of_inputs;
+
+  int controller_index_;
+};
+
+#endif  // FRC971_CONTROL_LOOPS_STATEFEEDBACKLOOP_H_
diff --git a/frc971/control_loops/update_angle_adjust.sh b/frc971/control_loops/update_angle_adjust.sh
new file mode 100755
index 0000000..096f95e
--- /dev/null
+++ b/frc971/control_loops/update_angle_adjust.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+#
+# Updates the angle adjust controller.
+
+./python/angle_adjust.py angle_adjust/angle_adjust_motor_plant.h \
+    angle_adjust/angle_adjust_motor_plant.cc \
+    angle_adjust/unaugmented_angle_adjust_motor_plant.h \
+    angle_adjust/unaugmented_angle_adjust_motor_plant.cc \
diff --git a/frc971/control_loops/update_drivetrain.sh b/frc971/control_loops/update_drivetrain.sh
new file mode 100755
index 0000000..bad1074
--- /dev/null
+++ b/frc971/control_loops/update_drivetrain.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+#
+# Updates the drivetrain controllers (for both robots).
+
+cd $(dirname $0)
+
+./python/drivetrain.py drivetrain/drivetrain_dog_motor_plant.h \
+    drivetrain/drivetrain_dog_motor_plant.cc \
+    drivetrain/drivetrain_clutch_motor_plant.h \
+    drivetrain/drivetrain_clutch_motor_plant.cc
diff --git a/frc971/control_loops/update_index.sh b/frc971/control_loops/update_index.sh
new file mode 100755
index 0000000..3b819b4
--- /dev/null
+++ b/frc971/control_loops/update_index.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+#
+# Updates the index controller.
+
+./python/index.py index/index_motor_plant.h index/index_motor_plant.cc
diff --git a/frc971/control_loops/update_polydrivetrain.sh b/frc971/control_loops/update_polydrivetrain.sh
new file mode 100755
index 0000000..2e2748e
--- /dev/null
+++ b/frc971/control_loops/update_polydrivetrain.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+#
+# Updates the polydrivetrain controllers (for both robots) and CIM models.
+
+cd $(dirname $0)
+
+./python/polydrivetrain.py drivetrain/polydrivetrain_dog_motor_plant.h \
+    drivetrain/polydrivetrain_dog_motor_plant.cc \
+    drivetrain/polydrivetrain_clutch_motor_plant.h \
+    drivetrain/polydrivetrain_clutch_motor_plant.cc \
+    drivetrain/polydrivetrain_cim_plant.h \
+    drivetrain/polydrivetrain_cim_plant.cc
diff --git a/frc971/control_loops/update_shooter.sh b/frc971/control_loops/update_shooter.sh
new file mode 100755
index 0000000..db98547
--- /dev/null
+++ b/frc971/control_loops/update_shooter.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+#
+# Updates the shooter controller.
+
+./python/shooter.py shooter/shooter_motor_plant.h shooter/shooter_motor_plant.cc
diff --git a/frc971/control_loops/update_transfer.sh b/frc971/control_loops/update_transfer.sh
new file mode 100755
index 0000000..d7820fa
--- /dev/null
+++ b/frc971/control_loops/update_transfer.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+#
+# Updates the transfer controller.
+
+./python/transfer.py index/transfer_motor_plant.h index/transfer_motor_plant.cc
diff --git a/frc971/control_loops/update_wrist.sh b/frc971/control_loops/update_wrist.sh
new file mode 100755
index 0000000..1a3b54c
--- /dev/null
+++ b/frc971/control_loops/update_wrist.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+#
+# Updates the wrist controller.
+
+./python/wrist.py wrist/wrist_motor_plant.h \
+    wrist/wrist_motor_plant.cc \
+    wrist/unaugmented_wrist_motor_plant.h \
+    wrist/unaugmented_wrist_motor_plant.cc
diff --git a/frc971/control_loops/wrist/unaugmented_wrist_motor_plant.cc b/frc971/control_loops/wrist/unaugmented_wrist_motor_plant.cc
new file mode 100644
index 0000000..a9871c4
--- /dev/null
+++ b/frc971/control_loops/wrist/unaugmented_wrist_motor_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/wrist/unaugmented_wrist_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeRawWristPlantCoefficients() {
+  Eigen::Matrix<double, 2, 2> A;
+  A << 1.0, 0.00904786878843, 0.0, 0.815818233346;
+  Eigen::Matrix<double, 2, 1> B;
+  B << 0.000326582411818, 0.0631746179893;
+  Eigen::Matrix<double, 1, 2> C;
+  C << 1, 0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<2, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<2, 1, 1> MakeRawWristController() {
+  Eigen::Matrix<double, 2, 1> L;
+  L << 1.71581823335, 64.8264890043;
+  Eigen::Matrix<double, 1, 2> K;
+  K << 130.590421637, 7.48987035533;
+  return StateFeedbackController<2, 1, 1>(L, K, MakeRawWristPlantCoefficients());
+}
+
+StateFeedbackPlant<2, 1, 1> MakeRawWristPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<2, 1, 1> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<2, 1, 1>(MakeRawWristPlantCoefficients());
+  return StateFeedbackPlant<2, 1, 1>(plants);
+}
+
+StateFeedbackLoop<2, 1, 1> MakeRawWristLoop() {
+  ::std::vector<StateFeedbackController<2, 1, 1> *> controllers(1);
+  controllers[0] = new StateFeedbackController<2, 1, 1>(MakeRawWristController());
+  return StateFeedbackLoop<2, 1, 1>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/wrist/unaugmented_wrist_motor_plant.h b/frc971/control_loops/wrist/unaugmented_wrist_motor_plant.h
new file mode 100644
index 0000000..c049420
--- /dev/null
+++ b/frc971/control_loops/wrist/unaugmented_wrist_motor_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_WRIST_UNAUGMENTED_WRIST_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_WRIST_UNAUGMENTED_WRIST_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<2, 1, 1> MakeRawWristPlantCoefficients();
+
+StateFeedbackController<2, 1, 1> MakeRawWristController();
+
+StateFeedbackPlant<2, 1, 1> MakeRawWristPlant();
+
+StateFeedbackLoop<2, 1, 1> MakeRawWristLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_WRIST_UNAUGMENTED_WRIST_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/wrist/wrist.cc b/frc971/control_loops/wrist/wrist.cc
new file mode 100644
index 0000000..8229c93
--- /dev/null
+++ b/frc971/control_loops/wrist/wrist.cc
@@ -0,0 +1,79 @@
+#include "frc971/control_loops/wrist/wrist.h"
+
+#include <stdio.h>
+
+#include <algorithm>
+
+#include "aos/common/control_loop/control_loops.q.h"
+#include "aos/common/logging/logging.h"
+
+#include "frc971/constants.h"
+#include "frc971/control_loops/wrist/wrist_motor_plant.h"
+
+namespace frc971 {
+namespace control_loops {
+
+WristMotor::WristMotor(control_loops::WristLoop *my_wrist)
+    : aos::control_loops::ControlLoop<control_loops::WristLoop>(my_wrist),
+      zeroed_joint_(MakeWristLoop()) {
+  {
+    using ::frc971::constants::GetValues;
+    ZeroedJoint<1>::ConfigurationData config_data;
+
+    config_data.lower_limit = GetValues().wrist_lower_limit;
+    config_data.upper_limit = GetValues().wrist_upper_limit;
+    config_data.hall_effect_start_angle[0] =
+        GetValues().wrist_hall_effect_start_angle;
+    config_data.zeroing_off_speed = GetValues().wrist_zeroing_off_speed;
+    config_data.zeroing_speed = GetValues().wrist_zeroing_speed;
+
+    config_data.max_zeroing_voltage = 5.0;
+    config_data.deadband_voltage = 0.0;
+
+    zeroed_joint_.set_config_data(config_data);
+  }
+}
+
+// Positive angle is up, and positive power is up.
+void WristMotor::RunIteration(
+    const ::aos::control_loops::Goal *goal,
+    const control_loops::WristLoop::Position *position,
+    ::aos::control_loops::Output *output,
+    ::aos::control_loops::Status * status) {
+
+  // Disable the motors now so that all early returns will return with the
+  // motors disabled.
+  if (output) {
+    output->voltage = 0;
+  }
+
+  ZeroedJoint<1>::PositionData transformed_position;
+  ZeroedJoint<1>::PositionData *transformed_position_ptr =
+      &transformed_position;
+  if (!position) {
+    transformed_position_ptr = NULL;
+  } else {
+    transformed_position.position = position->pos;
+    transformed_position.hall_effects[0] = position->hall_effect;
+    transformed_position.hall_effect_positions[0] = position->calibration;
+  }
+
+  const double voltage = zeroed_joint_.Update(transformed_position_ptr,
+    output != NULL,
+    goal->goal, 0.0);
+
+  if (position) {
+    LOG(DEBUG, "pos: %f hall: %s absolute: %f\n",
+        position->pos,
+        position->hall_effect ? "true" : "false",
+        zeroed_joint_.absolute_position());
+  }
+
+  if (output) {
+    output->voltage = voltage;
+  }
+  status->done = ::std::abs(zeroed_joint_.absolute_position() - goal->goal) < 0.004;
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/wrist/wrist.gyp b/frc971/control_loops/wrist/wrist.gyp
new file mode 100644
index 0000000..d66bf6c
--- /dev/null
+++ b/frc971/control_loops/wrist/wrist.gyp
@@ -0,0 +1,67 @@
+{
+  'targets': [
+    {
+      'target_name': 'wrist_loop',
+      'type': 'static_library',
+      'sources': ['wrist_motor.q'],
+      'variables': {
+        'header_path': 'frc971/control_loops/wrist',
+      },
+      'dependencies': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:control_loop_queues',
+        '<(AOS)/common/common.gyp:queues',
+      ],
+      'includes': ['../../../aos/build/queues.gypi'],
+    },
+    {
+      'target_name': 'wrist_lib',
+      'type': 'static_library',
+      'sources': [
+        'wrist.cc',
+        'wrist_motor_plant.cc',
+        'unaugmented_wrist_motor_plant.cc',
+      ],
+      'dependencies': [
+        'wrist_loop',
+        '<(AOS)/common/common.gyp:controls',
+        '<(DEPTH)/frc971/frc971.gyp:constants',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(AOS)/common/common.gyp:controls',
+        'wrist_loop',
+      ],
+    },
+    {
+      'target_name': 'wrist_lib_test',
+      'type': 'executable',
+      'sources': [
+        'wrist_lib_test.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gtest',
+        'wrist_loop',
+        'wrist_lib',
+        '<(AOS)/common/common.gyp:queue_testutils',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+      ],
+    },
+    {
+      'target_name': 'wrist',
+      'type': 'executable',
+      'sources': [
+        'wrist_main.cc',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        'wrist_lib',
+        'wrist_loop',
+      ],
+    },
+  ],
+}
diff --git a/frc971/control_loops/wrist/wrist.h b/frc971/control_loops/wrist/wrist.h
new file mode 100644
index 0000000..a3bad80
--- /dev/null
+++ b/frc971/control_loops/wrist/wrist.h
@@ -0,0 +1,63 @@
+#ifndef FRC971_CONTROL_LOOPS_WRIST_WRIST_H_
+#define FRC971_CONTROL_LOOPS_WRIST_WRIST_H_
+
+#include <memory>
+
+#include "aos/common/control_loop/ControlLoop.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+#include "frc971/control_loops/wrist/wrist_motor.q.h"
+#include "frc971/control_loops/wrist/wrist_motor_plant.h"
+#include "frc971/control_loops/wrist/unaugmented_wrist_motor_plant.h"
+
+#include "frc971/control_loops/zeroed_joint.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+class WristTest_NoWindupPositive_Test;
+class WristTest_NoWindupNegative_Test;
+};
+
+class WristMotor
+    : public aos::control_loops::ControlLoop<control_loops::WristLoop> {
+ public:
+  explicit WristMotor(
+      control_loops::WristLoop *my_wrist = &control_loops::wrist);
+
+  // True if the goal was moved to avoid goal windup.
+  bool capped_goal() const { return zeroed_joint_.capped_goal(); }
+
+  // True if the wrist is zeroing.
+  bool is_zeroing() const { return zeroed_joint_.is_zeroing(); }
+
+  // True if the wrist is zeroing.
+  bool is_moving_off() const { return zeroed_joint_.is_moving_off(); }
+
+  // True if the state machine is uninitialized.
+  bool is_uninitialized() const { return zeroed_joint_.is_uninitialized(); }
+
+  // True if the state machine is ready.
+  bool is_ready() const { return zeroed_joint_.is_ready(); }
+
+ protected:
+  virtual void RunIteration(
+      const ::aos::control_loops::Goal *goal,
+      const control_loops::WristLoop::Position *position,
+      ::aos::control_loops::Output *output,
+      ::aos::control_loops::Status *status);
+
+ private:
+  // Friend the test classes for acces to the internal state.
+  friend class testing::WristTest_NoWindupPositive_Test;
+  friend class testing::WristTest_NoWindupNegative_Test;
+
+  // The zeroed joint to use.
+  ZeroedJoint<1> zeroed_joint_;
+
+  DISALLOW_COPY_AND_ASSIGN(WristMotor);
+};
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_WRIST_WRIST_H_
diff --git a/frc971/control_loops/wrist/wrist_lib_test.cc b/frc971/control_loops/wrist/wrist_lib_test.cc
new file mode 100644
index 0000000..7d248ce
--- /dev/null
+++ b/frc971/control_loops/wrist/wrist_lib_test.cc
@@ -0,0 +1,335 @@
+#include <unistd.h>
+
+#include <memory>
+
+#include "gtest/gtest.h"
+#include "aos/common/queue.h"
+#include "aos/common/queue_testutils.h"
+#include "frc971/control_loops/wrist/wrist_motor.q.h"
+#include "frc971/control_loops/wrist/wrist.h"
+#include "frc971/constants.h"
+
+
+using ::aos::time::Time;
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+
+
+// Class which simulates the wrist and sends out queue messages containing the
+// position.
+class WristMotorSimulation {
+ public:
+  // Constructs a motor simulation.  initial_position is the inital angle of the
+  // wrist, which will be treated as 0 by the encoder.
+  WristMotorSimulation(double initial_position)
+      : wrist_plant_(new StateFeedbackPlant<2, 1, 1>(MakeRawWristPlant())),
+        my_wrist_loop_(".frc971.control_loops.wrist",
+                       0x1a7b7094, ".frc971.control_loops.wrist.goal",
+                       ".frc971.control_loops.wrist.position",
+                       ".frc971.control_loops.wrist.output",
+                       ".frc971.control_loops.wrist.status") {
+    Reinitialize(initial_position);
+  }
+
+  // Resets the plant so that it starts at initial_position.
+  void Reinitialize(double initial_position) {
+    initial_position_ = initial_position;
+    wrist_plant_->X(0, 0) = initial_position_;
+    wrist_plant_->X(1, 0) = 0.0;
+    wrist_plant_->Y = wrist_plant_->C() * wrist_plant_->X;
+    last_position_ = wrist_plant_->Y(0, 0);
+    calibration_value_ = 0.0;
+    last_voltage_ = 0.0;
+  }
+
+  // Returns the absolute angle of the wrist.
+  double GetAbsolutePosition() const {
+    return wrist_plant_->Y(0, 0);
+  }
+
+  // Returns the adjusted angle of the wrist.
+  double GetPosition() const {
+    return GetAbsolutePosition() - initial_position_;
+  }
+
+  // Sends out the position queue messages.
+  void SendPositionMessage() {
+    const double angle = GetPosition();
+
+    ::aos::ScopedMessagePtr<control_loops::WristLoop::Position> position =
+        my_wrist_loop_.position.MakeMessage();
+    position->pos = angle;
+
+    // Signal that the hall effect sensor has been triggered if it is within
+    // the correct range.
+    double abs_position = GetAbsolutePosition();
+    if (abs_position >= constants::GetValues().wrist_hall_effect_start_angle &&
+        abs_position <= constants::GetValues().wrist_hall_effect_stop_angle) {
+      position->hall_effect = true;
+    } else {
+      position->hall_effect = false;
+    }
+
+    // Only set calibration if it changed last cycle.  Calibration starts out
+    // with a value of 0.
+    if ((last_position_ <
+             constants::GetValues().wrist_hall_effect_start_angle ||
+         last_position_ >
+             constants::GetValues().wrist_hall_effect_stop_angle) &&
+        position->hall_effect) {
+      calibration_value_ =
+          constants::GetValues().wrist_hall_effect_start_angle -
+          initial_position_;
+    }
+
+    position->calibration = calibration_value_;
+    position.Send();
+  }
+
+  // Simulates the wrist moving for one timestep.
+  void Simulate() {
+    last_position_ = wrist_plant_->Y(0, 0);
+    EXPECT_TRUE(my_wrist_loop_.output.FetchLatest());
+    wrist_plant_->U << last_voltage_;
+    wrist_plant_->Update();
+
+    EXPECT_GE(constants::GetValues().wrist_upper_physical_limit,
+              wrist_plant_->Y(0, 0));
+    EXPECT_LE(constants::GetValues().wrist_lower_physical_limit,
+              wrist_plant_->Y(0, 0));
+    last_voltage_ = my_wrist_loop_.output->voltage;
+  }
+
+  ::std::unique_ptr<StateFeedbackPlant<2, 1, 1>> wrist_plant_;
+ private:
+  WristLoop my_wrist_loop_;
+  double initial_position_;
+  double last_position_;
+  double calibration_value_;
+  double last_voltage_;
+};
+
+class WristTest : public ::testing::Test {
+ protected:
+  ::aos::common::testing::GlobalCoreInstance my_core;
+
+  // Create a new instance of the test queue so that it invalidates the queue
+  // that it points to.  Otherwise, we will have a pointer to shared memory that
+  // is no longer valid.
+  WristLoop my_wrist_loop_;
+
+  // Create a loop and simulation plant.
+  WristMotor wrist_motor_;
+  WristMotorSimulation wrist_motor_plant_;
+
+  WristTest() : my_wrist_loop_(".frc971.control_loops.wrist",
+                               0x1a7b7094, ".frc971.control_loops.wrist.goal",
+                               ".frc971.control_loops.wrist.position",
+                               ".frc971.control_loops.wrist.output",
+                               ".frc971.control_loops.wrist.status"),
+                wrist_motor_(&my_wrist_loop_),
+                wrist_motor_plant_(0.5) {
+    // Flush the robot state queue so we can use clean shared memory for this
+    // test.
+    ::aos::robot_state.Clear();
+    SendDSPacket(true);
+  }
+
+  void SendDSPacket(bool enabled) {
+    ::aos::robot_state.MakeWithBuilder().enabled(enabled)
+                                        .autonomous(false)
+                                        .team_id(971).Send();
+    ::aos::robot_state.FetchLatest();
+  }
+
+  void VerifyNearGoal() {
+    my_wrist_loop_.goal.FetchLatest();
+    my_wrist_loop_.position.FetchLatest();
+    EXPECT_NEAR(my_wrist_loop_.goal->goal,
+                wrist_motor_plant_.GetAbsolutePosition(),
+                1e-4);
+  }
+
+  virtual ~WristTest() {
+    ::aos::robot_state.Clear();
+  }
+};
+
+// Tests that the wrist zeros correctly and goes to a position.
+TEST_F(WristTest, ZerosCorrectly) {
+  my_wrist_loop_.goal.MakeWithBuilder().goal(0.1).Send();
+  for (int i = 0; i < 400; ++i) {
+    wrist_motor_plant_.SendPositionMessage();
+    wrist_motor_.Iterate();
+    wrist_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that the wrist zeros correctly starting on the hall effect sensor.
+TEST_F(WristTest, ZerosStartingOn) {
+  wrist_motor_plant_.Reinitialize(90 * M_PI / 180.0);
+
+  my_wrist_loop_.goal.MakeWithBuilder().goal(0.1).Send();
+  for (int i = 0; i < 500; ++i) {
+    wrist_motor_plant_.SendPositionMessage();
+    wrist_motor_.Iterate();
+    wrist_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that missing positions are correctly handled.
+TEST_F(WristTest, HandleMissingPosition) {
+  my_wrist_loop_.goal.MakeWithBuilder().goal(0.1).Send();
+  for (int i = 0; i < 400; ++i) {
+    if (i % 23) {
+      wrist_motor_plant_.SendPositionMessage();
+    }
+    wrist_motor_.Iterate();
+    wrist_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that loosing the encoder for a second triggers a re-zero.
+TEST_F(WristTest, RezeroWithMissingPos) {
+  my_wrist_loop_.goal.MakeWithBuilder().goal(0.1).Send();
+  for (int i = 0; i < 800; ++i) {
+    // After 3 seconds, simulate the encoder going missing.
+    // This should trigger a re-zero.  To make sure it works, change the goal as
+    // well.
+    if (i < 300 || i > 400) {
+      wrist_motor_plant_.SendPositionMessage();
+    } else {
+      if (i > 310) {
+        // Should be re-zeroing now.
+        EXPECT_TRUE(wrist_motor_.is_uninitialized());
+      }
+      my_wrist_loop_.goal.MakeWithBuilder().goal(0.2).Send();
+    }
+    if (i == 410) {
+      EXPECT_TRUE(wrist_motor_.is_zeroing());
+    }
+
+    wrist_motor_.Iterate();
+    wrist_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+}
+
+// Tests that disabling while zeroing sends the state machine into the
+// uninitialized state.
+TEST_F(WristTest, DisableGoesUninitialized) {
+  my_wrist_loop_.goal.MakeWithBuilder().goal(0.1).Send();
+  for (int i = 0; i < 800; ++i) {
+    wrist_motor_plant_.SendPositionMessage();
+    // After 0.5 seconds, disable the robot.
+    if (i > 50 && i < 200) {
+      SendDSPacket(false);
+      if (i > 100) {
+        // Give the loop a couple cycled to get the message and then verify that
+        // it is in the correct state.
+        EXPECT_TRUE(wrist_motor_.is_uninitialized());
+        // When disabled, we should be applying 0 power.
+        EXPECT_TRUE(my_wrist_loop_.output.FetchLatest());
+        EXPECT_EQ(0, my_wrist_loop_.output->voltage);
+      }
+    } else {
+      SendDSPacket(true);
+    }
+    if (i == 202) {
+      // Verify that we are zeroing after the bot gets enabled again.
+      EXPECT_TRUE(wrist_motor_.is_zeroing());
+    }
+
+    wrist_motor_.Iterate();
+    wrist_motor_plant_.Simulate();
+  }
+  VerifyNearGoal();
+}
+
+// Tests that the wrist can't get too far away from the zeroing position if the
+// zeroing position is saturating the goal.
+TEST_F(WristTest, NoWindupNegative) {
+  int capped_count = 0;
+  double saved_zeroing_position = 0;
+  my_wrist_loop_.goal.MakeWithBuilder().goal(0.1).Send();
+  for (int i = 0; i < 500; ++i) {
+    wrist_motor_plant_.SendPositionMessage();
+    if (i == 50) {
+      EXPECT_TRUE(wrist_motor_.is_zeroing());
+      // Move the zeroing position far away and verify that it gets moved back.
+      saved_zeroing_position = wrist_motor_.zeroed_joint_.zeroing_position_;
+      wrist_motor_.zeroed_joint_.zeroing_position_ = -100.0;
+    } else if (i == 51) {
+      EXPECT_TRUE(wrist_motor_.is_zeroing());
+      EXPECT_NEAR(saved_zeroing_position,
+                  wrist_motor_.zeroed_joint_.zeroing_position_, 0.4);
+    }
+    if (!wrist_motor_.is_ready()) {
+      if (wrist_motor_.capped_goal()) {
+        ++capped_count;
+        // The cycle after we kick the zero position is the only cycle during
+        // which we should expect to see a high uncapped power during zeroing.
+        ASSERT_LT(5, ::std::abs(wrist_motor_.zeroed_joint_.U_uncapped()));
+      } else {
+        ASSERT_GT(5, ::std::abs(wrist_motor_.zeroed_joint_.U_uncapped()));
+      }
+    }
+
+    wrist_motor_.Iterate();
+    wrist_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+  EXPECT_GT(3, capped_count);
+}
+
+// Tests that the wrist can't get too far away from the zeroing position if the
+// zeroing position is saturating the goal.
+TEST_F(WristTest, NoWindupPositive) {
+  int capped_count = 0;
+  double saved_zeroing_position = 0;
+  my_wrist_loop_.goal.MakeWithBuilder().goal(0.1).Send();
+  for (int i = 0; i < 500; ++i) {
+    wrist_motor_plant_.SendPositionMessage();
+    if (i == 50) {
+      EXPECT_TRUE(wrist_motor_.is_zeroing());
+      // Move the zeroing position far away and verify that it gets moved back.
+      saved_zeroing_position = wrist_motor_.zeroed_joint_.zeroing_position_;
+      wrist_motor_.zeroed_joint_.zeroing_position_ = 100.0;
+    } else {
+      if (i == 51) {
+        EXPECT_TRUE(wrist_motor_.is_zeroing());
+        EXPECT_NEAR(saved_zeroing_position, wrist_motor_.zeroed_joint_.zeroing_position_, 0.4);
+      }
+    }
+    if (!wrist_motor_.is_ready()) {
+      if (wrist_motor_.capped_goal()) {
+        ++capped_count;
+        // The cycle after we kick the zero position is the only cycle during
+        // which we should expect to see a high uncapped power during zeroing.
+        EXPECT_LT(5, ::std::abs(wrist_motor_.zeroed_joint_.U_uncapped()));
+      } else {
+        EXPECT_GT(5, ::std::abs(wrist_motor_.zeroed_joint_.U_uncapped()));
+      }
+    }
+
+    wrist_motor_.Iterate();
+    wrist_motor_plant_.Simulate();
+    SendDSPacket(true);
+  }
+  VerifyNearGoal();
+  EXPECT_GT(3, capped_count);
+}
+
+}  // namespace testing
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/wrist/wrist_main.cc b/frc971/control_loops/wrist/wrist_main.cc
new file mode 100644
index 0000000..0aeec42
--- /dev/null
+++ b/frc971/control_loops/wrist/wrist_main.cc
@@ -0,0 +1,11 @@
+#include "frc971/control_loops/wrist/wrist.h"
+
+#include "aos/atom_code/init.h"
+
+int main() {
+  ::aos::Init();
+  frc971::control_loops::WristMotor wrist;
+  wrist.Run();
+  ::aos::Cleanup();
+  return 0;
+}
diff --git a/frc971/control_loops/wrist/wrist_motor.q b/frc971/control_loops/wrist/wrist_motor.q
new file mode 100644
index 0000000..3dbeb53
--- /dev/null
+++ b/frc971/control_loops/wrist/wrist_motor.q
@@ -0,0 +1,21 @@
+package frc971.control_loops;
+
+import "aos/common/control_loop/control_loops.q";
+
+queue_group WristLoop {
+  implements aos.control_loops.ControlLoop;
+
+  message Position {
+    double pos;
+    bool hall_effect;
+    // The exact pos when hall_effect last changed
+    double calibration;
+  };
+
+  queue aos.control_loops.Goal goal;
+  queue Position position;
+  queue aos.control_loops.Output output;
+  queue aos.control_loops.Status status;
+};
+
+queue_group WristLoop wrist;
diff --git a/frc971/control_loops/wrist/wrist_motor_plant.cc b/frc971/control_loops/wrist/wrist_motor_plant.cc
new file mode 100644
index 0000000..64146d8
--- /dev/null
+++ b/frc971/control_loops/wrist/wrist_motor_plant.cc
@@ -0,0 +1,47 @@
+#include "frc971/control_loops/wrist/wrist_motor_plant.h"
+
+#include <vector>
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<3, 1, 1> MakeWristPlantCoefficients() {
+  Eigen::Matrix<double, 3, 3> A;
+  A << 1.0, 0.00904786878843, 0.000326582411818, 0.0, 0.815818233346, 0.0631746179893, 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 3, 1> B;
+  B << 0.0, 0.0, 1.0;
+  Eigen::Matrix<double, 1, 3> C;
+  C << 1.0, 0.0, 0.0;
+  Eigen::Matrix<double, 1, 1> D;
+  D << 0.0;
+  Eigen::Matrix<double, 1, 1> U_max;
+  U_max << 12.0;
+  Eigen::Matrix<double, 1, 1> U_min;
+  U_min << -12.0;
+  return StateFeedbackPlantCoefficients<3, 1, 1>(A, B, C, D, U_max, U_min);
+}
+
+StateFeedbackController<3, 1, 1> MakeWristController() {
+  Eigen::Matrix<double, 3, 1> L;
+  L << 1.81581823335, 78.6334534274, 142.868137351;
+  Eigen::Matrix<double, 1, 3> K;
+  K << 92.6004807973, 4.38063492858, 1.11581823335;
+  return StateFeedbackController<3, 1, 1>(L, K, MakeWristPlantCoefficients());
+}
+
+StateFeedbackPlant<3, 1, 1> MakeWristPlant() {
+  ::std::vector<StateFeedbackPlantCoefficients<3, 1, 1> *> plants(1);
+  plants[0] = new StateFeedbackPlantCoefficients<3, 1, 1>(MakeWristPlantCoefficients());
+  return StateFeedbackPlant<3, 1, 1>(plants);
+}
+
+StateFeedbackLoop<3, 1, 1> MakeWristLoop() {
+  ::std::vector<StateFeedbackController<3, 1, 1> *> controllers(1);
+  controllers[0] = new StateFeedbackController<3, 1, 1>(MakeWristController());
+  return StateFeedbackLoop<3, 1, 1>(controllers);
+}
+
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/wrist/wrist_motor_plant.h b/frc971/control_loops/wrist/wrist_motor_plant.h
new file mode 100644
index 0000000..a40ffe5
--- /dev/null
+++ b/frc971/control_loops/wrist/wrist_motor_plant.h
@@ -0,0 +1,20 @@
+#ifndef FRC971_CONTROL_LOOPS_WRIST_WRIST_MOTOR_PLANT_H_
+#define FRC971_CONTROL_LOOPS_WRIST_WRIST_MOTOR_PLANT_H_
+
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+
+StateFeedbackPlantCoefficients<3, 1, 1> MakeWristPlantCoefficients();
+
+StateFeedbackController<3, 1, 1> MakeWristController();
+
+StateFeedbackPlant<3, 1, 1> MakeWristPlant();
+
+StateFeedbackLoop<3, 1, 1> MakeWristLoop();
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_WRIST_WRIST_MOTOR_PLANT_H_
diff --git a/frc971/control_loops/zeroed_joint.h b/frc971/control_loops/zeroed_joint.h
new file mode 100644
index 0000000..26dfc91
--- /dev/null
+++ b/frc971/control_loops/zeroed_joint.h
@@ -0,0 +1,457 @@
+#ifndef FRC971_CONTROL_LOOPS_ZEROED_JOINT_H_
+#define FRC971_CONTROL_LOOPS_ZEROED_JOINT_H_
+
+#include <memory>
+
+#include "aos/common/control_loop/ControlLoop.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace testing {
+class WristTest_NoWindupPositive_Test;
+class WristTest_NoWindupNegative_Test;
+};
+
+// Note: Everything in this file assumes that there is a 1 cycle delay between
+// power being requested and it showing up at the motor.  It assumes that
+// X_hat(2, 1) is the voltage being applied as well.  It will go unstable if
+// that isn't true.
+
+template<int kNumZeroSensors>
+class ZeroedJoint;
+
+// This class implements the CapU function correctly given all the extra
+// information that we know about from the wrist motor.
+template<int kNumZeroSensors>
+class ZeroedStateFeedbackLoop : public StateFeedbackLoop<3, 1, 1> {
+ public:
+  ZeroedStateFeedbackLoop(StateFeedbackLoop<3, 1, 1> loop,
+                          ZeroedJoint<kNumZeroSensors> *zeroed_joint)
+      : StateFeedbackLoop<3, 1, 1>(loop),
+        zeroed_joint_(zeroed_joint),
+        voltage_(0.0),
+        last_voltage_(0.0) {
+  }
+
+  // Caps U, but this time respects the state of the wrist as well.
+  virtual void CapU();
+
+  // Returns the accumulated voltage.
+  double voltage() const { return voltage_; }
+
+  // Returns the uncapped voltage.
+  double uncapped_voltage() const { return uncapped_voltage_; }
+
+  // Zeros the accumulator.
+  void ZeroPower() { voltage_ = 0.0; }
+ private:
+  ZeroedJoint<kNumZeroSensors> *zeroed_joint_;
+
+  // The accumulated voltage to apply to the motor.
+  double voltage_;
+  double last_voltage_;
+  double uncapped_voltage_;
+};
+
+template<int kNumZeroSensors>
+void ZeroedStateFeedbackLoop<kNumZeroSensors>::CapU() {
+  const double old_voltage = voltage_;
+  voltage_ += U(0, 0);
+
+  uncapped_voltage_ = voltage_;
+
+  // Do all our computations with the voltage, and then compute what the delta
+  // is to make that happen.
+  if (zeroed_joint_->state_ == ZeroedJoint<kNumZeroSensors>::READY) {
+    if (Y(0, 0) >= zeroed_joint_->config_data_.upper_limit) {
+      voltage_ = std::min(0.0, voltage_);
+    }
+    if (Y(0, 0) <= zeroed_joint_->config_data_.lower_limit) {
+      voltage_ = std::max(0.0, voltage_);
+    }
+  }
+
+  const bool is_ready =
+      zeroed_joint_->state_ == ZeroedJoint<kNumZeroSensors>::READY;
+  double limit = is_ready ?
+      12.0 : zeroed_joint_->config_data_.max_zeroing_voltage;
+
+  // Make sure that reality and the observer can't get too far off.  There is a
+  // delay by one cycle between the applied voltage and X_hat(2, 0), so compare
+  // against last cycle's voltage.
+  if (X_hat(2, 0) > last_voltage_ + 2.0) {
+    //X_hat(2, 0) = last_voltage_ + 2.0;
+    voltage_ -= X_hat(2, 0) - (last_voltage_ + 2.0);
+    LOG(DEBUG, "X_hat(2, 0) = %f\n", X_hat(2, 0));
+  } else if (X_hat(2, 0) < last_voltage_ -2.0) {
+    //X_hat(2, 0) = last_voltage_ - 2.0;
+    voltage_ += X_hat(2, 0) - (last_voltage_ - 2.0);
+    LOG(DEBUG, "X_hat(2, 0) = %f\n", X_hat(2, 0));
+  }
+
+  voltage_ = std::min(limit, voltage_);
+  voltage_ = std::max(-limit, voltage_);
+  U(0, 0) = voltage_ - old_voltage;
+  LOG(DEBUG, "abc %f\n", X_hat(2, 0) - voltage_);
+  LOG(DEBUG, "error %f\n", X_hat(0, 0) - R(0, 0));
+
+  last_voltage_ = voltage_;
+}
+
+
+// Class to zero and control a joint with any number of zeroing sensors with a
+// state feedback controller.
+template<int kNumZeroSensors>
+class ZeroedJoint {
+ public:
+  // Sturcture to hold the hardware configuration information.
+  struct ConfigurationData {
+    // Angle at the lower hardware limit.
+    double lower_limit;
+    // Angle at the upper hardware limit.
+    double upper_limit;
+    // Speed (and direction) to move while zeroing.
+    double zeroing_speed;
+    // Speed (and direction) to move while moving off the sensor.
+    double zeroing_off_speed;
+    // Maximum voltage to apply when zeroing.
+    double max_zeroing_voltage;
+    // Deadband voltage.
+    double deadband_voltage;
+    // Angles where we see a positive edge from the hall effect sensors.
+    double hall_effect_start_angle[kNumZeroSensors];
+  };
+
+  // Current position data for the encoder and hall effect information.
+  struct PositionData {
+    // Current encoder position.
+    double position;
+    // Array of hall effect values.
+    bool hall_effects[kNumZeroSensors];
+    // Array of the last positive edge position for the sensors.
+    double hall_effect_positions[kNumZeroSensors];
+  };
+
+  ZeroedJoint(StateFeedbackLoop<3, 1, 1> loop)
+      : loop_(new ZeroedStateFeedbackLoop<kNumZeroSensors>(loop, this)),
+        last_good_time_(0, 0),
+        state_(UNINITIALIZED),
+        error_count_(0),
+        zero_offset_(0.0),
+        capped_goal_(false) {
+  }
+
+  // Copies the provided configuration data locally.
+  void set_config_data(const ConfigurationData &config_data) {
+    config_data_ = config_data;
+  }
+
+  // Clips the goal to be inside the limits and returns the clipped goal.
+  // Requires the constants to have already been fetched.
+  double ClipGoal(double goal) const {
+    return ::std::min(config_data_.upper_limit,
+                      std::max(config_data_.lower_limit, goal));
+  }
+
+  // Updates the loop and state machine.
+  // position is null if the position data is stale, output_enabled is true if
+  // the output will actually go to the motors, and goal_angle and goal_velocity
+  // are the goal position and velocities.
+  double Update(const ZeroedJoint<kNumZeroSensors>::PositionData *position,
+                bool output_enabled,
+                double goal_angle, double goal_velocity);
+
+  // True if the code is zeroing.
+  bool is_zeroing() const { return state_ == ZEROING; }
+
+  // True if the code is moving off the hall effect.
+  bool is_moving_off() const { return state_ == MOVING_OFF; }
+
+  // True if the state machine is uninitialized.
+  bool is_uninitialized() const { return state_ == UNINITIALIZED; }
+
+  // True if the state machine is ready.
+  bool is_ready() const { return state_ == READY; }
+
+  // Returns the uncapped voltage.
+  double U_uncapped() const { return loop_->U_uncapped(0, 0); }
+
+  // True if the goal was moved to avoid goal windup.
+  bool capped_goal() const { return capped_goal_; }
+
+  // Timestamp
+  static const double dt;
+
+  double absolute_position() const { return loop_->X_hat(0, 0); }
+
+ private:
+  friend class ZeroedStateFeedbackLoop<kNumZeroSensors>;
+  // Friend the wrist test cases so that they can simulate windeup.
+  friend class testing::WristTest_NoWindupPositive_Test;
+  friend class testing::WristTest_NoWindupNegative_Test;
+
+  static const ::aos::time::Time kRezeroTime;
+
+  // The state feedback control loop to talk to.
+  ::std::unique_ptr<ZeroedStateFeedbackLoop<kNumZeroSensors>> loop_;
+
+  ConfigurationData config_data_;
+
+  ::aos::time::Time last_good_time_;
+
+  // Returns the index of the first active sensor, or -1 if none are active.
+  int ActiveSensorIndex(
+      const ZeroedJoint<kNumZeroSensors>::PositionData *position) {
+    if (!position) {
+      return -1;
+    }
+    int active_index = -1;
+    for (int i = 0; i < kNumZeroSensors; ++i) {
+      if (position->hall_effects[i]) {
+        if (active_index != -1) {
+          LOG(ERROR, "More than one hall effect sensor is active\n");
+        } else {
+          active_index = i;
+        }
+      }
+    }
+    return active_index;
+  }
+  // Returns true if any of the sensors are active.
+  bool AnySensorsActive(
+      const ZeroedJoint<kNumZeroSensors>::PositionData *position) {
+    return ActiveSensorIndex(position) != -1;
+  }
+
+  // Enum to store the state of the internal zeroing state machine.
+  enum State {
+    UNINITIALIZED,
+    MOVING_OFF,
+    ZEROING,
+    READY,
+    ESTOP
+  };
+
+  // Internal state for zeroing.
+  State state_;
+
+  // Missed position packet count.
+  int error_count_;
+  // Offset from the raw encoder value to the absolute angle.
+  double zero_offset_;
+  // Position that gets incremented when zeroing the wrist to slowly move it to
+  // the hall effect sensor.
+  double zeroing_position_;
+  // Last position at which the hall effect sensor was off.
+  double last_off_position_;
+
+  // True if the zeroing goal was capped during this cycle.
+  bool capped_goal_;
+
+  // Returns true if number is between first and second inclusive.
+  bool is_between(double first, double second, double number) {
+    if ((number >= first || number >= second) &&
+        (number <= first || number <= second)) {
+      return true;
+    }
+    return false;
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(ZeroedJoint);
+};
+
+template <int kNumZeroSensors>
+const ::aos::time::Time ZeroedJoint<kNumZeroSensors>::kRezeroTime =
+    ::aos::time::Time::InSeconds(2);
+
+template <int kNumZeroSensors>
+/*static*/ const double ZeroedJoint<kNumZeroSensors>::dt = 0.01;
+
+// Updates the zeroed joint controller and state machine.
+template <int kNumZeroSensors>
+double ZeroedJoint<kNumZeroSensors>::Update(
+    const ZeroedJoint<kNumZeroSensors>::PositionData *position,
+    bool output_enabled,
+    double goal_angle, double goal_velocity) {
+  // Uninitialize the bot if too many cycles pass without an encoder.
+  if (position == NULL) {
+    LOG(WARNING, "no new pos given\n");
+    error_count_++;
+  }
+  if (error_count_ >= 4) {
+    output_enabled = false;
+    LOG(WARNING, "err_count is %d so disabling\n", error_count_);
+
+    if ((::aos::time::Time::Now() - last_good_time_) > kRezeroTime) {
+      LOG(WARNING, "err_count is %d (or 1st time) so forcing a re-zero\n",
+          error_count_);
+      state_ = UNINITIALIZED;
+      loop_->Reset();
+    }
+  }
+  if (position != NULL) {
+    last_good_time_ = ::aos::time::Time::Now();
+    error_count_ = 0;
+  }
+
+  // Compute the absolute position of the wrist.
+  double absolute_position;
+  if (position) {
+    absolute_position = position->position;
+    if (state_ == READY) {
+      absolute_position -= zero_offset_;
+    }
+    loop_->Y << absolute_position;
+    if (!AnySensorsActive(position)) {
+      last_off_position_ = position->position;
+    }
+  } else {
+    // Dead recon for now.
+    absolute_position = loop_->X_hat(0, 0);
+  }
+
+  switch (state_) {
+    case UNINITIALIZED:
+      LOG(DEBUG, "UNINITIALIZED\n");
+      if (position) {
+        // Reset the zeroing goal.
+        zeroing_position_ = absolute_position;
+        // Clear the observer state.
+        loop_->X_hat << absolute_position, 0.0, 0.0;
+        loop_->ZeroPower();
+        // Set the goal to here to make it so it doesn't move when disabled.
+        loop_->R = loop_->X_hat;
+        // Only progress if we are enabled.
+        if (::aos::robot_state->enabled) {
+          if (AnySensorsActive(position)) {
+            state_ = MOVING_OFF;
+          } else {
+            state_ = ZEROING;
+          }
+        }
+      }
+      break;
+    case MOVING_OFF:
+      LOG(DEBUG, "MOVING_OFF\n");
+      {
+        // Move off the hall effect sensor.
+        if (!::aos::robot_state->enabled) {
+          // Start over if disabled.
+          state_ = UNINITIALIZED;
+        } else if (position && !AnySensorsActive(position)) {
+          // We are now off the sensor.  Time to zero now.
+          state_ = ZEROING;
+        } else {
+          // Slowly creep off the sensor.
+          zeroing_position_ -= config_data_.zeroing_off_speed * dt;
+          loop_->R << zeroing_position_, -config_data_.zeroing_off_speed, 0.0;
+          break;
+        }
+      }
+    case ZEROING:
+      LOG(DEBUG, "ZEROING\n");
+      {
+        int active_sensor_index = ActiveSensorIndex(position);
+        if (!::aos::robot_state->enabled) {
+          // Start over if disabled.
+          state_ = UNINITIALIZED;
+        } else if (position && active_sensor_index != -1) {
+          state_ = READY;
+          // Verify that the calibration number is between the last off position
+          // and the current on position.  If this is not true, move off and try
+          // again.
+          const double calibration =
+              position->hall_effect_positions[active_sensor_index];
+          if (!is_between(last_off_position_, position->position, 
+                          calibration)) {
+            LOG(ERROR, "Got a bogus calibration number.  Trying again.\n");
+            LOG(ERROR,
+                "Last off position was %f, current is %f, calibration is %f\n",
+                last_off_position_, position->position,
+                position->hall_effect_positions[active_sensor_index]);
+            state_ = MOVING_OFF;
+          } else {
+            // Save the zero, and then offset the observer to deal with the
+            // phantom step change.
+            const double old_zero_offset = zero_offset_;
+            zero_offset_ =
+                position->hall_effect_positions[active_sensor_index] -
+                config_data_.hall_effect_start_angle[active_sensor_index];
+            loop_->X_hat(0, 0) += old_zero_offset - zero_offset_;
+            loop_->Y(0, 0) += old_zero_offset - zero_offset_;
+          }
+        } else {
+          // Slowly creep towards the sensor.
+          zeroing_position_ += config_data_.zeroing_speed * dt;
+          loop_->R << zeroing_position_, config_data_.zeroing_speed, 0.0;
+        }
+        break;
+      }
+
+    case READY:
+      LOG(DEBUG, "READY\n");
+      {
+        const double limited_goal = ClipGoal(goal_angle);
+        loop_->R << limited_goal, goal_velocity, 0.0;
+        break;
+      }
+
+    case ESTOP:
+      LOG(DEBUG, "ESTOP\n");
+      LOG(WARNING, "have already given up\n");
+      return 0.0;
+  }
+
+  // Update the observer.
+  loop_->Update(position != NULL, !output_enabled);
+
+  LOG(DEBUG, "X_hat={%f, %f, %f}\n",
+      loop_->X_hat(0, 0), loop_->X_hat(1, 0), loop_->X_hat(2, 0));
+
+  capped_goal_ = false;
+  // Verify that the zeroing goal hasn't run away.
+  switch (state_) {
+    case UNINITIALIZED:
+    case READY:
+    case ESTOP:
+      // Not zeroing.  No worries.
+      break;
+    case MOVING_OFF:
+    case ZEROING:
+      // Check if we have cliped and adjust the goal.
+      if (loop_->uncapped_voltage() > config_data_.max_zeroing_voltage) {
+        double dx = (loop_->uncapped_voltage() -
+                     config_data_.max_zeroing_voltage) / loop_->K(0, 0);
+        zeroing_position_ -= dx;
+        capped_goal_ = true;
+      } else if(loop_->uncapped_voltage() < -config_data_.max_zeroing_voltage) {
+        double dx = (loop_->uncapped_voltage() +
+                     config_data_.max_zeroing_voltage) / loop_->K(0, 0);
+        zeroing_position_ -= dx;
+        capped_goal_ = true;
+      }
+      break;
+  }
+  if (output_enabled) {
+    double voltage = loop_->voltage();
+    if (voltage > 0) {
+      voltage += config_data_.deadband_voltage;
+    } else if (voltage < 0) {
+      voltage -= config_data_.deadband_voltage;
+    }
+    if (voltage > 12.0) {
+      voltage = 12.0;
+    } else if (voltage < -12.0) {
+      voltage = -12.0;
+    }
+    return voltage;
+  } else {
+    return 0.0;
+  }
+}
+
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_ZEROED_JOINT_H_
diff --git a/frc971/crio/build.sh b/frc971/crio/build.sh
index ec04978..9e77e89 100755
--- a/frc971/crio/build.sh
+++ b/frc971/crio/build.sh
@@ -1,3 +1,5 @@
 #!/bin/bash
 
-../../aos/build/build.sh crio crio.gyp no $1
+cd $(dirname $0)
+
+../../aos/build/build.sh crio crio.gyp no "$@"
diff --git a/frc971/crio/crio.gyp b/frc971/crio/crio.gyp
index 236ec14..d544f71 100644
--- a/frc971/crio/crio.gyp
+++ b/frc971/crio/crio.gyp
@@ -1,53 +1,23 @@
 {
   'targets': [
     {
-# The WPILib code that we've modified.
-      'target_name': 'WPILib_changes',
+      'target_name': 'dumb_main',
       'type': 'static_library',
       'sources': [
-        '<(AOS)/externals/WPILib/WPILib/DriverStationLCD.cpp',
-        '<(AOS)/externals/WPILib/WPILib/Synchronized.cpp',
-        '<(AOS)/externals/WPILib/WPILib/DriverStation.cpp',
-        '<(AOS)/externals/WPILib/WPILib/Notifier.cpp',
-        '<(AOS)/externals/WPILib/WPILib/MotorSafetyHelper.cpp',
-        '<(AOS)/externals/WPILib/WPILib/Resource.cpp',
-        '<(AOS)/externals/WPILib/WPILib/SolenoidBase.cpp',
+        'dumb_main.cc',
       ],
       'dependencies': [
         '<(EXTERNALS):WPILib',
-      ],
-      'cflags!': ['-Werror'],
-    },
-    {
-      'target_name': 'user_program',
-      'type': 'static_library',
-      'sources': [
-        'main.cc',
-      ],
-      'dependencies': [
-        '../input/input.gyp:SensorReader',
-        '../input/input.gyp:SensorWriter',
-        '../output/output.gyp:MotorWriter',
-        '../output/output.gyp:SensorSender',
-        'WPILib_changes',
-        '<(EXTERNALS):WPILib',
-        '<(AOS)/common/messages/messages.gyp:aos_queues',
+        '<(AOS)/crio/crio.gyp:ip',
+        '<(AOS)/common/common.gyp:util',
       ],
     },
     {
       'target_name': 'FRC_UserProgram',
       'type': 'shared_library',
       'dependencies': [
-        'user_program'
-      ],
-    },
-    {
-      'target_name': 'FRC_UserProgram_WithTests',
-      'type': 'shared_library',
-      'dependencies': [
-        'user_program',
-        # For testing.
-        '<(AOS)/build/aos_all.gyp:Crio',
+        '<(EXTERNALS):libgcc-4.5.2',
+        'dumb_main',
       ],
     },
   ],
diff --git a/frc971/crio/dumb_main.cc b/frc971/crio/dumb_main.cc
new file mode 100644
index 0000000..8cf0eb4
--- /dev/null
+++ b/frc971/crio/dumb_main.cc
@@ -0,0 +1,25 @@
+#include "WPILib/NetworkRobot/NetworkRobot.h"
+#include "WPILib/RobotBase.h"
+
+#include "aos/common/network_port.h"
+#include "aos/crio/ip.h"
+#include "aos/common/util.h"
+
+using ::aos::util::MakeIPAddress;
+using ::aos::util::GetOwnIPAddress;
+
+namespace frc971 {
+
+class MyRobot : public NetworkRobot {
+ public:
+  MyRobot() : NetworkRobot(static_cast<uint16_t>(::aos::NetworkPort::kMotors),
+                           ::MakeIPAddress(::GetOwnIPAddress(),
+                               ::aos::NetworkAddress::kAtom),
+                           static_cast<uint16_t>(::aos::NetworkPort::kDS),
+                           ::MakeIPAddress(::GetOwnIPAddress(),
+                               ::aos::NetworkAddress::kAtom)) {}
+};
+
+}  // namespace frc971
+
+START_ROBOT_CLASS(::frc971::MyRobot);
diff --git a/frc971/crio/main.cc b/frc971/crio/main.cc
deleted file mode 100644
index e814b97..0000000
--- a/frc971/crio/main.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "aos/crio/controls/ControlsManager.h"
-
-#include "aos/crio/motor_server/CRIOControlLoopRunner.h"
-
-namespace frc971 {
-
-class MyRobot : public ::aos::crio::ControlsManager {
- public:
-  virtual void RegisterControlLoops() {
-    //::aos::crio::CRIOControlLoopRunner::AddControlLoop(&shooter_);
-  }
-
- private:
-  //::frc971::control_loops::ShooterMotor shooter_;
-};
-
-}  // namespace frc971
-
-START_ROBOT_CLASS(::frc971::MyRobot);
diff --git a/frc971/frc971.gyp b/frc971/frc971.gyp
index ff43949..b6d842d 100644
--- a/frc971/frc971.gyp
+++ b/frc971/frc971.gyp
@@ -1,13 +1,20 @@
 {
   'targets': [
     {
-      'target_name': 'common',
+      'target_name': 'constants',
       'type': 'static_library',
       'sources': [
-        'constants.cpp',
+        'constants.cc',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/common/common.gyp:once',
+        '<(AOS)/common/network/network.gyp:team_number',
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
+        '<(DEPTH)/frc971/control_loops/drivetrain/drivetrain.gyp:polydrivetrain_plants',
+      ],
+      'export_dependent_settings': [
+        '<(DEPTH)/frc971/control_loops/control_loops.gyp:state_feedback_loop',
       ],
     }
   ],
diff --git a/frc971/input/AutoMode.act b/frc971/input/AutoMode.act
deleted file mode 100644
index b7b98c3..0000000
--- a/frc971/input/AutoMode.act
+++ /dev/null
@@ -1,7 +0,0 @@
-args automode_args {
-};
-status automode_status {
-};
-//has OnEnd;
-//has OnStart;
-priority 99;
diff --git a/frc971/input/AutoMode.cc b/frc971/input/AutoMode.cc
deleted file mode 100644
index 254d6b6..0000000
--- a/frc971/input/AutoMode.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "frc971/input/AutoMode.q.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "aos/common/control_loop/Timing.h"
-
-namespace frc971 {
-
-void AutoMode_t::DoAction() {
-  Sleep(10); // wait until it ends
-}
-
-} // namespace frc971
diff --git a/frc971/input/GyroReader.cc b/frc971/input/GyroReader.cc
deleted file mode 100644
index a6e1d00..0000000
--- a/frc971/input/GyroReader.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "aos/aos_core.h"
-
-#include "frc971/queues/GyroAngle.q.h"
-
-#define M_PI 3.14159265358979323846264338327
-
-using frc971::sensors::gyro;
-
-int main(){
-  aos::Init();
-  int fd = open("/dev/aschuh0", O_RDONLY);
-  int rate_limit = 0;
-  if (fd < 0) {
-    LOG(ERROR, "No Gyro found.\n");
-  } else {
-    LOG(INFO, "Gyro now connected\n");
-  }
-
-  while (true) {
-    int64_t gyro_value;
-    if (read(fd, (void *)&gyro_value, sizeof(gyro_value)) != sizeof(gyro_value)) {
-      LOG(ERROR, "Could not read gyro errno: %d\n", errno);
-      if (errno == ENODEV || errno == EBADF) {
-        close(fd);
-        while (1) {
-          usleep(1000);
-          fd = open("/dev/aschuh0", O_RDONLY);
-          if (fd > 0) {
-            LOG(INFO, "Found gyro again\n");
-            break;
-          }
-        }
-      }
-      continue;
-    }
-    rate_limit ++;
-    if (rate_limit > 10) {
-      LOG(DEBUG, "Gyro is %d\n", (int)(gyro_value / 16));
-      rate_limit = 0;
-    }
-    gyro.MakeWithBuilder().angle(gyro_value / 16.0 / 1000.0 / 180.0 * M_PI).Send();
-  }
-
-  aos::Cleanup();
-}
diff --git a/frc971/input/JoystickReader.cc b/frc971/input/JoystickReader.cc
index e0cfbac..b29e17d 100644
--- a/frc971/input/JoystickReader.cc
+++ b/frc971/input/JoystickReader.cc
@@ -3,51 +3,96 @@
 #include <unistd.h>
 #include <math.h>
 
-#include "aos/aos_core.h"
-#include "aos/atom_code/input/FRCComm.h"
-#include "aos/atom_code/input/JoystickInput.h"
+#include "aos/atom_code/init.h"
+#include "aos/atom_code/input/joystick_input.h"
+#include "aos/common/logging/logging.h"
 
-#include "frc971/input/AutoMode.q.h"
-#include "frc971/control_loops/DriveTrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
 #include "frc971/queues/GyroAngle.q.h"
 #include "frc971/queues/Piston.q.h"
+#include "frc971/control_loops/wrist/wrist_motor.q.h"
+#include "frc971/autonomous/auto.q.h"
+#include "frc971/control_loops/index/index_motor.q.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor.q.h"
+#include "frc971/queues/CameraTarget.q.h"
 
 using ::frc971::control_loops::drivetrain;
 using ::frc971::control_loops::shifters;
 using ::frc971::sensors::gyro;
+using ::frc971::control_loops::wrist;
+using ::frc971::control_loops::index_loop;
+using ::frc971::control_loops::shooter;
+using ::frc971::control_loops::angle_adjust;
+using ::frc971::control_loops::hangers;
+using ::frc971::vision::target_angle;
+
+using ::aos::input::driver_station::ButtonLocation;
+using ::aos::input::driver_station::JoystickAxis;
+using ::aos::input::driver_station::ControlBit;
 
 namespace frc971 {
+namespace input {
+namespace joysticks {
 
-class JoystickReader : public aos::JoystickInput {
+const ButtonLocation kDriveControlLoopEnable1(1, 7),
+                     kDriveControlLoopEnable2(1, 11);
+const JoystickAxis kSteeringWheel(1, 1), kDriveThrottle(2, 2);
+const ButtonLocation kShiftHigh(2, 1), kShiftLow(2, 3);
+const ButtonLocation kQuickTurn(1, 5);
+
+const ButtonLocation kLongShot(3, 5);
+const ButtonLocation kMediumShot(3, 3);
+const ButtonLocation kShortShot(3, 6);
+const ButtonLocation kPitShot1(2, 7), kPitShot2(2, 10);
+
+const ButtonLocation kWristDown(3, 8);
+
+const ButtonLocation kFire(3, 11);
+const ButtonLocation kIntake(3, 10);
+const ButtonLocation kForceFire(3, 12);
+const ButtonLocation kForceIndexUp(3, 9), kForceIndexDown(3, 7);
+const ButtonLocation kForceSpitOut(2, 11);
+
+const ButtonLocation kDeployHangers(3, 1);
+
+class Reader : public ::aos::input::JoystickInput {
  public:
-  JoystickReader() : aos::JoystickInput() {
+  static const bool kWristAlwaysDown = false;
+
+  Reader() {
     shifters.MakeWithBuilder().set(true).Send();
   }
 
-  virtual void RunIteration() {
+  virtual void RunIteration(const ::aos::input::driver_station::Data &data) {
     static bool is_high_gear = false;
+    static double angle_adjust_goal = 0.42;
 
-    if (Pressed(0, AUTONOMOUS)) {
-      if (PosEdge(0, ENABLED)){
+    if (data.GetControlBit(ControlBit::kAutonomous)) {
+      if (data.PosEdge(ControlBit::kEnabled)){
         LOG(INFO, "Starting auto mode\n");
-        AutoMode.Start();
-      }
-      if (NegEdge(0, ENABLED)) {
+        ::frc971::autonomous::autonomous.MakeWithBuilder()
+            .run_auto(true).Send();
+      } else if (data.NegEdge(ControlBit::kEnabled)) {
         LOG(INFO, "Stopping auto mode\n");
-        AutoMode.Stop();
+        ::frc971::autonomous::autonomous.MakeWithBuilder()
+            .run_auto(false).Send();
       }
     } else {  // teleop
       bool is_control_loop_driving = false;
       double left_goal = 0.0;
       double right_goal = 0.0;
-      const double wheel = control_data_.stick0Axis1 / 127.0;
-      const double throttle = -control_data_.stick1Axis2 / 127.0;
+      const double wheel = -data.GetAxis(kSteeringWheel);
+      const double throttle = -data.GetAxis(kDriveThrottle);
+      LOG(DEBUG, "wheel %f throttle %f\n", wheel, throttle);
       const double kThrottleGain = 1.0 / 2.5;
-      if (Pressed(0, 7) || Pressed(0, 11)) {
+      if (data.IsPressed(kDriveControlLoopEnable1) ||
+          data.IsPressed(kDriveControlLoopEnable2)) {
         static double distance = 0.0;
         static double angle = 0.0;
         static double filtered_goal_distance = 0.0;
-        if (PosEdge(0, 7) || PosEdge(0, 11)) {
+        if (data.PosEdge(kDriveControlLoopEnable1) ||
+            data.PosEdge(kDriveControlLoopEnable2)) {
           if (drivetrain.position.FetchLatest() && gyro.FetchLatest()) {
             distance = (drivetrain.position->left_encoder +
                         drivetrain.position->right_encoder) / 2.0
@@ -65,7 +110,8 @@
         const double kMaxVelocity = 0.6;
         if (goal_distance > kMaxVelocity * 0.02 + filtered_goal_distance) {
           filtered_goal_distance += kMaxVelocity * 0.02;
-        } else if (goal_distance < -kMaxVelocity * 0.02 + filtered_goal_distance) {
+        } else if (goal_distance < -kMaxVelocity * 0.02 +
+                   filtered_goal_distance) {
           filtered_goal_distance -= kMaxVelocity * 0.02;
         } else {
           filtered_goal_distance = goal_distance;
@@ -79,22 +125,138 @@
       if (!(drivetrain.goal.MakeWithBuilder()
                 .steering(wheel)
                 .throttle(throttle)
-                .highgear(is_high_gear).quickturn(Pressed(0, 5))
+                .highgear(is_high_gear).quickturn(data.IsPressed(kQuickTurn))
                 .control_loop_driving(is_control_loop_driving)
                 .left_goal(left_goal).right_goal(right_goal).Send())) {
         LOG(WARNING, "sending stick values failed\n");
       }
 
-      if (PosEdge(1, 1)) {
+      if (data.PosEdge(kShiftHigh)) {
         is_high_gear = false;
       }
-      if (PosEdge(1, 3)) {
+      if (data.PosEdge(kShiftLow)) {
         is_high_gear = true;
       }
+
+      // Whether we should change wrist positions to indicate that the hopper is
+      // clear.
+      bool hopper_clear = false;
+
+      // Where the wrist should be to pick up a frisbee.
+      // TODO(brians): Make these globally accessible and clean up auto.
+      static const double kWristPickup = -0.580;
+      static const double kWristNearGround = -0.4;
+      // Where the wrist gets stored when up.
+      // All the way up is 1.5.
+      static const double kWristUp = 1.43;
+      static const double kWristCleared = kWristUp - 0.2;
+      static double wrist_down_position = kWristPickup;
+      double wrist_up_position = kWristUp;
+      double wrist_pickup_position = data.IsPressed(kIntake) ?
+          kWristPickup : kWristNearGround;
+      if (index_loop.status.FetchLatest() || index_loop.status.get()) {
+        if (index_loop.status->hopper_disc_count >= 4) {
+          wrist_down_position = kWristNearGround;
+        } else {
+          wrist_down_position = wrist_pickup_position;
+        }
+        hopper_clear = index_loop.status->hopper_clear;
+      }
+
+      ::aos::ScopedMessagePtr<control_loops::ShooterLoop::Goal> shooter_goal =
+          shooter.goal.MakeMessage();
+      shooter_goal->velocity = 0;
+      if (data.IsPressed(kPitShot1) && data.IsPressed(kPitShot2)) {
+        shooter_goal->velocity = 131;
+        if (hopper_clear) wrist_up_position = kWristCleared;
+        angle_adjust_goal = 0.70;
+      } else if (data.IsPressed(kLongShot)) {
+#if 0
+        target_angle.FetchLatest();
+        if (target_angle.IsNewerThanMS(500)) {
+          shooter_goal->velocity = target_angle->shooter_speed;
+          angle_adjust_goal = target_angle->shooter_angle;
+          // TODO(brians): do the math right here
+          if (!hopper_clear) wrist_up_position = 0.70;
+        } else {
+          LOG(WARNING, "camera frame too old\n");
+          // Pretend like no button is pressed.
+        }
+#endif
+      } else if (data.IsPressed(kMediumShot)) {
+        // middle wheel on the back line (same as auto)
+        shooter_goal->velocity = 395;
+        if (!hopper_clear) wrist_up_position = 1.23 - 0.4;
+        angle_adjust_goal = 0.520;
+      } else if (data.IsPressed(kShortShot)) {
+        shooter_goal->velocity = 375;
+        if (hopper_clear) wrist_up_position = kWristCleared;
+        angle_adjust_goal = 0.671;
+      }
+      angle_adjust.goal.MakeWithBuilder().goal(angle_adjust_goal).Send();
+
+      wrist.goal.MakeWithBuilder()
+          .goal(data.IsPressed(kWristDown) ?
+                wrist_down_position :
+                wrist_up_position)
+          .Send();
+
+      ::aos::ScopedMessagePtr<control_loops::IndexLoop::Goal> index_goal =
+          index_loop.goal.MakeMessage();
+      if (data.IsPressed(kFire)) {
+        // FIRE
+        index_goal->goal_state = 4;
+      } else if (shooter_goal->velocity != 0) {
+        // get ready to shoot
+        index_goal->goal_state = 3;
+      } else if (data.IsPressed(kIntake)) {
+        // intake
+        index_goal->goal_state = 2;
+      } else {
+        // get ready to intake
+        index_goal->goal_state = 1;
+      }
+      index_goal->force_fire = data.IsPressed(kForceFire);
+
+      const bool index_up = data.IsPressed(kForceIndexUp);
+      const bool index_down = data.IsPressed(kForceIndexDown);
+      const bool spit_out = data.IsPressed(kForceSpitOut);
+      index_goal->override_index = index_up || index_down || spit_out;
+      index_goal->override_transfer = spit_out;
+      if (index_up && index_down) {
+        index_goal->index_voltage = 0.0;
+      } else if (index_up) {
+        index_goal->index_voltage = 12.0;
+      } else if (index_down) {
+        index_goal->index_voltage = -12.0;
+      }
+      if (spit_out) {
+        index_goal->index_voltage = -12.0;
+        index_goal->transfer_voltage = -12.0;
+      }
+
+      index_goal.Send();
+      shooter_goal.Send();
     }
+
+    static int hanger_cycles = 0;
+    if (data.IsPressed(kDeployHangers)) {
+      ++hanger_cycles;
+      angle_adjust_goal = 0.4;
+    } else {
+      hanger_cycles = 0;
+    }
+    hangers.MakeWithBuilder().set(hanger_cycles >= 10).Send();
   }
 };
 
+}  // namespace joysticks
+}  // namespace input
 }  // namespace frc971
 
-AOS_RUN(frc971::JoystickReader)
+int main() {
+  ::aos::Init();
+  ::frc971::input::joysticks::Reader reader;
+  reader.Run();
+  ::aos::Cleanup();
+}
diff --git a/frc971/input/SensorReader.cc b/frc971/input/SensorReader.cc
deleted file mode 100644
index fd14df4..0000000
--- a/frc971/input/SensorReader.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-#define __STDC_LIMIT_MACROS
-
-#include <arpa/inet.h>
-
-#include "aos/aos_core.h"
-#include "aos/common/inttypes.h"
-#include "aos/common/input/SensorInput.h"
-
-#include "frc971/control_loops/DriveTrain.q.h"
-#include "frc971/queues/sensor_values.h"
-
-#define M_PI 3.14159265358979323846
-
-using ::frc971::control_loops::drivetrain;
-
-namespace frc971 {
-
-namespace {
-inline double drivetrain_translate(int32_t in) {
-  // TODO(2013) fix the math
-  return static_cast<double>(in) / (256.0 * 4.0 * 44.0 / 32.0) *
-      (3.5 * 2.54 / 100.0 * M_PI);
-}
-} // namespace
-
-class SensorReader : public aos::SensorInput<sensor_values> {
-  virtual void RunIteration(sensor_values &sensors) {
-    for (size_t i = 0; i < sizeof(sensors.encoders) / sizeof(sensors.encoders[0]); ++i) {
-      sensors.encoders[i] = ntohl(sensors.encoders[i]);
-    }
-
-    // TODO(aschuh): Convert to meters.
-    const double left_encoder = drivetrain_translate(sensors.lencoder);
-    const double right_encoder = drivetrain_translate(sensors.rencoder);
-    drivetrain.position.MakeWithBuilder()
-        .left_encoder(left_encoder)
-        .right_encoder(right_encoder)
-        .Send();
-  }
-};
-
-} // namespace frc971
-
-AOS_RUN(frc971::SensorReader)
diff --git a/frc971/input/SensorWriter.cc b/frc971/input/SensorWriter.cc
deleted file mode 100644
index 1fb34db..0000000
--- a/frc971/input/SensorWriter.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <arpa/inet.h>
-
-#include "WPILib/Task.h"
-#include "WPILib/Encoder.h"
-#include "WPILib/DigitalInput.h"
-#include "WPILib/Counter.h"
-
-#include "aos/aos_core.h"
-#include "aos/crio/motor_server/SensorOutput.h"
-#include "aos/common/inttypes.h"
-#include "aos/common/mutex.h"
-#include "aos/crio/shared_libs/interrupt_notifier.h"
-
-#include "frc971/queues/sensor_values.h"
-
-using ::aos::MutexLocker;
-
-namespace frc971 {
-
-class SensorWriter : public aos::SensorOutput<sensor_values> {
-  Encoder lencoder;
-  Encoder rencoder;
-
- public:
-  SensorWriter() : lencoder(1, 2), rencoder(3, 4) {
-    lencoder.Start();
-    rencoder.Start();
-
-    printf("frc971::SensorWriter started\n");
-  }
-
-  virtual void RunIteration(sensor_values &vals) {
-    vals.lencoder = htonl(-lencoder.GetRaw());
-    vals.rencoder = -htonl(-rencoder.GetRaw());
-  }
-};
-
-}  // namespace frc971
-
-AOS_RUN(frc971::SensorWriter)
diff --git a/frc971/input/input.gyp b/frc971/input/input.gyp
index 43f591a..d26f851 100644
--- a/frc971/input/input.gyp
+++ b/frc971/input/input.gyp
@@ -1,79 +1,45 @@
 {
   'targets': [
     {
-      'target_name': 'actions',
-      'type': 'static_library',
-      'sources': ['AutoMode.act'],
-      'variables': {
-        'header_path': 'frc971/input',
-      },
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(AOS)/common/common.gyp:controls',
-      ],
-      'includes': ['../../aos/build/queues.gypi'],
-    },
-    {
       'target_name': 'JoystickReader',
       'type': 'executable',
       'sources': [
         'JoystickReader.cc',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(AOS)/atom_code/input/input.gyp:joystick',
-        '<(AOS)/common/network/network.gyp:socket',
-        'actions',
-        '<(DEPTH)/frc971/control_loops/control_loops.gyp:control_loops',
+        '<(AOS)/atom_code/input/input.gyp:joystick_input',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/build/aos.gyp:logging',
+
+        '<(DEPTH)/frc971/control_loops/drivetrain/drivetrain.gyp:drivetrain_loop',
         '<(DEPTH)/frc971/queues/queues.gyp:queues',
+        '<(DEPTH)/frc971/control_loops/angle_adjust/angle_adjust.gyp:angle_adjust_loop',
+        '<(DEPTH)/frc971/control_loops/wrist/wrist.gyp:wrist_loop',
+        '<(DEPTH)/frc971/control_loops/index/index.gyp:index_loop',
+        '<(DEPTH)/frc971/control_loops/shooter/shooter.gyp:shooter_loop',
+        '<(DEPTH)/frc971/control_loops/drivetrain/drivetrain.gyp:drivetrain_loop',
+        '<(DEPTH)/frc971/autonomous/autonomous.gyp:auto_queue',
       ],
     },
     {
-      'target_name': 'SensorReader',
-      'type': '<(aos_target)',
-      'sources': [
-        'SensorReader.cc',
-      ],
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(DEPTH)/frc971/control_loops/control_loops.gyp:control_loops',
-        '<(DEPTH)/frc971/queues/queues.gyp:queues',
-        '<(AOS)/common/network/network.gyp:socket',
-      ],
-    },
-    {
-      'target_name': 'SensorWriter',
-      'type': '<(aos_target)',
-      'sources': [
-        'SensorWriter.cc',
-      ],
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(DEPTH)/frc971/control_loops/control_loops.gyp:control_loops',
-      ],
-    },
-    {
-      'target_name': 'GyroReader',
+      'target_name': 'sensor_receiver',
       'type': 'executable',
       'sources': [
-        'GyroReader.cc',
+        'sensor_receiver.cc',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
+        '<(DEPTH)/frc971/control_loops/drivetrain/drivetrain.gyp:drivetrain_loop',
         '<(DEPTH)/frc971/queues/queues.gyp:queues',
-      ],
-    },
-    {
-      'target_name': 'AutoMode',
-      'type': 'executable',
-      'sources': [
-        'AutoMode.cc',
-      ],
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(DEPTH)/frc971/control_loops/control_loops.gyp:control_loops',
-        '<(DEPTH)/frc971/queues/queues.gyp:queues',
-        'actions',
+        '<(DEPTH)/frc971/control_loops/angle_adjust/angle_adjust.gyp:angle_adjust_loop',
+        '<(DEPTH)/frc971/control_loops/wrist/wrist.gyp:wrist_loop',
+        '<(DEPTH)/frc971/control_loops/index/index.gyp:index_loop',
+        '<(DEPTH)/frc971/control_loops/shooter/shooter.gyp:shooter_loop',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/common/util/util.gyp:wrapping_counter',
+        '<(DEPTH)/frc971/frc971.gyp:constants',
+        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:sensor_reader',
+        '<(AOS)/common/common.gyp:time',
       ],
     },
   ],
diff --git a/frc971/input/sensor_receiver.cc b/frc971/input/sensor_receiver.cc
new file mode 100644
index 0000000..6fdd2e6
--- /dev/null
+++ b/frc971/input/sensor_receiver.cc
@@ -0,0 +1,190 @@
+#include <inttypes.h>
+
+#include "aos/atom_code/init.h"
+#include "aos/common/logging/logging.h"
+#include "aos/common/util/wrapping_counter.h"
+#include "aos/common/time.h"
+
+#include "bbb/sensor_reader.h"
+
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/wrist/wrist_motor.q.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor.q.h"
+#include "frc971/control_loops/index/index_motor.q.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+#include "frc971/queues/GyroAngle.q.h"
+#include "frc971/constants.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+using ::frc971::control_loops::drivetrain;
+using ::frc971::control_loops::wrist;
+using ::frc971::control_loops::angle_adjust;
+using ::frc971::control_loops::shooter;
+using ::frc971::control_loops::index_loop;
+using ::frc971::sensors::gyro;
+using ::aos::util::WrappingCounter;
+
+namespace frc971 {
+namespace {
+
+double drivetrain_translate(int32_t in) {
+  return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
+      constants::GetValues().drivetrain_encoder_ratio *
+      (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI);
+}
+
+double wrist_translate(int32_t in) {
+  return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
+      (14.0 / 50.0 * 20.0 / 84.0) /*gears*/ * (2 * M_PI);
+}
+
+double angle_adjust_translate(int32_t in) {
+  static const double kCableDiameter = 0.060;
+  return -static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
+      ((0.75 + kCableDiameter) / (16.61125 + kCableDiameter)) /*pulleys*/ *
+      (2 * M_PI);
+}
+
+double shooter_translate(int32_t in) {
+ return static_cast<double>(in) / (32.0 /*cpr*/ * 4.0 /*quad*/) *
+      (15.0 / 34.0) /*gears*/ * (2 * M_PI);
+}
+
+double index_translate(int32_t in) {
+  return -static_cast<double>(in) / (128.0 /*cpr*/ * 4.0 /*quad*/) *
+      (1.0) /*gears*/ * (2 * M_PI);
+}
+
+// Translates values from the ADC into voltage.
+double adc_translate(uint16_t in) {
+  static const double kVRefN = 0;
+  static const double kVRefP = 3.3;
+  static const int kMaximumValue = 0xFFF;
+  static const double kDividerGnd = 31.6, kDividerOther = 28;
+  return (kVRefN +
+      (static_cast<double>(in) / static_cast<double>(kMaximumValue) *
+       (kVRefP - kVRefN))) * (kDividerGnd + kDividerOther) / kDividerGnd;
+}
+
+double gyro_translate(int64_t in) {
+  return in / 16.0 / 1000.0 / (180.0 / M_PI);
+}
+
+double battery_translate(uint16_t in) {
+  static const double kDividerBig = 98.9, kDividerSmall = 17.8;
+  return adc_translate(in) * kDividerBig / kDividerSmall;
+}
+
+double hall_translate(const constants::ShifterHallEffect &k, uint16_t in) {
+  const double voltage = adc_translate(in);
+  return (voltage - k.low) / (k.high - k.low);
+}
+
+WrappingCounter top_rise_;
+WrappingCounter top_fall_;
+WrappingCounter bottom_rise_;
+WrappingCounter bottom_fall_delay_;
+WrappingCounter bottom_fall_;
+void ProcessData(const ::bbb::DataStruct *data, bool bad_gyro) {
+  if (!bad_gyro) {
+    gyro.MakeWithBuilder()
+        .angle(gyro_translate(data->gyro_angle))
+        .Send();
+  }
+
+  drivetrain.position.MakeWithBuilder()
+      .right_encoder(drivetrain_translate(data->main.right_drive))
+      .left_encoder(-drivetrain_translate(data->main.left_drive))
+      .left_shifter_position(hall_translate(constants::GetValues().left_drive,
+                                            data->main.left_drive_hall))
+      .right_shifter_position(hall_translate(
+              constants::GetValues().right_drive, data->main.right_drive_hall))
+      .battery_voltage(battery_translate(data->main.battery_voltage))
+      .Send();
+
+  wrist.position.MakeWithBuilder()
+      .pos(wrist_translate(data->main.wrist))
+      .hall_effect(data->main.wrist_hall_effect)
+      .calibration(wrist_translate(data->main.capture_wrist_rise))
+      .Send();
+
+  angle_adjust.position.MakeWithBuilder()
+      .angle(angle_adjust_translate(data->main.shooter_angle))
+      .bottom_hall_effect(data->main.angle_adjust_bottom_hall_effect)
+      .middle_hall_effect(false)
+      .bottom_calibration(angle_adjust_translate(
+              data->main.capture_shooter_angle_rise))
+      .middle_calibration(angle_adjust_translate(
+              0))
+      .Send();
+
+  shooter.position.MakeWithBuilder()
+      .position(shooter_translate(data->main.shooter))
+      .Send();
+
+  index_loop.position.MakeWithBuilder()
+      .index_position(index_translate(data->main.indexer))
+      .top_disc_detect(data->main.top_disc)
+      .top_disc_posedge_count(top_rise_.Update(data->main.top_rise_count))
+      .top_disc_posedge_position(
+          index_translate(data->main.capture_top_rise))
+      .top_disc_negedge_count(top_fall_.Update(data->main.top_fall_count))
+      .top_disc_negedge_position(
+          index_translate(data->main.capture_top_fall))
+      .bottom_disc_detect(data->main.bottom_disc)
+      .bottom_disc_posedge_count(
+          bottom_rise_.Update(data->main.bottom_rise_count))
+      .bottom_disc_negedge_count(
+          bottom_fall_.Update(data->main.bottom_fall_count))
+      .bottom_disc_negedge_wait_position(index_translate(
+              data->main.capture_bottom_fall_delay))
+      .bottom_disc_negedge_wait_count(
+          bottom_fall_delay_.Update(data->main.bottom_fall_delay_count))
+      .loader_top(data->main.loader_top)
+      .loader_bottom(data->main.loader_bottom)
+      .Send();
+}
+
+void PacketReceived(const ::bbb::DataStruct *data,
+                    const ::aos::time::Time &cape_timestamp) {
+  LOG(DEBUG, "cape timestamp %010" PRId32 ".%09" PRId32 "s\n",
+      cape_timestamp.sec(), cape_timestamp.nsec());
+  bool bad_gyro;
+  if (data->uninitialized_gyro) {
+    LOG(DEBUG, "uninitialized gyro\n");
+    bad_gyro = true;
+  } else if (data->zeroing_gyro) {
+    LOG(DEBUG, "zeroing gyro\n");
+    bad_gyro = true;
+  } else if (data->bad_gyro) {
+    LOG(ERROR, "bad gyro\n");
+    bad_gyro = true;
+    gyro.MakeWithBuilder().angle(0).Send();
+  } else if (data->old_gyro_reading) {
+    LOG(WARNING, "old/bad gyro reading\n");
+    bad_gyro = true;
+  } else {
+    bad_gyro = false;
+  }
+  static int i = 0;
+  ++i;
+  if (i == 5) {
+    i = 0;
+    ProcessData(data, bad_gyro);
+  }
+}
+
+}  // namespace
+}  // namespace frc971
+
+int main() {
+  ::aos::Init(::bbb::SensorReader::kRelativePriority);
+  ::bbb::SensorReader reader("main");
+  while (true) {
+    ::frc971::PacketReceived(reader.ReadPacket(), reader.GetCapeTimestamp());
+  }
+  ::aos::Cleanup();
+}
diff --git a/frc971/output/AtomMotorWriter.cc b/frc971/output/AtomMotorWriter.cc
index 243ac81..3ba3593 100644
--- a/frc971/output/AtomMotorWriter.cc
+++ b/frc971/output/AtomMotorWriter.cc
@@ -2,44 +2,106 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "aos/aos_core.h"
-#include "aos/common/network/SendSocket.h"
-#include "aos/common/control_loop/Timing.h"
-#include "aos/common/messages/RobotState.q.h"
-#include "aos/atom_code/output/MotorOutput.h"
+#include "aos/atom_code/output/motor_output.h"
+#include "aos/common/logging/logging.h"
+#include "aos/atom_code/init.h"
 
 #include "frc971/queues/Piston.q.h"
-#include "frc971/control_loops/DriveTrain.q.h"
-#include "frc971/constants.h"
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/wrist/wrist_motor.q.h"
+#include "frc971/control_loops/shooter/shooter_motor.q.h"
+#include "frc971/control_loops/index/index_motor.q.h"
+#include "frc971/control_loops/angle_adjust/angle_adjust_motor.q.h"
 
 using ::frc971::control_loops::drivetrain;
 using ::frc971::control_loops::shifters;
+using ::frc971::control_loops::wrist;
+using ::frc971::control_loops::shooter;
+using ::frc971::control_loops::index_loop;
+using ::frc971::control_loops::angle_adjust;
+using ::frc971::control_loops::hangers;
 
 namespace frc971 {
 namespace output {
 
-class MotorWriter : public aos::MotorOutput {
+class MotorWriter : public ::aos::MotorOutput {
   // Maximum age of an output packet before the motors get zeroed instead.
   static const int kOutputMaxAgeMS = 20;
+  static const int kEnableDrivetrain = true;
 
-  void RunIteration() {
+  virtual void RunIteration() {
+    values_.digital_module = 0;
+    values_.pressure_switch_channel = 14;
+    values_.compressor_channel = 1;
+    values_.solenoid_module = 0;
+
     drivetrain.output.FetchLatest();
-    if (drivetrain.output.IsNewerThanMS(kOutputMaxAgeMS)) {
-      AddMotor(TALON, 2, drivetrain.output->right_voltage / 12.0);
-      AddMotor(TALON, 3, drivetrain.output->right_voltage / 12.0);
-      AddMotor(TALON, 5, -drivetrain.output->left_voltage / 12.0);
-      AddMotor(TALON, 6, -drivetrain.output->left_voltage / 12.0);
+    if (drivetrain.output.IsNewerThanMS(kOutputMaxAgeMS) && kEnableDrivetrain) {
+      SetPWMOutput(2, drivetrain.output->right_voltage / 12.0, kTalonBounds);
+      SetPWMOutput(3, drivetrain.output->right_voltage / 12.0, kTalonBounds);
+      SetPWMOutput(5, -drivetrain.output->left_voltage / 12.0, kTalonBounds);
+      SetPWMOutput(6, -drivetrain.output->left_voltage / 12.0, kTalonBounds);
     } else {
-      AddMotor(TALON, 2, 0.0f);
-      AddMotor(TALON, 3, 0.0f);
-      AddMotor(TALON, 5, 0.0f);
-      AddMotor(TALON, 6, 0.0f);
-      LOG(WARNING, "zeroing drivetrain\n");
+      DisablePWMOutput(2);
+      DisablePWMOutput(3);
+      DisablePWMOutput(5);
+      DisablePWMOutput(6);
+      if (kEnableDrivetrain) {
+        LOG(WARNING, "drivetrain not new enough\n");
+      }
     }
     shifters.FetchLatest();
-    if (shifters.IsNewerThanMS(kOutputMaxAgeMS)) {
-      AddSolenoid(1, shifters->set);
-      AddSolenoid(2, !shifters->set);
+    if (shifters.get()) {
+      SetSolenoid(1, shifters->set);
+      SetSolenoid(2, !shifters->set);
+    }
+
+    wrist.output.FetchLatest();
+    if (wrist.output.IsNewerThanMS(kOutputMaxAgeMS)) {
+      SetPWMOutput(10, wrist.output->voltage / 12.0, kTalonBounds);
+    } else {
+      DisablePWMOutput(10);
+      LOG(WARNING, "wrist not new enough\n");
+    }
+
+    shooter.output.FetchLatest();
+    if (shooter.output.IsNewerThanMS(kOutputMaxAgeMS)) {
+      SetPWMOutput(4, shooter.output->voltage / 12.0, kTalonBounds);
+    } else {
+      DisablePWMOutput(4);
+      LOG(WARNING, "shooter not new enough\n");
+    }
+
+    angle_adjust.output.FetchLatest();
+    if (angle_adjust.output.IsNewerThanMS(kOutputMaxAgeMS)) {
+      SetPWMOutput(1, -angle_adjust.output->voltage / 12.0, kTalonBounds);
+    } else {
+      DisablePWMOutput(1);
+      LOG(WARNING, "angle adjust is not new enough\n");
+    }
+
+    index_loop.output.FetchLatest();
+    if (index_loop.output.get()) {
+      SetSolenoid(7, index_loop.output->loader_up);
+      SetSolenoid(8, !index_loop.output->loader_up);
+      SetSolenoid(6, index_loop.output->disc_clamped);
+      SetSolenoid(3, index_loop.output->disc_ejected);
+    }
+    if (index_loop.output.IsNewerThanMS(kOutputMaxAgeMS)) {
+      SetPWMOutput(8, index_loop.output->intake_voltage / 12.0, kTalonBounds);
+      SetPWMOutput(9, index_loop.output->transfer_voltage / 12.0, kTalonBounds);
+      SetPWMOutput(7, -index_loop.output->index_voltage / 12.0, kTalonBounds);
+    } else {
+      DisablePWMOutput(8);
+      DisablePWMOutput(9);
+      DisablePWMOutput(7);
+      LOG(WARNING, "index not new enough\n");
+    }
+
+    hangers.FetchLatest();
+    if (hangers.get()) {
+      SetSolenoid(4, hangers->set);
+      SetSolenoid(5, hangers->set);
     }
   }
 };
@@ -47,4 +109,9 @@
 }  // namespace output
 }  // namespace frc971
 
-AOS_RUN(frc971::output::MotorWriter)
+int main() {
+  ::aos::Init();
+  ::frc971::output::MotorWriter writer;
+  writer.Run();
+  ::aos::Cleanup();
+}
diff --git a/frc971/output/CRIOMotorWriter.cc b/frc971/output/CRIOMotorWriter.cc
deleted file mode 100644
index b85ac4b..0000000
--- a/frc971/output/CRIOMotorWriter.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "WPILib/Victor.h"
-
-#include "aos/crio/motor_server/MotorOutput.h"
-#include "aos/aos_core.h"
-
-namespace frc971 {
-
-class MotorWriter : public aos::MotorOutput {
-  virtual void RunIteration() {
-  }
-};
-
-}  // namespace frc971
-
-AOS_RUN(frc971::MotorWriter)
diff --git a/frc971/output/CameraServer.cc b/frc971/output/CameraServer.cc
index d3c3bc8..93a83c7 100644
--- a/frc971/output/CameraServer.cc
+++ b/frc971/output/CameraServer.cc
@@ -1,12 +1,12 @@
 #include <string.h>
 
-#include "aos/aos_core.h"
 #include "aos/atom_code/output/HTTPServer.h"
 #include "aos/atom_code/output/evhttp_ctemplate_emitter.h"
 #include "aos/atom_code/output/ctemplate_cache.h"
-#include "aos/common/Configuration.h"
-#include "aos/common/messages/RobotState.q.h"
 #include "ctemplate/template.h"
+#include "aos/atom_code/init.h"
+#include "aos/common/logging/logging.h"
+#include "aos/atom_code/configuration.h"
 
 #include "frc971/constants.h"
 
@@ -16,7 +16,7 @@
 
 class CameraServer : public aos::http::HTTPServer {
  public:
-  CameraServer() : HTTPServer(aos::configuration::GetRootDirectory(), 8080),
+  CameraServer() : HTTPServer(::aos::configuration::GetRootDirectory(), 8080),
       buf_(NULL) {
     AddPage<CameraServer>("/robot.html", &CameraServer::RobotHTML, this);
   }
@@ -54,17 +54,7 @@
     // after it.
     dict.SetValue("HOST", ctemplate::TemplateString(host, length));
 
-    if (!aos::robot_state.FetchLatest()) {
-      LOG(WARNING, "getting a RobotState message failed\n");
-      evhttp_send_error(request, HTTP_INTERNAL, NULL);
-      return;
-    }
-    int center;
-    if (!constants::camera_center(&center)) {
-      evhttp_send_error(request, HTTP_INTERNAL, NULL);
-      return;
-    }
-    dict.SetIntValue("CENTER", center);
+    dict.SetIntValue("CENTER", constants::GetValues().camera_center);
 
     aos::http::EvhttpCtemplateEmitter emitter(buf_);
     if (!aos::http::get_template_cache()->
@@ -84,4 +74,9 @@
 
 }  // namespace frc971
 
-AOS_RUN_NRT(frc971::CameraServer)
+int main() {
+  ::aos::InitNRT();
+  ::frc971::CameraServer server;
+  server.Run();
+  ::aos::Cleanup();
+}
diff --git a/frc971/output/SensorSender.cc b/frc971/output/SensorSender.cc
deleted file mode 100644
index e2d2e51..0000000
--- a/frc971/output/SensorSender.cc
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "aos/crio/motor_server/SensorSender.h"
-#include "frc971/queues/sensor_values.h"
-
-AOS_RUN_FORK(aos::SensorSender<frc971::sensor_values>, "971SS", 100)
-
diff --git a/frc971/output/output.gyp b/frc971/output/output.gyp
index 6cb28d1..1a8b1c9 100644
--- a/frc971/output/output.gyp
+++ b/frc971/output/output.gyp
@@ -7,9 +7,11 @@
         'CameraServer.cc',
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
         '<(AOS)/atom_code/output/output.gyp:http_server',
-        '../frc971.gyp:common',
+        '../frc971.gyp:constants',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/atom_code/atom_code.gyp:configuration',
       ],
       'copies': [
         {
@@ -23,36 +25,20 @@
     {
       'target_name': 'MotorWriter',
       'type': '<(aos_target)',
-      'conditions': [
-        ['OS=="atom"', {
-            'sources': ['AtomMotorWriter.cc'],
-            'dependencies': [
-              '../frc971.gyp:common',
-              '<(AOS)/atom_code/output/output.gyp:motor_output',
-              '<(AOS)/atom_code/messages/messages.gyp:messages',
-            ],
-          }, {
-            'sources': ['CRIOMotorWriter.cc'],
-          }
-        ],
-      ],
-      'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(AOS)/common/common.gyp:controls',
-        '<(DEPTH)/frc971/control_loops/control_loops.gyp:control_loops',
-        '<(DEPTH)/frc971/queues/queues.gyp:queues',
-        '<(AOS)/common/network/network.gyp:socket',
-      ],
-    },
-    {
-      'target_name': 'SensorSender',
-      'type': '<(aos_target)',
       'sources': [
-        'SensorSender.cc',
+        'AtomMotorWriter.cc'
       ],
       'dependencies': [
-        '<(AOS)/build/aos.gyp:libaos',
-        '<(AOS)/common/network/network.gyp:socket',
+        '<(AOS)/atom_code/output/output.gyp:motor_output',
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(DEPTH)/frc971/control_loops/angle_adjust/angle_adjust.gyp:angle_adjust_loop',
+        '<(DEPTH)/frc971/control_loops/wrist/wrist.gyp:wrist_loop',
+        '<(DEPTH)/frc971/control_loops/index/index.gyp:index_loop',
+        '<(DEPTH)/frc971/control_loops/shooter/shooter.gyp:shooter_loop',
+        '<(DEPTH)/frc971/control_loops/drivetrain/drivetrain.gyp:drivetrain_loop',
+        '<(AOS)/common/common.gyp:controls',
+        '<(DEPTH)/frc971/queues/queues.gyp:queues',
       ],
     },
   ],
diff --git a/frc971/queues/CameraEnableQueue.q b/frc971/queues/CameraEnableQueue.q
new file mode 100644
index 0000000..d61a7ee
--- /dev/null
+++ b/frc971/queues/CameraEnableQueue.q
@@ -0,0 +1,7 @@
+package frc971.sensors;
+
+message CameraEnable {
+	bool enable_camera;
+};
+
+queue CameraEnable camera_enable;
diff --git a/frc971/queues/CameraTarget.q b/frc971/queues/CameraTarget.q
new file mode 100644
index 0000000..5e11e0c
--- /dev/null
+++ b/frc971/queues/CameraTarget.q
@@ -0,0 +1,17 @@
+package frc971.vision;
+
+message CameraTarget {
+  double percent_azimuth_off_center;
+  double percent_elevation_off_center;
+  // todo:(pschuh) add time syntax when havith more sleep
+  uint64_t timestamp; 
+};
+
+message TargetAngle {
+  double target_angle;
+  double shooter_speed;
+  double shooter_angle;
+};
+
+queue TargetAngle target_angle;
+queue CameraTarget targets;
diff --git a/frc971/queues/PhotoSensor.q b/frc971/queues/PhotoSensor.q
new file mode 100644
index 0000000..383bc25
--- /dev/null
+++ b/frc971/queues/PhotoSensor.q
@@ -0,0 +1,10 @@
+package frc971.sensors;
+
+message BlockedSensor {
+	bool blocked;
+};
+
+queue BlockedSensor bottom_ball_sensor;
+queue BlockedSensor top_ball_sensor;
+queue BlockedSensor left_bump;
+queue BlockedSensor right_bump;
diff --git a/frc971/queues/Piston.q b/frc971/queues/Piston.q
index 0819567..5811958 100644
--- a/frc971/queues/Piston.q
+++ b/frc971/queues/Piston.q
@@ -5,3 +5,4 @@
 };
 
 queue Piston shifters;
+queue Piston hangers;
diff --git a/frc971/queues/queues.gyp b/frc971/queues/queues.gyp
index 70ed873..ec5862a 100644
--- a/frc971/queues/queues.gyp
+++ b/frc971/queues/queues.gyp
@@ -1,7 +1,10 @@
 {
   'variables': {
     'queue_files': [
+      'CameraEnableQueue.q',
       'GyroAngle.q',
+      'CameraTarget.q',
+      'PhotoSensor.q',
       'Piston.q',
     ]
   },
@@ -15,7 +18,9 @@
       },
       'dependencies': [
         '<(AOS)/common/common.gyp:queues',
-        '<(AOS)/build/aos.gyp:libaos',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:queues',
       ],
       'includes': ['../../aos/build/queues.gypi'],
     },
@@ -27,7 +32,6 @@
         'header_path': 'frc971/queues',
       },
       'dependencies': [
-        '<(AOS)/build/aos.gyp:aos_shared_lib',
       ],
       'direct_dependent_settings': {
         'variables': {
diff --git a/frc971/queues/sensor_values.h b/frc971/queues/sensor_values.h
index 16d6890..95cfc27 100644
--- a/frc971/queues/sensor_values.h
+++ b/frc971/queues/sensor_values.h
@@ -1,22 +1,38 @@
-#ifndef __COMMON_SENSOR_VALUES_H_
-#define __COMMON_SENSOR_VALUES_H_
+#ifndef FRC971_QUEUES_SENSOR_VALUES_H_
+#define FRC971_QUEUES_SENSOR_VALUES_H_
 
 #include <stdint.h>
 
 namespace frc971 {
 
 struct sensor_values {
-	union {
-		struct {
-			int32_t lencoder, rencoder;
-		};
-		uint32_t encoders[2];
-	};
+  // Anonymous union to make fixing the byte order on all of the 4-byte long
+  // values easier.
+  // TODO(brians) name this better
+  union {
+    struct {
+      int32_t drive_left_encoder, drive_right_encoder;
+      int32_t shooter_encoder;
+      int32_t index_encoder, bottom_disc_negedge_wait_position;
+      int32_t bottom_disc_posedge_count, bottom_disc_negedge_count;
+      int32_t bottom_disc_negedge_wait_count;
+      int32_t top_disc_posedge_count, top_disc_negedge_count;
+      int32_t top_disc_posedge_position, top_disc_negedge_position;
+      int32_t wrist_position, wrist_edge_position;
+      int32_t angle_adjust_position;
+      int32_t angle_adjust_middle_edge_position;
+      int32_t angle_adjust_bottom_edge_position;
+    };
+    uint32_t encoders[17];
+  };
 
-  // TODO(2013) all the rest
+  bool wrist_hall_effect;
+  bool angle_adjust_middle_hall_effect;
+  bool angle_adjust_bottom_hall_effect;
+
+  bool top_disc, bottom_disc;
 };
 
-} // namespace frc971
+}  // namespace frc971
 
-#endif
-
+#endif  // FRC971_QUEUES_SENSOR_VALUES_H_
diff --git a/gyro_board/schematic/.gitignore b/gyro_board/schematic/.gitignore
new file mode 100644
index 0000000..d6b9d75
--- /dev/null
+++ b/gyro_board/schematic/.gitignore
@@ -0,0 +1,2 @@
+*.b#*
+*.s#*
diff --git a/gyro_board/src/libusb-driver/README b/gyro_board/src/libusb-driver/README
new file mode 100644
index 0000000..f8c3657
--- /dev/null
+++ b/gyro_board/src/libusb-driver/README
@@ -0,0 +1 @@
+./get --logtostderr=1
diff --git a/gyro_board/src/libusb-driver/get.cc b/gyro_board/src/libusb-driver/get.cc
new file mode 100644
index 0000000..4d7f7cb
--- /dev/null
+++ b/gyro_board/src/libusb-driver/get.cc
@@ -0,0 +1,197 @@
+#include "get.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <string.h>
+
+#include <queue>
+#include <iostream>
+#include <map>
+
+#include <google/gflags.h>
+#include "aos/common/mutex.h"
+#include "aos/common/logging/logging_impl.h"
+
+DEFINE_int32(vid, 0x1424, "Vendor ID of the device.");
+DEFINE_int32(pid, 0xd243, "Product ID of the device.");
+DEFINE_bool(send, true,
+            "True if the code should send packets.  (default: true)");
+
+// USB descriptors in use:
+// 0x81 Interrupt IN endpoint with the received CAN packets.
+//      These packets are 64 bytes maximum, and have the same format as
+//      SocketCAN.
+// 0x04 Interrupt OUT endpoint with the CAN packets to send.
+//      These packets are 64 bytes maximum, and have the same format as
+//      SocketCAN.
+// 0x82 Bulk IN endpoint with printf output.
+// 0x05 Bulk OUT endpoint for stdin.
+
+class GyroDriver::PacketReceiver : public ::aos::util::Thread {
+ public:
+  // refusing to send any more frames.
+  static const int kMaxRXFrames = 128;
+
+  explicit PacketReceiver(LibUSBDeviceHandle *dev_handle)
+      : Thread(), dev_handle_(dev_handle) {}
+
+  // Serve.
+  virtual void Run();
+
+  bool GetCanFrame(struct can_frame *msg);
+
+ private:
+  LibUSBDeviceHandle *dev_handle_;
+  ::aos::Mutex rx_mutex_;
+};
+
+GyroDriver::GyroDriver(LibUSBDeviceHandle *dev_handle)
+    : dev_handle_(dev_handle), dbg_(new DbgReader(this)),
+    rx_(new GyroDriver::PacketReceiver(dev_handle)) {}
+
+
+std::string GyroDriver::GetDebugData() {
+  char data[64];
+  int transferred;
+  dev_handle_->bulk_transfer(0x82,
+                             (unsigned char *)data, sizeof(data),
+                             &transferred, 0);
+  return std::string(data, transferred);
+}
+
+GyroDriver::~GyroDriver() {
+  rx_->Join();
+  dbg_->Join();
+}
+
+//bool GyroDriver::GetCanFrame(struct can_frame *msg) {
+//  return rx_->GetCanFrame(msg);
+//}
+
+struct DataStruct{
+	int64_t gyro_angle;
+
+	int32_t right_drive;
+	int32_t left_drive;
+	int32_t shooter_angle;
+	int32_t shooter;
+	int32_t indexer;
+	int32_t wrist;
+
+	int32_t capture_top_rise;
+	int32_t capture_top_fall;
+	int32_t capture_bottom_fall_delay;
+	int32_t capture_wrist_rise;
+	int32_t capture_shooter_angle_rise;
+
+	int8_t  top_rise_count;
+
+	int8_t top_fall_count;
+
+	int8_t bottom_rise_count;
+
+	int8_t bottom_fall_delay_count;
+	int8_t bottom_fall_count;
+
+	int8_t wrist_rise_count;
+
+	int8_t shooter_angle_rise_count;
+} __attribute__((__packed__));
+
+void GyroDriver::Start() {
+	rx_->Start();
+}
+
+void GyroDriver::PacketReceiver::Run() {
+  int r;
+  int actual;
+  uint8_t data[64];
+  DataStruct *real_data;
+  static_assert(sizeof(*real_data) <= sizeof(data), "it doesn't fit");
+
+  uint8_t *data_pointer = data;
+  memcpy(&real_data, &data_pointer, sizeof(data_pointer));
+  
+  int count = 0;
+  while (should_continue()) {
+    r = dev_handle_->interrupt_transfer(
+        0x81, data, sizeof(data), &actual, 1000);
+    if (actual <= 0) {
+      LOG(FATAL, "didn't get any data\n");
+    }
+    
+    if (r != 0) {
+      LOG(ERROR, "Read Error. Read %d\n", actual);
+    }
+
+    ++count;
+    if (count < 100) continue;
+    count = 0;
+    
+    printf("angle: %" PRId64 "\n", real_data->gyro_angle);
+    printf("drivel: %d\n", real_data->left_drive);
+    printf("driver: %d\n", real_data->right_drive);
+    printf("shooter: %d\n", real_data->shooter);
+    printf("shooter_angle: %d\n", real_data->shooter_angle);
+    printf("indexer: %d\n", real_data->indexer);
+    printf("wrist: %d\n", real_data->wrist);
+    printf("capture:\n");
+    printf("  wrist_rise{%d}: %d\n", real_data->wrist_rise_count, 
+    		    real_data->capture_wrist_rise);
+    printf("  shooter_angle_rise{%d}: %d\n", real_data->shooter_angle_rise_count,
+    		    real_data->capture_shooter_angle_rise);
+    printf("  bottom_rise_delay{%d}; \n", real_data->bottom_rise_count);
+    printf("  bottom_fall_delay{%d,%d}: %d\n", real_data->bottom_fall_count,
+    		    real_data->bottom_fall_delay_count,
+    		    real_data->capture_bottom_fall_delay);
+    printf("  top_rise{%d}: %d\n", real_data->top_rise_count,
+    		    real_data->capture_top_rise);
+    printf("  top_fall{%d}: %d\n", real_data->top_fall_count,
+    		    real_data->capture_top_fall);
+
+
+
+
+    //if (actual > 1) {
+    //  rx_cond_.notify_all();
+    //}
+  }
+  //rx_cond_.notify_all();
+  LOG(INFO, "Receive thread down.");
+}
+
+DbgReader::DbgReader(GyroDriver *gyro)
+    : Thread(), gyro_(gyro) {}
+
+void DbgReader::Run() {
+  LOG(INFO, "Running debug dump thread.");
+  while (should_continue()) {
+    printf("%s", gyro_->GetDebugData().c_str());
+  }
+  LOG(INFO, "Exiting debug dump thread.");
+}
+
+
+int main(int argc, char ** argv) {
+  google::ParseCommandLineFlags(&argc, &argv, true);
+  ::aos::logging::Init();
+
+  LibUSB libusb;
+
+  {
+    std::unique_ptr<LibUSBDeviceHandle> dev_handle(
+        libusb.FindDeviceWithVIDPID(FLAGS_vid, FLAGS_pid));
+    if (!dev_handle) {
+      LOG(FATAL, "couldn't find device\n");
+    }
+
+    GyroDriver gyro(dev_handle.release());
+		gyro.Start();
+
+    while(true){
+      	    sleep(50);
+    }
+  }
+  return 0;
+}
diff --git a/gyro_board/src/libusb-driver/get.h b/gyro_board/src/libusb-driver/get.h
new file mode 100644
index 0000000..f6b8011
--- /dev/null
+++ b/gyro_board/src/libusb-driver/get.h
@@ -0,0 +1,73 @@
+#ifndef GET_H_
+#define GET_H_
+
+#include <sys/socket.h>
+#include <linux/can.h>
+
+#include <memory>
+
+#include "aos/common/util/thread.h"
+
+#include "libusb_wrap.h"
+
+class DbgReader;
+
+class GyroDriver {
+ public:
+  // Constructs a GyroDriver.
+  // GyroDriver takes ownership of the device handle.
+  explicit GyroDriver(LibUSBDeviceHandle *dev_handle);
+  virtual ~GyroDriver();
+
+  // Queues a CAN frame.  The driver will copy the frame to reduce memory churn
+  // and non-realtime behavior associated with allocating and deallocating the
+  // messages.
+  // Returns true if the message was queued and false otherwise.
+  bool QueueCanFrame(const struct can_frame &msg);
+
+  // Returns 1 packet worth of debug data from the bulk debug channel.
+  std::string GetDebugData();
+
+  // Waits until a CAN frame is available and returns it.
+  // Returns true if we got a frame and false if we were interrupted.
+  bool GetCanFrame(struct can_frame *msg);
+
+  // Terminates the rx and tx threads in preperation for shutdown.
+  // Not safe for use in signal handlers.
+  void Terminate();
+
+  void Start();
+
+ private:
+  // Class that runs in a seperate thread and receives and queues all messages.
+  class PacketReceiver;
+
+  // USB Device handle.
+  std::unique_ptr<LibUSBDeviceHandle> dev_handle_;
+  // Handle for the object run in the debug thread which prints out debug
+  // information.
+  std::unique_ptr<DbgReader> dbg_;
+
+  // Handle for the transmit object which runs in the transmit thread and also
+  // handles priority queueing of packets.
+  //std::unique_ptr<PacketTransmitter> tx_;
+  // Thread handle for the transmit thread.
+  //std::unique_ptr<boost::thread> tx_thread_;
+
+  // Handle for the rx object which runs in the rx thread and also
+  // handles priority queueing of packets.
+  std::unique_ptr<PacketReceiver> rx_;
+};
+
+class DbgReader : public ::aos::util::Thread {
+ public:
+  explicit DbgReader(GyroDriver *dev_handle);
+
+  // Serve.
+  virtual void Run();
+
+ private:
+  GyroDriver *gyro_;
+};
+
+#endif  // GET_H_
diff --git a/gyro_board/src/libusb-driver/libusb-driver.gyp b/gyro_board/src/libusb-driver/libusb-driver.gyp
new file mode 100644
index 0000000..ab2bf70
--- /dev/null
+++ b/gyro_board/src/libusb-driver/libusb-driver.gyp
@@ -0,0 +1,35 @@
+{
+  'targets': [
+    {
+      'target_name': 'get',
+      'type': 'executable',
+      'sources': [
+        'get.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):gflags',
+        '<(AOS)/common/util/util.gyp:thread',
+        'libusb_wrap',
+        '<(AOS)/build/aos.gyp:logging',
+        '<(AOS)/common/common.gyp:time',
+      ],
+      'export_dependent_settings': [
+        '<(AOS)/common/common.gyp:time',
+      ],
+    },
+    {
+      'target_name': 'libusb_wrap',
+      'type': 'static_library',
+      'sources': [
+        'libusb_wrap.cc',
+      ],
+      'dependencies': [
+        '<(EXTERNALS):libusb',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+      'export_dependent_settings': [
+        '<(EXTERNALS):libusb',
+      ],
+    },
+  ],
+}
diff --git a/gyro_board/src/libusb-driver/libusb_wrap.cc b/gyro_board/src/libusb-driver/libusb_wrap.cc
new file mode 100644
index 0000000..0026ef3
--- /dev/null
+++ b/gyro_board/src/libusb-driver/libusb_wrap.cc
@@ -0,0 +1,192 @@
+#include "libusb_wrap.h"
+
+#include <string.h>
+
+#include <iostream>
+
+#include "aos/common/logging/logging.h"
+
+LibUSB::LibUSB() {
+  if (libusb_init(&ctx_) < 0) {
+    LOG(FATAL, "libusb_init(%p) failed\n", &ctx_);
+  }
+  libusb_set_debug(ctx_, 3);
+}
+
+LibUSBDeviceHandle *LibUSB::FindDeviceWithVIDPID(int vid, int pid) {
+  int r;
+  libusb_device **devs;
+  libusb_device_handle *dev_handle;
+
+  ssize_t cnt;
+  cnt = libusb_get_device_list(ctx_, &devs);
+  if (cnt < 0) {
+    LOG(ERROR, "Get Device Error\n");
+    return NULL;
+  }
+  LOG(INFO, "%d Devices in list.\n", cnt);
+  bool found = false;
+  for (int i = 0; i < cnt; ++i) {
+    struct libusb_device_descriptor desc;
+    r = libusb_get_device_descriptor(devs[i], &desc);
+    if (r < 0) {
+      LOG(FATAL, "lib_usb_get_device_descriptor(%p, %p) failed\n",
+          devs[i], &desc);
+    }
+    if (desc.idVendor == vid && desc.idProduct == pid) {
+      LOG(INFO, "Device %d:%d matches\n",
+          (int)libusb_get_bus_number(devs[i]),
+          (int)libusb_get_device_address(devs[i]));
+      r = libusb_open(devs[i], &dev_handle);
+      if (libusb_kernel_driver_active(dev_handle, 0) == 1) {
+        LOG(INFO, "Device already in use, trying next one.\n");
+        continue;
+      }
+      if (r < 0) {
+        LOG(WARNING, "Failed to open device.\n");
+      } else {
+        found = true;
+        break;
+      }
+    }
+  }
+  libusb_free_device_list(devs, 1);
+  if (!found) {
+    LOG(ERROR, "Couldn't open device.\n");
+    return NULL;
+  }
+
+  if (libusb_kernel_driver_active(dev_handle, 0) == 1) {
+    LOG(INFO, "Kernel Driver Active\n");
+    if (libusb_detach_kernel_driver(dev_handle, 0) == 0) {
+      LOG(INFO, "Kernel Driver Detached!\n");
+    } else {
+      LOG(ERROR, "Couldn't detach kernel driver.\n");
+      return NULL;
+    }
+  }
+
+  r = libusb_claim_interface(dev_handle, 0);
+  if (r < 0) {
+    LOG(ERROR, "Cannot Claim Interface\n");
+    return 0;
+  }
+  LOG(INFO, "Claimed Interface\n");
+  return new LibUSBDeviceHandle(dev_handle);
+}
+
+LibUSB::~LibUSB() {
+  libusb_exit(ctx_);
+}
+
+void LibUSB::HandleEvents() {
+  int ret = libusb_handle_events(ctx_);
+  if (ret != 0) {
+    LOG(FATAL, "libusb_handle_events(%p) returned %d\n", ctx_, ret);
+  }
+}
+
+LibUSBDeviceHandle::LibUSBDeviceHandle(
+    libusb_device_handle *dev_handle) : dev_handle_(dev_handle) { }
+
+LibUSBDeviceHandle::~LibUSBDeviceHandle() {
+  int r = libusb_release_interface(dev_handle_, 0);
+  if (r != 0) {
+    LOG(FATAL, "Cannot Release Interface\n");
+  }
+  LOG(INFO, "Released Interface\n");
+
+  libusb_close(dev_handle_);
+}
+
+int LibUSBDeviceHandle::interrupt_transfer(
+    unsigned char endpoint, unsigned char *data, int length,
+    int *transferred, unsigned int timeout) {
+  return libusb_interrupt_transfer(dev_handle_, endpoint, data, length,
+                                   transferred, timeout);
+}
+
+int LibUSBDeviceHandle::bulk_transfer(
+    unsigned char endpoint, unsigned char *data,
+    int length, int *transferred, unsigned int timeout) {
+  return libusb_bulk_transfer(dev_handle_, endpoint, data, length,
+                              transferred, timeout);
+}
+
+namespace libusb {
+
+Transfer::Transfer(size_t data_length,
+                   void (*callback)(Transfer *, void *),
+                   void *user_data,
+                   int num_iso_packets)
+    : transfer_(libusb_alloc_transfer(num_iso_packets)),
+      data_(new uint8_t[data_length]),
+      data_length_(data_length),
+      callback_(callback),
+      user_data_(user_data) {
+}
+Transfer::~Transfer() {
+  libusb_free_transfer(transfer_);
+  delete data_;
+}
+
+void Transfer::FillInterrupt(LibUSBDeviceHandle *device,
+                             unsigned char endpoint,
+                             unsigned int timeout) {
+  libusb_fill_interrupt_transfer(transfer_,
+                                 device->dev_handle_,
+                                 endpoint,
+                                 data_,
+                                 data_length_,
+                                 StaticTransferCallback,
+                                 this,
+                                 timeout);
+}
+
+void Transfer::Submit() {
+  int ret = libusb_submit_transfer(transfer_);
+  if (ret != 0) {
+    if (ret == LIBUSB_ERROR_BUSY) {
+      LOG(FATAL, "transfer %p already submitted\n", this);
+    }
+    LOG(FATAL, "libusb error %d submitting transfer %p. errno %d: %s\n",
+        ret, this, errno, strerror(errno));
+  }
+}
+
+void Transfer::Cancel() {
+  int ret = libusb_cancel_transfer(transfer_);
+  if (ret != 0) {
+    LOG(FATAL, "libusb error %d cancelling transfer %p. errno %d: %s\n",
+        ret, this, errno, strerror(errno));
+  }
+}
+
+void Transfer::TransferCallback() {
+  callback_(this, user_data_);
+}
+
+IsochronousTransfer::IsochronousTransfer(size_t packet_length,
+                                         int num_packets,
+                                         void (*callback)(Transfer *, void *),
+                                         void *user_data)
+    : Transfer(packet_length * num_packets, callback, user_data, num_packets),
+      num_packets_(num_packets) {
+}
+
+void IsochronousTransfer::FillIsochronous(LibUSBDeviceHandle *device,
+                               unsigned char endpoint,
+                               const ::aos::time::Time &timeout) {
+  libusb_fill_iso_transfer(transfer_,
+                           device->dev_handle_,
+                           endpoint,
+                           data_,
+                           data_length_,
+                           num_packets_,
+                           StaticTransferCallback,
+                           this,
+                           timeout.ToMSec());
+  transfer_->iso_packet_desc[0].length = data_length_;
+}
+
+}  // namespace libusb
diff --git a/gyro_board/src/libusb-driver/libusb_wrap.h b/gyro_board/src/libusb-driver/libusb_wrap.h
new file mode 100644
index 0000000..6056c66
--- /dev/null
+++ b/gyro_board/src/libusb-driver/libusb_wrap.h
@@ -0,0 +1,123 @@
+#ifndef LIBUSB_H_
+#define LIBUSB_H_
+
+#include <libusb-1.0/libusb.h>
+
+#include "aos/common/macros.h"
+#include "aos/common/time.h"
+
+class LibUSBDeviceHandle;
+namespace libusb {
+class Transfer;
+class IsochronousTransfer;
+}
+
+class LibUSB {
+ public:
+  explicit LibUSB();
+  ~LibUSB();
+
+  // Return a device handle or NULL with the correct VID and PID.
+  LibUSBDeviceHandle *FindDeviceWithVIDPID(
+      int vid, int pid);
+
+  void HandleEvents();
+
+ private:
+  libusb_context *ctx_;
+
+  DISALLOW_COPY_AND_ASSIGN(LibUSB);
+};
+
+class LibUSBDeviceHandle {
+ public:
+  virtual ~LibUSBDeviceHandle();
+  // Transfers data using an interrupt transfer.
+  int interrupt_transfer(unsigned char endpoint, unsigned char *data,
+                         int length, int *transferred, unsigned int timeout);
+
+  // Transfers data using a bulk transfer.
+  int bulk_transfer(unsigned char endpoint, unsigned char *data,
+                    int length, int *transferred, unsigned int timeout);
+
+ private:
+  friend class LibUSB; // For constructor
+  friend class libusb::Transfer;  // for access to dev_handle_
+  friend class libusb::IsochronousTransfer;  // for access to dev_handle_
+  // Takes ownership of the device handle and frees it when destructed.
+  explicit LibUSBDeviceHandle(libusb_device_handle *dev_handle);
+  libusb_device_handle *dev_handle_;
+
+ DISALLOW_COPY_AND_ASSIGN(LibUSBDeviceHandle);
+};
+
+// TODO(brians): move everything in here
+namespace libusb {
+
+// Wraps a libusb_transfer*.
+// Represents an asynchronous transfer.
+// Only designed to support interrupt and bulk transfers because they are very
+// similar and simple.
+class Transfer {
+ public:
+  Transfer(size_t data_length,
+           void (*callback)(Transfer *, void *),
+           void *user_data,
+           int num_iso_packets = 0);
+  ~Transfer();
+
+  void FillInterrupt(LibUSBDeviceHandle *device,
+                     unsigned char endpoint,
+                     unsigned int timeout);
+
+  void Submit();
+  void Cancel();
+
+  libusb_transfer_status status() { return transfer_->status; }
+  virtual int read_bytes() { return transfer_->actual_length; }
+
+  const uint8_t *data() { return data_; }
+
+ protected:
+  static void StaticTransferCallback(libusb_transfer *self) {
+    static_cast<Transfer *>(self->user_data)->TransferCallback();
+  }
+
+ protected:
+  libusb_transfer *const transfer_;
+
+  uint8_t *const data_;
+  size_t data_length_;
+
+ private:
+  void TransferCallback();
+
+  void (*const callback_)(Transfer *, void *);
+  void *const user_data_;
+
+  DISALLOW_COPY_AND_ASSIGN(Transfer);
+};
+
+// TODO(brians): Make this actually work for num_packets != 1.
+class IsochronousTransfer : public Transfer {
+ public:
+  IsochronousTransfer(size_t packet_length,
+                      int num_packets,
+                      void (*callback)(Transfer *, void *),
+                      void *user_data);
+
+  void FillIsochronous(LibUSBDeviceHandle *device,
+                       unsigned char endpoint,
+                       const ::aos::time::Time &timeout);
+
+  virtual int read_bytes() {
+    return transfer_->iso_packet_desc[0].actual_length;
+  }
+
+ private:
+  const int num_packets_;
+};
+
+}  // namespace libusb
+
+#endif  // LIBUSB_H_
diff --git a/gyro_board/src/usb/.gitignore b/gyro_board/src/usb/.gitignore
new file mode 100644
index 0000000..fb4dc0a
--- /dev/null
+++ b/gyro_board/src/usb/.gitignore
@@ -0,0 +1,3 @@
+*.o
+main.elf
+main.hex
diff --git a/gyro_board/src/usb/CAN.c b/gyro_board/src/usb/CAN.c
index 74e0a62..61e7f47 100644
--- a/gyro_board/src/usb/CAN.c
+++ b/gyro_board/src/usb/CAN.c
@@ -10,7 +10,6 @@
 #include "flash.h"
 #include "partest.h"
 #include "analog.h"
-#include "spi.h"
 #include "LPCUSB/usbapi.h"
 #include "CAN.h"
 
@@ -202,11 +201,10 @@
   xLastFlashTime = xTaskGetTickCount();
 
   for (;;) {
-    printf("hello\n");
 
     int c = VCOM_getchar();
     while (c != -1) {
-      printf("hello\n");
+      printf("hello in write\n");
       int j = c;
       printf("Sending data 0x%x\n", j);
       message.data[0] = j++;
@@ -277,6 +275,11 @@
   }
 }
 
+void CAN_PCLKSEL(void) {
+  // Set all of the CAN stuff to run at CCLK/6, which translates to about 1 Mbit
+  // (1.042).
+  SC->PCLKSEL0 |= 3 << 26 | 3 << 28 | 3 << 30;
+}
 
 void initCAN(void){
   xTaskCreate(vCAN1, (signed char *) "CAN1rx", configMINIMAL_STACK_SIZE + 400, NULL, tskIDLE_PRIORITY + 1, NULL);
diff --git a/gyro_board/src/usb/CAN.h b/gyro_board/src/usb/CAN.h
index 1ef39d5..60f2d10 100644
--- a/gyro_board/src/usb/CAN.h
+++ b/gyro_board/src/usb/CAN.h
@@ -14,6 +14,9 @@
 } can_message;
 
 int CAN_get(can_message *message);
+
+// Sets up PCLKSEL for CAN stuff (errata PCLKSELx.1).
+void CAN_PCLKSEL(void);
 void initCAN(void);
 
 #endif
diff --git a/gyro_board/src/usb/FreeRTOSConfig.h b/gyro_board/src/usb/FreeRTOSConfig.h
index 5a46dad..57f81ab 100644
--- a/gyro_board/src/usb/FreeRTOSConfig.h
+++ b/gyro_board/src/usb/FreeRTOSConfig.h
@@ -69,7 +69,7 @@
 #define configUSE_PREEMPTION		1
 #define configUSE_IDLE_HOOK		0
 #define configMAX_PRIORITIES		((unsigned portBASE_TYPE) 5)
-#define configUSE_TICK_HOOK		1
+#define configUSE_TICK_HOOK		0
 #define configCPU_CLOCK_HZ		((unsigned long) 100000000)
 #define configTICK_RATE_HZ		((portTickType ) 1000)
 #define configMINIMAL_STACK_SIZE	((unsigned short) 80)
diff --git a/gyro_board/src/usb/LPCUSB/USB_CDC.c b/gyro_board/src/usb/LPCUSB/USB_CDC.c
deleted file mode 100644
index 47d28db..0000000
--- a/gyro_board/src/usb/LPCUSB/USB_CDC.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
-	LPCUSB, an USB device driver for LPC microcontrollers
-	Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl)
-
-	Redistribution and use in source and binary forms, with or without
-	modification, are permitted provided that the following conditions are met:
-
-	1. Redistributions of source code must retain the above copyright
-	   notice, this list of conditions and the following disclaimer.
-	2. Redistributions in binary form must reproduce the above copyright
-	   notice, this list of conditions and the following disclaimer in the
-	   documentation and/or other materials provided with the distribution.
-	3. The name of the author may not be used to endorse or promote products
-	   derived from this software without specific prior written permission.
-
-	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-	IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-	OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-	DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-	THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-	THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*
-	Minimal implementation of a USB serial port, using the CDC class.
-	This example application simply echoes everything it receives right back
-	to the host.
-
-	Windows:
-	Extract the usbser.sys file from .cab file in C:\WINDOWS\Driver Cache\i386
-	and store it somewhere (C:\temp is a good place) along with the usbser.inf
-	file. Then plug in the LPC176x and direct windows to the usbser driver.
-	Windows then creates an extra COMx port that you can open in a terminal
-	program, like hyperterminal. [Note for FreeRTOS users - the required .inf
-	file is included in the project directory.]
-
-	Linux:
-	The device should be recognised automatically by the cdc_acm driver,
-	which creates a /dev/ttyACMx device file that acts just like a regular
-	serial port.
-
-*/
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "task.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include "usbapi.h"
-#include "usbdebug.h"
-#include "usbstruct.h"
-
-#include "LPC17xx.h"
-
-#define usbMAX_SEND_BLOCK		( 20 / portTICK_RATE_MS )
-#define usbRXBUFFER_LEN			( 80 )
-#define usbTXBUFFER_LEN			( 600 )
-
-#define INCREMENT_ECHO_BY 0
-#define BAUD_RATE	115200
-
-#define INT_IN_EP		0x81
-#define BULK_OUT_EP		0x05
-#define BULK_IN_EP		0x82
-
-#define MAX_PACKET_SIZE	64
-
-#define LE_WORD(x)		((x)&0xFF),((x)>>8)
-
-// CDC definitions
-#define CS_INTERFACE			0x24
-#define CS_ENDPOINT				0x25
-
-#define	SET_LINE_CODING			0x20
-#define	GET_LINE_CODING			0x21
-#define	SET_CONTROL_LINE_STATE	0x22
-
-// data structure for GET_LINE_CODING / SET_LINE_CODING class requests
-typedef struct {
-	unsigned long		dwDTERate;
-	unsigned char		bCharFormat;
-	unsigned char		bParityType;
-	unsigned char		bDataBits;
-} TLineCoding;
-
-static TLineCoding LineCoding = {115200, 0, 0, 8};
-static unsigned char abBulkBuf[64];
-static unsigned char abClassReqData[8];
-
-static xQueueHandle xRxedChars = NULL, xCharsForTx = NULL;
-
-// forward declaration of interrupt handler
-void USBIntHandler(void);
-
-static const unsigned char abDescriptors[] = {
-
-// device descriptor
-	0x12,
-	DESC_DEVICE,
-	LE_WORD(0x0101),		// bcdUSB
-	0x02,				// bDeviceClass
-	0x00,				// bDeviceSubClass
-	0x00,				// bDeviceProtocol
-	MAX_PACKET_SIZE0,		// bMaxPacketSize
-	LE_WORD(0xFFFF),		// idVendor
-	LE_WORD(0x0005),		// idProduct
-	LE_WORD(0x0100),		// bcdDevice
-	0x01,				// iManufacturer
-	0x02,				// iProduct
-	0x03,				// iSerialNumber
-	0x01,				// bNumConfigurations
-
-// configuration descriptor
-	0x09,
-	DESC_CONFIGURATION,
-	LE_WORD(67),			// wTotalLength
-	0x02,				// bNumInterfaces
-	0x01,				// bConfigurationValue
-	0x00,				// iConfiguration
-	0xC0,				// bmAttributes
-	0x32,				// bMaxPower
-// control class interface
-	0x09,
-	DESC_INTERFACE,
-	0x00,				// bInterfaceNumber
-	0x00,				// bAlternateSetting
-	0x01,				// bNumEndPoints
-	0x02,				// bInterfaceClass
-	0x02,				// bInterfaceSubClass
-	0x01,				// bInterfaceProtocol, linux requires value of 1 for the cdc_acm module
-	0x00,				// iInterface
-// header functional descriptor
-	0x05,
-	CS_INTERFACE,
-	0x00,
-	LE_WORD(0x0110),
-// call management functional descriptor
-	0x05,
-	CS_INTERFACE,
-	0x01,
-	0x01,				// bmCapabilities = device handles call management
-	0x01,				// bDataInterface
-// ACM functional descriptor
-	0x04,
-	CS_INTERFACE,
-	0x02,
-	0x02,				// bmCapabilities
-// union functional descriptor
-	0x05,
-	CS_INTERFACE,
-	0x06,
-	0x00,				// bMasterInterface
-	0x01,				// bSlaveInterface0
-// notification EP
-	0x07,
-	DESC_ENDPOINT,
-	INT_IN_EP,			// bEndpointAddress
-	0x03,				// bmAttributes = intr
-	LE_WORD(8),			// wMaxPacketSize
-	0x0A,				// bInterval
-// data class interface descriptor
-	0x09,
-	DESC_INTERFACE,
-	0x01,				// bInterfaceNumber
-	0x00,				// bAlternateSetting
-	0x02,				// bNumEndPoints
-	0x0A,				// bInterfaceClass = data
-	0x00,				// bInterfaceSubClass
-	0x00,				// bInterfaceProtocol
-	0x00,				// iInterface
-// data EP OUT
-	0x07,
-	DESC_ENDPOINT,
-	BULK_OUT_EP,			// bEndpointAddress
-	0x02,				// bmAttributes = bulk
-	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
-	0x00,				// bInterval
-// data EP in
-	0x07,
-	DESC_ENDPOINT,
-	BULK_IN_EP,			// bEndpointAddress
-	0x02,				// bmAttributes = bulk
-	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
-	0x00,				// bInterval
-
-	// string descriptors
-	0x04,
-	DESC_STRING,
-	LE_WORD(0x0409),
-
-	0x0E,
-	DESC_STRING,
-	'L', 0, 'P', 0, 'C', 0, 'U', 0, 'S', 0, 'B', 0,
-
-	0x14,
-	DESC_STRING,
-	'U', 0, 'S', 0, 'B', 0, 'S', 0, 'e', 0, 'r', 0, 'i', 0, 'a', 0, 'l', 0,
-
-	0x12,
-	DESC_STRING,
-	'A', 0, 'B', 0, 'S', 0, 'M', 0, 'o', 0, 't', 0, 'o', 0, 'r', 0,
-
-// terminating zero
-	0
-};
-
-
-/**
-	Local function to handle incoming bulk data
-
-	@param [in] bEP
-	@param [in] bEPStatus
- */
-static void BulkOut(unsigned char bEP, unsigned char bEPStatus)
-{
-	int i, iLen;
-	long lHigherPriorityTaskWoken = pdFALSE;
-
-	(void) bEPStatus;
-
-	// get data from USB into intermediate buffer
-	iLen = USBHwEPRead(bEP, abBulkBuf, sizeof(abBulkBuf));
-	for (i = 0; i < iLen; i++) {
-		// put into queue
-		xQueueSendFromISR(xRxedChars, &(abBulkBuf[ i ]), &lHigherPriorityTaskWoken);
-	}
-
-	portEND_SWITCHING_ISR(lHigherPriorityTaskWoken);
-}
-
-
-/**
-	Local function to handle outgoing bulk data
-
-	@param [in] bEP
-	@param [in] bEPStatus
- */
-static void BulkIn(unsigned char bEP, unsigned char bEPStatus)
-{
-	int i, iLen;
-	long lHigherPriorityTaskWoken = pdFALSE;
-
-	(void) bEPStatus;
-
-	if (uxQueueMessagesWaitingFromISR(xCharsForTx) == 0) {
-		// no more data, disable further NAK interrupts until next USB frame
-		USBHwNakIntEnable(0);
-		return;
-	}
-
-	// get bytes from transmit FIFO into intermediate buffer
-	for (i = 0; i < MAX_PACKET_SIZE; i++) {
-		if (xQueueReceiveFromISR(xCharsForTx, (&abBulkBuf[i]), &lHigherPriorityTaskWoken) != pdPASS) {
-			break;
-		}
-	}
-	iLen = i;
-
-	// send over USB
-	if (iLen > 0) {
-		USBHwEPWrite(bEP, abBulkBuf, iLen);
-	}
-
-	portEND_SWITCHING_ISR(lHigherPriorityTaskWoken);
-}
-
-
-/**
-	Local function to handle the USB-CDC class requests
-
-	@param [in] pSetup
-	@param [out] piLen
-	@param [out] ppbData
- */
-static BOOL HandleClassRequest(TSetupPacket *pSetup, int *piLen, unsigned char **ppbData)
-{
-	switch (pSetup->bRequest) {
-
-		// set line coding
-	case SET_LINE_CODING:
-		DBG("SET_LINE_CODING\n");
-		memcpy((unsigned char *)&LineCoding, *ppbData, 7);
-		*piLen = 7;
-		DBG("dwDTERate=%u, bCharFormat=%u, bParityType=%u, bDataBits=%u\n",
-		    LineCoding.dwDTERate,
-		    LineCoding.bCharFormat,
-		    LineCoding.bParityType,
-		    LineCoding.bDataBits);
-		break;
-
-		// get line coding
-	case GET_LINE_CODING:
-		DBG("GET_LINE_CODING\n");
-		*ppbData = (unsigned char *) & LineCoding;
-		*piLen = 7;
-		break;
-
-		// set control line state
-	case SET_CONTROL_LINE_STATE:
-		// bit0 = DTR, bit = RTS
-		DBG("SET_CONTROL_LINE_STATE %X\n", pSetup->wValue);
-		break;
-
-	default:
-		return FALSE;
-	}
-	return TRUE;
-}
-
-
-/**
-	Writes one character to VCOM port
-
-	@param [in] c character to write
-	@returns character written, or EOF if character could not be written
- */
-int VCOM_putchar(int c)
-{
-	char cc = (char) c;
-
-	if (xQueueSend(xCharsForTx, &cc, usbMAX_SEND_BLOCK) == pdPASS) {
-		return c;
-	} else {
-		return EOF;
-	}
-}
-
-
-/**
-	Reads one character from VCOM port
-
-	@returns character read, or EOF if character could not be read
- */
-int VCOM_getchar(void)
-{
-	unsigned char c;
-
-	/* Block the task until a character is available. */
-	xQueueReceive(xRxedChars, &c, portMAX_DELAY);
-	return c;
-}
-
-
-/**
-	Interrupt handler
-
-	Simply calls the USB ISR
- */
-void USB_IRQHandler(void)
-{
-	USBHwISR();
-}
-
-
-static void USBFrameHandler(unsigned short wFrame)
-{
-	(void) wFrame;
-
-	if (uxQueueMessagesWaitingFromISR(xCharsForTx) > 0) {
-		// data available, enable NAK interrupt on bulk in
-		USBHwNakIntEnable(INACK_BI);
-	}
-}
-
-unsigned long CPUcpsie(void)
-{
-	unsigned long ulRet;
-
-	//
-	// Read PRIMASK and enable interrupts.
-	//
-	__asm("    mrs     %0, PRIMASK\n"
-	      "    cpsie   i\n"
-	      "    bx      lr\n"
-      : "=r"(ulRet));
-
-	//
-	// The return is handled in the inline assembly, but the compiler will
-	// still complain if there is not an explicit return here (despite the fact
-	// that this does not result in any code being produced because of the
-	// naked attribute).
-	//
-	return(ulRet);
-}
-
-void vUSBTask(void *pvParameters)
-{
-	//int c;
-	portTickType xLastFlashTime;
-
-	/* Just to prevent compiler warnings about the unused parameter. */
-	(void) pvParameters;
-	DBG("Initialising USB stack\n");
-
-	xRxedChars = xQueueCreate(usbRXBUFFER_LEN, sizeof(char));
-	xCharsForTx = xQueueCreate(usbTXBUFFER_LEN, sizeof(char));
-
-	if ((xRxedChars == NULL) || (xCharsForTx == NULL)) {
-		/* Not enough heap available to create the buffer queues, can't do
-		anything so just delete ourselves. */
-		vTaskDelete(NULL);
-	}
-
-
-	// initialise stack
-	USBInit();
-
-	// register descriptors
-	USBRegisterDescriptors(abDescriptors);
-
-	// register class request handler
-	USBRegisterRequestHandler(REQTYPE_TYPE_CLASS, HandleClassRequest, abClassReqData);
-
-	// register endpoint handlers
-	USBHwRegisterEPIntHandler(INT_IN_EP, NULL);
-	USBHwRegisterEPIntHandler(BULK_IN_EP, BulkIn);
-	USBHwRegisterEPIntHandler(BULK_OUT_EP, BulkOut);
-
-	// register frame handler
-	USBHwRegisterFrameHandler(USBFrameHandler);
-
-	// enable bulk-in interrupts on NAKs
-	USBHwNakIntEnable(INACK_BI);
-
-	DBG("Starting USB communication\n");
-
-	NVIC_SetPriority(USB_IRQn, configUSB_INTERRUPT_PRIORITY);
-	NVIC_EnableIRQ(USB_IRQn);
-
-	// connect to bus
-
-	DBG("Connecting to USB bus\n");
-	USBHwConnect(TRUE);
-	
-	xLastFlashTime = xTaskGetTickCount();
-	
-	// echo any character received (do USB stuff in interrupt)
-	for (;;) {
-	//	c = VCOM_getchar();
-	//	if (c != EOF) {
-	//		// Echo character back with INCREMENT_ECHO_BY offset, so for example if
-	//		// INCREMENT_ECHO_BY is 1 and 'A' is received, 'B' will be echoed back.
-	//		VCOM_putchar(c + INCREMENT_ECHO_BY);
-	//	}
-		vTaskDelayUntil(&xLastFlashTime, 1000 / portTICK_RATE_MS);
-	}
-}
-
diff --git a/gyro_board/src/usb/LPCUSB/USB_SENSOR_STREAM.c b/gyro_board/src/usb/LPCUSB/USB_SENSOR_STREAM.c
deleted file mode 100644
index af1eede..0000000
--- a/gyro_board/src/usb/LPCUSB/USB_SENSOR_STREAM.c
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
-	LPCUSB, an USB device driver for LPC microcontrollers
-	Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl)
-
-	Redistribution and use in source and binary forms, with or without
-	modification, are permitted provided that the following conditions are met:
-
-	1. Redistributions of source code must retain the above copyright
-	   notice, this list of conditions and the following disclaimer.
-	2. Redistributions in binary form must reproduce the above copyright
-	   notice, this list of conditions and the following disclaimer in the
-	   documentation and/or other materials provided with the distribution.
-	3. The name of the author may not be used to endorse or promote products
-	   derived from this software without specific prior written permission.
-
-	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-	IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-	OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-	DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-	THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-	THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "task.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include "usbapi.h"
-#include "usbdebug.h"
-#include "usbstruct.h"
-
-#include "LPC17xx.h"
-
-#define usbMAX_SEND_BLOCK		( 20 / portTICK_RATE_MS )
-#define usbRXBUFFER_LEN			( 80 )
-#define usbTXBUFFER_LEN			( 600 )
-
-#define INT_IN_EP		0x81 //read manual for picking these...
-#define INT_OUT_EP		0x04
-#define BULK_IN_EP		0x82
-#define BULK_OUT_EP		0x05
-
-#define MAX_PACKET_SIZE	64
-
-#define LE_WORD(x)		((x)&0xFF),((x)>>8)
-
-static xQueueHandle xRxedChars = NULL, xCharsForTx = NULL;
-
-static const unsigned char abDescriptors[] = {
-
-// device descriptor
-	0x12,
-	DESC_DEVICE,
-	LE_WORD(0x0101),		// bcdUSB
-	0xFF,				// bDeviceClass
-	0x00,				// bDeviceSubClass
-	0x00,				// bDeviceProtocol
-	MAX_PACKET_SIZE0,		// bMaxPacketSize
-	LE_WORD(0x1424),		// idVendor
-	LE_WORD(0xd243),		// idProduct
-	LE_WORD(0x0153),		// bcdDevice
-	0x03,				// iManufacturer
-	0x36,				// iProduct
-	0x33,				// iSerialNumber
-	0x01,				// bNumConfigurations
-
-// configuration descriptor
-	0x09,
-	DESC_CONFIGURATION,
-	LE_WORD(67),			// wTotalLength
-	0x01,				// bNumInterfaces
-	0x01,				// bConfigurationValue
-	0x00,				// iConfiguration
-	0xC0,				// bmAttributes
-	0x32,				// bMaxPower
-// data class interface descriptor
-	0x09,
-	DESC_INTERFACE,
-	0x00,				// bInterfaceNumber
-	0x00,				// bAlternateSetting
-	0x04,				// bNumEndPoints
-	0x0A,				// bInterfaceClass = data
-	0x00,				// bInterfaceSubClass
-	0x00,				// bInterfaceProtocol
-	0x00,				// iInterface
-// debug EP OUT
-	0x07,
-	DESC_ENDPOINT,
-	BULK_OUT_EP,			// bEndpointAddress
-	0x02,				// bmAttributes = bulk
-	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
-	0x00,				// bInterval
-// debug EP in
-	0x07,
-	DESC_ENDPOINT,
-	BULK_IN_EP,			// bEndpointAddress
-	0x02,				// bmAttributes = bulk
-	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
-	0x00,				// bInterval
-// data EP OUT
-	0x07,
-	DESC_ENDPOINT,
-	INT_OUT_EP,			// bEndpointAddress
-	0x03,				// bmAttributes = intr
-	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
-	0x01,				// bInterval
-// data EP in
-	0x07,
-	DESC_ENDPOINT,
-	INT_IN_EP,			// bEndpointAddress
-	0x03,				// bmAttributes = intr
-	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
-	0x01,				// bInterval
-
-	// string descriptors
-	0x04,
-	DESC_STRING,
-	LE_WORD(0x0409),
-
-	0x0E,
-	DESC_STRING,
-	'L', 0, 'P', 0, 'C', 0, 'U', 0, 'S', 0, 'B', 0,
-
-	0x14,
-	DESC_STRING,
-	'U', 0, 'S', 0, 'B', 0, 'S', 0, 'e', 0, 'r', 0, 'i', 0, 'a', 0, 'l', 0,
-
-	0x12,
-	DESC_STRING,
-	'A', 0, 'B', 0, 'S', 0, 'M', 0, 'o', 0, 't', 0, 'o', 0, 'r', 0,
-
-// terminating zero
-	0
-};
-
-
-/**
- * Local function to handle incoming bulk data
- *
- * @param [in] bEP
- * @param [in] bEPStatus
- */
-static void DebugOut(unsigned char bEP, unsigned char bEPStatus) {
-  int i, iLen;
-  long lHigherPriorityTaskWoken = pdFALSE;
-  unsigned char abBulkBuf[64];
-
-  (void) bEPStatus;
-
-  // get data from USB into intermediate buffer
-  iLen = USBHwEPRead(bEP, abBulkBuf, sizeof(abBulkBuf));
-  for (i = 0; i < iLen; i++) {
-    // put into queue
-    xQueueSendFromISR(xRxedChars, &(abBulkBuf[ i ]), &lHigherPriorityTaskWoken);
-  }
-
-  portEND_SWITCHING_ISR(lHigherPriorityTaskWoken);
-}
-
-
-/**
- * Local function to handle outgoing bulk data
- *
- * @param [in] bEP
- * @param [in] bEPStatus
- */
-static void DebugIn(unsigned char bEP, unsigned char bEPStatus) {
-  int i, iLen;
-  long lHigherPriorityTaskWoken = pdFALSE;
-  unsigned char abBulkBuf[64];
-
-  (void) bEPStatus;
-
-  if (uxQueueMessagesWaitingFromISR(xCharsForTx) == 0) {
-    // no more data, disable further NAK interrupts until next USB frame
-    USBHwNakIntEnable(INACK_II);
-    return;
-  }
-
-  // get bytes from transmit FIFO into intermediate buffer
-  for (i = 0; i < MAX_PACKET_SIZE; i++) {
-    if (xQueueReceiveFromISR(xCharsForTx, (&abBulkBuf[i]),
-                             &lHigherPriorityTaskWoken) != pdPASS) {
-      break;
-    }
-  }
-  iLen = i;
-
-  // send over USB
-  if (iLen > 0) {
-    USBHwEPWrite(bEP, abBulkBuf, iLen);
-  }
-
-  portEND_SWITCHING_ISR(lHigherPriorityTaskWoken);
-}
-
-extern int64_t gyro_angle;
-static unsigned char abDataBuf[64];
-int VCOM_putcharFromISR(int c, long *woken);
-static void DataOut(unsigned char bEP, unsigned char bEPStatus) {
-  int iLen;
-  long lHigherPriorityTaskWoken = pdFALSE;
-  char *a = "hello\n";
-  while(*a){
-    VCOM_putcharFromISR(*a,&lHigherPriorityTaskWoken);
-    a ++;
-  }
-  iLen = USBHwEPRead(bEP, abDataBuf, sizeof(abDataBuf));
-  portEND_SWITCHING_ISR(lHigherPriorityTaskWoken);
-}
-static void DataIn(unsigned char bEP, unsigned char bEPStatus) {
-  long lHigherPriorityTaskWoken = pdFALSE;
-  unsigned char buff[16];
-  memcpy(buff, &gyro_angle, sizeof(gyro_angle));
-  USBHwEPWrite(bEP, buff, sizeof(gyro_angle));
-  portEND_SWITCHING_ISR(lHigherPriorityTaskWoken);
-}
-
-/**
- * Writes one character to VCOM port
- *
- * @param [in] c character to write
- * @returns character written, or EOF if character could not be written
- */
-int VCOM_putcharFromISR(int c, long *lHigherPriorityTaskWoken) {
-  char cc = (char) c;
-
-  if (xQueueSendFromISR(xCharsForTx, &cc,
-                        lHigherPriorityTaskWoken) == pdPASS) {
-    return c;
-  } else {
-    return EOF;
-  }
-}
-
-int VCOM_putchar(int c) {
-  char cc = (char) c;
-
-  // Don't block if not connected to USB.
-  if (xQueueSend(xCharsForTx, &cc,
-                 USBIsConnected() ? usbMAX_SEND_BLOCK : 0) == pdPASS) {
-    return c;
-  } else {
-    return EOF;
-  }
-}
-
-
-/**
- * Reads one character from VCOM port
- *
- * @returns character read, or EOF if character could not be read
- */
-int VCOM_getchar(void) {
-  unsigned char c;
-
-  /* Block the task until a character is available. */
-  if(xQueueReceive(xRxedChars, &c, 0) == pdTRUE){  //portMAX_DELAY);
-    return c;
-  }
-  return -1;
-}
-
-
-/**
- * Interrupt handler
- *
- * Simply calls the USB ISR
- */
-void USB_IRQHandler(void) {
-	USBHwISR();
-}
-
-
-static void USBFrameHandler(unsigned short wFrame) {
-  (void) wFrame;
-
-	if (uxQueueMessagesWaitingFromISR(xCharsForTx) > 0) {
-		// data available, enable NAK interrupt on bulk in
-		USBHwNakIntEnable(INACK_BI);
-	}
-}
-
-void vUSBTask(void *pvParameters) {
-  portTickType xLastFlashTime;
-
-  /* Just to prevent compiler warnings about the unused parameter. */
-  (void) pvParameters;
-  DBG("Initialising USB stack\n");
-
-  xRxedChars = xQueueCreate(usbRXBUFFER_LEN, sizeof(char));
-  xCharsForTx = xQueueCreate(usbTXBUFFER_LEN, sizeof(char));
-
-  if ((xRxedChars == NULL) || (xCharsForTx == NULL)) {
-    /* Not enough heap available to create the buffer queues, can't do
-       anything so just delete ourselves. */
-    vTaskDelete(NULL);
-  }
-
-  // initialise stack
-  USBInit();
-
-  // register descriptors
-  USBRegisterDescriptors(abDescriptors);
-
-  // register class request handler
-  //USBRegisterRequestHandler(REQTYPE_TYPE_CLASS,
-  //                          HandleClassRequest, abClassReqData);
-
-  // register endpoint handlers
-  USBHwRegisterEPIntHandler(INT_IN_EP, DataIn);
-  USBHwRegisterEPIntHandler(INT_OUT_EP, DataOut);
-  USBHwRegisterEPIntHandler(BULK_IN_EP, DebugIn);
-  USBHwRegisterEPIntHandler(BULK_OUT_EP, DebugOut);
-
-  // register frame handler
-  USBHwRegisterFrameHandler(USBFrameHandler);
-
-  // enable bulk-in interrupts on NAKs
-  USBHwNakIntEnable(INACK_BI);
-
-  DBG("Starting USB communication\n");
-
-  NVIC_SetPriority(USB_IRQn, configUSB_INTERRUPT_PRIORITY);
-  NVIC_EnableIRQ(USB_IRQn);
-
-  // connect to bus
-
-  DBG("Connecting to USB bus\n");
-  USBHwConnect(TRUE);
-
-  xLastFlashTime = xTaskGetTickCount();
-
-  vTaskDelayUntil(&xLastFlashTime, 1000 / portTICK_RATE_MS * 100);
-
-  //USBHwAllowConnect();
-  // echo any character received (do USB stuff in interrupt)
-  for (;;) {
-    //	c = VCOM_getchar();
-    //	if (c != EOF) {
-    //		// Echo character back with INCREMENT_ECHO_BY offset, so for example if
-    //		// INCREMENT_ECHO_BY is 1 and 'A' is received, 'B' will be echoed back.
-    //		VCOM_putchar(c + INCREMENT_ECHO_BY);
-    //	}
-    vTaskDelayUntil(&xLastFlashTime, 1000 / portTICK_RATE_MS);
-  }
-}
-
diff --git a/gyro_board/src/usb/LPCUSB/usbhw_lpc.c b/gyro_board/src/usb/LPCUSB/usbhw_lpc.c
index 8229371..e39a636 100644
--- a/gyro_board/src/usb/LPCUSB/usbhw_lpc.c
+++ b/gyro_board/src/usb/LPCUSB/usbhw_lpc.c
@@ -59,7 +59,7 @@
 
 	@param [in]	dwIntr		Bitmask of interrupts to wait for
  */
-static void Wait4DevInt(unsigned long dwIntr)
+void Wait4DevInt(unsigned long dwIntr)
 {
 	// wait for specific interrupt
 	while ((USB->USBDevIntSt & dwIntr) != dwIntr);
@@ -107,7 +107,7 @@
 
 	@return the data
  */
-static unsigned char USBHwCmdRead(unsigned char bCmd)
+unsigned char USBHwCmdRead(unsigned char bCmd)
 {
 	// write command code
 	USBHwCmd(bCmd);
@@ -458,6 +458,8 @@
 	// endpoint interrupt
 	if (dwStatus & EP_SLOW) {
 		// clear EP_SLOW
+    // TODO(brians): The manual says that this should happen after clearing
+    // stuff using USBEpIntClr.
 		USB->USBDevIntClr = EP_SLOW;
 		// check all endpoints
 		for (i = 0; i < 32; i++) {
diff --git a/gyro_board/src/usb/Makefile b/gyro_board/src/usb/Makefile
index a87936e..a66848c 100644
--- a/gyro_board/src/usb/Makefile
+++ b/gyro_board/src/usb/Makefile
@@ -4,17 +4,25 @@
 
 CSRC=main.c
 
-GCC_PATH=/usr/local/cortex-m3/bin
+# See if /opt/cortex-m3 exists first, because that's the preferred location. If
+# not, fall back to /usr/local/cortex-m3.
+ifneq ($(wildcard /opt/cortex-m3),)
+	TOOLS_PREFIX=/opt/cortex-m3
+else
+	TOOLS_PREFIX=/usr/local/cortex-m3
+endif
+GCC_PATH=$(TOOLS_PREFIX)/bin
 
 PORT=/dev/ttyUSB0
 
 CC=$(GCC_PATH)/arm-eabi-gcc
 LD=$(GCC_PATH)/arm-eabi-ld
 OBJCOPY=$(GCC_PATH)/arm-eabi-objcopy
+OBJDUMP=$(GCC_PATH)/arm-eabi-objdump
 AS=$(GCC_PATH)/arm-eabi-as
 FLASHER=lpc21isp
 
-CFLAGS=-I. -I./FreeRTOS/include -I./FreeRTOS/portable/GCC/ARM_CM3/ -I./CommonDemoTasks/include -Os -mcpu=cortex-m3 -mthumb -Wl,--gc-sections -ffunction-sections -Wl,-static -Werror
+CFLAGS=-I. -I./FreeRTOS/include -I./FreeRTOS/portable/GCC/ARM_CM3/ -I./CommonDemoTasks/include -O3 -mcpu=cortex-m3 -mthumb -Wl,--gc-sections -ffunction-sections -Wl,-static -Werror
 
 SPEED=38400
 OSC=12000
@@ -27,35 +35,51 @@
 	FreeRTOS/portable/MemMang/heap_2.c \
 	alloc.c \
 	analog.c \
+	digital.c \
+	encoder.c \
+	gyro.c \
+	CAN.c \
 	FreeRTOS/portable/GCC/ARM_CM3/port.c \
 	FreeRTOS/tasks.c \
 	FreeRTOS/list.c \
 	FreeRTOS/queue.c \
-	CAN.c \
 	LPCUSB/usbinit.c \
 	LPCUSB/usbcontrol.c \
-	LPCUSB/USB_SENSOR_STREAM.c \
 	LPCUSB/usbhw_lpc.c \
-	spi.c \
-	LPCUSB/usbstdreq.c
+	LPCUSB/usbstdreq.c \
+	usb_device.c \
+
+DATA_STRUCT_CHECKSUM=$(shell ./data_struct_checksum.sh)
 
 all: $(NAME).hex
 
 $(NAME).elf: Makefile $(SOURCES:.c=.o) $(LDSCRIPT)
-	$(CC) $(CFLAGS) -nostartfiles -nostdlib -T $(LDSCRIPT) -o $@ -L/usr/local/cortex-m3/lib/gcc/arm-eabi/4.5.1/ $(SOURCES:.c=.o) -Wa,-Map -Wa,main.map -lgcc
+	$(CC) $(CFLAGS) -nostartfiles -nostdlib -T $(LDSCRIPT) -o $@ -L$(TOOLS_PREFIX)/lib/gcc/arm-eabi/4.5.1/ $(SOURCES:.c=.o) -Wa,-Map -Wa,main.map -lgcc
 
-%.o: %.c Makefile
-	$(CC) $(CFLAGS) -nostartfiles -nostdlib -c -o $@ $< -Wall -std=gnu99
+%.o: %.c Makefile data_struct_checksum.sh
+	$(CC) $(CFLAGS) -nostartfiles -nostdlib -c -o $@ $< -Wall -std=gnu99 -DDATA_STRUCT_CHECKSUM=$(DATA_STRUCT_CHECKSUM)
 
 run: deploy
-	$(FLASHER) -termonly $(NAME).hex $(PORT) $(SPEED) $(OSC)
+	$(FLASHER) -termonly -control $(NAME).hex $(PORT) $(SPEED) $(OSC)
 
 deploy: all $(NAME).hex
-	$(FLASHER) -hex -verify $(NAME).hex $(PORT) $(SPEED) $(OSC)
+	# TODO(aschuh): Figure out why the verify fails (or remove it) and then
+	# remove the -.
+	-$(FLASHER) -hex -verify -control $(NAME).hex $(PORT) $(SPEED) $(OSC)
+
+reset: deploy
+	# Echo an ESC into it to immediately exit the terminal.
+	`which echo` -e '\e' | $(FLASHER) -termonly -control $(PORT) $(SPEED) $(OSC)
 
 cat:
 	@cd ../../bin; python serial_looper.py
 
+assm.S: $(NAME).elf
+	$(OBJDUMP) -D -S $(NAME).elf > $@
+# So that you can see the assembly for an individual file with any comments etc.
+%.s: %.c Makefile
+	$(CC) $(CFLAGS) -nostartfiles -nostdlib -S -o $@ $< -Wall -std=gnu99
+
 %.hex: %.elf Makefile
 	$(OBJCOPY) -O ihex $< $@
 
diff --git a/gyro_board/src/usb/ParTest.c b/gyro_board/src/usb/ParTest.c
index 67f3a45..fa979cd 100644
--- a/gyro_board/src/usb/ParTest.c
+++ b/gyro_board/src/usb/ParTest.c
@@ -74,12 +74,9 @@
 {
         /* LEDs on port 2. */
         GPIO2->FIODIR |= partstFIO1_BITS;
-        //GPIO0->FIODIR = LED_4;
 
         /* Start will all LEDs off. */
-        GPIO2->FIOCLR = partstFIO1_BITS;
-        //GPIO0->FIOSET = LED_4;
-	//PINCON->PINMODE0 = (PINCON->PINMODE0 & 0xfffffff0) | 0x00000001;
+        GPIO2->FIOSET = partstFIO1_BITS;
 }
 /*-----------------------------------------------------------*/
 
@@ -116,4 +113,3 @@
         }
 }
 /*-----------------------------------------------------------*/
-
diff --git a/gyro_board/src/usb/README b/gyro_board/src/usb/README
new file mode 100644
index 0000000..bfd7f00
--- /dev/null
+++ b/gyro_board/src/usb/README
@@ -0,0 +1,18 @@
+Encoder 0: Wrist
+Encoder 1: Shooter
+Encoder 2: angle adjust
+Encoder 3: Indexer
+
+DIO 1: Bottom beam break
+DIO 2: Top beam break
+DIO 3: Wrist Hall Effect
+DIO 4: Angle Adjust Hall Effect
+DIO 5: NOP
+DIO 6: NOP
+DIO 7: Right Drive
+DIO 8: Right Drive
+DIO 9: Left Drive
+DIO 10: Left Drive
+DIO 11: NOP
+DIO 12: NOP
+
diff --git a/gyro_board/src/usb/analog.c b/gyro_board/src/usb/analog.c
index 9e67dd5..7968094 100644
--- a/gyro_board/src/usb/analog.c
+++ b/gyro_board/src/usb/analog.c
@@ -1,220 +1,81 @@
-// ****************************************************************************
-// CopyLeft qwerk Robotics unINC. 2010 All Rights Reserved.
-// ****************************************************************************
+#include "analog.h"
 
-// ****************************************************************************
-// **************** IO Pin Setup
-// ****************************************************************************
-
+#include "LPC17xx.h"
 #include "FreeRTOS.h"
 
-void analog_init (void)
-{
-	// b[1:0] CAN RD1 p0.0
-	// b[3:2] CAN TD1 p0.1
-	//PINCON->PINSEL0 = 0x00000005;
+static int discarded_samples[4];
 
-	// b[29:28] USB_DMIN 	p0.30
-	// b[27:26] USB_DPLUS	p0.29
-	// b[21:20] AD0.3	p0.26
-	// b[19:18] AD0.2	p0.25
-	// PINCON->PINSEL1 = 0x14140000;
+static uint16_t raw_analog(int channel) {
+  uint32_t value;
+  switch (channel) {
+    case 0:
+      value = ADC->ADDR0;
+      break;
+    case 1:
+      value = ADC->ADDR1;
+      break;
+    case 2:
+      value = ADC->ADDR2;
+      break;
+    case 3:
+      value = ADC->ADDR3;
+      break;
+  }
 
-	// PINCON->PINSEL2 = 0x0;
-
-	// b[31:30] AD0.5	p1.31
-	// b[29:28] V_BUS	p1.30
-	// b[21:20] MCOB1	p1.26
-	// b[19:18] MCOA1	p1.25
-	// b[15:14] MCI1	p1.23
-	// b[13:12] MCOB0	p1.22
-	// b[09:08] MCI0	p1.20
-	// b[07:06] MCOA0	p1.19
-	// b[05:04] USB_UP_LED	p1.18
-	//PINCON->PINSEL3 = 0xE0145150;
-	SC->PCONP |= PCONP_PCAD;
-
-	// Enable AD0.0, AD0.1, AD0.2, AD0.3
-	PINCON->PINSEL1 &= 0xFFC03FFF;
-	PINCON->PINSEL1 |= 0x00D54000;
-	ADC->ADCR = 0x00200500;
+  return (value >> 4) & 0xFFF;
 }
 
-// ****************************************************************************
-// **************** ADC Functions
-// ****************************************************************************
+void TIMER1_IRQHandler(void) {
+  TIM1->IR = 1 << 0;  // clear channel 0 match
 
+  static const int kBadSampleThreshold = 175;
+  static const int kMaxBadSamples = 4;
 
-// **************** macros
-// starts convertion [26:24] = 001
-
-// **************** functions
-int analog(int channel)
-{
-	ADC->ADCR = ((ADC->ADCR & 0xF8FFFF00) | (0x01000000 | (1 << channel)));
-
-	// Poll until it is done.
-	while(!(ADC->ADGDR & 0x80000000));
-
-	return ((ADC->ADGDR & 0x0000FFF0) >> 4);
-}
-// GPIO1 P0.4
-// GPIO2 P0.5
-// GPIO3 P0.6
-// GPIO4 P0.7
-// GPIO5 P0.8
-// GPIO6 P0.9
-// GPIO7 P2.0
-// GPIO8 P2.1
-// GPIO9 P2.2
-// GPIO10 P2.3
-// GPIO11 P2.4
-// GPIO12 P2.5
-
-// DIP0 P1.29
-// DIP1 P2.13
-// DIP2 P0.11
-// DIP3 P0.10
-#define readGPIO(gpio,chan) ((((gpio)->FIOPIN) >> (chan)) & 1)
-inline int readGPIO_inline(int major,int minor){
-	switch(major){
-		case 0:
-			return readGPIO(GPIO0,minor);
-		case 1:
-			return readGPIO(GPIO1,minor);
-		case 2:
-			return readGPIO(GPIO2,minor);
-		default:
-			return -1;
-	}
-}
-int digital(int channel)
-{
-	if(channel < 1){
-		return -1;
-	}else if(channel < 7){
-		int chan = channel + 3;
-		return readGPIO(GPIO0,chan);
-	}else if(channel < 13){
-		int chan = channel - 7;
-		return readGPIO(GPIO2,chan);
-	}
-	return -1;
-}
-int dip(int channel)
-{
-	switch(channel){
-		case 0:
-			return readGPIO(GPIO1,29);
-		case 1:
-			return readGPIO(GPIO2,13);
-		case 2:
-			return readGPIO(GPIO0,11);
-		case 3:
-			return readGPIO(GPIO0,10);
-		default:
-			return -1;
-
-	}
-}
-//ENC0A 1.20
-//ENC0B 1.23
-//ENC1A 2.11
-//ENC1B 2.12
-//ENC2A 0.21
-//ENC2B 0.22
-//ENC3A 0.19
-//ENC3B 0.20
-
-#define ENC(gpio,a,b) readGPIO(gpio,a) * 2 + readGPIO(gpio,b)
-int encoder_bits(int channel)
-{
-	switch(channel){
-		case 0:
-			return ENC(GPIO1,20,23);
-		case 1:
-			return ENC(GPIO2,11,12);
-		case 2:	
-			return ENC(GPIO0,21,22);
-		case 3:	
-			return ENC(GPIO0,19,20);
-		default:
-			return -1;
-	}
-	return -1;
+  static const uint32_t kBitShift = 16;
+  static const uint32_t kA =
+      (1.0 - 0.8408964152537146 /*0.5^0.25*/) * (1 << kBitShift) + 0.5;
+  for (int i = 0; i < 4; ++i) {
+    uint16_t current = raw_analog(i);
+    uint16_t average = averaged_values[i];
+    if ((current - average) < -kBadSampleThreshold ||
+        (current - average) > kBadSampleThreshold) {
+      ++discarded_samples[i];
+      if (discarded_samples[i] >= kMaxBadSamples) {
+        discarded_samples[i] = 0;
+        averaged_values[i] = current;
+      }
+    } else {
+      discarded_samples[i] = 0;
+      averaged_values[i] =
+          ((uint32_t)current * kA +
+           (uint32_t)average * ((1 << kBitShift) - kA)) >> kBitShift;
+    }
+  }
 }
 
-volatile int32_t encoder1_val;
-void encoder_init(void)
-{
-// port 0
-	// Setup the encoder interface.
-	SC->PCONP |= PCONP_PCQEI;
-	PINCON->PINSEL3 = ((PINCON->PINSEL3 & 0xffff3dff) | 0x00004100);
+void analog_init(void) {
+  SC->PCONP |= PCONP_PCAD;
 
-	// Reset the count and velocity
-	QEI->QEICON = 0x00000005;
+  // Enable AD0.0, AD0.1, AD0.2, and AD0.3 (0.23 - 0.26).
+  PINCON->PINSEL1 &= ~(3 << 14 | 3 << 16 | 3 << 18 | 3 << 20);
+  PINCON->PINSEL1 |= 1 << 14 | 1 << 16 | 1 << 18 | 1 << 20;
+  PINCON->PINMODE1 &= ~(3 << 14 | 3 << 16 | 3 << 18 | 3 << 20);
+  PINCON->PINMODE1 |= 2 << 14 | 2 << 16 | 2 << 18 | 2 << 20;
 
-	QEI->QEICONF = 0x00000004;
-	// Wrap back to 0 when we wrap the int...
-	QEI->QEIMAXPOS = 0xffffffff;
-// port 1
-	NVIC_EnableIRQ(EINT1_IRQn);
-	NVIC_EnableIRQ(EINT2_IRQn);
-	//NVIC_EnableIRQ(EINT3_IRQn);
-	//PINSEL4 23/22 0 1
-	//PINSEL4 25 24 0 1
-	PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 22)) | (0x1 << 22);
-	PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 24)) | (0x1 << 24);
+  ADC->ADCR = (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3) /* enable all 4 */ |
+      79 << 8 /* takes 208us to scan through all 4 */ |
+      1 << 16 /* enable burst mode */ |
+      1 << 21 /* turn on ADC */;
 
-	//EXTMODE 1 2 1 1 // all others off
-	SC->EXTMODE = 0x6;
-	SC->EXTINT = 0x6;
-	encoder1_val = 0;
-//ports 2 and 3
-	
-
+  // Set up the timer for the low-pass filter.
+  SC->PCONP |= 1 << 2;
+  TIM1->PR = (configCPU_CLOCK_HZ / 2000) - 1;
+  TIM1->TC = 0;  // don't match the first time around
+  TIM1->MR0 = 1;  // match every time it wraps
+  TIM1->MCR = 1 << 0 | 1 << 1;  // interrupt and reset on match channel 0
+  // Priority 4 is higher than any FreeRTOS-managed stuff (ie USB), but lower
+  // than encoders etc.
+  NVIC_SetPriority(TIMER1_IRQn, 4);
+  NVIC_EnableIRQ(TIMER1_IRQn);
+  TIM1->TCR = 1;  // enable it
 }
-void EINT1_IRQHandler(void){
-	//ENC1A 2.11
-	int stored_val = encoder1_val;
-	int fiopin = GPIO2->FIOPIN;
-	if(((fiopin >> 1) ^ fiopin) & 0x800){
-		stored_val ++;
-	}else{
-		stored_val --;
-	}
-	encoder1_val = stored_val;
-	SC->EXTPOLAR ^= 0x2;   
-	SC->EXTINT = 0x2;
-}
-void EINT2_IRQHandler(void){
-	//ENC1B 2.12
-	int stored_val = encoder1_val;
-	int fiopin = GPIO2->FIOPIN;
-	if(((fiopin >> 1) ^ fiopin) & 0x800){
-		stored_val --;
-	}else{
-		stored_val ++;
-	}
-	encoder1_val = stored_val;
-	SC->EXTPOLAR ^= 0x4;   
-	SC->EXTINT = 0x4;
-}
-void EINT3_IRQHandler(void){
-	
-}
-int32_t encoder_val(int chan)
-{
-	switch(chan){
-		case 0:
-			return (int32_t)QEI->QEIPOS;
-		case 1:
-			return encoder1_val;
-		case 2:
-		case 3:
-		default:
-			return -1;
-	}
-}
-
diff --git a/gyro_board/src/usb/analog.h b/gyro_board/src/usb/analog.h
index e9704f6..a77ee65 100644
--- a/gyro_board/src/usb/analog.h
+++ b/gyro_board/src/usb/analog.h
@@ -1,11 +1,24 @@
 #ifndef __ANALOG_H__
 #define __ANALOG_H__
 
-void analog_init (void);
-int analog(int chan);
-int digital(int chan);
-int encoder_bits(int chan);
-void encoder_init(void);
-int32_t encoder_val(int chan);
-int dip(int chan);
-#endif // __ANALOG_H__
+#include <stdint.h>
+
+// Internal variable for holding the averaged value. USE analog TO GET TO THIS
+// IN CASE IT CHANGES!
+uint16_t averaged_values[4];
+
+// Starts the hardware constantly doing conversions on all 4 of our analog
+// inputs.
+void analog_init(void);
+
+// Retrieves the most recent reading on channel (0-3).
+// Returns 0xFFFF for invalid channel.
+// 0 means 0V and 0xFFF means 3.3V.
+// These values are run through a low-pass filter with unreasonable readings
+// discarded first.
+static inline uint16_t analog(int channel) {
+  if (channel < 0 || channel > 3) return 0xFFFF;
+  return averaged_values[channel];
+}
+
+#endif  // __ANALOG_H__
diff --git a/gyro_board/src/usb/data_struct.h b/gyro_board/src/usb/data_struct.h
new file mode 100644
index 0000000..975084a
--- /dev/null
+++ b/gyro_board/src/usb/data_struct.h
@@ -0,0 +1,148 @@
+// This isn't really a header file. It's designed to be #included directly into
+// other code (possibly in a namespace or whatever), so it doesn't have include
+// guards.
+// This means that it can not #include anything else because it (sometimes) gets
+// #included inside a namespace.
+// <stdint.h> must be #included by the containing file.
+// In the gyro board code, fill_packet.h #includes this file.
+// In the fitpc code, frc971/input/gyro_board_data.h #includes this file.
+
+#pragma pack(push, 1)
+// Be careful with declaration order in here. ARM doesn't like unaligned
+// accesses!
+struct DATA_STRUCT_NAME {
+  int64_t gyro_angle;
+
+  union {
+    struct {
+      // This is the USB frame number for this data. It (theoretically) gets
+      // incremented on every packet sent, but the gyro board will deal with it
+      // correctly if it misses a frame or whatever by tracking the frame
+      // numbers sent out by the host.
+      // Negative numbers mean that the gyro board has no idea what the right
+      // answer is.
+      // This value going down at all indicates that the code on the gyro board
+      // dealing with it reset.
+      //
+      // The USB 2.0 standard says that timing of frames is 1.000ms +- 500ns.
+      // Testing with a fitpc and gyro board on 2013-10-30 by Brian gave 10us
+      // (the resolution of the timer on the gyro board that was used) of drift
+      // every 90-130 frames (~100ns per frame) and no jitter (and the timer on
+      // the gyro board isn't necessarily that good). This is plenty accurate
+      // for what we need for timing, so this number is what the code uses to do
+      // all timing calculations.
+      int32_t frame_number;
+
+      // Checksum of this file calculated with sum(1).
+      // The gyro board sets this and then the fitpc checks it to make sure that
+      // they're both using the same version of this file.
+      uint16_t checksum;
+
+      // Which robot (+version) the gyro board is sending out data for.
+      // We should keep this in the same place for all gyro board software
+      // versions so that the fitpc can detect when it's reading from a gyro
+      // board set up for a different robot (or version) than it is.
+      // The numbers listed below each robot are the values that have been used
+      // for it.
+      //
+      // 2013 competition/practice robot
+      //   0
+      //   2 added battery measurement + drivetrain analog hall effects
+      // 2013 3rd robot
+      //   1
+      uint8_t robot_id;
+      // This information should also be kept in the same place from year to
+      // year so that the fitpc code can record the dip switch values when it
+      // detects the wrong robot id to make debugging easier.
+      union {
+        struct {
+          uint8_t dip_switch0 : 1;
+          uint8_t dip_switch1 : 1;
+          uint8_t dip_switch2 : 1;
+          uint8_t dip_switch3 : 1;
+        };
+        uint8_t dip_switches;
+      };
+      struct {
+        // If the current gyro_angle has been not updated because of a bad
+        // reading from the sensor.
+        uint8_t old_gyro_reading : 1;
+        // If we're not going to get any more good gyro_angles.
+        uint8_t bad_gyro : 1;
+
+        // We're not sure what frame number this packet was sent in.
+        uint8_t unknown_frame : 1;
+      };
+    };
+    struct {
+      uint64_t header0, header1;
+    };
+  };
+
+  // We are 64-bit aligned at this point.
+
+  union {
+    struct {
+      int32_t left_drive;
+      int32_t right_drive;
+      int32_t shooter_angle;
+      int32_t shooter;
+      int32_t indexer;
+      int32_t wrist;
+
+      int32_t capture_top_rise;
+      int32_t capture_top_fall;
+      int32_t capture_bottom_fall_delay;
+      int32_t capture_wrist_rise;
+      int32_t capture_shooter_angle_rise;
+
+      uint16_t battery_voltage;
+      uint16_t left_drive_hall;
+      uint16_t right_drive_hall;
+
+      int8_t top_rise_count;
+
+      int8_t top_fall_count;
+
+      int8_t bottom_rise_count;
+
+      int8_t bottom_fall_delay_count;
+      int8_t bottom_fall_count;
+
+      int8_t wrist_rise_count;
+
+      int8_t shooter_angle_rise_count;
+
+      struct {
+        uint8_t wrist_hall_effect : 1;
+        uint8_t angle_adjust_bottom_hall_effect : 1;
+        uint8_t top_disc : 1;
+        uint8_t bottom_disc : 1;
+        uint8_t loader_top : 1;
+        uint8_t loader_bottom : 1;
+      };
+    } main;
+    
+    struct {
+      union {
+        struct {
+        };
+        uint16_t booleans;
+      };
+    } bot3;
+  };
+};
+#pragma pack(pop)
+
+// This is how big the isochronous packets that we're going to send are.
+// This number is more painful to change than the actual size of the struct
+// because the code on both ends has to agree on this (or at least that's what
+// Brian found empirically 2013-10-24).
+#define DATA_STRUCT_SEND_SIZE 128
+
+#ifdef __cplusplus
+// TODO(brians): Consider using C1X's _Static_assert once we have a compiler
+// (GCC 4.6) + flags that support it.
+static_assert(sizeof(DATA_STRUCT_NAME) <= DATA_STRUCT_SEND_SIZE,
+              "The sensor data structure is too big.");
+#endif  // defined(__cplusplus)
diff --git a/gyro_board/src/usb/data_struct_checksum.sh b/gyro_board/src/usb/data_struct_checksum.sh
new file mode 100755
index 0000000..147a365
--- /dev/null
+++ b/gyro_board/src/usb/data_struct_checksum.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+sum $(dirname $0)/data_struct.h | sed 's/^\([0-9]*\) .*$/\1/'
diff --git a/gyro_board/src/usb/digital.c b/gyro_board/src/usb/digital.c
new file mode 100644
index 0000000..c468173
--- /dev/null
+++ b/gyro_board/src/usb/digital.c
@@ -0,0 +1,34 @@
+#include "digital.h"
+
+inline int readGPIO_inline(int major, int minor) {
+  switch (major) {
+    case 0:
+      return readGPIO(GPIO0, minor);
+    case 1:
+      return readGPIO(GPIO1, minor);
+    case 2:
+      return readGPIO(GPIO2, minor);
+    default:
+      return -1;
+  }
+}
+
+int dip_switch(int channel) {
+  switch (channel) {
+    case 0:
+      return readGPIO(GPIO1, 29);
+    case 1:
+      return readGPIO(GPIO2, 13);
+    case 2:
+      return readGPIO(GPIO0, 11);
+    case 3:
+      return readGPIO(GPIO0, 10);
+    default:
+      return -1;
+  }
+}
+
+int is_bot3;
+void digital_init(void) {
+  is_bot3 = 0;
+}
diff --git a/gyro_board/src/usb/digital.h b/gyro_board/src/usb/digital.h
new file mode 100644
index 0000000..3792038
--- /dev/null
+++ b/gyro_board/src/usb/digital.h
@@ -0,0 +1,59 @@
+#ifndef GYRO_BOARD_USB_DIGITAL_H_
+#define GYRO_BOARD_USB_DIGITAL_H_
+
+#include "FreeRTOS.h"
+
+#define readGPIO(gpio, chan) ((((gpio)->FIOPIN) >> (chan)) & 1)
+
+// These are the actual pin numbers for all of the digital I(/0) pins on the
+// board.
+//
+// GPIO1 P0.4
+// GPIO2 P0.5
+// GPIO3 P0.6
+// GPIO4 P0.7
+// GPIO5 P0.8
+// GPIO6 P0.9
+// GPIO7 P2.0
+// GPIO8 P2.1
+// GPIO9 P2.2
+// GPIO10 P2.3
+// GPIO11 P2.4
+// GPIO12 P2.5
+//
+// DIP0 P1.29
+// DIP1 P2.13
+// DIP2 P0.11
+// DIP3 P0.10
+//
+// ENC0A 1.20
+// ENC0B 1.23
+// ENC1A 2.11
+// ENC1B 2.12
+// ENC2A 0.21
+// ENC2B 0.22
+// ENC3A 0.19
+// ENC3B 0.20
+
+void digital_init(void);
+
+inline int digital(int channel) {
+  if (channel < 1) {
+    return -1;
+  } else if (channel < 7) {
+    int chan = channel + 3;
+    return readGPIO(GPIO0, chan);
+  } else if (channel < 13) {
+    int chan = channel - 7;
+    return readGPIO(GPIO2, chan);
+  }
+  return -1;
+}
+
+int dip_switch(int channel);
+
+// Boolean set by digital_init() which says whether or not this is the 3rd
+// robot.
+extern int is_bot3;
+
+#endif  // GYRO_BOARD_USB_DIGITAL_H_
diff --git a/gyro_board/src/usb/encoder.c b/gyro_board/src/usb/encoder.c
new file mode 100644
index 0000000..c9155d4
--- /dev/null
+++ b/gyro_board/src/usb/encoder.c
@@ -0,0 +1,560 @@
+#include "fill_packet.h"
+#include "encoder.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#include "digital.h"
+#include "analog.h"
+#include "gyro.h"
+
+// How long (in ms) to wait after a falling edge on the bottom indexer sensor
+// before reading the indexer encoder.
+static const int kBottomFallDelayTime = 32;
+
+#define ENC(gpio, a, b) readGPIO(gpio, a) * 2 + readGPIO(gpio, b)
+int encoder_bits(int channel) {
+  switch (channel) {
+    case 0:
+      return ENC(GPIO1, 20, 23);
+    case 1:
+      return ENC(GPIO2, 11, 12);
+    case 2:  
+      return ENC(GPIO0, 21, 22);
+    case 3:  
+      return ENC(GPIO0, 19, 20);
+    default:
+      return -1;
+  }
+  return -1;
+}
+#undef ENC
+
+// Uses EINT1 and EINT2 on 2.11 and 2.12.
+volatile int32_t encoder1_val;
+// On GPIO pins 0.22 and 0.21.
+volatile int32_t encoder2_val;
+// On GPIO pins 0.20 and 0.19.
+volatile int32_t encoder3_val;
+// On GPIO pins 2.0 and 2.1.
+volatile int32_t encoder4_val;
+// On GPIO pins 2.2 and 2.3.
+volatile int32_t encoder5_val;
+
+// It is important to clear the various interrupt flags first thing in the ISRs.
+// It doesn't seem to work otherwise, possibly because of the reason that Brian
+// found poking around online: caches on the bus make it so that the clearing of
+// the interrupt gets to the NVIC after the ISR returns, so it runs the ISR a
+// second time. Also, by clearing them early, if a second interrupt arrives from
+// the same source it will still get handled instead of getting lost.
+
+// ENC1A 2.11
+void EINT1_IRQHandler(void) {
+  // Make sure to change this BEFORE clearing the interrupt like the datasheet
+  // says you have to.
+  SC->EXTPOLAR ^= 0x2;
+  SC->EXTINT = 0x2;
+  int fiopin = GPIO2->FIOPIN;
+  // This looks like a weird way to XOR the 2 inputs, but it compiles down to
+  // just 2 instructions, which is hard to beat.
+  if (((fiopin >> 1) ^ fiopin) & 0x800) {
+    ++encoder1_val;
+  } else {
+    --encoder1_val;
+  }
+}
+// ENC1B 2.12
+void EINT2_IRQHandler(void) {
+  SC->EXTPOLAR ^= 0x4;
+  SC->EXTINT = 0x4;
+  int fiopin = GPIO2->FIOPIN;
+  if (((fiopin >> 1) ^ fiopin) & 0x800) {
+    --encoder1_val;
+  } else {
+    ++encoder1_val;
+  }
+}
+
+// TODO(brians): Have this indicate some kind of error instead of just looping
+// infinitely in the ISR because it never clears it.
+static void NoGPIO(void) {}
+static void Encoder2ARise(void) {
+  GPIOINT->IO0IntClr = (1 << 22);
+  if (GPIO0->FIOPIN & (1 << 21)) {
+    ++encoder2_val;
+  } else {
+    --encoder2_val;
+  }
+}
+static void Encoder2AFall(void) {
+  GPIOINT->IO0IntClr = (1 << 22);
+  if (GPIO0->FIOPIN & (1 << 21)) {
+    --encoder2_val;
+  } else {
+    ++encoder2_val;
+  }
+}
+static void Encoder2BRise(void) {
+  GPIOINT->IO0IntClr = (1 << 21);
+  if (GPIO0->FIOPIN & (1 << 22)) {
+    --encoder2_val;
+  } else {
+    ++encoder2_val;
+  }
+}
+static void Encoder2BFall(void) {
+  GPIOINT->IO0IntClr = (1 << 21);
+  if (GPIO0->FIOPIN & (1 << 22)) {
+    ++encoder2_val;
+  } else {
+    --encoder2_val;
+  }
+}
+
+static void Encoder3ARise(void) {
+  GPIOINT->IO0IntClr = (1 << 20);
+  if (GPIO0->FIOPIN & (1 << 19)) {
+    ++encoder3_val;
+  } else {
+    --encoder3_val;
+  }
+}
+static void Encoder3AFall(void) {
+  GPIOINT->IO0IntClr = (1 << 20);
+  if (GPIO0->FIOPIN & (1 << 19)) {
+    --encoder3_val;
+  } else {
+    ++encoder3_val;
+  }
+}
+static void Encoder3BRise(void) {
+  GPIOINT->IO0IntClr = (1 << 19);
+  if (GPIO0->FIOPIN & (1 << 20)) {
+    --encoder3_val;
+  } else {
+    ++encoder3_val;
+  }
+}
+static void Encoder3BFall(void) {
+  GPIOINT->IO0IntClr = (1 << 19);
+  if (GPIO0->FIOPIN & (1 << 20)) {
+    ++encoder3_val;
+  } else {
+    --encoder3_val;
+  }
+}
+
+static void Encoder4ARise(void) {
+  GPIOINT->IO2IntClr = (1 << 0);
+  if (GPIO2->FIOPIN & (1 << 1)) {
+    ++encoder4_val;
+  } else {
+    --encoder4_val;
+  }
+}
+static void Encoder4AFall(void) {
+  GPIOINT->IO2IntClr = (1 << 0);
+  if (GPIO2->FIOPIN & (1 << 1)) {
+    --encoder4_val;
+  } else {
+    ++encoder4_val;
+  }
+}
+static void Encoder4BRise(void) {
+  GPIOINT->IO2IntClr = (1 << 1);
+  if (GPIO2->FIOPIN & (1 << 0)) {
+    --encoder4_val;
+  } else {
+    ++encoder4_val;
+  }
+}
+static void Encoder4BFall(void) {
+  GPIOINT->IO2IntClr = (1 << 1);
+  if (GPIO2->FIOPIN & (1 << 0)) {
+    ++encoder4_val;
+  } else {
+    --encoder4_val;
+  }
+}
+
+static void Encoder5ARise(void) {
+  GPIOINT->IO2IntClr = (1 << 2);
+  if (GPIO2->FIOPIN & (1 << 3)) {
+    ++encoder5_val;
+  } else {
+    --encoder5_val;
+  }
+}
+static void Encoder5AFall(void) {
+  GPIOINT->IO2IntClr = (1 << 2);
+  if (GPIO2->FIOPIN & (1 << 3)) {
+    --encoder5_val;
+  } else {
+    ++encoder5_val;
+  }
+}
+static void Encoder5BRise(void) {
+  GPIOINT->IO2IntClr = (1 << 3);
+  if (GPIO2->FIOPIN & (1 << 2)) {
+    --encoder5_val;
+  } else {
+    ++encoder5_val;
+  }
+}
+static void Encoder5BFall(void) {
+  GPIOINT->IO2IntClr = (1 << 3);
+  if (GPIO2->FIOPIN & (1 << 2)) {
+    ++encoder5_val;
+  } else {
+    --encoder5_val;
+  }
+}
+
+volatile int32_t capture_top_rise;
+volatile int8_t top_rise_count;
+static void IndexerTopRise(void) {
+  GPIOINT->IO0IntClr = (1 << 5);
+  // edge counting   encoder capture
+  ++top_rise_count;
+  capture_top_rise = encoder3_val;
+}
+volatile int32_t capture_top_fall;
+volatile int8_t top_fall_count;
+static void IndexerTopFall(void) {
+  GPIOINT->IO0IntClr = (1 << 5);
+  // edge counting   encoder capture
+  ++top_fall_count;
+  capture_top_fall = encoder3_val;
+}
+volatile int8_t bottom_rise_count;
+static void IndexerBottomRise(void) {
+  GPIOINT->IO0IntClr = (1 << 4);
+  // edge counting
+  ++bottom_rise_count;
+}
+volatile int32_t capture_bottom_fall_delay;
+volatile int8_t bottom_fall_delay_count;
+portTickType xDelayTimeFrom;
+static portTASK_FUNCTION(vDelayCapture, pvParameters)
+{
+  portTickType xSleepFrom = xTaskGetTickCount();
+
+  for (;;) {
+    // Atomically (wrt the ISR) switch xDelayTimeFrom to 0 and store its old
+    // value to use later.
+    NVIC_DisableIRQ(EINT3_IRQn);
+    portTickType new_time = xDelayTimeFrom;
+    xDelayTimeFrom = 0;
+    NVIC_EnableIRQ(EINT3_IRQn);
+
+    if (new_time != 0) {
+      xSleepFrom = new_time;
+
+      vTaskDelayUntil(&xSleepFrom, kBottomFallDelayTime / portTICK_RATE_MS);
+
+      // Make sure that the USB ISR doesn't look at inconsistent values.
+      NVIC_DisableIRQ(USB_IRQn);
+      capture_bottom_fall_delay = encoder3_val;
+      ++bottom_fall_delay_count;
+      NVIC_EnableIRQ(USB_IRQn);
+    } else {
+      // Wait 10ms and then check again.
+      vTaskDelayUntil(&xSleepFrom, 10 / portTICK_RATE_MS);
+    }
+  }
+}
+
+volatile int8_t bottom_fall_count;
+static void IndexerBottomFall(void) {
+  GPIOINT->IO0IntClr = (1 << 4);
+  ++bottom_fall_count;
+  // edge counting   start delayed capture
+  xDelayTimeFrom = xTaskGetTickCount();
+}
+volatile int32_t capture_wrist_rise;
+volatile int8_t wrist_rise_count;
+static void WristHallRise(void) {
+  GPIOINT->IO0IntClr = (1 << 6);
+  // edge counting   encoder capture
+  ++wrist_rise_count;
+  capture_wrist_rise = (int32_t)QEI->QEIPOS;
+}
+volatile int32_t capture_shooter_angle_rise;
+volatile int8_t shooter_angle_rise_count;
+static void ShooterHallRise(void) {
+  GPIOINT->IO0IntClr = (1 << 7);
+  // edge counting   encoder capture
+  ++shooter_angle_rise_count;
+  capture_shooter_angle_rise = encoder2_val; 
+}
+
+// Count leading zeros.
+// Returns 0 if bit 31 is set etc.
+__attribute__((always_inline)) static __INLINE uint32_t __clz(uint32_t value) {
+  uint32_t result;
+  __asm__("clz %0, %1" : "=r" (result) : "r" (value));
+  return result;
+}
+inline static void IRQ_Dispatch(void) {
+  // There is no need to add a loop here to handle multiple interrupts at the
+  // same time because the processor has tail chaining of interrupts which we
+  // can't really beat with our own loop.
+  // It would actually be bad because a loop here would block EINT1/2 for longer
+  // lengths of time.
+
+  uint32_t index = __clz(GPIOINT->IO2IntStatR | GPIOINT->IO0IntStatR |
+      (GPIOINT->IO2IntStatF << 28) | (GPIOINT->IO0IntStatF << 4));
+
+  typedef void (*Handler)(void);
+  const static Handler table[] = {
+    Encoder5BFall,     // index 0: P2.3 Fall     #bit 31  //Encoder 5 B  //Dio 10
+    Encoder5AFall,     // index 1: P2.2 Fall     #bit 30  //Encoder 5 A  //Dio 9
+    Encoder4BFall,     // index 2: P2.1 Fall     #bit 29  //Encoder 4 B  //Dio 8
+    Encoder4AFall,     // index 3: P2.0 Fall     #bit 28  //Encoder 4 A  //Dio 7
+    NoGPIO,            // index 4: NO GPIO       #bit 27
+    Encoder2AFall,     // index 5: P0.22 Fall    #bit 26  //Encoder 2 A
+    Encoder2BFall,     // index 6: P0.21 Fall    #bit 25  //Encoder 2 B
+    Encoder3AFall,     // index 7: P0.20 Fall    #bit 24  //Encoder 3 A
+    Encoder3BFall,     // index 8: P0.19 Fall    #bit 23  //Encoder 3 B
+    Encoder2ARise,     // index 9: P0.22 Rise    #bit 22  //Encoder 2 A
+    Encoder2BRise,     // index 10: P0.21 Rise   #bit 21  //Encoder 2 B
+    Encoder3ARise,     // index 11: P0.20 Rise   #bit 20  //Encoder 3 A
+    Encoder3BRise,     // index 12: P0.19 Rise   #bit 19  //Encoder 3 B
+    NoGPIO,            // index 13: NO GPIO      #bit 18
+    NoGPIO,            // index 14: NO GPIO      #bit 17
+    NoGPIO,            // index 15: NO GPIO      #bit 16
+    NoGPIO,            // index 16: NO GPIO      #bit 15
+    NoGPIO,            // index 17: NO GPIO      #bit 14
+    NoGPIO,            // index 18: NO GPIO      #bit 13
+    NoGPIO,            // index 19: NO GPIO      #bit 12
+    ShooterHallRise,   // index 20: P0.7 Fall    #bit 11  //Shooter Hall   //Dio 4
+    WristHallRise,     // index 21: P0.6 Fall    #bit 10  //Wrist Hall     //Dio 3
+    IndexerTopRise,    // index 22: P0.5 Fall    #bit 9   //Indexer Top    //Dio 2
+    IndexerBottomRise, // index 23: P0.4 Fall    #bit 8   //Indexer Bottom //Dio 1
+    NoGPIO,            // index 24: NO GPIO      #bit 7
+    NoGPIO,            // index 25: NO GPIO      #bit 6
+    IndexerTopFall,    // index 26: P0.5 Rise    #bit 5   //Indexer Top    //Dio 2
+    IndexerBottomFall, // index 27: P0.4 Rise    #bit 4   //Indexer Bottom //Dio 1
+    Encoder5BRise,     // index 28: P2.3 Rise    #bit 3   //Encoder 5 B    //Dio 10
+    Encoder5ARise,     // index 29: P2.2 Rise    #bit 2   //Encoder 5 A    //Dio 9
+    Encoder4BRise,     // index 30: P2.1 Rise    #bit 1   //Encoder 4 B    //Dio 8
+    Encoder4ARise,     // index 31: P2.0 Rise    #bit 0   //Encoder 4 A    //Dio 7
+    NoGPIO             // index 32: NO BITS SET  #False Alarm
+  };
+  table[index]();
+}
+void EINT3_IRQHandler(void) {
+  IRQ_Dispatch();
+}
+int32_t encoder_val(int chan) {
+  int32_t val;
+  switch (chan) {
+    case 0: // Wrist
+      return (int32_t)QEI->QEIPOS;
+    case 1: // Shooter Wheel
+      NVIC_DisableIRQ(EINT1_IRQn);
+      NVIC_DisableIRQ(EINT2_IRQn);
+      val = encoder1_val;
+      NVIC_EnableIRQ(EINT2_IRQn);
+      NVIC_EnableIRQ(EINT1_IRQn);
+      return val;
+    case 2: // Shooter Angle
+      NVIC_DisableIRQ(EINT3_IRQn);
+      val = encoder2_val;
+      NVIC_EnableIRQ(EINT3_IRQn);
+      return val;
+    case 3: // Indexer
+      NVIC_DisableIRQ(EINT3_IRQn);
+      val = encoder3_val;
+      NVIC_EnableIRQ(EINT3_IRQn);
+      return val;
+    case 4: // Drive R
+      NVIC_DisableIRQ(EINT3_IRQn);
+      val = encoder4_val;
+      NVIC_EnableIRQ(EINT3_IRQn);
+      return val;
+    case 5: // Drive L
+      NVIC_DisableIRQ(EINT3_IRQn);
+      val = encoder5_val;
+      NVIC_EnableIRQ(EINT3_IRQn);
+      return val;
+    default:
+      return -1;
+  }
+}
+
+static volatile uint32_t sensor_timing_wraps = 0;
+
+void encoder_init(void) {
+  // Setup the encoder interface.
+  SC->PCONP |= PCONP_PCQEI;
+  PINCON->PINSEL3 = ((PINCON->PINSEL3 & 0xffff3dff) | 0x00004100);
+  // Reset the count and velocity.
+  QEI->QEICON = 0x00000005;
+  QEI->QEICONF = 0x00000004;
+  // Wrap back to 0 when we wrap the int and vice versa.
+  QEI->QEIMAXPOS = 0xFFFFFFFF;
+
+  // Set up encoder 1.
+  // Make GPIOs 2.11 and 2.12 trigger EINT1 and EINT2 (respectively).
+  // PINSEL4[23:22] = {0 1}
+  // PINSEL4[25:24] = {0 1}
+  PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 22)) | (0x1 << 22);
+  PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 24)) | (0x1 << 24);
+  // Clear the interrupt flags for EINT1 and EINT2 (0x6 = 0b0110).
+  SC->EXTMODE = 0x6;
+  SC->EXTINT = 0x6;
+  NVIC_EnableIRQ(EINT1_IRQn);
+  NVIC_EnableIRQ(EINT2_IRQn);
+  encoder1_val = 0;
+
+  // Set up encoder 2.
+  GPIOINT->IO0IntEnF |= (1 << 22);  // Set GPIO falling interrupt.
+  GPIOINT->IO0IntEnR |= (1 << 22);  // Set GPIO rising interrupt.
+  GPIOINT->IO0IntEnF |= (1 << 21);  // Set GPIO falling interrupt.
+  GPIOINT->IO0IntEnR |= (1 << 21);  // Set GPIO rising interrupt.
+  // Make sure they're in mode 00 (the default, aka nothing special).
+  PINCON->PINSEL1 &= ~(0x3 << 12);
+  PINCON->PINSEL1 &= ~(0x3 << 10);
+  encoder2_val = 0;
+
+  // Set up encoder 3.
+  GPIOINT->IO0IntEnF |= (1 << 20);  // Set GPIO falling interrupt.
+  GPIOINT->IO0IntEnR |= (1 << 20);  // Set GPIO rising interrupt.
+  GPIOINT->IO0IntEnF |= (1 << 19);  // Set GPIO falling interrupt.
+  GPIOINT->IO0IntEnR |= (1 << 19);  // Set GPIO rising interrupt.
+  // Make sure they're in mode 00 (the default, aka nothing special).
+  PINCON->PINSEL1 &= ~(0x3 << 8);
+  PINCON->PINSEL1 &= ~(0x3 << 6);
+  encoder3_val = 0;
+
+  // Set up encoder 4.
+  GPIOINT->IO2IntEnF |= (1 << 0);  // Set GPIO falling interrupt.
+  GPIOINT->IO2IntEnR |= (1 << 0);  // Set GPIO rising interrupt.
+  GPIOINT->IO2IntEnF |= (1 << 1);  // Set GPIO falling interrupt.
+  GPIOINT->IO2IntEnR |= (1 << 1);  // Set GPIO rising interrupt.
+  // Make sure they're in mode 00 (the default, aka nothing special).
+  PINCON->PINSEL4 &= ~(0x3 << 0);
+  PINCON->PINSEL4 &= ~(0x3 << 2);
+  encoder4_val = 0;
+
+  // Set up encoder 5.
+  GPIOINT->IO2IntEnF |= (1 << 2);  // Set GPIO falling interrupt.
+  GPIOINT->IO2IntEnR |= (1 << 2);  // Set GPIO rising interrupt.
+  GPIOINT->IO2IntEnF |= (1 << 3);  // Set GPIO falling interrupt.
+  GPIOINT->IO2IntEnR |= (1 << 3);  // Set GPIO rising interrupt.
+  // Make sure they're in mode 00 (the default, aka nothing special).
+  PINCON->PINSEL4 &= ~(0x3 << 4);
+  PINCON->PINSEL4 &= ~(0x3 << 6);
+  encoder5_val = 0;
+
+  // Enable interrupts from the GPIO pins.
+  NVIC_EnableIRQ(EINT3_IRQn);
+
+  if (is_bot3) {
+  } else {  // is main robot
+    xTaskCreate(vDelayCapture,
+                (signed char *) "SENSORs",
+                configMINIMAL_STACK_SIZE + 100,
+                NULL /*parameters*/,
+                tskIDLE_PRIORITY + 5,
+                NULL /*return task handle*/);
+
+    GPIOINT->IO0IntEnF |= (1 << 4);  // Set GPIO falling interrupt
+    GPIOINT->IO0IntEnR |= (1 << 4);  // Set GPIO rising interrupt
+    PINCON->PINSEL0 &= ~(0x3 << 8);
+
+    GPIOINT->IO0IntEnF |= (1 << 5);  // Set GPIO falling interrupt
+    GPIOINT->IO0IntEnR |= (1 << 5);  // Set GPIO rising interrupt
+    PINCON->PINSEL0 &= ~(0x3 << 10);
+
+    GPIOINT->IO0IntEnF |= (1 << 6);
+    PINCON->PINSEL0 &= ~(0x3 << 12);
+
+    GPIOINT->IO0IntEnF |= (1 << 7);
+    PINCON->PINSEL0 &= ~(0x3 << 14);
+  }
+}
+
+void fillSensorPacket(struct DataStruct *packet) {
+  if (gyro_output.initialized) {
+    packet->gyro_angle = gyro_output.angle;
+    packet->old_gyro_reading = gyro_output.last_reading_bad;
+    packet->bad_gyro = gyro_output.gyro_bad;
+  } else {
+    packet->gyro_angle = 0;
+    packet->old_gyro_reading = 1;
+    packet->bad_gyro = 0;
+  }
+
+  packet->checksum = DATA_STRUCT_CHECKSUM;
+
+  packet->dip_switch0 = dip_switch(0);
+  packet->dip_switch1 = dip_switch(1);
+  packet->dip_switch2 = dip_switch(2);
+  packet->dip_switch3 = dip_switch(3);
+
+  // We disable EINT3 to avoid sending back inconsistent values. All of the
+  // aligned reads from the variables are atomic, so disabling it isn't
+  // necessary for just reading encoder values. We re-enable it periodically
+  // because disabling and enabling is cheap (2 instructions) and we really rely
+  // on low interrupt latencies.
+
+  if (is_bot3) {
+    packet->robot_id = 1;
+  } else {  // is main robot
+    packet->robot_id = 2;
+
+    packet->main.shooter = encoder1_val;
+    packet->main.left_drive = encoder5_val;
+    packet->main.right_drive = encoder4_val;
+    packet->main.indexer = encoder3_val;
+
+    NVIC_DisableIRQ(EINT3_IRQn);
+
+    packet->main.wrist = (int32_t)QEI->QEIPOS;
+    packet->main.wrist_hall_effect = !digital(3);
+    packet->main.capture_wrist_rise = capture_wrist_rise;
+    packet->main.wrist_rise_count = wrist_rise_count;
+
+    NVIC_EnableIRQ(EINT3_IRQn);
+    NVIC_DisableIRQ(EINT3_IRQn);
+
+    packet->main.capture_top_rise = capture_top_rise;
+    packet->main.top_rise_count = top_rise_count;
+    packet->main.capture_top_fall = capture_top_fall;
+    packet->main.top_fall_count = top_fall_count;
+    packet->main.top_disc = !digital(2);
+
+    NVIC_EnableIRQ(EINT3_IRQn);
+    NVIC_DisableIRQ(EINT3_IRQn);
+
+    packet->main.capture_bottom_fall_delay = capture_bottom_fall_delay;
+    packet->main.bottom_fall_delay_count = bottom_fall_delay_count;
+    packet->main.bottom_fall_count = bottom_fall_count;
+    packet->main.bottom_rise_count = bottom_rise_count;
+    packet->main.bottom_disc = !digital(1);
+
+    NVIC_EnableIRQ(EINT3_IRQn);
+    NVIC_DisableIRQ(EINT3_IRQn);
+
+    packet->main.loader_top = !digital(5);
+    packet->main.loader_bottom = !digital(6);
+
+    NVIC_EnableIRQ(EINT3_IRQn);
+    NVIC_DisableIRQ(EINT3_IRQn);
+
+    packet->main.shooter_angle = encoder2_val;
+    packet->main.capture_shooter_angle_rise = capture_shooter_angle_rise;
+    packet->main.shooter_angle_rise_count = shooter_angle_rise_count;
+    packet->main.angle_adjust_bottom_hall_effect = !digital(4);
+
+    NVIC_EnableIRQ(EINT3_IRQn);
+
+    // Do all of the analogs last because they have the potential to be slow and
+    // jittery.
+    packet->main.battery_voltage = analog(1);
+    packet->main.left_drive_hall = analog(3);
+    packet->main.right_drive_hall = analog(2);
+  }
+}
diff --git a/gyro_board/src/usb/encoder.h b/gyro_board/src/usb/encoder.h
new file mode 100644
index 0000000..5b1f3ab
--- /dev/null
+++ b/gyro_board/src/usb/encoder.h
@@ -0,0 +1,16 @@
+#ifndef GYRO_BOARD_USB_ENCODER_H_
+#define GYRO_BOARD_USB_ENCODER_H_
+
+#include <stdint.h>
+
+void encoder_init(void);
+
+// For debugging only.
+// Returns the current values of the inputs for the given encoder (as the low 2
+// bits).
+int encoder_bits(int channel);
+
+// Returns the current position of the given encoder.
+int32_t encoder_val(int channel);
+
+#endif  // GYRO_BOARD_USB_ENCODER_H_
diff --git a/gyro_board/src/usb/fill_packet.h b/gyro_board/src/usb/fill_packet.h
new file mode 100644
index 0000000..9acc094
--- /dev/null
+++ b/gyro_board/src/usb/fill_packet.h
@@ -0,0 +1,16 @@
+#ifndef GYRO_BOARD_FILL_PACKET_H_
+#define GYRO_BOARD_FILL_PACKET_H_
+
+#include <stdint.h>
+
+#define DATA_STRUCT_NAME DataStruct
+#include "data_struct.h"
+#undef DATA_STRUCT_NAME
+
+// Gets called in the USB data output ISR. Assumes that it will not be preempted
+// except by very high priority things.
+//
+// Implemented in encoder.c because it depends on so many things in there.
+void fillSensorPacket(struct DataStruct *packet);
+
+#endif  // GYRO_BOARD_FILL_PACKET_H_
diff --git a/gyro_board/src/usb/gyro.c b/gyro_board/src/usb/gyro.c
new file mode 100644
index 0000000..40734ff
--- /dev/null
+++ b/gyro_board/src/usb/gyro.c
@@ -0,0 +1,344 @@
+#include "gyro.h"
+
+#include <stdio.h>
+#include <inttypes.h>
+
+#include "FreeRTOS.h"
+#include "task.h"
+#include "partest.h"
+
+struct GyroOutput gyro_output;
+
+static void gyro_disable_csel(void) {
+  // Set the CSEL pin high to deselect it.
+  GPIO0->FIOSET = 1 << 16;
+}
+
+static void gyro_enable_csel(void) {
+  // Clear the CSEL pin to select it.
+  GPIO0->FIOCLR = 1 << 16;
+}
+
+// Blocks until there is data available.
+static uint16_t spi_read(void) {
+  while (!(SSP0->SR & (1 << 2))) {}
+  return SSP0->DR;
+}
+
+// Blocks until there is space to enqueue data.
+static void spi_write(uint16_t data) {
+  while (!(SSP0->SR & (1 << 1))) {}
+  SSP0->DR = data;
+}
+
+static uint32_t do_gyro_read(uint32_t data, int *parity_error) {
+  *parity_error = 0;
+
+  gyro_enable_csel();
+  spi_write(data >> 16);
+  if (__builtin_parity(data & ~1) == 0) data |= 1;
+  spi_write(data);
+
+  uint16_t high_value = spi_read();
+  if (__builtin_parity(high_value) != 1) {
+    printf("high value 0x%"PRIx16" parity error\n", high_value);
+    *parity_error = 1;
+  }
+  uint16_t low_value = spi_read();
+  gyro_disable_csel();
+  uint32_t r = high_value << 16 | low_value;
+  if (__builtin_parity(r) != 1) {
+    printf("low value 0x%"PRIx16" parity error (r=%"PRIx32")\n", low_value, r);
+    *parity_error = 1;
+  }
+
+  return r;
+}
+
+// Returns all of the non-data bits in the "header" except the parity from
+// value.
+static uint8_t gyro_status(uint32_t value) {
+  return (value >> 26) & ~4;
+}
+
+// Returns all of the error bits in the "footer" from value.
+static uint8_t gyro_errors(uint32_t value) {
+  return (value >> 1) & 0x7F;
+}
+
+// Performs a read from the gyro.
+// Sets *bad_reading to 1 if the result is potentially bad and *bad_gyro to 1 if
+// the gyro is bad and we're not going to get any more readings.
+static int16_t gyro_read(int *bad_reading, int *bad_gyro) {
+  *bad_reading = *bad_gyro = 0;
+
+  int parity_error;
+  uint32_t value = do_gyro_read(0x20000000, &parity_error);
+
+  if (parity_error) {
+    *bad_reading = 1;
+    return 0;
+  }
+
+  // This check assumes that the sequence bits are all 0, but they should be
+  // because that's all we send.
+  if (gyro_status(value) != 1) {
+    uint8_t status = gyro_status(value);
+    if (status == 0) {
+      printf("gyro says sensor data is bad\n");
+    } else {
+      printf("gyro gave weird status 0x%"PRIx8"\n", status);
+    }
+    *bad_reading = 1;
+  }
+
+  if (gyro_errors(value) != 0) {
+    uint8_t errors = gyro_errors(value);
+    if (errors & ~(1 << 1)) {
+      *bad_reading = 1;
+      // Error 1 (continuous self-test error) will set status to 0 if it's bad
+      // enough by itself.
+    }
+    if (errors & (1 << 6)) {
+      printf("gyro PLL error\n");
+    }
+    if (errors & (1 << 5)) {
+      printf("gyro quadrature error\n");
+    }
+    if (errors & (1 << 4)) {
+      printf("gyro non-volatile memory error\n");
+      *bad_gyro = 1;
+    }
+    if (errors & (1 << 3)) {
+      printf("gyro volatile memory error\n");
+      *bad_gyro = 1;
+    }
+    if (errors & (1 << 2)) {
+      printf("gyro power error\n");
+    }
+    if (errors & (1 << 1)) {
+      printf("gyro continuous self-test error\n");
+    }
+    if (errors & 1) {
+      printf("gyro unexpected self check mode\n");
+    }
+  }
+  if (*bad_gyro) {
+    *bad_reading = 1;
+    return 0;
+  } else {
+    return -(int16_t)(value >> 10 & 0xFFFF);
+  }
+}
+
+// Returns 1 if the setup failed or 0 if it succeeded.
+static int gyro_setup(void) {
+  for (int i = 0; i < 100; ++i) {
+	  portTickType wait_time = xTaskGetTickCount();
+    int parity_error;
+
+    // Wait for it to start up.
+	  vTaskDelayUntil(&wait_time, 100 / portTICK_RATE_MS);
+    // Get it started doing a check.
+    uint32_t value = do_gyro_read(0x20000003, &parity_error);
+    if (parity_error) continue;
+    // Its initial response is hardcoded to 1.
+    if (value != 1) {
+      printf("gyro unexpected initial response 0x%"PRIx32"\n", value);
+      // There's a chance that we're retrying because of a parity error
+      // previously, so keep going.
+    }
+
+    // Wait for it to assert the fault conditions.
+	  vTaskDelayUntil(&wait_time, 50 / portTICK_RATE_MS);
+    // Dummy read to clear the old latched state.
+    do_gyro_read(0x20000000, &parity_error);
+    if (parity_error) continue;
+
+    // Wait for it to clear the fault conditions.
+	  vTaskDelayUntil(&wait_time, 50 / portTICK_RATE_MS);
+    value = do_gyro_read(0x20000000, &parity_error);
+    if (parity_error) continue;
+    // If it's not reporting self test data.
+    if (gyro_status(value) != 2) {
+      printf("gyro first value 0x%"PRIx32" not self test data\n", value);
+      continue;
+    }
+    // If we don't see all of the errors.
+    if (gyro_errors(value) != 0x7F) {
+      printf("gyro self test value 0x%"PRIx32" is bad\n", value);
+      return 1;
+    }
+
+    // Wait for the sequential transfer delay.
+	  vTaskDelayUntil(&wait_time, 1 / portTICK_RATE_MS);
+    value = do_gyro_read(0x20000000, &parity_error);
+    if (parity_error) continue;
+    // It should still be reporting self test data.
+    if (gyro_status(value) != 2) {
+      printf("gyro second value 0x%"PRIx32" not self test data\n", value);
+      continue;
+    }
+    return 0;
+  }
+  return 1;
+}
+
+static portTASK_FUNCTION(gyro_read_task, pvParameters) {
+  SC->PCONP |= PCONP_PCSSP0;
+
+  // Set up SSEL.
+  // It's is just a GPIO pin because we're the master (it would be special if we
+  // were a slave).
+  gyro_disable_csel();
+  GPIO0->FIODIR |= 1 << 16;
+  PINCON->PINSEL1 &= ~(3 << 0);
+  PINCON->PINSEL1 |= 0 << 0;
+
+  // Set up MISO0 and MOSI0.
+  PINCON->PINSEL1 &= ~(3 << 2 | 3 << 4);
+  PINCON->PINSEL1 |= 2 << 2 | 2 << 4;
+
+  // Set up SCK0.
+  PINCON->PINSEL0 &= ~(3 << 30);
+  PINCON->PINSEL0 |= (2 << 30);
+
+  // Make sure it's disabled.
+  SSP0->CR1 = 0;
+  SSP0->CR0 =
+      0xF /* 16 bit transfer */ |
+      0 << 4 /* SPI mode */ |
+      0 << 6 /* CPOL = 0 */ |
+      0 << 7 /* CPHA = 0 */;
+  // 14 clocks per cycle.  This works out to a ~7.2MHz bus.
+  // The gyro is rated for a maximum of 8.08MHz.
+  SSP0->CPSR = 14;
+  // Finally, enable it.
+  // This has to be done after we're done messing with everything else.
+  SSP0->CR1 |= 1 << 1;
+
+  if (gyro_setup()) {
+    printf("gyro setup failed. deleting task\n");
+    gyro_output.angle = 0;
+    gyro_output.last_reading_bad = gyro_output.gyro_bad = 1;
+    gyro_output.initialized = 1;
+    vTaskDelete(NULL);
+    return;
+  } else {
+    gyro_output.initialized = 1;
+  }
+
+  gyro_output.angle = 0;
+  gyro_output.last_reading_bad = 1;  // until we're started up
+  gyro_output.gyro_bad = 0;
+
+  // How many times per second to read the gyro value.
+  static const int kGyroReadFrequency = 200;
+  // How many times per second to flash the LED.
+  // Must evenly divide kGyroReadFrequency.
+  static const int kFlashFrequency = 10;
+
+  static const int kStartupCycles = kGyroReadFrequency * 2;
+  static const int kZeroingCycles = kGyroReadFrequency * 6;
+
+  // An accumulator for all of the values read while zeroing.
+  int32_t zero_bias = 0;
+
+  int startup_cycles_left = kStartupCycles;
+  int zeroing_cycles_left = kZeroingCycles;
+
+  // These are a pair that hold the offset calculated while zeroing.
+  // full_units_ is the base (in ticks) and remainder_ ranges between 0 and
+  // kZeroingCycles (like struct timespec). remainder_ is used to calculate which
+  // cycles to add an additional unit to the result.
+  int32_t full_units_offset = 0;
+  int32_t remainder_offset = 0;
+  // This keeps track of when to add 1 to the read value (using _offset).
+  int32_t remainder_sum = 0;
+
+  int32_t led_flash = 0;
+  vParTestSetLED(0, 0);
+
+  portTickType xLastGyroReadTime = xTaskGetTickCount();
+
+  for (;;) {
+    ++led_flash;
+    if (led_flash < kGyroReadFrequency / kFlashFrequency / 2) {
+      vParTestSetLED(1, 0);
+    } else {
+      vParTestSetLED(1, 1);
+    }
+    if (led_flash >= kGyroReadFrequency / kFlashFrequency) {
+      led_flash = 0;
+    }
+
+    vTaskDelayUntil(&xLastGyroReadTime,
+                    1000 / kGyroReadFrequency / portTICK_RATE_MS);
+
+    int bad_reading, bad_gyro;
+    int16_t gyro_value = gyro_read(&bad_reading, &bad_gyro);
+    if (bad_gyro) {
+      // We're just going to give up if this happens (write out that we're
+      // giving up and then never run anything else in this task).
+      vParTestSetLED(0, 1);
+      printf("gyro read task giving up because of bad gyro\n");
+      portENTER_CRITICAL();
+      gyro_output.gyro_bad = 1;
+      gyro_output.last_reading_bad = 1;
+      gyro_output.angle = 0;
+      portEXIT_CRITICAL();
+      vTaskDelete(NULL);
+      while (1) {}
+    }
+
+    if (startup_cycles_left) {
+      vParTestSetLED(2, 0);
+      --startup_cycles_left;
+      if (bad_reading) {
+        printf("gyro retrying startup wait because of bad reading\n");
+        startup_cycles_left = kStartupCycles;
+      }
+    } else if (zeroing_cycles_left) {
+      vParTestSetLED(2, 1);
+      --zeroing_cycles_left;
+      if (bad_reading) {
+        printf("gyro restarting zeroing because of bad reading\n");
+        zeroing_cycles_left = kZeroingCycles;
+        zero_bias = 0;
+      } else {
+        zero_bias -= gyro_value;
+        if (zeroing_cycles_left == 0) {
+          // Do all the nice math
+          full_units_offset = zero_bias / kZeroingCycles;
+          remainder_offset = zero_bias % kZeroingCycles;
+          if (remainder_offset < 0) {
+            remainder_offset += kZeroingCycles;
+            --full_units_offset;
+          }
+        }
+      }
+    } else {
+      vParTestSetLED(2, 0);
+
+      int64_t new_angle = gyro_output.angle;
+      if (!bad_reading) new_angle += gyro_value + full_units_offset;
+      if (remainder_sum >= kZeroingCycles) {
+        remainder_sum -= kZeroingCycles;
+        new_angle += 1;
+      }
+      portENTER_CRITICAL();
+      gyro_output.angle = new_angle;
+      gyro_output.last_reading_bad = bad_reading;
+      portEXIT_CRITICAL();
+      remainder_sum += remainder_offset;
+    }
+  }
+}
+
+void gyro_init(void) {
+  gyro_output.initialized = 0;
+
+  xTaskCreate(gyro_read_task, (signed char *) "gyro",
+              configMINIMAL_STACK_SIZE + 100, NULL,
+              tskIDLE_PRIORITY + 2, NULL);
+}
diff --git a/gyro_board/src/usb/gyro.h b/gyro_board/src/usb/gyro.h
new file mode 100644
index 0000000..2c74aad
--- /dev/null
+++ b/gyro_board/src/usb/gyro.h
@@ -0,0 +1,20 @@
+#ifndef GYRO_BOARD_SRC_USB_GYRO_H_
+#define GYRO_BOARD_SRC_USB_GYRO_H_
+
+#include <stdint.h>
+
+// Does everything to set up the gyro code, including starting a task which
+// reads and integrates the gyro values and blinks the LEDs etc.
+void gyro_init(void);
+
+struct GyroOutput {
+  int64_t angle;
+  int last_reading_bad;
+  int gyro_bad;
+  int initialized;
+};
+// This gets updated in a portENTER_CRITICAL/portEXIT_CRITICAL() block so all of
+// the values will be in sync.
+extern struct GyroOutput gyro_output;
+
+#endif  // GYRO_BOARD_SRC_USB_GYRO_H_
diff --git a/gyro_board/src/usb/main.c b/gyro_board/src/usb/main.c
index 11191a4..e186bba 100644
--- a/gyro_board/src/usb/main.c
+++ b/gyro_board/src/usb/main.c
@@ -31,368 +31,194 @@
 /* Demo app includes. */
 #include "flash.h"
 #include "partest.h"
-#include "analog.h"
-#include "spi.h"
 #include "LPCUSB/usbapi.h"
 
-/*-----------------------------------------------------------*/
-
-/* The time between cycles of the 'check' functionality (defined within the
-tick hook. */
-#define mainCHECK_DELAY			((portTickType) 5000 / portTICK_RATE_MS)
-
-/* Task priorities. */
-#define mainQUEUE_POLL_PRIORITY		(tskIDLE_PRIORITY + 2)
-#define mainSEM_TEST_PRIORITY		(tskIDLE_PRIORITY + 1)
-#define mainBLOCK_Q_PRIORITY		(tskIDLE_PRIORITY + 2)
-#define mainUIP_TASK_PRIORITY		(tskIDLE_PRIORITY + 3)
-#define mainINTEGER_TASK_PRIORITY	(tskIDLE_PRIORITY)
-#define mainGEN_QUEUE_TASK_PRIORITY	(tskIDLE_PRIORITY)
-#define mainFLASH_TASK_PRIORITY		(tskIDLE_PRIORITY + 2)
-
-/* The WEB server has a larger stack as it utilises stack hungry string
-handling library calls. */
-#define mainBASIC_WEB_STACK_SIZE	(configMINIMAL_STACK_SIZE * 4)
-
-int32_t goal = 0;
-int64_t gyro_angle = 0;
-
-/*-----------------------------------------------------------*/
-
-/*
- * Configure the hardware for the demo.
- */
-static void prvSetupHardware(void);
-
-/*
- * The task that handles the USB stack.
- */
-extern void vUSBTask(void *pvParameters);
-
-extern int VCOM_getchar(void);
-
-int VCOM_putchar(int c);
-
-inline int32_t encoder()
-{
-	return (int32_t)QEI->QEIPOS;
-}
-
-static portTASK_FUNCTION(vPrintPeriodic, pvParameters)
-{
-	portTickType xLastFlashTime;
-
-	/* We need to initialise xLastFlashTime prior to the first call to
-	vTaskDelayUntil(). */
-	xLastFlashTime = xTaskGetTickCount();
-
-	analog_init();
-
-	encoder_init();
-
-	// Wait 100 ms for it to boot.
-	vTaskDelayUntil(&xLastFlashTime, 100 / portTICK_RATE_MS);
-	spi_init();
-
-	// Enable USB.  The PC has probably disconnected it now.
-	USBHwAllowConnect();
-
-	// TODO(aschuh): Write this into a gyro calibration function, and check all the outputs.
-	vTaskDelayUntil(&xLastFlashTime, 50 / portTICK_RATE_MS);
-	enable_gyro_csel();
-	printf("SPI Gyro Second Response 0x%x %x\n", transfer_spi_bytes(0x2000), transfer_spi_bytes(0x0000));
-	disable_gyro_csel();
-
-	vTaskDelayUntil(&xLastFlashTime, 50 / portTICK_RATE_MS);
-	enable_gyro_csel();
-	printf("SPI Gyro Third Response 0x%x %x\n", transfer_spi_bytes(0x2000), transfer_spi_bytes(0x0000));
-	disable_gyro_csel();
-
-	vTaskDelayUntil(&xLastFlashTime, 10 / portTICK_RATE_MS);
-	enable_gyro_csel();
-	printf("SPI Gyro Fourth Response 0x%x %x\n", transfer_spi_bytes(0x2000), transfer_spi_bytes(0x0000));
-	disable_gyro_csel();
-	const int hz = 200;
-	const int flash_hz = 10;
-	const int startup_cycles = hz * 2;
-	const int zeroing_cycles = hz * 6;
-	int32_t zero_bias = 0;
-	int32_t startup_cycles_left = startup_cycles;
-	int32_t zeroing_cycles_left = zeroing_cycles;
-	int32_t full_units_offset = 0;
-	int32_t remainder_offset = 0;
-	int32_t remainder_sum = 0;
-	int32_t led_flash = 0;
-	vParTestSetLED(0, 0);
-
-	for (;;) {
-		led_flash ++;
-		if (led_flash < hz / flash_hz / 2) {
-			vParTestSetLED(1, 0);
-		} else {
-			vParTestSetLED(1, 1);
-		}
-		if (led_flash >= hz / flash_hz) {
-			led_flash = 0;
-		}
-		/* Delay for half the flash period then turn the LED on. */
-		vTaskDelayUntil(&xLastFlashTime, 1000 / hz / portTICK_RATE_MS);
-		enable_gyro_csel();
-		uint16_t high_value = transfer_spi_bytes(0x2000);
-		uint16_t low_value = transfer_spi_bytes(0x0000);
-		disable_gyro_csel();
-		int16_t gyro_value = -((int16_t)((((uint32_t)high_value << 16) | (uint32_t)low_value) >> 10));
-
-		if (startup_cycles_left) {
-			vParTestSetLED(2, 0);
-			--startup_cycles_left;
-		} else if (zeroing_cycles_left) {
-			vParTestSetLED(2, 1);
-			//printf("Zeroing ");
-			--zeroing_cycles_left;
-			zero_bias -= gyro_value;
-			if (zeroing_cycles_left == 0) {
-				// Do all the nice math
-				full_units_offset = zero_bias / zeroing_cycles;
-				remainder_offset = zero_bias % zeroing_cycles;
-				if (remainder_offset < 0) {
-					remainder_offset += zeroing_cycles;
-					--full_units_offset;
-				}
-			}
-		} else {
-			vParTestSetLED(2, 0);
-			int64_t new_angle = gyro_angle + gyro_value + full_units_offset;
-			if (remainder_sum >= zeroing_cycles) {
-				remainder_sum -= zeroing_cycles;
-				new_angle += 1;
-			}
-			NVIC_DisableIRQ(USB_IRQn);
-			gyro_angle = new_angle;
-			NVIC_EnableIRQ(USB_IRQn);
-			remainder_sum += remainder_offset;
-		}
-		//printf("Angle %d Rate %d\n", (int)(gyro_angle / 16), (int)(gyro_value + full_units_offset));
-
-		//printf("time: %d analog %d encoder %d goal %d\n", (int)i, (int)analog(5), (int)encoder(), (int)goal);
-
-		//printf("time: %d encoder %d goal %d\n", (int)i, (int)encoder(), (int)goal);
-		/*
-		for(i = 0; i < 4; i++){
-			printf("analog(%d) => %d\n",i,analog(i));
-		}
-		for(i = 1; i < 13; i++){
-			printf("digital(%d) => %d\n",i,digital(i));
-		}
-		for(i = 0; i < 4; i++){
-			printf("dip(%d) => %d\n",i,dip(i));
-		}
-		for(i = 0; i < 4; i++){
-			printf("encoder(%d) => %d\n",i,encoder_bits(i));
-		}
-		for(i = 0; i < 4; i++){
-			printf("encoder_val(%d) => %d\n",i,(int)encoder_val(i));
-		}*/
-	}
-}
-
+#include "analog.h"
+#include "digital.h"
+#include "encoder.h"
 #include "CAN.h"
+#include "gyro.h"
 
+extern void usb_init(void);
 
+// Sets up (and connects) PLL0.
+// The CPU will be running at 100 MHz with a 12 MHz clock input when this is
+// done.
+static void setup_PLL0(void) {
+  // If PLL0 is currently connected.
+  if (SC->PLL0STAT & (1 << 25)) {
+    /* Enable PLL0, disconnected. */
+    SC->PLL0CON = 1;
+    SC->PLL0FEED = PLLFEED_FEED1;
+    SC->PLL0FEED = PLLFEED_FEED2;
+  }
 
-void motor(int32_t speed)
-{
-	if (speed > 2047) speed = 2047;
-	if (speed < -2047) speed = -2047;
-	return;
-	if (speed > 0) {
-		MCPWM->MCMAT1 = 2047 - speed;
-		MCPWM->MCMAT0 = 2048;
-	} else {
-		MCPWM->MCMAT1 = 2048;
-		MCPWM->MCMAT0 = speed + 2047;
-	}
+  // Disable PLL0, disconnected.
+  SC->PLL0CON = 0;
+  SC->PLL0FEED = PLLFEED_FEED1;
+  SC->PLL0FEED = PLLFEED_FEED2;
+
+  // Enable main OSC.
+  SC->SCS |= 1 << 5;
+  // Wait until it's ready.
+  while (!(SC->SCS & (1 << 6)));
+
+  // Select main OSC as the PLL0 clock source.
+  SC->CLKSRCSEL = 0x1;
+
+  // Set up PLL0 to output 400MHz.
+  // 12MHz * 50 / 3 * 2 = 400MHz.
+  // The input is 12MHz (from the crystal), M = 50, and N = 3.
+  SC->PLL0CFG = 0x20031;
+  SC->PLL0FEED = PLLFEED_FEED1;
+  SC->PLL0FEED = PLLFEED_FEED2;
+
+  // Enable PLL0, disconnected.
+  SC->PLL0CON = 1;
+  SC->PLL0FEED = PLLFEED_FEED1;
+  SC->PLL0FEED = PLLFEED_FEED2;
+
+  // Set clock divider to dividing by 4 to give a final frequency of 100MHz.
+  SC->CCLKCFG = 0x03;
+
+  // Configure flash accelerator to use 5 CPU clocks like the datasheet says for
+  // a 100MHz clock.
+  SC->FLASHCFG = 0x403a;
+
+  // Wait until PLL0 is locked.
+  while (((SC->PLL0STAT & (1 << 26)) == 0));
+
+  // Enable PLL0 and connect.
+  SC->PLL0CON = 3;
+  SC->PLL0FEED = PLLFEED_FEED1;
+  SC->PLL0FEED = PLLFEED_FEED2;
+
+  // Wait until PLL0 is connected.
+  while (((SC->PLL0STAT & (1 << 25)) == 0));
 }
 
+// Configures PLL1 as the clock for USB.
+static void setup_PLL1(void) {
+  // If PLL1 is currently connected.
+  if (SC->PLL1STAT & (1 << 9)) {
+    // Enable PLL1, disconnected.
+    SC->PLL1CON = 1;
+    SC->PLL1FEED = PLLFEED_FEED1;
+    SC->PLL1FEED = PLLFEED_FEED2;
+  }
 
+  // Disable PLL1, disconnected.
+  SC->PLL1CON = 0;
+  SC->PLL1FEED = PLLFEED_FEED1;
+  SC->PLL1FEED = PLLFEED_FEED2;
 
-/*-----------------------------------------------------------*/
+  // Set up PLL1 to produce the required 48MHz from the crystal.
+  // USBCLK = 12MHz * 4 = 48MHz.
+  // FCCO = USBCLK * 2 * 3 = 288MHz.
+  // The input is 12MHz, M = 4, and P = 3.
+  SC->PLL1CFG = 0x23;
+  SC->PLL1FEED = PLLFEED_FEED1;
+  SC->PLL1FEED = PLLFEED_FEED2;
 
-int main(void)
-{
-        // Configure the hardware
-        prvSetupHardware();
+  /* Enable PLL1, disconnected. */
+  SC->PLL1CON = 1;
+  SC->PLL1FEED = PLLFEED_FEED1;
+  SC->PLL1FEED = PLLFEED_FEED2;
 
-        /* Start the standard demo tasks.  These are just here to exercise the
-        kernel port and provide examples of how the FreeRTOS API can be used. */
-        //vStartLEDFlashTasks(mainFLASH_TASK_PRIORITY);
+  // Wait until PLL1 is locked.
+  while (((SC->PLL1STAT & (1 << 10)) == 0));
 
-        /* Create the USB task. */
-        xTaskCreate(vUSBTask, (signed char *) "USB", configMINIMAL_STACK_SIZE + 1020, (void *) NULL, tskIDLE_PRIORITY + 3, NULL);
+  /* Enable PLL1 and connect it. */
+  SC->PLL1CON = 3;
+  SC->PLL1FEED = PLLFEED_FEED1;
+  SC->PLL1FEED = PLLFEED_FEED2;
 
-	xTaskCreate(vPrintPeriodic, (signed char *) "PRINTx", configMINIMAL_STACK_SIZE + 100, NULL, tskIDLE_PRIORITY + 2, NULL);
-
-	initCAN();
-
-        // Start the scheduler.
-        vTaskStartScheduler();
-
-        /* Will only get here if there was insufficient memory to create the idle
-           task.  The idle task is created within vTaskStartScheduler(). */
-        for (;;);
+  // Wait until PLL1 is connected.
+  while (((SC->PLL1STAT & (1 << 9)) == 0));
 }
-/*-----------------------------------------------------------*/
 
+// Setup the peripherals.
+static void setup_hardware(void) {
+  // Setup GPIO power.
+  SC->PCONP = PCONP_PCGPIO;
 
-void vApplicationTickHook(void)
-{
-        static unsigned long ulTicksSinceLastDisplay = 0;
+  // Disable TPIU.
+  PINCON->PINSEL10 = 0;
 
-        /* Called from every tick interrupt as described in the comments at the top
-        of this file.
+  setup_PLL0();
 
-        Have enough ticks passed to make it	time to perform our health status
-        check again? */
+  setup_PLL1();
 
-        ulTicksSinceLastDisplay++;
-
-        if (ulTicksSinceLastDisplay >= mainCHECK_DELAY) {
-                /* Reset the counter so these checks run again in mainCHECK_DELAY
-                ticks time. */
-                ulTicksSinceLastDisplay = 0;
-        }
+  /* Configure the LEDs. */
+  vParTestInitialise();
 }
-/*-----------------------------------------------------------*/
 
-void prvSetupHardware(void)
-{
-	// Setup the peripherals.
-	// The CPU will be running at 100 MHz with a 12 MHz clock input.
+int main(void) {
+  // Errata PCLKSELx.1 says that we have to do all of this BEFORE setting up
+  // PLL0 or it might not work.
 
-        // Setup GPIO power.
-        SC->PCONP = PCONP_PCGPIO;
-        // Disable TPIU.
-        PINCON->PINSEL10 = 0;
+  // Set everything to run at full CCLK by default.
+  SC->PCLKSEL0 = 0x55555555;
 
-	// Setup PLL0 so that the CPU runs at 100 MHz.
-        if (SC->PLL0STAT & (1 << 25)) {
-                /* Enable PLL, disconnected. */
-                SC->PLL0CON = 1;
-                SC->PLL0FEED = PLLFEED_FEED1;
-                SC->PLL0FEED = PLLFEED_FEED2;
-        }
+  CAN_PCLKSEL();
 
-        // Disable PLL, disconnected.
-        SC->PLL0CON = 0;
-        SC->PLL0FEED = PLLFEED_FEED1;
-        SC->PLL0FEED = PLLFEED_FEED2;
+  setup_hardware();
 
-        // Enable main OSC and wait until it's ready.
-        SC->SCS |= 0x20;
-        while (!(SC->SCS & 0x40));
+  digital_init();
 
-        // select main OSC, 12MHz, as the PLL clock source.
-        SC->CLKSRCSEL = 0x1;
+  analog_init();
 
-        SC->PLL0CFG = 0x20031;
-        SC->PLL0FEED = PLLFEED_FEED1;
-        SC->PLL0FEED = PLLFEED_FEED2;
+  encoder_init();
 
-        // Enable PLL, disconnected.
-        SC->PLL0CON = 1;
-        SC->PLL0FEED = PLLFEED_FEED1;
-        SC->PLL0FEED = PLLFEED_FEED2;
+  gyro_init();
 
-        // Set clock divider.
-        SC->CCLKCFG = 0x03;
+  initCAN();
 
-        // Configure flash accelerator.
-        SC->FLASHCFG = 0x403a;
+  usb_init();
 
-        // Check lock bit status.
-        while (((SC->PLL0STAT & (1 << 26)) == 0));
+  // Start the scheduler.
+  vTaskStartScheduler();
 
-        // Enable and connect.
-        SC->PLL0CON = 3;
-        SC->PLL0FEED = PLLFEED_FEED1;
-        SC->PLL0FEED = PLLFEED_FEED2;
-
-        while (((SC->PLL0STAT & (1 << 25)) == 0));
-
-        // Configure the clock for the USB.
-        if (SC->PLL1STAT & (1 << 9)) {
-                // Enable PLL, disconnected.
-                SC->PLL1CON = 1;
-                SC->PLL1FEED = PLLFEED_FEED1;
-                SC->PLL1FEED = PLLFEED_FEED2;
-        }
-
-        // Disable PLL, disconnected.
-        SC->PLL1CON = 0;
-        SC->PLL1FEED = PLLFEED_FEED1;
-        SC->PLL1FEED = PLLFEED_FEED2;
-
-        SC->PLL1CFG = 0x23;
-        SC->PLL1FEED = PLLFEED_FEED1;
-        SC->PLL1FEED = PLLFEED_FEED2;
-
-        /* Enable PLL, disconnected. */
-        SC->PLL1CON = 1;
-        SC->PLL1FEED = PLLFEED_FEED1;
-        SC->PLL1FEED = PLLFEED_FEED2;
-        while (((SC->PLL1STAT & (1 << 10)) == 0));
-
-        /* Enable and connect. */
-        SC->PLL1CON = 3;
-        SC->PLL1FEED = PLLFEED_FEED1;
-        SC->PLL1FEED = PLLFEED_FEED2;
-        while (((SC->PLL1STAT & (1 << 9)) == 0));
-
-        // Setup the peripheral bus to be the same as the CCLK, 100 MHz.
-	// Set CAN to run at CCLK/6, which should have it running about 1 Mbit (1.042)
-        SC->PCLKSEL0 = 0xff555555;
-
-        /* Configure the LEDs. */
-        vParTestInitialise();
+  /* Will only get here if there was insufficient memory to create the idle
+     task.  The idle task is created within vTaskStartScheduler(). */
+  for (;;) {}
 }
-/*-----------------------------------------------------------*/
 
 void vApplicationStackOverflowHook(xTaskHandle *pxTask, signed char *pcTaskName)
 {
-        /* This function will get called if a task overflows its stack. */
+  /* This function will get called if a task overflows its stack. */
 
-        (void) pxTask;
-        (void) pcTaskName;
+  (void) pxTask;
+  (void) pcTaskName;
 
-        for (;;);
-}
-/*-----------------------------------------------------------*/
-
-void vConfigureTimerForRunTimeStats(void)
-{
-        const unsigned long TCR_COUNT_RESET = 2, CTCR_CTM_TIMER = 0x00, TCR_COUNT_ENABLE = 0x01;
-
-        /* This function configures a timer that is used as the time base when
-        collecting run time statistical information - basically the percentage
-        of CPU time that each task is utilising.  It is called automatically when
-        the scheduler is started (assuming configGENERATE_RUN_TIME_STATS is set
-        to 1). */
-
-        /* Power up and feed the timer. */
-        SC->PCONP |= 0x02UL;
-        SC->PCLKSEL0 = (SC->PCLKSEL0 & (~(0x3 << 2))) | (0x01 << 2);
-
-        /* Reset Timer 0 */
-        TIM0->TCR = TCR_COUNT_RESET;
-
-        /* Just count up. */
-        TIM0->CTCR = CTCR_CTM_TIMER;
-
-        /* Prescale to a frequency that is good enough to get a decent resolution,
-        but not too fast so as to overflow all the time. */
-        TIM0->PR = (configCPU_CLOCK_HZ / 10000UL) - 1UL;
-
-        /* Start the counter. */
-        TIM0->TCR = TCR_COUNT_ENABLE;
+  for (;;);
 }
 
+// This is what portCONFIGURE_TIMER_FOR_RUN_TIME_STATS in FreeRTOSConfig.h
+// actually calls.
+// It sets up timer 0 to use for timing.
+void vConfigureTimerForRunTimeStats(void) {
+  const unsigned long TCR_COUNT_RESET = 2, CTCR_CTM_TIMER = 0x00, TCR_COUNT_ENABLE = 0x01;
+
+  /* This function configures a timer that is used as the time base when
+     collecting run time statistical information - basically the percentage
+     of CPU time that each task is utilising.  It is called automatically when
+     the scheduler is started (assuming configGENERATE_RUN_TIME_STATS is set
+     to 1). */
+
+  /* Power up and feed the timer. */
+  SC->PCONP |= 0x02UL;
+
+  /* Reset Timer 0 */
+  TIM0->TCR = TCR_COUNT_RESET;
+
+  /* Just count up. */
+  TIM0->CTCR = CTCR_CTM_TIMER;
+
+  /* Prescale to a frequency that is good enough to get a decent resolution,
+     but not too fast so as to overflow all the time. */
+  TIM0->PR = (configCPU_CLOCK_HZ / 10000UL) - 1UL;
+
+  /* Start the counter. */
+  TIM0->TCR = TCR_COUNT_ENABLE;
+}
diff --git a/gyro_board/src/usb/quad encoder config.txt b/gyro_board/src/usb/quad encoder config.txt
deleted file mode 100644
index 4c0fe4e..0000000
--- a/gyro_board/src/usb/quad encoder config.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Quad Encoder stuff

-

-

-// enable the quadrature encode peripheral and peripherial clock

-

-	SC->PCONP    |=0x00040000; 	// bit 18 of PCONP set to 1

-	SC->PCLKSEL1 |=0x00000001;	/* bits 1,0 	00 CCLK/4

-							01 CCLK

-							10 CCLK/2

-							11 CCLK/8  */

-

-

-// Enable pins for QEI MCI0, MCI1 (PhA PhB, signals respectively)

-

-		

-	PINCON->PINSEL3 = ((PINSEL3 &=0xFFFF3DFF) |= 0x00004100); /* 01 in bits 9:8 and 15:14*/ 

-	//PINCON->PINSEL3 = ((PINSEL3 &=0xFFFCFFFF) |= 0x00010000); /* Turns on MCI2 index input 17:16 = 01*/

-

-

-

-// Specify Quadriture phase mode

-

-	// QEI->QEICON &= 0xFFFFFFFE; 	/* Clears position counter */

-	QEI->QEICONF &= 0XFFFFFFFD;	/* Sets bit 1 to 0, Signal mode to Quad Phase */

-	// QEI->QEICON |= 0X00000002;	/* Bit 2 to 1 counts both PhA and PhB for higher resolution */

-

-

-

-	// QEI->FILTER = ****Whatever Sampling size we want*** /* Sets the number of consecutive pulses for a change in direction, etc to accepted */

-

-

-// Set Various Attributes

-

-	// QEI->QEIMAXPOS = *****insert max position*****;

-

-

-/* Note: QEI->QEIPOS is a read only section that stores the current position */
\ No newline at end of file
diff --git a/gyro_board/src/usb/spi.c b/gyro_board/src/usb/spi.c
deleted file mode 100644
index de41866..0000000
--- a/gyro_board/src/usb/spi.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include "stdio.h"
-#include "FreeRTOS.h"
-#include "spi.h"
-
-void spi_init (void) {
-  SC->PCONP |= PCONP_PCSPI;
-  SC->PCLKSEL0 |= 0x00010000;
-
-  // Hook up the interrupt
-  //NVIC_EnableIRQ(SPI_IRQn);
-
-  // SCK
-  PINCON->PINSEL0 &= 0x3fffffff;
-  PINCON->PINSEL0 |= 0xc0000000;
-
-  // SSEL, MISO, MOSI
-  // SSEL is GPIO, and needs to be done manually.
-  disable_gyro_csel();
-  GPIO0->FIODIR |= 0x00010000;
-  PINCON->PINSEL1 &= 0xffffffc0;
-  PINCON->PINSEL1 |= 0x0000003c;
-
-  // Master mode, 16 bits/frame, enable interrupts
-  SPI->SPCR = 0x000000a4;
-  // 13 clocks per cycle.  This works out to a 7.7 mhz buss.
-  SPI->SPCCR = 0x0000000d;
-
-  // TODO(aschuh): Implement the gyro bring-up blocking first.
-  // Then use interrupts.
-  enable_gyro_csel();
-  printf("SPI Gyro Initial Response 0x%x %x\n", transfer_spi_bytes(0x2000), transfer_spi_bytes(0x0003));
-  disable_gyro_csel();
-}
-
-// TODO: DMA? SSP0?  SSP0 should have a buffer, which would be very nice.
-uint16_t transfer_spi_bytes(uint16_t data) {
-  SPI->SPDR = (uint32_t)data;
-  while (!(SPI->SPSR & 0x80));
-  return SPI->SPDR;
-}
-
-void disable_gyro_csel (void) {
-  // Set the CSEL pin high to deselect it.
-  GPIO0->FIOSET = 0x00010000;
-}
-
-void enable_gyro_csel (void) {
-  // Clear the CSEL pin high to select it.
-  GPIO0->FIOCLR = 0x00010000;
-}
-
-void SPI_IRQHandler(void) {
-  int status = SPI->SPSR;
-  if (status & 0x80) {
-    // Transfer completed.
-  }
-
-  // Clear the interrupt?
-  SPI->SPINT = 0x00000001;
-}
diff --git a/gyro_board/src/usb/spi.h b/gyro_board/src/usb/spi.h
deleted file mode 100644
index 6dbc511..0000000
--- a/gyro_board/src/usb/spi.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __SPI_H__
-#define __SPI_H__
-
-void spi_init (void);
-uint16_t transfer_spi_bytes(uint16_t data);
-void disable_gyro_csel (void);
-void enable_gyro_csel (void);
-
-#endif // __SPI_H__
diff --git a/gyro_board/src/usb/toolchain-build-notes.txt b/gyro_board/src/usb/toolchain-build-notes.txt
new file mode 100644
index 0000000..d81c905
--- /dev/null
+++ b/gyro_board/src/usb/toolchain-build-notes.txt
@@ -0,0 +1,23 @@
+These are Brian's notes from building a toolchain on 2013-03-29.
+It compiles the code successfully and lives in /opt/cortex-m3.
+The flags are from logic, Austin's gcc, and
+  <http://www.coactionos.com/getting-started/43-building-and-installing-a-cortex-m3-compiler-on-ubuntu.html>
+  (for some of the newlib flags).
+This has been uploaded to our package repository for wheezy as arm-eabi-gcc.
+
+binutils
+	../binutils-2.23.2/configure --prefix=/opt/cortex-m3 --target=arm-eabi
+	make -j6
+	make install
+gcc
+	Symlinked in gmp-4.3.2, mpc-0.8.1, and mpfr-2.4.2 first.
+	../gcc-4.5.4/configure --target=arm-eabi --prefix=/opt/cortex-m3 --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newlib --with-headers --disable-shared --with-gnu-as --with-gnu-ld --with-cpu-cortex-m3 --disable-shared --with-float=soft --with-cpu=cortex-m3 --with-tune=cortex-m3 --disable-libmudflap --disable-libgomp --with-mode=thumb
+	make -j6 all-gcc
+	sudo make install-gcc
+newlib
+	../newlib-1.20.0/configure --target=arm-eabi --prefix=/opt/cortex-m3 --enable-interwork --enable-multilib --enable-languages=c,c++ --with-headers --disable-shared --with-gnu-as --with-gnu-ld --with-cpu-cortex-m3 --disable-shared --with-float=soft --with-cpu=cortex-m3 --with-tune=cortex-m3 --disable-libmudflap --disable-libgomp --with-mode=thumb --disable-werror --disable-newlib-supplied-syscalls --disable-nls --enable-target-optspace --disable-libssp --enable-newlib-reent-small --enable-newlib-multithread --disable-libgloss
+	make CFLAGS_FOR_TARGET="-D__IEEE_BIG_ENDIAN -D__IEEE_BYTES_LITTLE_ENDIAN -D__BUFSIZ__=128"
+	sudo make install
+gcc
+	make -j6
+	sudo make install
diff --git a/gyro_board/src/usb/usb_device.c b/gyro_board/src/usb/usb_device.c
new file mode 100644
index 0000000..c90bd0d
--- /dev/null
+++ b/gyro_board/src/usb/usb_device.c
@@ -0,0 +1,396 @@
+/*
+  LPCUSB, an USB device driver for LPC microcontrollers
+  Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl)
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are met:
+
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+  3. The name of the author may not be used to endorse or promote products
+     derived from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "FreeRTOS.h"
+#include "queue.h"
+#include "task.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "LPCUSB/usbapi.h"
+#include "LPCUSB/usbdebug.h"
+#include "LPCUSB/usbstruct.h"
+
+// This file is marked private and most of the functions in its associated .c
+// file started out static, but we want to use some of them to do frame handling
+// stuff because we do special stuff with it (handle it ourselves for reduced
+// jitter and actually deal with the frame number correctly), so it's nice to
+// have the utility functions for accessing the hardware available instead of
+// having to rewrite them.
+#include "LPCUSB/usbhw_lpc.h"
+unsigned char USBHwCmdRead(unsigned char bCmd);
+void Wait4DevInt(unsigned long dwIntr);
+
+#include "LPC17xx.h"
+
+#include "fill_packet.h"
+
+#define usbMAX_SEND_BLOCK    ( 20 / portTICK_RATE_MS )
+#define usbRXBUFFER_LEN      ( 80 )
+#define usbTXBUFFER_LEN      ( 600 )
+
+// Read the processor manual for picking these.
+#define BULK_IN_EP    0x82
+#define BULK_OUT_EP   0x05
+#define ISOC_IN_EP    0x83
+#define NUM_ENDPOINTS 3
+
+#define MAX_PACKET_SIZE  64
+#define DATA_PACKET_SIZE DATA_STRUCT_SEND_SIZE
+
+#define LE_WORD(x)    ((x)&0xFF),((x)>>8)
+
+static xQueueHandle xRxedChars = NULL, xCharsForTx = NULL;
+
+// This gets cleared each time the ISR is entered and then checked as it's
+// returning so that we can still yield from the ISR to a woken task but not
+// from the middle of the ISR like it would be if this was checked in each
+// endpoint handler that needs it.
+static portBASE_TYPE higher_priority_task_woken;
+
+static const unsigned char abDescriptors[] = {
+// Device descriptor
+  0x12,
+  DESC_DEVICE,
+  LE_WORD(0x0200),    // bcdUSB
+  0xFF,        // bDeviceClass
+  0x00,        // bDeviceSubClass
+  0x00,        // bDeviceProtocol
+  MAX_PACKET_SIZE0,    // bMaxPacketSize
+  LE_WORD(0x1424),    // idVendor
+  LE_WORD(0xd243),    // idProduct
+  LE_WORD(0x0153),    // bcdDevice
+  0x03,        // iManufacturer
+  0x02,        // iProduct
+  0x01,        // iSerialNumber
+  0x01,        // bNumConfigurations
+
+// Configuration descriptor
+  0x09,
+  DESC_CONFIGURATION,
+  LE_WORD(9 + 9 + 7 * NUM_ENDPOINTS),  // wTotalLength
+  0x01,        // bNumInterfaces
+  0x01,        // bConfigurationValue
+  0x00,        // iConfiguration
+  0xC0,        // bmAttributes
+  0x32,        // bMaxPower
+// Data class interface descriptor
+  0x09,
+  DESC_INTERFACE,
+  0x00,        // bInterfaceNumber
+  0x00,        // bAlternateSetting
+  NUM_ENDPOINTS,  // bNumEndPoints
+  0x0A,        // bInterfaceClass = data
+  0x00,        // bInterfaceSubClass
+  0x00,        // bInterfaceProtocol
+  0x00,        // iInterface
+// Debug EP OUT
+  0x07,
+  DESC_ENDPOINT,
+  BULK_OUT_EP,  // bEndpointAddress
+  0x02,        // bmAttributes = bulk
+  LE_WORD(MAX_PACKET_SIZE),  // wMaxPacketSize
+  0x00,        // bInterval
+// Debug EP in
+  0x07,
+  DESC_ENDPOINT,
+  BULK_IN_EP,      // bEndpointAddress
+  0x02,        // bmAttributes = bulk
+  LE_WORD(MAX_PACKET_SIZE),  // wMaxPacketSize
+  0x00,        // bInterval
+  // isoc data EP IN
+  0x07,
+  DESC_ENDPOINT,
+  ISOC_IN_EP,            // bEndpointAddress
+  0x0D,              // bmAttributes = isoc, synchronous, data endpoint
+  LE_WORD(DATA_PACKET_SIZE),  // wMaxPacketSize
+  0x01,            // bInterval
+
+  // string descriptors
+  0x04,
+  DESC_STRING,
+  LE_WORD(0x0409),
+
+  0x0E,
+  DESC_STRING,
+  'A', 0, 'S', 0, 'C', 0, 'H', 0, 'U', 0, 'H', 0,
+
+  0x14,
+  DESC_STRING,
+  'U', 0, 'S', 0, 'B', 0, 'S', 0, 'e', 0, 'n', 0, 's', 0, 'o', 0, 'r', 0,
+
+  0x12,
+  DESC_STRING,
+  'A', 0, 'O', 0, 'S', 0, '_', 0, 'G', 0, 'y', 0, 'r', 0, 'o', 0,
+
+// terminating zero
+  0
+};
+
+// Enables interrupts to write data instead of NAKing on the bulk in endpoints.
+// This is in a centralized place so that other NAK interrupts can be enabled
+// all of the time easily in the future.
+static void bulk_in_nak_int(int have_data) {
+  USBHwNakIntEnable(have_data ? INACK_BI : 0);
+}
+
+/**
+ * Local function to handle incoming bulk data
+ *
+ * @param [in] bEP
+ * @param [in] bEPStatus
+ */
+static void DebugOut(unsigned char bEP, unsigned char bEPStatus) {
+  int i, iLen;
+  unsigned char abBulkBuf[64];
+
+  (void) bEPStatus;
+
+  // get data from USB into intermediate buffer
+  iLen = USBHwEPRead(bEP, abBulkBuf, sizeof(abBulkBuf));
+  for (i = 0; i < iLen; i++) {
+    // put into queue
+    xQueueSendFromISR(xRxedChars, &abBulkBuf[i], &higher_priority_task_woken);
+  }
+}
+
+
+/**
+ * Local function to handle outgoing bulk data
+ *
+ * @param [in] bEP
+ * @param [in] bEPStatus
+ */
+static void DebugIn(unsigned char bEP, unsigned char bEPStatus) {
+  int i, iLen;
+  unsigned char abBulkBuf[64];
+
+  (void) bEPStatus;
+
+  if (uxQueueMessagesWaitingFromISR(xCharsForTx) == 0) {
+    // no more data
+    bulk_in_nak_int(0);
+    return;
+  }
+
+  // get bytes from transmit FIFO into intermediate buffer
+  for (i = 0; i < MAX_PACKET_SIZE; i++) {
+    if (xQueueReceiveFromISR(xCharsForTx, &abBulkBuf[i],
+                             &higher_priority_task_woken) != pdPASS) {
+      break;
+    }
+  }
+  iLen = i;
+
+  // send over USB
+  if (iLen > 0) {
+    USBHwEPWrite(bEP, abBulkBuf, iLen);
+  }
+}
+
+
+/**
+ * Writes one character to VCOM port
+ *
+ * @param [in] c character to write
+ * @returns character written, or EOF if character could not be written
+ */
+int VCOM_putcharFromISR(int c, long *lHigherPriorityTaskWoken) {
+    char cc = (char) c;
+
+    if (xQueueSendFromISR(xCharsForTx, &cc,
+                          lHigherPriorityTaskWoken) == pdPASS) {
+        return c;
+    } else {
+        return EOF;
+    }
+}
+
+int VCOM_putchar(int c) {
+    char cc = (char) c;
+
+    // Don't block if not connected to USB.
+    if (xQueueSend(xCharsForTx, &cc,
+                   USBIsConnected() ? usbMAX_SEND_BLOCK : 0) == pdPASS) {
+        return c;
+    } else {
+        return EOF;
+    }
+}
+
+
+/**
+ * Reads one character from VCOM port
+ *
+ * @returns character read, or EOF if character could not be read
+ */
+int VCOM_getchar(void) {
+    unsigned char c;
+
+    /* Block the task until a character is available. */
+    if(xQueueReceive(xRxedChars, &c, 0) == pdTRUE){  //portMAX_DELAY);
+        return c;
+    }
+    return -1;
+}
+
+// Instead of registering an lpcusb handler for this, we do it ourself so that
+// we can get the timing jitter down and deal with the frame number right.
+static void HandleFrame(void) {
+  USB->USBDevIntClr = FRAME;
+
+  static struct DataStruct sensor_values;
+  fillSensorPacket(&sensor_values);
+
+  // What the last good frame number that we got was.
+  // Values <0 are uninitialized.
+  static int32_t current_frame = -1;
+  // How many extra frames we're guessing happened since we got a good one.
+  static int guessed_frames = 0;
+
+  uint8_t error_status = USBHwCmdRead(CMD_DEV_READ_ERROR_STATUS);
+  if (error_status & PID_ERR) {
+    ++guessed_frames;
+  } else {
+    int16_t read_frame = USBHwCmdRead(CMD_DEV_READ_CUR_FRAME_NR);
+    USB->USBCmdCode = 0x00000200 | (CMD_DEV_READ_CUR_FRAME_NR << 16);
+    Wait4DevInt(CDFULL);
+    read_frame |= USB->USBCmdData << 8;
+
+    if (current_frame < 0) {
+      current_frame = read_frame;
+      guessed_frames = 0;
+    } else {
+      // All of the complicated stuff in here tracks the frame number from
+      // hardware (which comes from the SOF tokens sent out by the host) except
+      // deal with it if we miss a couple or get off by a little bit (and reset
+      // completely if we get off by a lot or miss a lot in a row).
+
+      static const uint32_t kMaxReadFrame = 0x800;
+      static const uint32_t kReadMask = kMaxReadFrame - 1;
+      if ((current_frame & kReadMask) == read_frame) {
+        // This seems like it must mean that we didn't receive the SOF token.
+        ++guessed_frames;
+      } else {
+        guessed_frames = 0;
+        // The frame number that we think we should have gotten.
+        int32_t expected_frame = current_frame + guessed_frames + 1;
+        int16_t difference =
+            read_frame - (int16_t)(expected_frame & kReadMask);
+        // If we're off by only a little.
+        if (difference > -10 && difference < 10) {
+          current_frame = (expected_frame & ~kReadMask) | read_frame;
+          // If we're ahead by only a little (or dead on) but we wrapped.
+        } else if (difference > kMaxReadFrame - 10) {
+          current_frame =
+              ((expected_frame & ~kReadMask) - kMaxReadFrame) | read_frame;
+          // If we're behind by only a little (or dead on) but the number in the
+          // token wrapped.
+        } else if (difference < -(kMaxReadFrame - 10)) {
+          current_frame =
+              ((expected_frame & ~kReadMask) + kMaxReadFrame) | read_frame;
+        } else {
+          // We're way off, so give up and reset.
+          current_frame = -1;
+        }
+      }
+    }
+  }
+
+  sensor_values.frame_number = current_frame + guessed_frames;
+  sensor_values.unknown_frame = guessed_frames > 10;
+
+  USBHwEPWrite(ISOC_IN_EP, (unsigned char *)&sensor_values, DATA_PACKET_SIZE);
+
+  if (uxQueueMessagesWaitingFromISR(xCharsForTx) > 0) {
+    // Data to send is available so enable interrupt instead of NAK.
+    bulk_in_nak_int(1);
+  } else {
+    bulk_in_nak_int(0);
+  }
+}
+
+void USB_IRQHandler(void) {
+  higher_priority_task_woken = pdFALSE;
+  uint32_t status = SC->USBIntSt;
+  if (status & USB_INT_REQ_HP) {
+    // We set the frame interrupt to get routed to the high priority line.
+    HandleFrame();
+  }
+  //if (status & USB_INT_REQ_LP) {
+    // Call lpcusb to let it handle all of the other interrupts.
+    USBHwISR();
+  //}
+  portEND_SWITCHING_ISR(higher_priority_task_woken);
+}
+
+void usb_init(void) {
+  DBG("Initialising USB stack\n");
+
+  xRxedChars = xQueueCreate(usbRXBUFFER_LEN, sizeof(char));
+  xCharsForTx = xQueueCreate(usbTXBUFFER_LEN, sizeof(char));
+
+  if ((xRxedChars == NULL) || (xCharsForTx == NULL)) {
+    /* Not enough heap available to create the buffer queues, can't do
+       anything so just delete ourselves. */
+    vTaskDelete(NULL);
+  }
+
+  // Initialise the USB stack.
+  USBInit();
+
+  // register descriptors
+  USBRegisterDescriptors(abDescriptors);
+
+  // register class request handler
+  //USBRegisterRequestHandler(REQTYPE_TYPE_CLASS,
+  //                          HandleClassRequest, abClassReqData);
+
+  // register endpoint handlers
+  USBHwRegisterEPIntHandler(BULK_IN_EP, DebugIn);
+  USBHwRegisterEPIntHandler(BULK_OUT_EP, DebugOut);
+
+  USB->USBDevIntPri = 1;  // route frame interrupt to high priority line
+  USB->USBDevIntEn |= FRAME;  // enable frame interrupt
+
+  // register frame handler
+  //USBHwRegisterFrameHandler(USBFrameHandler);
+
+  DBG("Starting USB communication\n");
+
+  NVIC_SetPriority(USB_IRQn, configUSB_INTERRUPT_PRIORITY);
+  NVIC_EnableIRQ(USB_IRQn);
+
+  // connect to bus
+
+  DBG("Connecting to USB bus\n");
+  USBHwConnect(TRUE);
+
+  // Enable USB.  The PC has probably disconnected it now.
+  USBHwAllowConnect();
+}
diff --git a/gyro_board/src/usb_driver/90-aschuh.rules b/gyro_board/src/usb_driver/90-aschuh.rules
index 7e7699e..9af2e2c 100644
--- a/gyro_board/src/usb_driver/90-aschuh.rules
+++ b/gyro_board/src/usb_driver/90-aschuh.rules
@@ -1 +1 @@
-KERNEL=="aschuh[0-9]*",GROUP="dialout"
+SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="d243", ATTR{idProduct}=="1424", GROUP="dialout"
diff --git a/output/.gitignore b/output/.gitignore
new file mode 100644
index 0000000..04d5097
--- /dev/null
+++ b/output/.gitignore
@@ -0,0 +1,3 @@
+/atom/
+/crio/
+/compiled-*/
diff --git a/output/downloaded/.gitignore b/output/downloaded/.gitignore
new file mode 100644
index 0000000..68db3c1
--- /dev/null
+++ b/output/downloaded/.gitignore
@@ -0,0 +1,24 @@
+/ctemplate-129.tar.gz
+/ctemplate-129/
+/eigen-3.1.3.tar.bz2
+/eigen-3.1.3/
+/gccdist.zip
+/gccdist/
+/gtest-1.6.0/
+/gtest-1.6.0.zip
+/gyp-1738/
+/javacv-0.2-bin.zip
+/javacv-bin/
+/jpeg-8d/
+/jpegsrc.v8d.tar.gz
+/libjpeg/
+/ninja-v1.4.0/
+/one-jar-boot-0.97.jar
+/gflags-2.0.tar.gz
+/gflags-2.0/
+/compiler-rt-RELEASE_32_final/
+/libevent-2.0.21.tar.gz
+/libevent-2.0.21/
+/libcdd-094g.tar.gz
+/libcdd-094g/
+/gmp-5.1.3.tar.lz
diff --git a/vision/BinaryServer.cpp b/vision/BinaryServer.cpp
new file mode 100644
index 0000000..18cf85b
--- /dev/null
+++ b/vision/BinaryServer.cpp
@@ -0,0 +1,129 @@
+#include "vision/BinaryServer.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <string.h>
+#include <vector>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+
+#include "aos/externals/libjpeg/include/jpeglib.h"
+#include "aos/atom_code/camera/Buffers.h"
+#include "aos/common/time.h"
+
+namespace frc971 {
+namespace vision {
+
+static void echo_read_cb(struct bufferevent *bev, void * /*ctx*/) {
+  struct evbuffer *input = bufferevent_get_input(bev);
+  struct evbuffer *output = bufferevent_get_output(bev);
+
+  size_t len = evbuffer_get_length(input);
+  char *data;
+  data = (char *)malloc(len);
+  evbuffer_copyout(input, data, len);
+
+  printf("we got some data: %s\n", data);
+
+  evbuffer_add_buffer(output, input);
+}
+
+void BinaryServer::ErrorEvent(struct bufferevent *bev, short events) {
+  if (events & BEV_EVENT_ERROR) perror("Error from bufferevent");
+  if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
+    have_id = false;
+    bufferevent_free(bev);
+  }
+}
+
+void BinaryServer::Accept(struct evconnlistener *listener, evutil_socket_t fd,
+                          struct sockaddr * /*address*/, int /*socklen*/) {
+  struct event_base *base = evconnlistener_get_base(listener);
+  if (!have_id) {
+    struct bufferevent *bev =
+        bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
+    _output = bufferevent_get_output(bev);
+    _bufev = bev;
+    have_id = true;
+    int no_delay_flag = 1;
+    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &no_delay_flag,
+               sizeof(no_delay_flag));
+
+    bufferevent_setcb(bev, echo_read_cb, NULL, StaticErrorEvent, this);
+
+    bufferevent_enable(bev, EV_READ | EV_WRITE);
+  }
+}
+static void accept_error_cb(struct evconnlistener *listener, void * /*ctx*/) {
+  struct event_base *base = evconnlistener_get_base(listener);
+  int err = EVUTIL_SOCKET_ERROR();
+  fprintf(stderr, "Got an error %d (%s) on the listener. "
+                  "Shutting down.\n",
+          err, evutil_socket_error_to_string(err));
+
+  event_base_loopexit(base, NULL);
+}
+
+void BinaryServer::StartServer(uint16_t port) {
+  _fd = socket(AF_INET, SOCK_STREAM, 0);
+  struct sockaddr_in sin;
+  memset(&sin, 0, sizeof(sin));
+  sin.sin_family = AF_INET;
+  sin.sin_port = htons(port);
+  sin.sin_addr.s_addr = inet_addr("0.0.0.0");
+
+  listener = evconnlistener_new_bind(
+      _base, StaticAccept, this, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1,
+      (struct sockaddr *)(void *)&sin, sizeof(sin));
+
+  if (!listener) {
+    fprintf(stderr, "%s:%d: Couldn't create listener\n", __FILE__, __LINE__);
+    exit(-1);
+  }
+
+  evconnlistener_set_error_cb(listener, accept_error_cb);
+}
+
+void BinaryServer::Notify(int fd, short /*what*/) {
+  char notes[4096];
+  int count = read(fd, notes, 4096);
+  if (count == 0) {
+    close(fd);
+    fprintf(stderr, "%s:%d: Error No cheeze from OpenCV task!!!\n", __FILE__,
+            __LINE__);
+    exit(-1);
+  }
+  printf("notified!: %d\n", count);
+  if (have_id) {
+    printf("got someone to read my stuff!\n");
+    char *binary_data;
+    size_t len;
+    if (_notify->GetData(&binary_data, &len)) {
+      printf("here is for sending\n");
+      evbuffer_add_reference(_output, binary_data, len,
+                             PacketNotifier::StaticDataSent, _notify);
+      printf("this is how sending went %d\n",
+             bufferevent_flush(_bufev, EV_WRITE, BEV_FLUSH));
+    }
+  }
+}
+
+// Constructor
+BinaryServer::BinaryServer(uint16_t port,
+                           frc971::vision::PacketNotifier *notify)
+    : _base(event_base_new()) {
+  have_id = false;
+  StartServer(port);
+  _notify = notify;
+  frame_notify = event_new(_base, notify->RecieverFD(), EV_READ | EV_PERSIST,
+                           StaticNotify, this);
+  event_add(frame_notify, NULL);
+  event_base_dispatch(_base);
+}
+
+}  // namespace vision
+}  // namespace frc971
diff --git a/vision/BinaryServer.h b/vision/BinaryServer.h
new file mode 100644
index 0000000..f33ee21
--- /dev/null
+++ b/vision/BinaryServer.h
@@ -0,0 +1,57 @@
+#ifndef FRC971_VISION_BINARY_SERVER_H_
+#define FRC971_VISION_BINARY_SERVER_H_
+
+#include <sys/types.h> 
+#include <sys/socket.h>
+
+#include "event2/buffer.h"
+#include "event2/event.h"
+#include "event2/listener.h"
+#include "event2/bufferevent.h"
+
+#include "aos/common/mutex.h"
+
+#include "vision/PacketNotifier.h"
+
+namespace frc971 {
+namespace vision {
+
+/* This runs the libevent loop and interfaces in with the sockets provided from the PacketNotifier
+ * to allow a secondary process to focus primarily on doing processing and then feeding this task.
+ */
+class BinaryServer {
+ public:
+  BinaryServer(uint16_t port,PacketNotifier *notify);
+
+
+  void StartServer(uint16_t port);
+ private:
+  event_base *const _base;
+  int _fd;
+  PacketNotifier *_notify;
+  bool have_id;
+  int _client_fd;
+  struct event *frame_notify;
+  struct evbuffer *_output;
+  struct bufferevent *_bufev;
+  struct evconnlistener *listener;
+  void Accept(evconnlistener *listener, evutil_socket_t fd,
+      struct sockaddr* /*address*/, int /*socklen*/);
+  void Notify(int /*fd*/, short /*what*/);
+  void ErrorEvent(struct bufferevent *bev,short events);
+  static void StaticAccept(evconnlistener *listener, evutil_socket_t fd,
+          struct sockaddr *address, int socklen,void *self){
+    ((BinaryServer *)(self))->Accept(listener, fd, address, socklen);
+  }
+  static void StaticNotify(int fd, short what, void *self){
+    ((BinaryServer *)(self))->Notify(fd, what);
+  }
+  static void StaticErrorEvent(struct bufferevent *bev,short events,void *self){
+    ((BinaryServer *)(self))->ErrorEvent(bev,events);
+  }
+};
+
+}  // namespace vision
+}  // namespace frc971
+
+#endif  // FRC971_VISION_BINARY_SERVER_H_
diff --git a/vision/CameraProcessor.cpp b/vision/CameraProcessor.cpp
new file mode 100644
index 0000000..856e12b
--- /dev/null
+++ b/vision/CameraProcessor.cpp
@@ -0,0 +1,466 @@
+#include "vision/CameraProcessor.h"
+#include "aos/common/logging/logging.h"
+
+//#define LOCAL_DEBUG 1
+
+// create a new target
+Target::Target(std::vector<cv::Point> new_contour,
+		std::vector<cv::Point> new_raw_contour,
+		FullRect new_rect, int new_weight, bool _is_90) {
+	this_contour = new_contour;
+	raw_contour = new_raw_contour;
+	rect = new_rect;
+	weight = new_weight;
+	height = getHeight(_is_90);
+}
+
+// calculate distance to target
+double Target::getHeight(bool is_90) {
+	// The 780.3296 is at full resolution 640x480, and we need
+	// to scale back to 320x240
+	//static const double cam_l = 780.3296 / 2.0; 
+	////static const double cam_d = 20.78096;
+	double height;
+	if (is_90) {
+		height = ((rect.ul.x - rect.ur.x) +
+				(rect.bl.x - rect.br.x)) / 2.0;
+	} else {
+		height = ((rect.ur.y + rect.ul.y) -
+				(rect.br.y + rect.bl.y)) / 2.0;
+	}
+	//return cam_l * 12.0 / height;
+	return height;
+}
+
+void Target::refineTarget() {
+	printf("okay refined\n");
+}
+
+FullRect::FullRect() {
+	ur.x = -1;
+	ur.y = -1;
+	ul.x = -1;
+	ul.y = -1;
+	br.x = -1;
+	br.y = -1;
+	bl.x = -1;
+	bl.y = -1;
+}
+
+// turns a contour into easier to access structure
+FullRect calcFullRect(std::vector<cv::Point> *contour){
+	FullRect rect;
+	for(int i=0; i<4; i++){
+		cv::Point2f pt = (*contour)[i];
+		rect.centroid.x += pt.x;
+		rect.centroid.y += pt.y;
+	}
+	rect.centroid.x /= 4;
+	rect.centroid.y /= 4;
+	for(int i=0; i<4; i++){
+		cv::Point2f pt = (*contour)[i];
+		if(pt.y > rect.centroid.y ){
+			if(pt.x > rect.centroid.x){
+				if (rect.ul.x < 0) {
+					rect.ul = pt;
+				} else {
+					rect.ur = pt;
+				}
+			}else{
+				if (rect.ur.x < 0) {
+					rect.ur = pt;
+				} else {
+					rect.ul = pt;
+				}
+			}
+			if (rect.ul.x > 0 && rect.ur.x > 0) {
+				// both are set, so if we got it wrong correct it here
+				if (rect.ul.x > rect.ur.x) {
+					pt = rect.ur;
+					rect.ur = rect.ul;
+					rect.ul = pt;
+				}
+			}
+		}else{
+			if(pt.x > rect.centroid.x){
+				if (rect.bl.x < 0) {
+					rect.bl = pt;
+				} else {
+					rect.br = pt;
+				}
+			}else{
+				if (rect.br.x < 0) {
+					rect.br = pt;
+				} else {
+					rect.bl = pt;
+				}
+			}
+			if (rect.bl.x > 0 && rect.br.x > 0) {
+				// both are set, so if we got it wrong correct it here
+				if (rect.bl.x > rect.br.x) {
+					pt = rect.br;
+					rect.br = rect.bl;
+					rect.bl = pt;
+				}
+			}
+		}
+	}
+	return rect;
+}
+
+// quickly remove targets that do not fit a very broad set of constraints
+bool cullObvious(FullRect rect, double outside_size){
+	// first check that could see a target this size
+	// Calculated from dave's simulation, shloud be 850 and 72000 if filled
+	if((outside_size < 500) || (outside_size > 90000)){
+		return false;
+	}
+	// Targets on the edge are at best inaccurate.
+	// In this case, we just want to point the right way,
+	// so this is no longer a valid assumption.
+	/*if(	rect.ur.x < 2 || rect.ur.y < 2 || rect.ur.x > 637 || rect.ur.y > 477 ||
+		rect.ul.x < 2 || rect.ul.y < 2 || rect.ul.x > 637 || rect.ul.y > 477 ||
+		rect.br.x < 2 || rect.br.y < 2 || rect.br.x > 637 || rect.br.y > 477 ||
+		rect.bl.x < 2 || rect.bl.y < 2 || rect.bl.x > 637 || rect.bl.y > 477){
+		return false;
+	}*/
+	// make sure the sides are close to the right ratio of a rect
+	// some really odd shapes get confusing
+	double ratio = norm(rect.ur-rect.ul)/norm(rect.br-rect.bl);
+	if( ratio < .7 || ratio > 1.4 ) {
+		return false;
+	}
+	ratio = norm(rect.ur-rect.br)/norm(rect.ul-rect.bl);
+	if( ratio < .7 || ratio > 1.4 ) {
+		return false;
+	}
+
+	return true;
+}
+
+// sum over values between these two points and normalize
+// see Bresenham's Line Algorithm for the logic of moving
+// over all the pixels between these two points.
+double ProcessorData::calcHistComponent(
+		cv::Point2i start,
+		cv::Point2i end,
+		cv::Mat thresh_img){
+	int dx = abs(end.x - start.x);
+	int dy = abs(end.y - start.y);
+	int sx = (start.x < end.x) ? 1 : -1;
+	int sy = (start.y < end.y) ? 1 : -1;
+	int error = dx-dy;
+
+	int total = 0;
+	int value = 0;
+	int total_error;
+#if LOCAL_DEBUG
+	IplImage gd = *global_display;
+#endif
+	IplImage ti = thresh_img;
+	while(1){
+		total++;
+		
+		uchar* ptr = (uchar*) (ti.imageData + start.y * ti.widthStep + start.x);
+		if((int) *ptr) value++;
+		// draw line checked
+#if LOCAL_DEBUG
+		uchar* ptr2 = (uchar*) (gd.imageData + start.y * gd.widthStep + start.x*3);
+		*ptr2++ = 0;
+		*ptr2++ = 255;
+		*ptr2 = 0;
+#endif
+		if(start.x == end.x && start.y == end.y) break;
+		total_error = 2 * error;
+		if(total_error > -dy){
+			error -=  dy;
+			start.x += sx;
+		}
+		if(total_error < dx){
+			error += dx;
+			start.y += sy;
+		}
+	}
+	return (double)value/(double)total;
+}
+
+// just a distance function
+double chiSquared(int length, double* histA, double* histB){
+	double sum = 0;
+	for(int i=0; i<length;i++){
+		double diff = *(histB+i) - *(histA+i);
+		sum += (diff * diff) / *(histA+i);
+	}
+	return sum;
+}
+// euclidiean dist function
+double L2_dist(int length, double* histA, double* histB){
+	double sum = 0;
+	for(int i=0; i<length;i++){
+		double diff = *(histB+i) - *(histA+i);
+		sum += (diff * diff);
+	}
+	return sqrt(sum);
+}
+
+// calc and compare the histograms to the desired
+double ProcessorData::checkHistogram(FullRect rect, cv::Mat thresh_img){
+	// found horiz histogram
+	double hist_lr[HIST_SIZE];
+	// step size along left edge
+	cv::Point2f delta_left = (rect.ul - rect.bl)*HIST_SIZE_F;
+	// step size along right edge
+	cv::Point2f delta_right = (rect.ur - rect.br)*HIST_SIZE_F;
+	// sum each left to right line for the histogram
+	for(int i=0; i<HIST_SIZE; i++){
+		hist_lr[i] = calcHistComponent(rect.bl+i*delta_left,
+				rect.br+i*delta_right,thresh_img);
+	}
+	double check_vert = L2_dist(HIST_SIZE, vert_hist, hist_lr);
+	// found vert histogram
+	double hist_ub[HIST_SIZE];
+	// step size along bottom edge
+	cv::Point2f delta_bottom = (rect.bl - rect.br)*HIST_SIZE_F;
+	// step size along top edge
+	cv::Point2f delta_top = (rect.ul - rect.ur)*HIST_SIZE_F;
+	// sum each top to bottom line for the histogram
+	for(int i=0; i<HIST_SIZE; i++){
+		hist_ub[i] = calcHistComponent(rect.ur+i*delta_top,
+				rect.br+i*delta_bottom,thresh_img);
+	}
+	double check_horz = L2_dist(HIST_SIZE, horz_hist, hist_ub);
+
+	// average the two distances
+	double check = (check_vert + check_horz)/2.0;
+	return check;
+}
+
+// return smallest
+template<class T> inline T Min3(T x, T y, T z) {
+  return y <= z ? (x <= y ? x : y)
+                : (x <= z ? x : z);
+}
+
+// return largest
+template<class T> inline T Max3(T x, T y, T z) {
+  return y >= z ? (x >= y ? x : y)
+                : (x >= z ? x : z);
+}
+
+// transforms the contour
+void makeConvex(std::vector<cv::Point> *contour){
+	std::vector<cv::Point2i> hull;
+	convexHull(*contour, hull, false);
+	*contour = hull;
+}
+
+// basic init
+ProcessorData::ProcessorData(int width, int height, bool is_90_) {
+	is_90 = is_90_;
+	// series b images from nasa
+	h1=79;  s1=53;   v1=82;
+	h2=200; s2=255; v2=255;
+	// For images from Jerry
+	//h1=79;  s1=0;   v1=11;
+	//h2=160; s2=255; v2=255;
+	img_width = width;
+	img_height = height;
+	buffer_size = img_height * img_width * 3;
+#if LOCAL_DEBUG
+        global_display = cvCreateImage(cvSize(width, height),
+                                       IPL_DEPTH_8U, 3);
+#endif
+	grey_image = cvCreateImage(cvSize(width, height),
+			           IPL_DEPTH_8U, 1);
+	grey_mat = new cv::Mat(grey_image);
+	
+	// calculate a desired histogram before we start
+	int j = 0;
+	for(double i=0; j<HIST_SIZE; i+=HIST_SIZE_F){
+		if (is_90) {
+			if(i < 2.0/12.0 || i > (1.0-2.0/12.0) ) horz_hist[j] = 1;
+			else horz_hist[j] = 0.10;
+			if(i < 2.0/24.0 || i > (1.0-2.0/24.0) ) vert_hist[j] = 1;
+			else vert_hist[j] = 4.0/24.0;
+		} else {
+			if(i < 2.0/12.0 || i > (1.0-2.0/12.0) ) vert_hist[j] = 1;
+			else vert_hist[j] = 0.10;
+			if(i < 2.0/24.0 || i > (1.0-2.0/24.0) ) horz_hist[j] = 1;
+			else horz_hist[j] = 4.0/24.0;
+		}
+		j++;
+	}
+
+        src_header_image = cvCreateImage(cvSize(width, height),
+            IPL_DEPTH_8U, 3);
+}
+
+// throw stuff away
+ProcessorData::~ProcessorData() {
+	cvReleaseImage(&grey_image);
+	cvReleaseImage(&src_header_image);
+	delete(grey_mat);
+}
+
+// reset processor data freeing as little as possible.
+void ProcessorData::clear() {
+	target_list.clear();
+	contour_pairs.clear();
+	hierarchy.clear();
+}
+
+
+// r,g,b values are from 0 to 255
+// h = [0,255], s = [0,255], v = [0,255]
+//		if s == 0, then h = 0 (undefined)
+void ProcessorData::RGBtoHSV(uchar r, uchar g, uchar b,
+		uchar *h, uchar *s, uchar *v ) {
+	uchar min, max, delta;
+	min = Min3( r, g, b );
+	max = Max3( r, g, b );
+	*v = max;
+	delta = max - min;
+	if (max == 0 || delta == 0) {
+		*s = 0;
+		*h = 0;
+		return;
+	}
+	*s = (255 * long(delta))/max;
+	if (max == r) {
+		*h = 0 + 43*(g - b)/(delta);
+	} else if (max == g) {
+		*h = 85 + 43*(b - r)/(delta);
+	} else {
+		*h = 171 + 43*(r - g)/(delta);
+	}
+}
+
+// keep anything that is in our HVS wedge
+// by far the longest running function in this code
+void ProcessorData::threshold(uchar* buffer) {
+#if LOCAL_DEBUG
+  uchar * draw_buffer = (uchar *) global_display->imageData;
+#endif
+  for (int i = 0, j = 0; i < (buffer_size); i+= 3, j++) {
+    uchar r = buffer[i + 2];
+    uchar g = buffer[i + 1];
+    uchar b = buffer[i + 0];
+    uchar h, s, v;
+
+    RGBtoHSV(r, g, b, &h, &s, &v);
+
+    if (g > 128) {
+#if LOCAL_DEBUG
+      draw_buffer[i + 0] = 120;
+      draw_buffer[i + 1] = 80;
+      draw_buffer[i + 2] = 70;
+#endif
+      grey_image->imageData[j] = 255;
+    } else if (h == 0 && s == 0 && v >= v1 && v <= v2) { 
+      // Value thresholds invalid pixels.
+#if LOCAL_DEBUG
+      draw_buffer[i + 0] = 200;
+      draw_buffer[i + 1] = 50;
+      draw_buffer[i + 2] = 100;
+#endif
+      grey_image->imageData[j] = 255;
+    } else if (h >= h1 && h <= h2 && v >= v1 &&
+               v <= v2 && s >= s1 && s <= s2){
+      // HSV Thresholded image.
+#if LOCAL_DEBUG
+      draw_buffer[i + 0] = 255;
+      draw_buffer[i + 1] = 0;
+      draw_buffer[i + 2] = 0;
+#endif
+      grey_image->imageData[j] = 255;
+    } else {
+      // Display the unmodified image.
+#if LOCAL_DEBUG
+      draw_buffer[i + 0] = buffer[i + 0];
+      draw_buffer[i + 1] = buffer[i + 1];
+      draw_buffer[i + 2] = buffer[i + 2];
+#endif
+      grey_image->imageData[j] = 0;
+    }
+
+  }
+
+}
+
+// run find contours and try to make them squares
+void ProcessorData::getContours() {
+	std::vector<std::vector<cv::Point> > raw_contours;
+	//cv::findContours(*grey_mat, raw_contours, hierarchy, CV_RETR_LIST,
+	//		CV_CHAIN_APPROX_SIMPLE);
+	cv::findContours(*grey_mat, raw_contours, hierarchy, CV_RETR_EXTERNAL,
+			CV_CHAIN_APPROX_SIMPLE);
+#if LOCAL_DEBUG
+	cv::Mat global_mat(global_display);
+	cv::Scalar color(255,0,0);
+	drawContours(global_mat,raw_contours,-1,color,1);
+
+	std::vector<std::vector<cv::Point> > p_contours;
+#endif
+	if (!raw_contours.empty()) {
+		std::vector<std::vector<cv::Point2i> >::iterator contour_it;
+		for (contour_it=raw_contours.begin();
+				contour_it != raw_contours.end();
+				contour_it++) {
+			// make the contours convex
+			makeConvex(&(*contour_it));
+			std::vector<cv::Point> contour;
+			//then make them rectangle
+			approxPolyDP(*contour_it, contour, 9, true);
+			// stick the raw and processed contours together
+			std::pair<std::vector<cv::Point>,
+				std::vector<cv::Point> > a_pair(
+						*contour_it, contour);
+#if LOCAL_DEBUG
+			p_contours.push_back(contour);
+#endif
+			// and put them in a list
+			contour_pairs.push_back(a_pair);
+		}
+	}
+#if LOCAL_DEBUG
+	cv::Scalar color2(0,0,255);
+	drawContours(global_mat,p_contours,-1,color2,CV_FILLED);
+#endif
+}
+
+// filter the contours down to a list of targets
+void ProcessorData::filterToTargets() {
+  std::vector<std::pair<
+    std::vector<cv::Point>,
+    std::vector<cv::Point> > >::iterator contour_it;
+  for(contour_it=contour_pairs.begin();
+      contour_it != contour_pairs.end();
+      contour_it++){
+    double check = 0;
+    std::vector<cv::Point> raw_contour = std::get<0>(*contour_it);
+    std::vector<cv::Point> contour = std::get<1>(*contour_it);
+    FullRect rect = calcFullRect(&contour);
+    if(contour.size() == 4 &&
+        cullObvious(rect, contourArea(contour)) &&
+        (check = checkHistogram(rect, *grey_mat)) <= HIST_MATCH){
+      // now we have a target, try to improve the square
+#if LOCAL_DEBUG
+      /*	printf("________\n");
+                printf("\tcont= %d raw= %d\n",
+                (int)contour.size(), (int)raw_contour.size());
+                std::vector<cv::Point2i>::iterator point_it;
+                for(point_it=raw_contour.begin();
+                point_it != raw_contour.end(); point_it++){
+                printf("(%d,%d)", point_it->x, point_it->y);
+                }
+                printf("\n");*/
+#endif
+      target_list.push_back(Target(contour,
+            raw_contour, rect, check, is_90));
+    }
+    if (contour.size() == 4 && cullObvious(rect, contourArea(contour))) {
+    	LOG(DEBUG, "check= %.2f\n", check);
+    }
+  }
+}
+
diff --git a/vision/CameraProcessor.h b/vision/CameraProcessor.h
new file mode 100644
index 0000000..096defb
--- /dev/null
+++ b/vision/CameraProcessor.h
@@ -0,0 +1,88 @@
+#ifndef VISION_CAMERA_PROCESSOR_H_
+#define VISION_CAMERA_PROCESSOR_H_
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <utility>
+#include <vector>
+
+#include "opencv2/imgproc/imgproc.hpp"
+
+// an over described geometric representation of a rectangle
+class FullRect {
+ public:
+  FullRect();
+  cv::Point2f ur; // upper right
+  cv::Point2f ul; // upper left
+  cv::Point2f br; // bottom right
+  cv::Point2f bl; // bottom_left
+  cv::Point2f centroid; //centroid
+};
+
+// All data needed once a target is found
+class Target {
+	public:
+		Target(std::vector<cv::Point> new_contour,
+			std::vector<cv::Point> new_raw_contour,
+			FullRect new_rect, int new_weight, bool _is_90);
+		void refineTarget();
+		double getHeight(bool is_90);
+		FullRect rect; // geometric representation of the target
+		std::vector<cv::Point> this_contour; // opencv contour of target
+		std::vector<cv::Point> raw_contour; // opencv contour of target
+		double height; // top target to robot
+		double weight; // confidence in this target
+};
+
+// main class for processing image data. All relavent data should be
+// accessible through this structure.
+class ProcessorData {
+	public:
+		ProcessorData(int width, int height, bool is_90_);
+		~ProcessorData();
+		void RGBtoHSV(uchar r, uchar g, uchar b,
+			uchar *h, uchar *s, uchar *v);
+		void threshold(uchar* buffer);
+		void getContours();
+		void filterToTargets();
+		void clear();
+	//protected:
+		int img_width; // all images should be this width
+		int img_height; // and this height
+		bool is_90;
+		int buffer_size; // width * height * 3
+		IplImage *grey_image; // thresholded image
+		cv::Mat *grey_mat; // Matrix representaion (just a header)
+		std::vector<std::pair<std::vector<cv::Point>,
+			std::vector<cv::Point> > > contour_pairs;
+		//std::vector<std::vector<cv::Point> > contours; // filtered contours
+		//yystd::vector<std::vector<cv::Point> > raw_contours; //original contours
+		std::vector<cv::Vec4i> hierarchy; // ordering on contours
+		cv::MemStorage g_storage; // opencv storage
+		static const int HIST_SIZE = 20; // dimension of histogram
+								 // ie number of scan lines
+		static constexpr double HIST_SIZE_F = 1.0/20.0; // step size
+											// should be 1/HIST_SIZE
+		double vert_hist[HIST_SIZE]; // desired vertical histogram
+		double horz_hist[HIST_SIZE]; // desired horizontal histogram
+		// defines the minimum dist for a match
+		static constexpr double HIST_MATCH = 1.9;
+		double calcHistComponent(
+				cv::Point2i start,
+				cv::Point2i end,
+				cv::Mat thresh_img);
+		double checkHistogram(
+				FullRect rect,
+				cv::Mat thresh_img);
+	public:
+		int h1, s1, v1, h2, s2, v2; // HSV min and max
+									// must be public for tuning
+		IplImage * global_display;
+
+		IplImage *src_header_image; // header for main image
+		std::vector<Target> target_list; // list of found targets
+};
+
+#endif  // VISION_CAMERA_PROCESSOR_H_
diff --git a/vision/GoalMaster.cpp b/vision/GoalMaster.cpp
new file mode 100644
index 0000000..5c8fad8
--- /dev/null
+++ b/vision/GoalMaster.cpp
@@ -0,0 +1,61 @@
+#include "math.h"
+
+#include "aos/common/time.h"
+#include "aos/atom_code/init.h"
+#include "aos/common/logging/logging.h"
+
+#include "frc971/queues/GyroAngle.q.h"
+#include "frc971/queues/CameraTarget.q.h"
+
+#include "vision/RingBuffer.h"
+#include "vision/SensorProcessor.h"
+
+using ::frc971::vision::RingBuffer;
+using ::frc971::sensors::gyro;
+using ::frc971::vision::targets;
+using ::frc971::vision::target_angle;
+using ::frc971::kPixelsToMeters;
+using ::frc971::kMetersToShooterSpeeds;
+using ::frc971::kMetersToShooterAngles;
+using ::frc971::interpolate;
+
+int main() {
+  //RingBuffer< ::aos::time::Time, double> buff;
+  ::aos::InitNRT();
+  while (true) {
+    //gyro.FetchNextBlocking();
+    //buff.Sample(gyro->sent_time, gyro->angle);
+    if (targets.FetchNext()) {
+      /*::aos::time::Time stamp = ::aos::time::Time::InNS(targets->timestamp);
+      double angle_goal =
+          buff.ValueAt(stamp) -
+					M_PI / 2.0 * targets->percent_azimuth_off_center / 2.0;
+      printf("%g ",angle_goal);
+      printf("%g\n",gyro->angle);*/
+
+      double meters = interpolate(
+          sizeof(kPixelsToMeters) / sizeof(kPixelsToMeters[0]),
+          kPixelsToMeters,
+          targets->percent_elevation_off_center);
+      const double shooter_speed = interpolate(
+          sizeof(kMetersToShooterSpeeds) / sizeof(kMetersToShooterSpeeds[0]),
+          kMetersToShooterSpeeds,
+          meters);
+      const double shooter_angle = interpolate(
+           sizeof(kMetersToShooterAngles) / sizeof(kMetersToShooterAngles[0]),
+           kMetersToShooterAngles,
+           meters);
+
+      LOG(DEBUG, "%+f=> think target is %f meters away Speed %f Angle %f\n",
+          targets->percent_elevation_off_center,
+          meters, shooter_speed, shooter_angle);
+
+      target_angle.MakeWithBuilder()
+          /*.target_angle(angle_goal)*/
+          .shooter_speed(shooter_speed)
+          .shooter_angle(shooter_angle)
+          .Send();
+    }
+  }
+  ::aos::Cleanup();
+}
diff --git a/vision/JPEGRoutines.cpp b/vision/JPEGRoutines.cpp
new file mode 100644
index 0000000..e3dc254
--- /dev/null
+++ b/vision/JPEGRoutines.cpp
@@ -0,0 +1,192 @@
+#include "vision/JPEGRoutines.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <string.h>
+
+#include "aos/common/time.h"
+
+#include "vision/OpenCVWorkTask.h"
+
+namespace frc971 {
+namespace vision {
+
+/* This is also adapted from libjpeg to be used on decompression tables rather than
+ * compression tables as it was origionally intended
+ */
+void decompress_add_huff_table (j_decompress_ptr cinfo,
+    JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
+/* Define a Huffman table */
+{
+  int nsymbols, len;
+
+  if (*htblptr == NULL)
+    *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+
+  /* Copy the number-of-symbols-of-each-code-length counts */
+  memcpy((*htblptr)->bits, bits, sizeof((*htblptr)->bits));
+
+  /* Validate the counts.  We do this here mainly so we can copy the right
+   * number of symbols from the val[] array, without risking marching off
+   * the end of memory.  jchuff.c will do a more thorough test later.
+   */
+  nsymbols = 0;
+  for (len = 1; len <= 16; len++)
+    nsymbols += bits[len];
+  if (nsymbols < 1 || nsymbols > 256){
+    fprintf(stderr,"%s:%d: Error, bad huffman table",__FILE__,__LINE__);
+    exit(-1);
+  }
+
+  memcpy((*htblptr)->huffval, val, nsymbols * sizeof(uint8_t));
+
+}
+
+/* standard_huff_tables is taken from libjpeg compression stuff
+ * and is here used to set up the same tables in the decompression structure.
+ */
+void  standard_huff_tables (j_decompress_ptr cinfo)
+  /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
+  /* IMPORTANT: these are only valid for 8-bit data precision! */
+{
+  static const UINT8 bits_dc_luminance[17] =
+  { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
+  static const UINT8 val_dc_luminance[] =
+  { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+
+  static const UINT8 bits_dc_chrominance[17] =
+  { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
+  static const UINT8 val_dc_chrominance[] =
+  { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+
+  static const UINT8 bits_ac_luminance[17] =
+  { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
+  static const UINT8 val_ac_luminance[] =
+  { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+    0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+    0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+    0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+    0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+    0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+    0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+    0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+    0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+    0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+    0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+    0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+    0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+    0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+    0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+    0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+    0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+    0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+    0xf9, 0xfa };
+
+  static const UINT8 bits_ac_chrominance[17] =
+  { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
+  static const UINT8 val_ac_chrominance[] =
+  { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+    0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+    0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+    0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+    0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+    0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+    0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+    0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+    0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+    0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+    0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+    0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+    0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+    0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+    0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+    0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+    0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+    0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+    0xf9, 0xfa };
+
+  decompress_add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
+      bits_dc_luminance, val_dc_luminance);
+  decompress_add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
+      bits_ac_luminance, val_ac_luminance);
+  decompress_add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
+      bits_dc_chrominance, val_dc_chrominance);
+  decompress_add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
+      bits_ac_chrominance, val_ac_chrominance);
+}
+
+
+
+
+void process_jpeg(unsigned char *out,unsigned char *image,size_t size){
+  struct jpeg_decompress_struct cinfo;
+  struct jpeg_error_mgr jerr;
+
+  static aos::time::Time timestamp_old = aos::time::Time::Now();
+  //aos::time::Time timestamp_start = aos::time::Time::Now();
+  
+  cinfo.err = jpeg_std_error( &jerr );
+  cinfo.out_color_space = JCS_RGB;
+  jpeg_create_decompress( &cinfo );
+  //jpeg_stdio_src( &cinfo, infile );
+  jpeg_mem_src(&cinfo,image,size);
+
+  jpeg_read_header( &cinfo, TRUE );
+  standard_huff_tables (&cinfo);
+
+
+//  printf( "JPEG File Information: \n" );
+//  printf( "Image width and height: %d pixels and %d pixels.\n", cinfo.image_width, cinfo.image_height );
+//  printf( "Color components per pixel: %d.\n", cinfo.num_components );
+//  printf( "Color space: %d.\n", cinfo.jpeg_color_space );
+  //printf("JpegDecompressed\n");
+
+  jpeg_start_decompress( &cinfo );
+
+  int offset = 0;
+  int step = cinfo.num_components * cinfo.image_width;
+  unsigned char *buffers[cinfo.image_height];
+  for (int i = cinfo.image_height - 1; i >= 0; --i) {
+    buffers[i] = &out[offset]; 
+    offset += step;
+  }
+
+  while( cinfo.output_scanline < cinfo.image_height )
+  {
+    jpeg_read_scanlines(&cinfo, &buffers[cinfo.output_scanline],
+        cinfo.image_height - cinfo.output_scanline);
+  }
+
+  /* This used to do BGR to RGB conversions inline */
+/* 
+  for (int i = 0; i < (int)(cinfo.image_height * cinfo.image_width * 3); i+= 3) {
+    uint8_t b = out[i + 0];
+    uint8_t r = out[i + 2];
+    out[i + 0] = r;
+    out[i + 2] = b;
+  }
+*/
+  jpeg_finish_decompress( &cinfo );
+  jpeg_destroy_decompress( &cinfo );
+
+  aos::time::Time timestamp_end = aos::time::Time::Now();
+
+  //double jpeg_part = ((timestamp_end - timestamp_start).nsec()) / 1000000000.0;
+  //double longer_part = ((timestamp_end - timestamp_old).nsec()) / 1000000000.0;
+
+  //printf("%g %g\n",jpeg_part / longer_part,1.0 / longer_part);
+
+  timestamp_old = timestamp_end;
+
+}
+
+}  // namespace vision
+}  // namespace frc971
+
diff --git a/vision/JPEGRoutines.h b/vision/JPEGRoutines.h
new file mode 100644
index 0000000..c3b8e13
--- /dev/null
+++ b/vision/JPEGRoutines.h
@@ -0,0 +1,17 @@
+// for jpeglib.h
+#include <stdio.h>
+
+#include "libjpeg/include/jpeglib.h"
+
+namespace frc971 {
+namespace vision {
+
+void decompress_add_huff_table (j_decompress_ptr cinfo,
+    JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val);
+
+void  standard_huff_tables (j_decompress_ptr cinfo);
+
+void process_jpeg(unsigned char *out,unsigned char *image,size_t size);
+
+}  // namespace vision
+}  // namespace frc971
diff --git a/vision/OpenCVWorkTask.cpp b/vision/OpenCVWorkTask.cpp
new file mode 100644
index 0000000..8fc11eb
--- /dev/null
+++ b/vision/OpenCVWorkTask.cpp
@@ -0,0 +1,139 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+
+#include <vector>
+#include <iostream>
+
+#include "libjpeg/include/jpeglib.h"
+
+#include "aos/common/time.h"
+#include "aos/atom_code/camera/Buffers.h"
+#include "aos/atom_code/init.h"
+#include "aos/common/logging/logging.h"
+
+#include "vision/OpenCVWorkTask.h"
+#include "vision/CameraProcessor.h"
+#include "vision/JPEGRoutines.h"
+
+
+namespace frc971 {
+namespace vision {
+
+}  // namespace vision
+}  // namespace frc971
+
+namespace {
+void SaveImageToFile(IplImage *image, const char *filename) {
+  FILE *file = fopen(filename, "w");
+
+  fputs("P3\n320 240\n255\n", file);
+  ::cv::Mat img(image);
+  for (int i = 0; i < img.rows; i++) {
+    for (int j = 0; j < img.cols; j++) {
+      // You can now access the pixel value with cv::Vec3b
+      fprintf(file, "%d %d %d ",
+          img.at<cv::Vec3b>(i,j)[0],
+          img.at<cv::Vec3b>(i,j)[1],
+          img.at<cv::Vec3b>(i,j)[2]);
+
+    }
+    fputs("\n", file);
+  }
+  fclose(file);
+}
+}
+
+#include "frc971/queues/CameraTarget.q.h"
+using frc971::vision::targets;
+
+void sender_main(){
+  ::aos::camera::Buffers buffers;
+  CvSize size;
+  size.width = ::aos::camera::Buffers::Buffers::kWidth;
+  size.height = ::aos::camera::Buffers::Buffers::kHeight;
+  unsigned char buffer[::aos::camera::Buffers::Buffers::kWidth *
+      ::aos::camera::Buffers::Buffers::kHeight * 3];
+
+  // create processing object
+  ProcessorData processor(size.width, size.height, false);
+
+  printf("started sender main\n");
+  LOG(INFO, "Camera server started\n");
+  while(true){
+    //usleep(7500);
+    size_t data_size;
+  	timeval timestamp_timeval;
+    LOG(DEBUG, "getting new image\n");
+    const void *image = buffers.GetNext(
+		    true, &data_size, &timestamp_timeval, NULL);
+    ::aos::time::Time timestamp(timestamp_timeval);
+
+    LOG(DEBUG, "Got new image\n");
+    frc971::vision::process_jpeg(
+        buffer, static_cast<unsigned char *>(const_cast<void *>(image)),
+        data_size);
+
+    // build the headers on top of the buffer
+    cvSetData(processor.src_header_image,
+              buffer,
+              ::aos::camera::Buffers::Buffers::kWidth * 3);
+
+    // Reset.
+    processor.clear();
+    // transform the buffer into targets
+    processor.threshold(buffer);
+
+    processor.getContours();
+    processor.filterToTargets();
+
+    // could be used for debug ie drawContours
+    //std::vector<std::vector<cv::Point> > target_contours;
+    //std::vector<std::vector<cv::Point> > best_contours;
+    std::vector<Target>::iterator target_it;
+    Target *best_target = NULL;
+    // run through the targets
+    LOG(DEBUG, "Found %u targets\n", processor.target_list.size());
+    for(target_it = processor.target_list.begin();
+        target_it != processor.target_list.end(); target_it++){
+      //target_contours.push_back(*(target_it->this_contour));
+      // select the highest target
+      if (best_target == NULL) {
+        best_target = &*target_it;
+      } else {
+        if (target_it->height < best_target->height) {
+          best_target = &*target_it;
+        }
+      }
+    }
+    // if we found one then send it on
+    if (best_target != NULL) {
+      LOG(DEBUG, "Target is %f\n", best_target->rect.centroid.x);
+      targets.MakeWithBuilder()
+        .percent_azimuth_off_center(
+            best_target->rect.centroid.y / (double)::aos::camera::Buffers::kHeight - 0.5)
+        .percent_elevation_off_center(
+            best_target->rect.centroid.x / (double)::aos::camera::Buffers::kWidth - 0.5)
+        .timestamp(timestamp.ToNSec())
+        .Send();
+    }
+    //static int counter = 0;
+    //if (++counter > 2) {
+      //break;
+    //}
+  }
+}
+
+
+int main(int /*argc*/, char** /*argv*/){
+  ::aos::InitNRT();
+  sender_main();
+  ::aos::Cleanup();
+}
+
diff --git a/vision/OpenCVWorkTask.h b/vision/OpenCVWorkTask.h
new file mode 100644
index 0000000..78bda5d
--- /dev/null
+++ b/vision/OpenCVWorkTask.h
@@ -0,0 +1,20 @@
+#ifndef VISION_OPENCV_WORK_TASK_H_
+#define VISION_OPENCV_WORK_TASK_H_
+
+#include <sys/types.h> 
+#include <sys/socket.h>
+
+#include "event2/buffer.h"
+#include "event2/event.h"
+#include "event2/listener.h"
+#include "event2/bufferevent.h"
+
+#include "aos/common/mutex.h"
+
+namespace frc971 {
+namespace vision {
+
+}  // namespace vision
+}  // namespace frc971
+
+#endif  // VISION_OPENCV_WORK_TASK_H_
diff --git a/vision/PacketNotifier.cpp b/vision/PacketNotifier.cpp
new file mode 100644
index 0000000..d12872e
--- /dev/null
+++ b/vision/PacketNotifier.cpp
@@ -0,0 +1,79 @@
+#include "vision/PacketNotifier.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <string.h>
+
+namespace frc971 {
+namespace vision {
+	
+void PacketNotifier::RegisterSender(){
+	close(fd[1]);
+}
+void PacketNotifier::RegisterReciever(){
+	close(fd[0]);
+}
+PacketNotifier *PacketNotifier::MMap(size_t data_size){
+	PacketNotifier *data;
+	data = (PacketNotifier *)mmap(NULL, ((data_size * 3 + 4095 + sizeof(PacketNotifier)) / 4096) * 4096, 
+			PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+	data->data_size = data_size;
+	socketpair(PF_LOCAL, SOCK_STREAM, 0, data->fd);
+	for(int i = 0;i < 3;i++){
+		data->buffs[i] = (uint8_t *)data + (sizeof(PacketNotifier) + i * data_size);
+	}
+	void *place = &(data->mutex);
+	*((int *)place) = 0; // The Mutex class needs a placement new operator. (you know, keep the masses happy);
+	data->in_flight = false;
+	data->to_send = -1;
+	data->sending = -1;
+	return data;
+}
+void *PacketNotifier::GetBuffer(){
+	mutex.Lock();
+	for(int i = 0; i < 3 ; i++){ //search for open spot.
+		if(i != sending && i != to_send){ //open
+			filling = i;
+			mutex.Unlock();
+			//printf("leasing out to fill buff # %d\n",i);
+			return buffs[i];
+		}
+	}
+	mutex.Unlock();
+	//printf("Error in the fabric of the universe\n");
+	exit(-42);
+}
+void PacketNotifier::Notify(){
+	mutex.Lock();
+	to_send = filling;
+	filling = -1;
+	mutex.Unlock();
+	// wall error
+	if(write(fd[0],"\n",1)) {}
+}
+
+void PacketNotifier::DataSent(const void * /*data*/, size_t /*datalen*/){
+	//printf("packet_sent: %d; fill: %d; to_send: %d \n",sending,filling,to_send);
+	mutex.Lock();
+	sending = -1;
+	mutex.Unlock();
+	in_flight = false;
+}
+bool PacketNotifier::GetData(char **place_to_put,size_t *length){
+	if(in_flight) return false;
+	mutex.Lock();
+	*length = data_size;
+	*place_to_put = (char *)buffs[to_send];
+	sending = to_send;
+	to_send = -1;
+	mutex.Unlock();
+	in_flight = true;
+	return true;
+}
+
+}  // namespace vision
+}  // namespace frc971
+
diff --git a/vision/PacketNotifier.h b/vision/PacketNotifier.h
new file mode 100644
index 0000000..7aff7fa
--- /dev/null
+++ b/vision/PacketNotifier.h
@@ -0,0 +1,45 @@
+#ifndef FRC971_VISION_PACKET_NOTIFIER_H_
+#define FRC971_VISION_PACKET_NOTIFIER_H_
+#include "event2/buffer.h"
+#include "event2/event.h"
+#include "event2/listener.h"
+#include "event2/bufferevent.h"
+#include "aos/common/mutex.h"
+
+#include <sys/types.h> 
+#include <sys/socket.h>
+
+namespace frc971 {
+namespace vision {
+
+/* This class lives in shared memory (using an anonomous mmap) to transfer data between
+ * the server process and the image processing process.
+ */
+struct PacketNotifier{
+ aos::Mutex mutex;
+ int fd[2];
+ //3 things can be happening:
+ //something waiting to be sent, something sending, and something getting filled (decompressed to)
+ void *buffs[3];
+ int to_send;
+ int filling;
+ int sending;
+ bool in_flight;
+ size_t data_size;
+ void Notify();
+ void RegisterSender();
+ void RegisterReciever();
+ int RecieverFD(){ return fd[1]; }
+ static PacketNotifier *MMap(size_t data_size);
+ void DataSent(const void * /*data*/, size_t /*datalen*/);
+ void *GetBuffer();
+ static void StaticDataSent(const void *data, size_t datalen, void *self){
+	 ((PacketNotifier *)(self))->DataSent(data,datalen);
+ }
+ bool GetData(char **place_to_put,size_t *length);
+};
+}  // namespace vision
+}  // namespace frc971
+
+
+#endif  //FRC971_VISION_PACKET_NOTIFIER_H_
diff --git a/vision/RingBuffer.h b/vision/RingBuffer.h
new file mode 100644
index 0000000..f333f29
--- /dev/null
+++ b/vision/RingBuffer.h
@@ -0,0 +1,67 @@
+#ifndef VISION_RINGBUFFER_H_
+#define VISION_RINGBUFFER_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+
+namespace frc971 {
+namespace vision {
+
+template<class T,class V>
+class RingBuffer{
+  //record class to hold sampes
+	class Samples{
+		public:
+	  T time;
+		V value;
+	};  
+	Samples *samples;
+	int current_;
+	int wraps_;
+	V value_at(int index){
+		return samples[index & 255].value;
+	}
+	T time_at(int index){
+		return samples[index & 255].time;
+	}
+	public:
+	RingBuffer(){
+		current_ = 0;
+		wraps_ = 0;
+		samples = (Samples *)malloc(sizeof(Samples) * 256);
+	}
+	// Adds samples into the ringbuffer.
+	void Sample(T time,V val){
+		current_ += 1;
+		wraps_ += current_ / 256;
+		current_ = current_ % 256;
+		samples[current_].time = time;
+		samples[current_].value = val;
+	}
+	// Binary Search to find and interpolate the values.
+	V ValueAt(T time){
+		int start = current_ - 255;
+		int end = current_;
+		if(start < 0 && !wraps_){ 
+			start = 0;
+		}   
+		int max = end;
+		int min = start;
+		while(end - start > 1){
+			int mid = (start + end) / 2;
+			Samples check = samples[mid & 255];
+			if(check.time < time){
+				start = mid;
+				min = mid;
+			}else{
+				max = mid;
+				end = mid;
+			}   
+		}
+		return value_at(min) + (value_at(max) - value_at(min)) *
+		((time - time_at(min)).ToSeconds()/(time_at(max) - time_at(min)).ToSeconds());
+	}
+};
+};  // vision
+};  // frc971
+#endif // VISION_RINGBUFFER_H_
diff --git a/vision/SensorProcessor.cpp b/vision/SensorProcessor.cpp
new file mode 100644
index 0000000..2060956
--- /dev/null
+++ b/vision/SensorProcessor.cpp
@@ -0,0 +1,53 @@
+#include "vision/SensorProcessor.h"
+
+#include <stdio.h>
+
+namespace frc971 {
+
+// give a set of x -> fx pairs find a range for our value
+// then interpolate between and return an interpolated fx.
+// If the value is off the end just extend the line to
+// meet our point. If something does go wrong (and it
+// never should) it will return -1.
+double interpolate(int num_interp_vals,
+		const Interpolation *interp, double value) {
+	double dy;
+	double dx;
+	double a;
+	double intercept;
+	//printf("for val %.1f\n", value); 
+	if (value < interp[0].x) {
+		// if closer than nearest 
+		dy = interp[1].fx - interp[0].fx;
+		dx = interp[1].x - interp[0].x;
+		a = value - interp[0].x;
+		intercept = interp[0].fx;
+		//printf("LESS THAN\n");
+	} else if (value > interp[num_interp_vals-1].x){
+		// if further than furthest 
+		dy = interp[num_interp_vals-1].fx - interp[num_interp_vals-2].fx;
+		dx = interp[num_interp_vals-1].x - interp[num_interp_vals-2].x;
+		a = value - interp[num_interp_vals-2].x;
+		intercept = interp[num_interp_vals-2].fx;
+		//printf("GT THAN\n");
+	} else {
+		//printf("gh0\n");
+		// scan for range
+		for(int i=0; i<num_interp_vals-1; i++){
+			if(value >= interp[i].x && value <= interp[i+1].x){
+		//		printf("(%.1f,%.1f)=(%.1f,%.1f)\n",
+		//				interp[i].x, interp[i+1].x,
+		//				interp[i].fx, interp[i+1].fx);
+				double lambda =
+					(value - interp[i].x)/(interp[i+1].x - interp[i].x);
+				return (1-lambda)*interp[i].fx + lambda*interp[i+1].fx;
+			}
+		}
+		// this should maybe be an assert
+		return -1;
+	}
+	
+	return ( (dy/dx)*a + intercept );
+}
+
+}  // namespace frc971
diff --git a/vision/SensorProcessor.h b/vision/SensorProcessor.h
new file mode 100644
index 0000000..daf24be
--- /dev/null
+++ b/vision/SensorProcessor.h
@@ -0,0 +1,45 @@
+#ifndef VISION_SENSOR_PROCESSOR_H_
+#define VISION_SENSOR_PROCESSOR_H_
+
+namespace frc971 {
+
+// struct maps a single point x to to a value f of x
+typedef struct {
+	double x;
+	double fx;
+} Interpolation;
+
+static const Interpolation kPixelsToMeters[] = {
+  {-0.050781, 4.7498},
+  {-0.0375, 4.318},
+  {0.028125, 3.9878},
+  {0.080469, 3.51},
+  {0.126563, 3.1496},
+  {0.131, 2.9972},
+  {0.144, 2.921},
+  {0.196, 3.2258},
+  // Below here is junk because it starts coming off of the tower base.
+  {0.296875, 2.667},
+  {0.351562, 2.3876},
+};
+
+// Must be in reverse order in meters.
+static const Interpolation kMetersToShooterSpeeds[] = {
+  {2.0, 375.0},
+  {3.0, 360.0},
+  {4.5, 375.0},
+};
+
+static const Interpolation kMetersToShooterAngles[] = {
+  {3.0, 0.68},
+  {3.7, 0.635},
+  {4.15, 0.58},
+  {5.0, 0.51},
+};
+
+double interpolate(int num_interp_vals,
+		const Interpolation *interp, double value);
+
+}  // namespace frc971
+
+#endif  // VISION_SENSOR_PROCESSOR_H_
diff --git a/vision/bmp_stream/bmp.rb b/vision/bmp_stream/bmp.rb
new file mode 100644
index 0000000..122c9de
--- /dev/null
+++ b/vision/bmp_stream/bmp.rb
@@ -0,0 +1,11 @@
+class BMPHeader
+	def initialize(width,height)
+		@width = width
+		@height = height
+	end
+	def text()
+		size = @width * @height * 3
+		return ["BM",size + 54,"\0\0\0\0",54,40,@width,
+			@height,1,24,0,size,2835,2835,0,0].pack("a2Ia4IIIIssIIIIII")
+	end
+end
diff --git a/vision/bmp_stream/bmp_dump.rb b/vision/bmp_stream/bmp_dump.rb
new file mode 100644
index 0000000..6c5133c
--- /dev/null
+++ b/vision/bmp_stream/bmp_dump.rb
@@ -0,0 +1,45 @@
+require "socket"
+
+require "bmp"
+sock = TCPSocket.new(ARGV[0] || "fitpc",8020)
+$width = 640 / 2
+$height = 480 / 2
+$header = BMPHeader.new($width,$height).text()
+
+
+
+require "rubygems"
+require "gtk2"
+
+
+$image = Gtk::Image.new()
+$window = Gtk::Window.new()
+$window.add($image)
+$window.show_all()
+$window.signal_connect("delete-event") { Gtk.main_quit}
+
+loader = Gdk::PixbufLoader.new
+loader.write($header)
+data = sock.read($width * $height * 3)
+loader.last_write(data)
+loader.close
+$image.pixbuf = loader.pixbuf
+$oldtime = Time.now
+i = 0
+Gtk.idle_add do
+	loader = Gdk::PixbufLoader.new
+	loader.write($header)
+	data = sock.read($width * $height * 3)
+#	(640 * 480).times do |i| #BGR -> RGB
+#		b,g,r = data[i * 3 + 0],data[i * 3 + 1],data[i * 3 + 2]
+#		data[i * 3 + 0],data[i * 3 + 1],data[i * 3 + 2] = r,g,b
+#	end
+	loader.last_write(data)
+	loader.close
+	new_time = Time.now()
+	puts 1 / (new_time - $oldtime)
+	$oldtime = new_time
+	$image.pixbuf = loader.pixbuf
+end
+
+Gtk.main()
diff --git a/vision/bmp_stream/bmp_stream_from_file.rb b/vision/bmp_stream/bmp_stream_from_file.rb
new file mode 100644
index 0000000..3324484
--- /dev/null
+++ b/vision/bmp_stream/bmp_stream_from_file.rb
@@ -0,0 +1,43 @@
+require "socket"
+$header = File.open("header.bmp") { |f| f.read(54)} 
+
+
+sock = File.open("output.bmp_stream")
+#TCPSocket.new(ARGV[0] || "fitpc",8020)
+
+
+
+require "rubygems"
+require "gtk2"
+
+
+$image = Gtk::Image.new()
+$window = Gtk::Window.new()
+$window.add($image)
+$window.show_all()
+$window.signal_connect("delete-event") { Gtk.main_quit}
+
+loader = Gdk::PixbufLoader.new
+loader.write($header)
+data = sock.read(320 * 240 * 3)
+loader.last_write(data)
+loader.close
+$image.pixbuf = loader.pixbuf
+$oldtime = Time.now
+Gtk.timeout_add(1000) do 
+	loader = Gdk::PixbufLoader.new
+	loader.write($header)
+	data = sock.read(320 * 240 * 3)
+#	(640 * 480).times do |i| #BGR -> RGB
+#		b,g,r = data[i * 3 + 0],data[i * 3 + 1],data[i * 3 + 2]
+#		data[i * 3 + 0],data[i * 3 + 1],data[i * 3 + 2] = r,g,b
+#	end
+	loader.last_write(data)
+	loader.close
+	new_time = Time.now()
+	puts 1.0 / (new_time - $oldtime)
+	$oldtime = new_time
+	$image.pixbuf = loader.pixbuf
+end
+
+Gtk.main()
diff --git a/vision/bmp_stream/bmp_stream_to_file.rb b/vision/bmp_stream/bmp_stream_to_file.rb
new file mode 100644
index 0000000..962bb2d
--- /dev/null
+++ b/vision/bmp_stream/bmp_stream_to_file.rb
@@ -0,0 +1,20 @@
+require "socket"
+$header = File.open("header.bmp") { |f| f.read(54)} 
+
+
+sock = TCPSocket.new(ARGV[0] || "fitpc",8020)
+
+
+
+require "rubygems"
+require "gtk2"
+
+
+
+File.open("output.bmp_stream","w+") do |file|
+	400.times do |i|
+		data = sock.read(320 * 240 * 3)
+		file.print(data)
+		puts "frame: #{i}"
+	end
+end
diff --git a/vision/tests/FieldDBGCamProc.cpp b/vision/tests/FieldDBGCamProc.cpp
new file mode 100644
index 0000000..f23b541
--- /dev/null
+++ b/vision/tests/FieldDBGCamProc.cpp
@@ -0,0 +1,210 @@
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <vector>
+
+#include "../CameraProcessor.h"
+#include "../SensorProcessor.h"
+
+#include "opencv2/highgui/highgui.hpp"
+
+const int num_names = 39;
+
+
+static const bool USE_ROTATED = true;
+static const int use_width = 320;
+static const int use_height = 240;
+const char * image_names[num_names] = {
+			"NASA_bmp/img26_series_b_side_204_e65.jpg",
+			"NASA_bmp/img19_series_b_side_110_e65.jpg",
+			"NASA_bmp/img12_series_b_center_224_e65.jpg",
+			"NASA_bmp/img23_series_b_side_101_e65.jpg",
+			"NASA_bmp/img15_series_b_side_230_e65.jpg",
+			"NASA_bmp/img10_series_b_center_203_e65.jpg",
+			"NASA_bmp/img11_series_b_center_203_e65.jpg",
+			"NASA_bmp/img13_series_b_center_260_e65.jpg",
+			"NASA_bmp/img14_series_b_center_251_e65.jpg",
+			"NASA_bmp/img16_series_b_side_196_e65.jpg",
+			"NASA_bmp/img17_series_b_side_160_e65.jpg",
+			"NASA_bmp/img18_series_b_side_140_e65.jpg",
+			"NASA_bmp/img1_center_200_e65.jpg",
+			"NASA_bmp/img20_series_b_side_114_e65.jpg",
+			"NASA_bmp/img21_series_b_side_137_e65.jpg",
+			"NASA_bmp/img22_center field_e10.jpg",
+			"NASA_bmp/img22_dog Center Field_e10.jpg",
+			"NASA_bmp/img22_series_b_side_150_e65.jpg",
+			"NASA_bmp/img23_center field_e10.jpg",
+			"NASA_bmp/img24_center field_e10.jpg",
+			"NASA_bmp/img24_series_b_side_104_e65.jpg",
+			"NASA_bmp/img25_series_b_side_195_e65.jpg",
+			"NASA_bmp/img27_series_b_side_192_e65.jpg",
+			"NASA_bmp/img28_series_b_side_192_e65.jpg",
+			"NASA_bmp/img29_series_b_side_186_e65.jpg",
+			"NASA_bmp/img2_center_207_e65.jpg",
+			"NASA_bmp/img30_series_b_side_177_e65.jpg",
+			"NASA_bmp/img31_series_b_side_176_e65.jpg",
+			"NASA_bmp/img32_series_b_side_212_e65.jpg",
+			"NASA_bmp/img33_series_b_side_251_e65.jpg",
+			"NASA_bmp/img34_series_b_side_272_e65.jpg",
+			"NASA_bmp/img35_series_b_side_23+219_e65.jpg",
+			"NASA_bmp/img3_center_180_e65.jpg",
+			"NASA_bmp/img4_series_b_center_106_e65.jpg",
+			"NASA_bmp/img5_series_b_center_122_e65.jpg",
+			"NASA_bmp/img6_series_b_center_145_e65.jpg",
+			"NASA_bmp/img7_series_b_center_174_e65.jpg",
+			"NASA_bmp/img8_series_b_center_196_e65.jpg",
+			"NASA_bmp/img9_series_b_center_201_e65.jpg"};
+
+const char	* WINDOW_NAME	= "Treshhold Window";
+const char	* WINDOW_NAME2	= "Target Window";
+
+
+static void onMouse( int event, int x, int y, int, void* userData ) {
+	if( event != CV_EVENT_LBUTTONDOWN ) return;
+	ProcessorData *proc = (ProcessorData *) userData;
+	IplImage *image = proc->src_header_image;
+	uchar b = *((uchar*) (image->imageData + y*image->widthStep + 3*x));
+	uchar g = *((uchar*) (image->imageData + y*image->widthStep + 3*(x+1)));
+	uchar r = *((uchar*) (image->imageData + y*image->widthStep + 3*(x+2)));
+	
+	uchar h=0;
+	uchar s=0;
+	uchar v=0;
+	proc->RGBtoHSV(r, g, b, &h, &s, &v);
+
+	
+	*((uchar*) (image->imageData + y*image->widthStep + 3*x)) = 128;
+	*((uchar*) (image->imageData + y*image->widthStep + 3*(x+1))) = 128;
+	*((uchar*) (image->imageData + y*image->widthStep + 3*(x+2))) = 255;
+	
+	cv::Mat src(image);
+	//cv::imshow("test", src);
+
+	printf("got click (%d,%d)= <%d,%d,%d> -- [%d,%d,%d]\n",
+			x, y, r, g, b, h, s, v);
+}
+
+
+int main( int argc, char *argv[] ){
+	ProcessorData processor(use_width, use_height, USE_ROTATED);
+	int img_cycle = 0;
+	int thresh = 100;
+	
+	cvStartWindowThread();
+
+	cvNamedWindow ("cnt", CV_WINDOW_AUTOSIZE);
+	cvNamedWindow ("GLOBAL", CV_WINDOW_AUTOSIZE);
+	//cvNamedWindow ("Grey Img", CV_WINDOW_AUTOSIZE);
+	//cvNamedWindow ("test", CV_WINDOW_AUTOSIZE);
+	cvNamedWindow (WINDOW_NAME2, CV_WINDOW_AUTOSIZE);
+	cvNamedWindow (WINDOW_NAME, CV_WINDOW_AUTOSIZE);
+
+	cvMoveWindow(WINDOW_NAME,0,0);
+	cvMoveWindow("GLOBAL",325,0);
+	cvMoveWindow(WINDOW_NAME2,650,0);
+	//cvMoveWindow("Grey Img", 0, 275);
+	//cvMoveWindow("test", 325, 275);
+	cvMoveWindow("cnt",1100,100);
+	//Creating the trackbars
+	cvCreateTrackbar("H1","cnt",&processor.h1,360,0);
+	cvCreateTrackbar("H2","cnt",&processor.h2,360,0);
+	cvCreateTrackbar("S1","cnt",&processor.s1,255,0);
+	cvCreateTrackbar("S2","cnt",&processor.s2,255,0);
+	cvCreateTrackbar("V1","cnt",&processor.v1,255,0);
+	cvCreateTrackbar("V2","cnt",&processor.v2,255,0);
+	
+	while (img_cycle >= 0) {
+		processor.clear();
+		printf("%d = %s\n", img_cycle, image_names[img_cycle]);
+		processor.src_header_image = cvLoadImage(image_names[img_cycle]);
+		cvCopy(processor.src_header_image, processor.global_display);
+
+		cv::setMouseCallback( WINDOW_NAME2, onMouse,
+				(void *)&processor );
+
+		cv::Mat global_mat(processor.global_display);
+		cv::Mat src_mat(processor.src_header_image);
+
+		// These lines are the vision processing, the rest of main
+		// is just fluff
+		processor.threshold((uchar *)
+				processor.src_header_image->imageData);
+		processor.getContours();
+		processor.filterToTargets();
+
+		if(!processor.target_list.empty()){
+			std::vector<std::vector<cv::Point> > target_contours;
+			std::vector<std::vector<cv::Point> > best_contours;
+			std::vector<std::vector<cv::Point> > raw_contours;
+			std::vector<Target>::iterator target_it;
+			Target *best_target = NULL;
+			int i = 0;
+			for(target_it = processor.target_list.begin();
+					target_it != processor.target_list.end(); target_it++){
+				target_contours.push_back(target_it->this_contour);
+				raw_contours.push_back(target_it->raw_contour);
+				printf("%d: h=%.1f, interp=%.1f, <x,y>=<%.1f,%.1f>\n",
+						i++, target_it->height,
+						interpolate(4, &pixel_to_dist[0], target_it->rect.centroid.x),
+						target_it->rect.centroid.x, target_it->rect.centroid.y);
+				if (best_target == NULL) {
+					best_target = &*target_it;
+				} else {
+					if (target_it->height > best_target->height) {
+						best_target = &*target_it;
+					}
+				/*	if (processor.is_90) {
+						if (target_it->rect.centroid.x > best_target->rect.centroid.x) {
+							best_target = &*target_it;
+						}
+					} else {
+						if (target_it->rect.centroid.y < best_target->rect.centroid.y) {
+							best_target = &*target_it;
+						}
+					}*/
+				}
+			}
+			best_contours.push_back(best_target->this_contour);
+			//drawContours(global_mat,target_contours,-1,color,CV_FILLED);
+			cv::imshow(WINDOW_NAME, src_mat);
+			//cv::imshow("Grey Img", *processor.grey_mat);
+			cv::Scalar color(0,0,255);
+			cv::drawContours( src_mat, target_contours, -1, color, CV_FILLED );
+			cv::Scalar color2(128,0,255);
+			cv::drawContours( src_mat, best_contours, -1, color2, CV_FILLED );
+			cv::Scalar color3(0,255,0);
+			cv::drawContours( src_mat, raw_contours, -1, color3, 1 );
+		}
+		//cv::Mat grey_mat(grey_image);
+		//cv::imshow(WINDOW_NAME2, grey_mat);
+		cv::imshow("GLOBAL", global_mat);
+		cv::imshow(WINDOW_NAME2, src_mat);
+		char key = cvWaitKey(3000);
+		switch (key) {
+			case ' ':
+				img_cycle++;
+				img_cycle = img_cycle % num_names;
+				printf("%c %d= %s\n", key, img_cycle, image_names[img_cycle]);
+				break;
+			case 'g':
+				thresh++;
+				thresh = (thresh % 255);
+				printf("+ thresh= %d\n", thresh);
+				break;
+			case 'G':
+				thresh--;
+				thresh = (thresh % 255);
+				printf("- thresh= %d\n", thresh);
+				break;
+			case 'q':
+				img_cycle = -1;
+				break;
+			default:
+				break;
+		}
+		//redraw image cuz we drew all over it
+	}
+
+	cvDestroyWindow(WINDOW_NAME);
+}
+
diff --git a/vision/vision.gyp b/vision/vision.gyp
new file mode 100644
index 0000000..df27045
--- /dev/null
+++ b/vision/vision.gyp
@@ -0,0 +1,38 @@
+{
+  'targets': [
+    {
+      'target_name': 'OpenCVWorkTask',
+      'type': 'executable',
+      'sources': [
+        'OpenCVWorkTask.cpp',
+        'CameraProcessor.cpp',
+        #'BinaryServer.cpp',
+        #'PacketNotifier.cpp',
+        'JPEGRoutines.cpp',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/common/common.gyp:time',
+        '<(EXTERNALS):libevent',
+        '<(EXTERNALS):libjpeg',
+        '<(EXTERNALS):opencv',
+        '<(AOS)/atom_code/camera/camera.gyp:buffers',
+        '<(DEPTH)/frc971/queues/queues.gyp:queues',
+      ],
+    },
+    {
+      'target_name': 'GoalMaster',
+      'type': 'executable',
+      'sources': [
+        'GoalMaster.cpp',
+        'SensorProcessor.cpp',
+      ],
+      'dependencies': [
+        '<(AOS)/atom_code/atom_code.gyp:init',
+        '<(AOS)/common/common.gyp:time',
+        '<(DEPTH)/frc971/queues/queues.gyp:queues',
+        '<(AOS)/build/aos.gyp:logging',
+      ],
+    },
+  ],
+}