Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/nessmd2usb.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2016-04-23 21:35:45 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2016-04-23 21:35:45 +0300
commitaa4f6e4b5666583e49ac0bf421f2ba35f78358d1 (patch)
tree163473d023b8ee1ef108be62b3e785026be4b66e
First commit
-rw-r--r--Config/LUFAConfig.h126
-rw-r--r--Descriptors.c224
-rw-r--r--Descriptors.h124
-rw-r--r--bits.h13
-rw-r--r--board/BoardOutline.gbr19
-rw-r--r--board/Bottom.gbr1990
-rw-r--r--board/BottomMask.gbr94
-rw-r--r--board/BottomSilk.gbr12
-rw-r--r--board/Top.gbr2322
-rw-r--r--board/TopMask.gbr177
-rw-r--r--board/TopSilk.gbr1078
-rw-r--r--board/nessmd2usb.dipbin0 -> 209041 bytes
-rw-r--r--board/~nessmd2usb.dip~3
-rw-r--r--defines.h30
-rw-r--r--doxyfile2364
-rw-r--r--gamepad.c347
-rw-r--r--gamepad.h59
-rw-r--r--images/board_3d.pngbin0 -> 37098 bytes
-rw-r--r--images/photo.jpgbin0 -> 92218 bytes
-rw-r--r--makefile30
-rw-r--r--nessmd2usb.c212
-rw-r--r--nessmd2usb.h113
-rw-r--r--nessmd2usb.hex418
23 files changed, 9755 insertions, 0 deletions
diff --git a/Config/LUFAConfig.h b/Config/LUFAConfig.h
new file mode 100644
index 0000000..c654244
--- /dev/null
+++ b/Config/LUFAConfig.h
@@ -0,0 +1,126 @@
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2014.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaims all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ * \brief LUFA Library Configuration Header File
+ *
+ * This header file is used to configure LUFA's compile time options,
+ * as an alternative to the compile time constants supplied through
+ * a makefile.
+ *
+ * For information on what each token does, refer to the LUFA
+ * manual section "Summary of Compile Tokens".
+ */
+
+#ifndef _LUFA_CONFIG_H_
+#define _LUFA_CONFIG_H_
+
+ #if (ARCH == ARCH_AVR8)
+
+ /* Non-USB Related Configuration Tokens: */
+// #define DISABLE_TERMINAL_CODES
+
+ /* USB Class Driver Related Tokens: */
+// #define HID_HOST_BOOT_PROTOCOL_ONLY
+// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
+// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
+// #define HID_MAX_COLLECTIONS {Insert Value Here}
+// #define HID_MAX_REPORTITEMS {Insert Value Here}
+// #define HID_MAX_REPORT_IDS {Insert Value Here}
+// #define NO_CLASS_DRIVER_AUTOFLUSH
+
+ /* General USB Driver Related Tokens: */
+// #define ORDERED_EP_CONFIG
+ #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
+ #define USB_DEVICE_ONLY
+// #define USB_HOST_ONLY
+// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
+// #define NO_LIMITED_CONTROLLER_CONNECT
+// #define NO_SOF_EVENTS
+
+ /* USB Device Mode Driver Related Tokens: */
+// #define USE_RAM_DESCRIPTORS
+ #define USE_FLASH_DESCRIPTORS
+// #define USE_EEPROM_DESCRIPTORS
+// #define NO_INTERNAL_SERIAL
+ #define FIXED_CONTROL_ENDPOINT_SIZE 8
+// #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
+ #define FIXED_NUM_CONFIGURATIONS 1
+// #define CONTROL_ONLY_DEVICE
+// #define INTERRUPT_CONTROL_ENDPOINT
+// #define NO_DEVICE_REMOTE_WAKEUP
+// #define NO_DEVICE_SELF_POWER
+
+ /* USB Host Mode Driver Related Tokens: */
+// #define HOST_STATE_AS_GPIOR {Insert Value Here}
+// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
+// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
+// #define NO_AUTO_VBUS_MANAGEMENT
+// #define INVERTED_VBUS_ENABLE_LINE
+
+ #elif (ARCH == ARCH_XMEGA)
+
+ /* Non-USB Related Configuration Tokens: */
+// #define DISABLE_TERMINAL_CODES
+
+ /* USB Class Driver Related Tokens: */
+// #define HID_HOST_BOOT_PROTOCOL_ONLY
+// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
+// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
+// #define HID_MAX_COLLECTIONS {Insert Value Here}
+// #define HID_MAX_REPORTITEMS {Insert Value Here}
+// #define HID_MAX_REPORT_IDS {Insert Value Here}
+// #define NO_CLASS_DRIVER_AUTOFLUSH
+
+ /* General USB Driver Related Tokens: */
+ #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH)
+// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
+// #define NO_LIMITED_CONTROLLER_CONNECT
+// #define NO_SOF_EVENTS
+
+ /* USB Device Mode Driver Related Tokens: */
+// #define USE_RAM_DESCRIPTORS
+ #define USE_FLASH_DESCRIPTORS
+// #define USE_EEPROM_DESCRIPTORS
+// #define NO_INTERNAL_SERIAL
+ #define FIXED_CONTROL_ENDPOINT_SIZE 8
+// #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
+ #define FIXED_NUM_CONFIGURATIONS 1
+// #define CONTROL_ONLY_DEVICE
+ #define MAX_ENDPOINT_INDEX 1
+// #define NO_DEVICE_REMOTE_WAKEUP
+// #define NO_DEVICE_SELF_POWER
+
+ #else
+
+ #error Unsupported architecture for this LUFA configuration file.
+
+ #endif
+#endif
diff --git a/Descriptors.c b/Descriptors.c
new file mode 100644
index 0000000..09583ae
--- /dev/null
+++ b/Descriptors.c
@@ -0,0 +1,224 @@
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2014.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaims all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ *
+ * USB Device Descriptors, for library use when in USB device mode. Descriptors are special
+ * computer-readable structures which the host requests upon device enumeration, to determine
+ * the device's capabilities and functions.
+ */
+
+#include "Descriptors.h"
+
+/** HID class report descriptor. This is a special descriptor constructed with values from the
+ * USBIF HID class specification to describe the reports and capabilities of the HID device. This
+ * descriptor is parsed by the host and its contents used to determine what data (and in what encoding)
+ * the device will send, and what it may be sent back from the host. Refer to the HID specification for
+ * more details on HID report descriptors.
+ */
+
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] =
+{
+ /* Use the HID class driver's standard Joystick report.
+ * Min X/Y/Z Axis values: -100
+ * Max X/Y/Z Axis values: 100
+ * Min physical X/Y/Z Axis values (used to determine resolution): -1
+ * Max physical X/Y/Z Axis values (used to determine resolution): 1
+ * Buttons: 2
+ */
+ HID_DESCRIPTOR_JOYSTICK_MY(-100, 100, -1, 1, 8, 1),
+ HID_DESCRIPTOR_JOYSTICK_MY(-100, 100, -1, 1, 8, 2),
+ HID_DESCRIPTOR_JOYSTICK_MY(-100, 100, -1, 1, 4, 3),
+ HID_DESCRIPTOR_JOYSTICK_MY(-100, 100, -1, 1, 4, 4)
+};
+
+/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
+ * device characteristics, including the supported USB version, control endpoint size and the
+ * number of device configurations. The descriptor is read out by the USB host when the enumeration
+ * process begins.
+ */
+const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
+{
+ .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
+
+ .USBSpecification = VERSION_BCD(1,1,0),
+ .Class = USB_CSCP_NoDeviceClass,
+ .SubClass = USB_CSCP_NoDeviceSubclass,
+ .Protocol = USB_CSCP_NoDeviceProtocol,
+
+ .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
+
+ .VendorID = 0x03EB,
+ .ProductID = 0x2044,
+ .ReleaseNumber = VERSION_BCD(0,0,1),
+
+ .ManufacturerStrIndex = STRING_ID_Manufacturer,
+ .ProductStrIndex = STRING_ID_Product,
+ .SerialNumStrIndex = NO_DESCRIPTOR,
+
+ .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
+};
+
+/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
+ * of the device in one of its supported configurations, including information about any device interfaces
+ * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
+ * a configuration so that the host may correctly communicate with the USB device.
+ */
+const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
+{
+ .Config =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
+
+ .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
+ .TotalInterfaces = 1,
+
+ .ConfigurationNumber = 1,
+ .ConfigurationStrIndex = NO_DESCRIPTOR,
+
+ .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED),
+
+ .MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
+ },
+
+ .HID_Interface =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+ .InterfaceNumber = INTERFACE_ID_Joystick,
+ .AlternateSetting = 0x00,
+
+ .TotalEndpoints = 1,
+
+ .Class = HID_CSCP_HIDClass,
+ .SubClass = HID_CSCP_NonBootSubclass,
+ .Protocol = HID_CSCP_NonBootProtocol,
+
+ .InterfaceStrIndex = NO_DESCRIPTOR
+ },
+
+ .HID_JoystickHID =
+ {
+ .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+ .HIDSpec = VERSION_BCD(1,1,1),
+ .CountryCode = 0x00,
+ .TotalReportDescriptors = 1,
+ .HIDReportType = HID_DTYPE_Report,
+ .HIDReportLength = sizeof(JoystickReport)
+ },
+
+ .HID_ReportINEndpoint =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+ .EndpointAddress = JOYSTICK_EPADDR,
+ .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+ .EndpointSize = JOYSTICK_EPSIZE,
+ .PollingIntervalMS = 0x05
+ }
+};
+
+/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
+ * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
+ * via the language ID table available at USB.org what languages the device supports for its string descriptors.
+ */
+const USB_Descriptor_String_t PROGMEM LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG);
+
+/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
+ * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
+ * Descriptor.
+ */
+const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR(L"Cluster");
+
+/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
+ * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
+ * Descriptor.
+ */
+const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"Sega/Dendy controllers");
+
+/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
+ * documentation) by the application code so that the address and size of a requested descriptor can be given
+ * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
+ * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
+ * USB host.
+ */
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+ const uint8_t wIndex,
+ const void** const DescriptorAddress)
+{
+ const uint8_t DescriptorType = (wValue >> 8);
+ const uint8_t DescriptorNumber = (wValue & 0xFF);
+
+ const void* Address = NULL;
+ uint16_t Size = NO_DESCRIPTOR;
+
+ switch (DescriptorType)
+ {
+ case DTYPE_Device:
+ Address = &DeviceDescriptor;
+ Size = sizeof(USB_Descriptor_Device_t);
+ break;
+ case DTYPE_Configuration:
+ Address = &ConfigurationDescriptor;
+ Size = sizeof(USB_Descriptor_Configuration_t);
+ break;
+ case DTYPE_String:
+ switch (DescriptorNumber)
+ {
+ case STRING_ID_Language:
+ Address = &LanguageString;
+ Size = pgm_read_byte(&LanguageString.Header.Size);
+ break;
+ case STRING_ID_Manufacturer:
+ Address = &ManufacturerString;
+ Size = pgm_read_byte(&ManufacturerString.Header.Size);
+ break;
+ case STRING_ID_Product:
+ Address = &ProductString;
+ Size = pgm_read_byte(&ProductString.Header.Size);
+ break;
+ }
+
+ break;
+ case HID_DTYPE_HID:
+ Address = &ConfigurationDescriptor.HID_JoystickHID;
+ Size = sizeof(USB_HID_Descriptor_HID_t);
+ break;
+ case HID_DTYPE_Report:
+ Address = &JoystickReport;
+ Size = sizeof(JoystickReport);
+ break;
+ }
+
+ *DescriptorAddress = Address;
+ return Size;
+}
+
diff --git a/Descriptors.h b/Descriptors.h
new file mode 100644
index 0000000..6355eeb
--- /dev/null
+++ b/Descriptors.h
@@ -0,0 +1,124 @@
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2014.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaims all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ *
+ * Header file for Descriptors.c.
+ */
+
+#ifndef _DESCRIPTORS_H_
+#define _DESCRIPTORS_H_
+
+ /* Includes: */
+ #include <avr/pgmspace.h>
+
+ #include <LUFA/Drivers/USB/USB.h>
+
+ /* Type Defines: */
+ /** Type define for the device configuration descriptor structure. This must be defined in the
+ * application code, as the configuration descriptor contains several sub-descriptors which
+ * vary between devices, and which describe the device's usage to the host.
+ */
+ typedef struct
+ {
+ USB_Descriptor_Configuration_Header_t Config;
+
+ // Joystick HID Interface
+ USB_Descriptor_Interface_t HID_Interface;
+ USB_HID_Descriptor_HID_t HID_JoystickHID;
+ USB_Descriptor_Endpoint_t HID_ReportINEndpoint;
+ } USB_Descriptor_Configuration_t;
+
+ /** Enum for the device interface descriptor IDs within the device. Each interface descriptor
+ * should have a unique ID index associated with it, which can be used to refer to the
+ * interface from other descriptors.
+ */
+ enum InterfaceDescriptors_t
+ {
+ INTERFACE_ID_Joystick = 0, /**< Joystick interface desciptor ID */
+ };
+
+ /** Enum for the device string descriptor IDs within the device. Each string descriptor should
+ * have a unique ID index associated with it, which can be used to refer to the string from
+ * other descriptors.
+ */
+ enum StringDescriptors_t
+ {
+ STRING_ID_Language = 0, /**< Supported Languages string descriptor ID (must be zero) */
+ STRING_ID_Manufacturer = 1, /**< Manufacturer string ID */
+ STRING_ID_Product = 2, /**< Product string ID */
+ };
+
+ /* Macros: */
+ /** Endpoint address of the Joystick HID reporting IN endpoint. */
+ #define JOYSTICK_EPADDR (ENDPOINT_DIR_IN | 1)
+
+ /** Size in bytes of the Joystick HID reporting IN endpoint. */
+ #define JOYSTICK_EPSIZE 8
+
+ /* Function Prototypes: */
+ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+ const uint8_t wIndex,
+ const void** const DescriptorAddress)
+ ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
+
+
+#define HID_DESCRIPTOR_JOYSTICK_MY(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, ReportId) \
+ HID_RI_USAGE_PAGE(8, 0x01), \
+ HID_RI_USAGE(8, 0x04), \
+ HID_RI_COLLECTION(8, 0x01), \
+ HID_RI_USAGE(8, 0x01), \
+ HID_RI_COLLECTION(8, 0x00), \
+ HID_RI_REPORT_ID(8, ReportId), \
+ HID_RI_USAGE(8, 0x30), \
+ HID_RI_USAGE(8, 0x31), \
+ HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
+ HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
+ HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
+ HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
+ HID_RI_REPORT_COUNT(8, 2), \
+ HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+ HID_RI_END_COLLECTION(0), \
+ HID_RI_USAGE_PAGE(8, 0x09), \
+ HID_RI_USAGE_MINIMUM(8, 0x01), \
+ HID_RI_USAGE_MAXIMUM(8, Buttons), \
+ HID_RI_LOGICAL_MINIMUM(8, 0x00), \
+ HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
+ HID_RI_REPORT_SIZE(8, 0x01), \
+ HID_RI_REPORT_COUNT(8, Buttons), \
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+ HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \
+ HID_RI_REPORT_COUNT(8, 0x01), \
+ HID_RI_INPUT(8, HID_IOF_CONSTANT), \
+ HID_RI_END_COLLECTION(0)
+
+#endif
+
diff --git a/bits.h b/bits.h
new file mode 100644
index 0000000..3451fcf
--- /dev/null
+++ b/bits.h
@@ -0,0 +1,13 @@
+#define _BVL(bit) (1UL << (bit))
+#define set(reg,value) reg |= (value)
+#define unset(reg,value) reg &= ~(value)
+#define set_bit(reg,value) reg |= (_BVL(value))
+#define set_bit2(reg,value1,value2) reg |= (_BVL(value1) | _BVL(value2))
+#define set_bit3(reg,value1,value2,value3) reg |= (_BVL(value1) | _BVL(value2) | _BVL(value3))
+#define set_bit4(reg,value1,value2,value3,value4) reg |= (_BVL(value1) | _BVL(value2) | _BVL(value3) | _BVL(value4))
+#define set_bit5(reg,value1,value2,value3,value4,value5) reg |= (_BVL(value1) | _BVL(value2) | _BVL(value3) | _BVL(value4) | _BVL(value5))
+#define unset_bit(reg,value) reg &= ~(_BVL(value))
+#define unset_bit2(reg,value1,value2) reg &= ~(_BVL(value1) | _BVL(value2))
+#define unset_bit3(reg,value1,value2,value3) reg &= ~(_BVL(value1) | _BVL(value2) | _BVL(value3))
+#define unset_bit4(reg,value1,value2,value3,value4) reg &= ~(_BVL(value1) | _BVL(value2) | _BVL(value3) | _BVL(value4))
+#define unset_bit5(reg,value1,value2,value3,value4,value5) reg &= ~(_BVL(value1) | _BVL(value2) | _BVL(value3) | _BVL(value4) | _BVL(value5))
diff --git a/board/BoardOutline.gbr b/board/BoardOutline.gbr
new file mode 100644
index 0000000..66ff305
--- /dev/null
+++ b/board/BoardOutline.gbr
@@ -0,0 +1,19 @@
+G04 DipTrace 2.4.0.2*
+%INBoardOutline.gbr*%
+%MOIN*%
+%ADD11C,0.0055*%
+%FSLAX44Y44*%
+G04*
+G70*
+G90*
+G75*
+G01*
+%LNBoardOutline*%
+%LPD*%
+X3937Y24437D2*
+D11*
+X33437D1*
+Y3937D1*
+X3937D1*
+Y24437D1*
+M02*
diff --git a/board/Bottom.gbr b/board/Bottom.gbr
new file mode 100644
index 0000000..bdafb34
--- /dev/null
+++ b/board/Bottom.gbr
@@ -0,0 +1,1990 @@
+G04 DipTrace 2.4.0.2*
+%INBottom.gbr*%
+%MOIN*%
+%ADD13C,0.0118*%
+%ADD14C,0.0079*%
+%ADD15C,0.025*%
+%ADD18R,0.063X0.063*%
+%ADD19C,0.063*%
+%ADD24R,0.0665X0.0665*%
+%ADD26C,0.0665*%
+%ADD27C,0.1874*%
+%ADD28C,0.189*%
+%ADD34C,0.0276*%
+%FSLAX44Y44*%
+G04*
+G70*
+G90*
+G75*
+G01*
+%LNBottom*%
+%LPD*%
+X24302Y11411D2*
+D14*
+X13051D1*
+X12913Y11549D1*
+Y15590D1*
+X12776Y15727D1*
+X6574D1*
+X28526Y20805D2*
+Y18044D1*
+X26645Y16163D1*
+Y11431D1*
+X26221Y11008D1*
+Y8273D1*
+X25676Y7727D1*
+Y7217D1*
+X25538Y7079D1*
+X22464D1*
+X21973Y7569D1*
+X25245D2*
+Y11125D1*
+X25582Y11462D1*
+Y11746D1*
+X25818Y11982D1*
+Y16959D1*
+X25254Y17523D1*
+Y20805D1*
+X25247Y11648D2*
+X21437Y15458D1*
+Y19687D1*
+X13189Y12691D2*
+Y19980D1*
+X13051Y20118D1*
+X11475D1*
+X10788Y20805D1*
+X13882Y13321D2*
+Y20667D1*
+X13744Y20805D1*
+X11879D1*
+X8075Y8687D2*
+Y12061D1*
+X9165Y8687D2*
+Y11746D1*
+X10256Y8687D2*
+Y11431D1*
+X8620Y7569D2*
+Y9915D1*
+X28516Y13293D2*
+X27706D1*
+X25470Y13321D2*
+D13*
+X24932D1*
+Y13596D1*
+X24617D1*
+X8062Y19687D2*
+X6023Y17648D1*
+Y14686D1*
+X6259Y14449D1*
+X12201D1*
+X12437Y14213D1*
+Y8687D1*
+X21982Y20805D2*
+X21183Y21604D1*
+X8298D1*
+X8062Y21368D1*
+Y19687D1*
+X24617Y13596D2*
+X21982Y16231D1*
+Y20805D1*
+X29011Y13435D2*
+Y12954D1*
+X28517Y12460D1*
+Y7569D1*
+X27984Y13687D2*
+X28047Y13750D1*
+X28696D1*
+X29011Y13435D1*
+D34*
+X10872Y14938D3*
+X8997D3*
+Y18126D3*
+Y16126D3*
+X12562Y14937D3*
+X12123Y16126D3*
+X10497Y18876D3*
+X12873Y16439D3*
+X12935Y17501D3*
+X11623Y18876D3*
+X12748D3*
+X13560Y18064D3*
+X16623Y15001D3*
+X15935Y14563D3*
+X15248Y14126D3*
+X13560Y16939D3*
+X21749Y12376D3*
+X17873D3*
+X13623D3*
+X11935D3*
+X8560D3*
+X8622Y11438D3*
+Y10438D3*
+X9685Y11313D3*
+Y10438D3*
+X10685Y10750D3*
+X11998D3*
+X12935Y10625D3*
+X17998D3*
+X22936D3*
+X6434Y16876D3*
+X8997Y13438D3*
+X11998D3*
+X13498D3*
+Y14813D3*
+X24936Y14626D3*
+X26187Y14938D3*
+Y14063D3*
+X26937Y12438D3*
+X28624Y12938D3*
+X27749Y10625D3*
+X25937Y10688D3*
+X22374Y18001D3*
+X24874D3*
+X24374Y15563D3*
+X13560Y15813D3*
+X4309Y24064D3*
+X33062D3*
+Y4312D3*
+X4309D3*
+X7810Y9250D3*
+X25624Y18001D3*
+X27999D3*
+X25749Y9625D3*
+X7872Y7375D3*
+X6997Y8500D3*
+X23561Y11751D3*
+X24061Y13501D3*
+X25499Y12501D3*
+X6574Y15727D3*
+X24302Y11411D3*
+X26645Y11431D3*
+X25582Y11746D3*
+X25247Y11648D3*
+X13189Y12691D3*
+X13882Y13321D3*
+X8075Y12061D3*
+X9165Y11746D3*
+X10256Y11431D3*
+X8620Y9915D3*
+X27706Y13293D3*
+X28516D3*
+X27984Y13687D3*
+X29011Y13435D3*
+X25470Y13321D3*
+X24617Y13596D3*
+X4337Y23813D2*
+D15*
+X33039D1*
+X4337Y23565D2*
+X33039D1*
+X4337Y23316D2*
+X33039D1*
+X4337Y23067D2*
+X33039D1*
+X4337Y22819D2*
+X33039D1*
+X4337Y22570D2*
+X33039D1*
+X4337Y22321D2*
+X33039D1*
+X4337Y22073D2*
+X33039D1*
+X4337Y21824D2*
+X8035D1*
+X21448D2*
+X33039D1*
+X4337Y21575D2*
+X7789D1*
+X21694D2*
+X33039D1*
+X4337Y21326D2*
+X7715D1*
+X22300D2*
+X22758D1*
+X23390D2*
+X23848D1*
+X24480D2*
+X24937D1*
+X25569D2*
+X26027D1*
+X26663D2*
+X27117D1*
+X27753D2*
+X28207D1*
+X28843D2*
+X33039D1*
+X4337Y21078D2*
+X7715D1*
+X9163D2*
+X10230D1*
+X13905D2*
+X21226D1*
+X29081D2*
+X33039D1*
+X4337Y20829D2*
+X7715D1*
+X9230D2*
+X10168D1*
+X14163D2*
+X21359D1*
+X29148D2*
+X33039D1*
+X4337Y20580D2*
+X7715D1*
+X9187D2*
+X10211D1*
+X14210D2*
+X21402D1*
+X29105D2*
+X33039D1*
+X4337Y20332D2*
+X7715D1*
+X8995D2*
+X10398D1*
+X13292D2*
+X13551D1*
+X14210D2*
+X21594D1*
+X28913D2*
+X33039D1*
+X4337Y20083D2*
+X7590D1*
+X8534D2*
+X8680D1*
+X9624D2*
+X9770D1*
+X10714D2*
+X10862D1*
+X14210D2*
+X20965D1*
+X28855D2*
+X33039D1*
+X4337Y19834D2*
+X7457D1*
+X14210D2*
+X20832D1*
+X28855D2*
+X33039D1*
+X4337Y19586D2*
+X7449D1*
+X14210D2*
+X20824D1*
+X28855D2*
+X33039D1*
+X4337Y19337D2*
+X7230D1*
+X14210D2*
+X20930D1*
+X28855D2*
+X33039D1*
+X4337Y19088D2*
+X6980D1*
+X7944D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X24926D1*
+X25581D2*
+X28195D1*
+X28855D2*
+X33039D1*
+X4337Y18840D2*
+X6730D1*
+X7698D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X24926D1*
+X25581D2*
+X28195D1*
+X28855D2*
+X33039D1*
+X4337Y18591D2*
+X6484D1*
+X7448D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X24926D1*
+X25581D2*
+X28195D1*
+X28855D2*
+X33039D1*
+X4337Y18342D2*
+X6234D1*
+X7198D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X24926D1*
+X25581D2*
+X28195D1*
+X28855D2*
+X33039D1*
+X4337Y18094D2*
+X5984D1*
+X6952D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X24926D1*
+X25581D2*
+X28121D1*
+X28855D2*
+X33039D1*
+X4337Y17845D2*
+X5742D1*
+X6702D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X24926D1*
+X25581D2*
+X27871D1*
+X28780D2*
+X33039D1*
+X4337Y17596D2*
+X5676D1*
+X6452D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X24926D1*
+X25636D2*
+X27621D1*
+X28534D2*
+X33039D1*
+X4337Y17347D2*
+X5676D1*
+X6370D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X24980D1*
+X25886D2*
+X27375D1*
+X28284D2*
+X33039D1*
+X4337Y17099D2*
+X5676D1*
+X6370D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X25223D1*
+X26112D2*
+X27125D1*
+X28034D2*
+X33039D1*
+X4337Y16850D2*
+X5676D1*
+X6370D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X25473D1*
+X26148D2*
+X26875D1*
+X27788D2*
+X33039D1*
+X4337Y16601D2*
+X5676D1*
+X6370D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22331D2*
+X25488D1*
+X26148D2*
+X26629D1*
+X27538D2*
+X33039D1*
+X4337Y16353D2*
+X5676D1*
+X6370D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22343D2*
+X25488D1*
+X26148D2*
+X26383D1*
+X27288D2*
+X33039D1*
+X4337Y16104D2*
+X5676D1*
+X6741D2*
+X12859D1*
+X14210D2*
+X21109D1*
+X22593D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X27042D2*
+X33039D1*
+X4337Y15855D2*
+X5676D1*
+X14210D2*
+X21109D1*
+X22843D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X33039D1*
+X4337Y15607D2*
+X5676D1*
+X14210D2*
+X21109D1*
+X21765D2*
+X22125D1*
+X23089D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X33039D1*
+X4337Y15358D2*
+X5676D1*
+X6757D2*
+X12586D1*
+X14210D2*
+X21125D1*
+X21991D2*
+X22371D1*
+X23339D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X31453D1*
+X31733D2*
+X33039D1*
+X4337Y15109D2*
+X5676D1*
+X6370D2*
+X12586D1*
+X14210D2*
+X21332D1*
+X22241D2*
+X22621D1*
+X23589D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X31164D1*
+X32023D2*
+X33039D1*
+X4337Y14861D2*
+X5676D1*
+X6370D2*
+X12586D1*
+X14210D2*
+X21578D1*
+X22491D2*
+X22871D1*
+X23835D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X31133D1*
+X32054D2*
+X33039D1*
+X4337Y14612D2*
+X5683D1*
+X14210D2*
+X21828D1*
+X22737D2*
+X23117D1*
+X24085D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X31262D1*
+X31925D2*
+X33039D1*
+X4337Y14363D2*
+X5863D1*
+X14210D2*
+X22078D1*
+X22987D2*
+X23367D1*
+X24335D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X33039D1*
+X4337Y14115D2*
+X12051D1*
+X14210D2*
+X22324D1*
+X23237D2*
+X23617D1*
+X24581D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X33039D1*
+X4337Y13866D2*
+X12090D1*
+X14210D2*
+X22574D1*
+X23483D2*
+X23863D1*
+X25136D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X27598D1*
+X29062D2*
+X33039D1*
+X4337Y13617D2*
+X12090D1*
+X14210D2*
+X22824D1*
+X23733D2*
+X24113D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X27441D1*
+X29394D2*
+X31426D1*
+X31761D2*
+X33039D1*
+X4337Y13368D2*
+X12090D1*
+X14308D2*
+X23070D1*
+X23983D2*
+X24262D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X27285D1*
+X29433D2*
+X31160D1*
+X32026D2*
+X33039D1*
+X4337Y13120D2*
+X12090D1*
+X14257D2*
+X23320D1*
+X24230D2*
+X24652D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X27316D1*
+X29358D2*
+X31133D1*
+X32054D2*
+X33039D1*
+X4337Y12871D2*
+X12090D1*
+X13573D2*
+X23570D1*
+X24480D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X28445D1*
+X29351D2*
+X31273D1*
+X31913D2*
+X33039D1*
+X4337Y12622D2*
+X12090D1*
+X13612D2*
+X23816D1*
+X24730D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X28211D1*
+X29163D2*
+X33039D1*
+X4337Y12374D2*
+X7797D1*
+X8355D2*
+X12090D1*
+X13460D2*
+X24066D1*
+X24976D2*
+X25488D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X28168D1*
+X28913D2*
+X33039D1*
+X4337Y12125D2*
+X7652D1*
+X8499D2*
+X9004D1*
+X9327D2*
+X12090D1*
+X13241D2*
+X24316D1*
+X25226D2*
+X25422D1*
+X26148D2*
+X26316D1*
+X26976D2*
+X28168D1*
+X28866D2*
+X33039D1*
+X4337Y11876D2*
+X7691D1*
+X8456D2*
+X8758D1*
+X9569D2*
+X12090D1*
+X13241D2*
+X24562D1*
+X26128D2*
+X26316D1*
+X26976D2*
+X28168D1*
+X28866D2*
+X33039D1*
+X4337Y11628D2*
+X7746D1*
+X8405D2*
+X8754D1*
+X9573D2*
+X9879D1*
+X10632D2*
+X12090D1*
+X24667D2*
+X24812D1*
+X25991D2*
+X26269D1*
+X27023D2*
+X28168D1*
+X28866D2*
+X33039D1*
+X4337Y11379D2*
+X7746D1*
+X8405D2*
+X8836D1*
+X9495D2*
+X9832D1*
+X10679D2*
+X12090D1*
+X24730D2*
+X24922D1*
+X25898D2*
+X26137D1*
+X27069D2*
+X28168D1*
+X28866D2*
+X29207D1*
+X30417D2*
+X33039D1*
+X4337Y11130D2*
+X7746D1*
+X8405D2*
+X8836D1*
+X9495D2*
+X9926D1*
+X10585D2*
+X12090D1*
+X24616D2*
+X24918D1*
+X25706D2*
+X25918D1*
+X26937D2*
+X28168D1*
+X28866D2*
+X29207D1*
+X30417D2*
+X33039D1*
+X4337Y10882D2*
+X7746D1*
+X8405D2*
+X8836D1*
+X9495D2*
+X9926D1*
+X10585D2*
+X12090D1*
+X12784D2*
+X24918D1*
+X25573D2*
+X25891D1*
+X26550D2*
+X28168D1*
+X28866D2*
+X29207D1*
+X30417D2*
+X33039D1*
+X4337Y10633D2*
+X7746D1*
+X8405D2*
+X8836D1*
+X9495D2*
+X9926D1*
+X10585D2*
+X12090D1*
+X12784D2*
+X24918D1*
+X25573D2*
+X25891D1*
+X26550D2*
+X28168D1*
+X28866D2*
+X29207D1*
+X30417D2*
+X33039D1*
+X4337Y10384D2*
+X7746D1*
+X8405D2*
+X8836D1*
+X9495D2*
+X9926D1*
+X10585D2*
+X12090D1*
+X12784D2*
+X24918D1*
+X25573D2*
+X25891D1*
+X26550D2*
+X28168D1*
+X28866D2*
+X29207D1*
+X30417D2*
+X33039D1*
+X4337Y10135D2*
+X7746D1*
+X9495D2*
+X9926D1*
+X10585D2*
+X12090D1*
+X12784D2*
+X24918D1*
+X25573D2*
+X25891D1*
+X26550D2*
+X28168D1*
+X28866D2*
+X33039D1*
+X4337Y9887D2*
+X7746D1*
+X9495D2*
+X9926D1*
+X10585D2*
+X12090D1*
+X12784D2*
+X24918D1*
+X25573D2*
+X25891D1*
+X26550D2*
+X28168D1*
+X28866D2*
+X33039D1*
+X4337Y9638D2*
+X7746D1*
+X9495D2*
+X9926D1*
+X10585D2*
+X12090D1*
+X12784D2*
+X24918D1*
+X25573D2*
+X25891D1*
+X26550D2*
+X28168D1*
+X28866D2*
+X33039D1*
+X4337Y9389D2*
+X7746D1*
+X9495D2*
+X9926D1*
+X10585D2*
+X12090D1*
+X12784D2*
+X24918D1*
+X25573D2*
+X25891D1*
+X26550D2*
+X28168D1*
+X28866D2*
+X33039D1*
+X4337Y9141D2*
+X7453D1*
+X9577D2*
+X9844D1*
+X10671D2*
+X10933D1*
+X11761D2*
+X12023D1*
+X12851D2*
+X22105D1*
+X22933D2*
+X23195D1*
+X24023D2*
+X24285D1*
+X27296D2*
+X27558D1*
+X29476D2*
+X33039D1*
+X4337Y8892D2*
+X7453D1*
+X13023D2*
+X21933D1*
+X29648D2*
+X33039D1*
+X4337Y8643D2*
+X7453D1*
+X13058D2*
+X21898D1*
+X29683D2*
+X33039D1*
+X4337Y8395D2*
+X7453D1*
+X12983D2*
+X21973D1*
+X29608D2*
+X33039D1*
+X4337Y8146D2*
+X7453D1*
+X10534D2*
+X11066D1*
+X12714D2*
+X21793D1*
+X29339D2*
+X33039D1*
+X4337Y7897D2*
+X8098D1*
+X10233D2*
+X11367D1*
+X12417D2*
+X21449D1*
+X29042D2*
+X33039D1*
+X4337Y7649D2*
+X8004D1*
+X10327D2*
+X11273D1*
+X12507D2*
+X21355D1*
+X29132D2*
+X33039D1*
+X4337Y7400D2*
+X8023D1*
+X10308D2*
+X11293D1*
+X12491D2*
+X21375D1*
+X29116D2*
+X33039D1*
+X4337Y7151D2*
+X8168D1*
+X9073D2*
+X9258D1*
+X10163D2*
+X11441D1*
+X12343D2*
+X21519D1*
+X26788D2*
+X26973D1*
+X27878D2*
+X28066D1*
+X28968D2*
+X33039D1*
+X4337Y6903D2*
+X22183D1*
+X25816D2*
+X33039D1*
+X4337Y6654D2*
+X33039D1*
+X4337Y6405D2*
+X33039D1*
+X4337Y6156D2*
+X33039D1*
+X4337Y5908D2*
+X33039D1*
+X4337Y5659D2*
+X33039D1*
+X4337Y5410D2*
+X33039D1*
+X4337Y5162D2*
+X33039D1*
+X4337Y4913D2*
+X33039D1*
+X4337Y4664D2*
+X33039D1*
+X4337Y4416D2*
+X33039D1*
+X29357Y11393D2*
+X30392D1*
+Y10233D1*
+X29232D1*
+Y11393D1*
+X29357D1*
+X32018Y13076D2*
+X31967Y12962D1*
+X31886Y12867D1*
+X31782Y12799D1*
+X31663Y12762D1*
+X31538Y12760D1*
+X31418Y12793D1*
+X31312Y12858D1*
+X31228Y12951D1*
+X31173Y13062D1*
+X31152Y13185D1*
+X31165Y13309D1*
+X31213Y13424D1*
+X31291Y13521D1*
+X31393Y13593D1*
+X31511Y13633D1*
+X31635Y13639D1*
+X31756Y13610D1*
+X31865Y13548D1*
+X31951Y13459D1*
+X32009Y13349D1*
+X32036Y13199D1*
+X32018Y13076D1*
+Y14808D2*
+X31967Y14694D1*
+X31886Y14600D1*
+X31782Y14531D1*
+X31663Y14495D1*
+X31538Y14493D1*
+X31418Y14526D1*
+X31312Y14591D1*
+X31228Y14683D1*
+X31173Y14795D1*
+X31152Y14917D1*
+X31165Y15041D1*
+X31213Y15156D1*
+X31291Y15254D1*
+X31393Y15325D1*
+X31511Y15366D1*
+X31635Y15371D1*
+X31756Y15342D1*
+X31865Y15281D1*
+X31951Y15191D1*
+X32009Y15081D1*
+X32036Y14931D1*
+X32018Y14808D1*
+X7602Y9285D2*
+X7770D1*
+X7771Y11800D1*
+X7696Y11924D1*
+X7672Y12046D1*
+X7687Y12170D1*
+X7739Y12283D1*
+X7822Y12375D1*
+X7930Y12437D1*
+X8052Y12463D1*
+X8176Y12451D1*
+X8290Y12401D1*
+X8384Y12319D1*
+X8448Y12213D1*
+X8478Y12061D1*
+X8458Y11938D1*
+X8402Y11827D1*
+X8378Y11802D1*
+X8379Y10237D1*
+X8476Y10291D1*
+X8597Y10318D1*
+X8721Y10305D1*
+X8835Y10256D1*
+X8862Y10233D1*
+X8861Y11480D1*
+X8787Y11609D1*
+X8763Y11731D1*
+X8778Y11855D1*
+X8829Y11968D1*
+X8913Y12060D1*
+X9021Y12122D1*
+X9143Y12148D1*
+X9266Y12136D1*
+X9381Y12086D1*
+X9474Y12004D1*
+X9538Y11898D1*
+X9568Y11746D1*
+X9549Y11623D1*
+X9493Y11512D1*
+X9468Y11487D1*
+X9470Y9203D1*
+X9562Y9134D1*
+X9646Y9042D1*
+X9711Y8930D1*
+X9771Y9036D1*
+X9854Y9129D1*
+X9951Y9201D1*
+X9952Y11167D1*
+X9877Y11294D1*
+X9853Y11416D1*
+X9868Y11540D1*
+X9920Y11653D1*
+X10004Y11745D1*
+X10111Y11807D1*
+X10233Y11833D1*
+X10357Y11821D1*
+X10471Y11771D1*
+X10565Y11689D1*
+X10629Y11583D1*
+X10659Y11431D1*
+X10639Y11308D1*
+X10583Y11197D1*
+X10559Y11172D1*
+X10560Y9201D1*
+X10653Y9134D1*
+X10737Y9042D1*
+X10801Y8930D1*
+X10861Y9036D1*
+X10944Y9129D1*
+X11045Y9203D1*
+X11159Y9254D1*
+X11280Y9281D1*
+X11405Y9282D1*
+X11527Y9257D1*
+X11642Y9207D1*
+X11743Y9134D1*
+X11827Y9042D1*
+X11892Y8930D1*
+X11952Y9036D1*
+X12035Y9129D1*
+X12113Y9187D1*
+Y14082D1*
+X11951Y14125D1*
+X6259D1*
+X6137Y14149D1*
+X6030Y14220D1*
+X5794Y14456D1*
+X5724Y14560D1*
+X5699Y14686D1*
+Y17648D1*
+X5722Y17770D1*
+X5794Y17877D1*
+X7476Y19559D1*
+X7464Y19685D1*
+X7477Y19809D1*
+X7515Y19928D1*
+X7577Y20036D1*
+X7660Y20129D1*
+X7738Y20187D1*
+Y21368D1*
+X7762Y21490D1*
+X7833Y21597D1*
+X8069Y21833D1*
+X8172Y21903D1*
+X8298Y21928D1*
+X21183D1*
+X21305Y21904D1*
+X21412Y21833D1*
+X21857Y21389D1*
+X21916Y21399D1*
+X22041Y21400D1*
+X22163Y21375D1*
+X22278Y21325D1*
+X22379Y21252D1*
+X22463Y21160D1*
+X22528Y21049D1*
+X22588Y21154D1*
+X22671Y21247D1*
+X22771Y21321D1*
+X22885Y21372D1*
+X23007Y21399D1*
+X23132Y21400D1*
+X23254Y21375D1*
+X23368Y21325D1*
+X23470Y21252D1*
+X23554Y21160D1*
+X23618Y21049D1*
+X23678Y21154D1*
+X23761Y21247D1*
+X23862Y21321D1*
+X23975Y21372D1*
+X24097Y21399D1*
+X24222Y21400D1*
+X24344Y21375D1*
+X24459Y21325D1*
+X24560Y21252D1*
+X24644Y21160D1*
+X24709Y21049D1*
+X24769Y21154D1*
+X24852Y21247D1*
+X24952Y21321D1*
+X25066Y21372D1*
+X25188Y21399D1*
+X25313Y21400D1*
+X25435Y21375D1*
+X25549Y21325D1*
+X25651Y21252D1*
+X25735Y21160D1*
+X25799Y21049D1*
+X25859Y21154D1*
+X25942Y21247D1*
+X26043Y21321D1*
+X26157Y21372D1*
+X26278Y21399D1*
+X26403Y21400D1*
+X26525Y21375D1*
+X26640Y21325D1*
+X26741Y21252D1*
+X26825Y21160D1*
+X26890Y21049D1*
+X26950Y21154D1*
+X27033Y21247D1*
+X27133Y21321D1*
+X27247Y21372D1*
+X27369Y21399D1*
+X27494Y21400D1*
+X27616Y21375D1*
+X27730Y21325D1*
+X27832Y21252D1*
+X27916Y21160D1*
+X27980Y21049D1*
+X28040Y21154D1*
+X28123Y21247D1*
+X28224Y21321D1*
+X28338Y21372D1*
+X28460Y21399D1*
+X28584Y21400D1*
+X28707Y21375D1*
+X28821Y21325D1*
+X28922Y21252D1*
+X29006Y21160D1*
+X29070Y21052D1*
+X29109Y20934D1*
+X29123Y20805D1*
+X29110Y20681D1*
+X29072Y20562D1*
+X29009Y20454D1*
+X28926Y20361D1*
+X28828Y20290D1*
+X28830Y18044D1*
+X28802Y17919D1*
+X28741Y17829D1*
+X26948Y16036D1*
+X26949Y11698D1*
+X27018Y11583D1*
+X27047Y11431D1*
+X27028Y11308D1*
+X26972Y11197D1*
+X26885Y11108D1*
+X26775Y11050D1*
+X26679Y11033D1*
+X26526Y10882D1*
+Y9168D1*
+X26579Y9203D1*
+X26693Y9254D1*
+X26815Y9281D1*
+X26940Y9282D1*
+X27062Y9257D1*
+X27176Y9207D1*
+X27278Y9134D1*
+X27362Y9042D1*
+X27426Y8930D1*
+X27486Y9036D1*
+X27569Y9129D1*
+X27670Y9203D1*
+X27784Y9254D1*
+X27905Y9281D1*
+X28030Y9282D1*
+X28152Y9257D1*
+X28192Y9239D1*
+X28193Y12460D1*
+X28217Y12582D1*
+X28288Y12689D1*
+X28489Y12890D1*
+X28400Y12908D1*
+X28288Y12961D1*
+X28256Y12991D1*
+X27973Y12989D1*
+X27836Y12912D1*
+X27713Y12891D1*
+X27590Y12908D1*
+X27478Y12961D1*
+X27387Y13047D1*
+X27327Y13156D1*
+X27303Y13278D1*
+X27318Y13402D1*
+X27370Y13515D1*
+X27453Y13607D1*
+X27580Y13673D1*
+X27596Y13795D1*
+X27648Y13909D1*
+X27732Y14001D1*
+X27840Y14063D1*
+X27961Y14089D1*
+X28172Y14074D1*
+X28696D1*
+X28818Y14050D1*
+X28925Y13979D1*
+X29072Y13833D1*
+X29112Y13825D1*
+X29226Y13775D1*
+X29320Y13693D1*
+X29384Y13587D1*
+X29414Y13435D1*
+X29395Y13312D1*
+X29335Y13185D1*
+Y12954D1*
+X29311Y12832D1*
+X29240Y12725D1*
+X28840Y12325D1*
+X28841Y9245D1*
+X28996Y9281D1*
+X29121Y9282D1*
+X29243Y9257D1*
+X29357Y9207D1*
+X29459Y9134D1*
+X29543Y9042D1*
+X29606Y8934D1*
+X29646Y8816D1*
+X29660Y8687D1*
+X29647Y8563D1*
+X29608Y8444D1*
+X29546Y8336D1*
+X29462Y8243D1*
+X29362Y8170D1*
+X29248Y8119D1*
+X29126Y8093D1*
+X29001D1*
+X28879Y8118D1*
+X28839Y8136D1*
+X28841Y8073D1*
+X28913Y8016D1*
+X28998Y7924D1*
+X29061Y7816D1*
+X29100Y7698D1*
+X29114Y7569D1*
+X29101Y7445D1*
+X29063Y7326D1*
+X29000Y7218D1*
+X28917Y7125D1*
+X28816Y7052D1*
+X28702Y7001D1*
+X28580Y6975D1*
+X28456Y6974D1*
+X28333Y7000D1*
+X28219Y7051D1*
+X28118Y7124D1*
+X28034Y7216D1*
+X27970Y7328D1*
+X27910Y7218D1*
+X27827Y7125D1*
+X27726Y7052D1*
+X27612Y7001D1*
+X27490Y6975D1*
+X27365Y6974D1*
+X27243Y7000D1*
+X27129Y7051D1*
+X27028Y7124D1*
+X26944Y7216D1*
+X26880Y7328D1*
+X26819Y7218D1*
+X26736Y7125D1*
+X26635Y7052D1*
+X26521Y7001D1*
+X26399Y6975D1*
+X26274Y6974D1*
+X26152Y7000D1*
+X26038Y7051D1*
+X25959Y7108D1*
+X25940Y7066D1*
+X25891Y7001D1*
+X25754Y6864D1*
+X25646Y6795D1*
+X25538Y6774D1*
+X22464D1*
+X22339Y6802D1*
+X22248Y6864D1*
+X22124Y6988D1*
+X22037Y6975D1*
+X21912Y6974D1*
+X21790Y7000D1*
+X21676Y7051D1*
+X21575Y7124D1*
+X21491Y7216D1*
+X21428Y7324D1*
+X21389Y7442D1*
+X21376Y7566D1*
+X21388Y7691D1*
+X21426Y7809D1*
+X21488Y7918D1*
+X21571Y8011D1*
+X21672Y8085D1*
+X21786Y8136D1*
+X21907Y8163D1*
+X22032Y8164D1*
+X22154Y8138D1*
+X22269Y8088D1*
+X22370Y8016D1*
+X22454Y7924D1*
+X22519Y7812D1*
+X22579Y7918D1*
+X22662Y8011D1*
+X22762Y8085D1*
+X22876Y8136D1*
+X22998Y8163D1*
+X23123Y8164D1*
+X23245Y8138D1*
+X23359Y8088D1*
+X23461Y8016D1*
+X23545Y7924D1*
+X23609Y7812D1*
+X23669Y7918D1*
+X23752Y8011D1*
+X23853Y8085D1*
+X23967Y8136D1*
+X24089Y8163D1*
+X24213Y8164D1*
+X24336Y8138D1*
+X24450Y8088D1*
+X24551Y8016D1*
+X24635Y7924D1*
+X24700Y7812D1*
+X24760Y7918D1*
+X24843Y8011D1*
+X24940Y8083D1*
+X24885Y8119D1*
+X24763Y8093D1*
+X24639D1*
+X24517Y8118D1*
+X24402Y8169D1*
+X24301Y8242D1*
+X24217Y8334D1*
+X24154Y8446D1*
+X24093Y8336D1*
+X24010Y8243D1*
+X23909Y8170D1*
+X23795Y8119D1*
+X23673Y8093D1*
+X23548D1*
+X23426Y8118D1*
+X23312Y8169D1*
+X23211Y8242D1*
+X23127Y8334D1*
+X23063Y8446D1*
+X23002Y8336D1*
+X22919Y8243D1*
+X22818Y8170D1*
+X22704Y8119D1*
+X22582Y8093D1*
+X22458D1*
+X22335Y8118D1*
+X22221Y8169D1*
+X22120Y8242D1*
+X22036Y8334D1*
+X21974Y8442D1*
+X21935Y8561D1*
+X21921Y8685D1*
+X21934Y8809D1*
+X21972Y8928D1*
+X22034Y9036D1*
+X22117Y9129D1*
+X22217Y9203D1*
+X22331Y9254D1*
+X22453Y9281D1*
+X22577Y9282D1*
+X22700Y9257D1*
+X22814Y9207D1*
+X22915Y9134D1*
+X23000Y9042D1*
+X23064Y8930D1*
+X23124Y9036D1*
+X23207Y9129D1*
+X23308Y9203D1*
+X23421Y9254D1*
+X23543Y9281D1*
+X23668Y9282D1*
+X23790Y9257D1*
+X23905Y9207D1*
+X24006Y9134D1*
+X24090Y9042D1*
+X24155Y8930D1*
+X24215Y9036D1*
+X24298Y9129D1*
+X24398Y9203D1*
+X24512Y9254D1*
+X24634Y9281D1*
+X24759Y9282D1*
+X24881Y9257D1*
+X24942Y9230D1*
+X24941Y11125D1*
+X24968Y11250D1*
+X24982Y11278D1*
+X24868Y11511D1*
+X24848Y11614D1*
+X21222Y15243D1*
+X21153Y15351D1*
+X21133Y15458D1*
+Y19173D1*
+X21038Y19242D1*
+X20955Y19334D1*
+X20892Y19442D1*
+X20853Y19561D1*
+X20839Y19685D1*
+X20852Y19809D1*
+X20890Y19928D1*
+X20952Y20036D1*
+X21035Y20129D1*
+X21135Y20203D1*
+X21249Y20254D1*
+X21371Y20281D1*
+X21496Y20282D1*
+X21618Y20257D1*
+X21657Y20239D1*
+X21584Y20360D1*
+X21500Y20452D1*
+X21437Y20560D1*
+X21398Y20679D1*
+X21385Y20803D1*
+X21398Y20931D1*
+X21049Y21280D1*
+X12242D1*
+X12360Y21160D1*
+X12389Y21109D1*
+X13744D1*
+X13869Y21082D1*
+X13959Y21020D1*
+X14097Y20882D1*
+X14166Y20775D1*
+X14186Y20667D1*
+X14191Y13579D1*
+X14255Y13472D1*
+X14284Y13321D1*
+X14265Y13198D1*
+X14209Y13087D1*
+X14122Y12998D1*
+X14012Y12940D1*
+X13889Y12918D1*
+X13766Y12935D1*
+X13654Y12989D1*
+X13563Y13074D1*
+X13503Y13184D1*
+X13494Y13233D1*
+X13498Y12949D1*
+X13562Y12842D1*
+X13592Y12691D1*
+X13572Y12568D1*
+X13517Y12457D1*
+X13429Y12368D1*
+X13319Y12310D1*
+X13216Y12292D1*
+X13218Y11718D1*
+X14551Y11716D1*
+X24039D1*
+X24158Y11787D1*
+X24279Y11813D1*
+X24403Y11801D1*
+X24518Y11752D1*
+X24611Y11670D1*
+X24675Y11563D1*
+X24705Y11411D1*
+X24686Y11288D1*
+X24630Y11177D1*
+X24543Y11088D1*
+X24432Y11030D1*
+X24310Y11009D1*
+X24186Y11026D1*
+X24074Y11079D1*
+X24043Y11109D1*
+X17802Y11107D1*
+X13051D1*
+X12926Y11135D1*
+X12836Y11196D1*
+X12761Y11271D1*
+Y9186D1*
+X12834Y9134D1*
+X12918Y9042D1*
+X12981Y8934D1*
+X13021Y8816D1*
+X13035Y8687D1*
+X13022Y8563D1*
+X12983Y8444D1*
+X12921Y8336D1*
+X12837Y8243D1*
+X12736Y8170D1*
+X12623Y8119D1*
+X12501Y8093D1*
+X12376D1*
+X12254Y8118D1*
+X12140Y8169D1*
+X12038Y8242D1*
+X11955Y8334D1*
+X11891Y8446D1*
+X11830Y8336D1*
+X11747Y8243D1*
+X11646Y8170D1*
+X11532Y8119D1*
+X11410Y8093D1*
+X11285D1*
+X11163Y8118D1*
+X11049Y8169D1*
+X10948Y8242D1*
+X10864Y8334D1*
+X10800Y8446D1*
+X10740Y8336D1*
+X10656Y8243D1*
+X10555Y8170D1*
+X10441Y8119D1*
+X10319Y8093D1*
+X10195D1*
+X10073Y8118D1*
+X9958Y8169D1*
+X9857Y8242D1*
+X9774Y8334D1*
+X9710Y8446D1*
+X9649Y8336D1*
+X9566Y8243D1*
+X9465Y8170D1*
+X9351Y8119D1*
+X9229Y8093D1*
+X9104D1*
+X8982Y8118D1*
+X8921Y8145D1*
+X9017Y8016D1*
+X9101Y7924D1*
+X9165Y7812D1*
+X9225Y7918D1*
+X9308Y8011D1*
+X9409Y8085D1*
+X9523Y8136D1*
+X9645Y8163D1*
+X9769Y8164D1*
+X9892Y8138D1*
+X10006Y8088D1*
+X10107Y8016D1*
+X10192Y7924D1*
+X10255Y7816D1*
+X10294Y7698D1*
+X10308Y7569D1*
+X10295Y7445D1*
+X10257Y7326D1*
+X10194Y7218D1*
+X10111Y7125D1*
+X10010Y7052D1*
+X9896Y7001D1*
+X9774Y6975D1*
+X9649Y6974D1*
+X9527Y7000D1*
+X9413Y7051D1*
+X9312Y7124D1*
+X9228Y7216D1*
+X9164Y7328D1*
+X9104Y7218D1*
+X9020Y7125D1*
+X8920Y7052D1*
+X8806Y7001D1*
+X8684Y6975D1*
+X8559Y6974D1*
+X8437Y7000D1*
+X8323Y7051D1*
+X8222Y7124D1*
+X8138Y7216D1*
+X8075Y7324D1*
+X8036Y7442D1*
+X8022Y7566D1*
+X8035Y7691D1*
+X8073Y7809D1*
+X8135Y7918D1*
+X8218Y8011D1*
+X8315Y8083D1*
+X8172Y8089D1*
+X7477D1*
+Y9285D1*
+X7602D1*
+X12476Y7445D2*
+X12438Y7326D1*
+X12375Y7218D1*
+X12292Y7125D1*
+X12191Y7052D1*
+X12077Y7001D1*
+X11955Y6975D1*
+X11831Y6974D1*
+X11708Y7000D1*
+X11594Y7051D1*
+X11493Y7124D1*
+X11409Y7216D1*
+X11347Y7324D1*
+X11308Y7442D1*
+X11294Y7566D1*
+X11307Y7691D1*
+X11345Y7809D1*
+X11407Y7918D1*
+X11490Y8011D1*
+X11590Y8085D1*
+X11704Y8136D1*
+X11826Y8163D1*
+X11951Y8164D1*
+X12073Y8138D1*
+X12187Y8088D1*
+X12288Y8016D1*
+X12373Y7924D1*
+X12436Y7816D1*
+X12475Y7698D1*
+X12489Y7569D1*
+X12476Y7445D1*
+X25549Y9230D2*
+X25602Y9254D1*
+X25724Y9281D1*
+X25849Y9282D1*
+X25917Y9273D1*
+Y11008D1*
+X25945Y11133D1*
+X26006Y11223D1*
+X26241Y11458D1*
+X26257Y11540D1*
+X26309Y11653D1*
+X26343Y11690D1*
+X26340Y14806D1*
+Y16163D1*
+X26368Y16288D1*
+X26430Y16378D1*
+X28222Y18171D1*
+X28221Y19142D1*
+X28166Y19119D1*
+X28044Y19093D1*
+X27919D1*
+X27797Y19118D1*
+X27683Y19169D1*
+X27582Y19242D1*
+X27498Y19334D1*
+X27434Y19446D1*
+X27374Y19336D1*
+X27290Y19243D1*
+X27189Y19170D1*
+X27075Y19119D1*
+X26953Y19093D1*
+X26829D1*
+X26706Y19118D1*
+X26592Y19169D1*
+X26491Y19242D1*
+X26407Y19334D1*
+X26343Y19446D1*
+X26283Y19336D1*
+X26200Y19243D1*
+X26099Y19170D1*
+X25985Y19119D1*
+X25863Y19093D1*
+X25738D1*
+X25616Y19118D1*
+X25555Y19145D1*
+X25558Y17930D1*
+Y17653D1*
+X26033Y17175D1*
+X26102Y17067D1*
+X26122Y16959D1*
+Y11982D1*
+X26095Y11858D1*
+X26033Y11767D1*
+X25981Y11715D1*
+X25965Y11623D1*
+X25909Y11512D1*
+X25885Y11487D1*
+X25861Y11340D1*
+X25797Y11246D1*
+X25551Y11001D1*
+X25549Y9231D1*
+X24948Y19143D2*
+X24894Y19119D1*
+X24772Y19093D1*
+X24647D1*
+X24525Y19118D1*
+X24411Y19169D1*
+X24310Y19242D1*
+X24226Y19334D1*
+X24162Y19446D1*
+X24102Y19336D1*
+X24018Y19243D1*
+X23918Y19170D1*
+X23804Y19119D1*
+X23682Y19093D1*
+X23557D1*
+X23435Y19118D1*
+X23321Y19169D1*
+X23220Y19242D1*
+X23136Y19334D1*
+X23072Y19446D1*
+X23011Y19336D1*
+X22928Y19243D1*
+X22827Y19170D1*
+X22713Y19119D1*
+X22591Y19093D1*
+X22466D1*
+X22344Y19118D1*
+X22305Y19136D1*
+X22306Y16364D1*
+X24678Y13994D1*
+X24718Y13986D1*
+X24832Y13937D1*
+X24853Y13919D1*
+X24932Y13920D1*
+X25054Y13897D1*
+X25158Y13829D1*
+X25226Y13731D1*
+X25326Y13697D1*
+X25448Y13723D1*
+X25514Y13716D1*
+Y16830D1*
+X25039Y17308D1*
+X24970Y17416D1*
+X24950Y17523D1*
+Y19137D1*
+X12885Y19089D2*
+X11827D1*
+Y19351D1*
+X11734Y19243D1*
+X11633Y19170D1*
+X11519Y19119D1*
+X11397Y19093D1*
+X11272D1*
+X11150Y19118D1*
+X11036Y19169D1*
+X10935Y19242D1*
+X10851Y19334D1*
+X10787Y19446D1*
+X10727Y19336D1*
+X10643Y19243D1*
+X10543Y19170D1*
+X10429Y19119D1*
+X10307Y19093D1*
+X10182D1*
+X10060Y19118D1*
+X9946Y19169D1*
+X9845Y19242D1*
+X9761Y19334D1*
+X9697Y19446D1*
+X9636Y19336D1*
+X9553Y19243D1*
+X9452Y19170D1*
+X9338Y19119D1*
+X9216Y19093D1*
+X9091D1*
+X8969Y19118D1*
+X8855Y19169D1*
+X8754Y19242D1*
+X8670Y19334D1*
+X8606Y19446D1*
+X8546Y19336D1*
+X8462Y19243D1*
+X8362Y19170D1*
+X8248Y19119D1*
+X8126Y19093D1*
+X8001D1*
+X7936Y19106D1*
+X6344Y17511D1*
+X6347Y16058D1*
+X6429Y16103D1*
+X6551Y16129D1*
+X6675Y16117D1*
+X6789Y16068D1*
+X6833Y16029D1*
+X8949Y16032D1*
+X12812Y16029D1*
+X12885Y16066D1*
+Y19093D1*
+X10789Y19931D2*
+X10849Y20036D1*
+X10932Y20129D1*
+X10991Y20173D1*
+X10852Y20211D1*
+X10727D1*
+X10605Y20236D1*
+X10491Y20287D1*
+X10390Y20360D1*
+X10306Y20452D1*
+X10243Y20560D1*
+X10204Y20679D1*
+X10191Y20803D1*
+X10203Y20927D1*
+X10241Y21046D1*
+X10303Y21154D1*
+X10386Y21247D1*
+X10433Y21282D1*
+X8968Y21280D1*
+X9088Y21160D1*
+X9151Y21052D1*
+X9191Y20934D1*
+X9205Y20805D1*
+X9192Y20681D1*
+X9153Y20562D1*
+X9091Y20454D1*
+X9008Y20361D1*
+X8907Y20288D1*
+X8793Y20237D1*
+X8671Y20211D1*
+X8546D1*
+X8424Y20236D1*
+X8385Y20254D1*
+X8386Y20192D1*
+X8459Y20134D1*
+X8543Y20042D1*
+X8607Y19930D1*
+X8667Y20036D1*
+X8750Y20129D1*
+X8851Y20203D1*
+X8965Y20254D1*
+X9087Y20281D1*
+X9211Y20282D1*
+X9334Y20257D1*
+X9448Y20207D1*
+X9549Y20134D1*
+X9633Y20042D1*
+X9698Y19930D1*
+X9758Y20036D1*
+X9841Y20129D1*
+X9942Y20203D1*
+X10055Y20254D1*
+X10177Y20281D1*
+X10302Y20282D1*
+X10424Y20257D1*
+X10538Y20207D1*
+X10640Y20134D1*
+X10724Y20042D1*
+X10788Y19930D1*
+X12388Y20498D2*
+X12334Y20422D1*
+X13051D1*
+X13176Y20395D1*
+X13266Y20333D1*
+X13404Y20195D1*
+X13473Y20088D1*
+X13493Y19980D1*
+X13494Y13429D1*
+X13546Y13543D1*
+X13580Y13580D1*
+X13577Y16696D1*
+Y20504D1*
+X12869Y20501D1*
+X12396D1*
+X6833Y15424D2*
+X6814Y15404D1*
+X6704Y15346D1*
+X6581Y15325D1*
+X6458Y15342D1*
+X6349Y15394D1*
+X6347Y14823D1*
+X6509Y14773D1*
+X12201D1*
+X12323Y14750D1*
+X12430Y14678D1*
+X12608Y14500D1*
+X12609Y15420D1*
+X11276Y15423D1*
+X6834D1*
+X25316Y12045D2*
+X25437Y12122D1*
+X25517Y12139D1*
+X25514Y12924D1*
+X25478Y12918D1*
+X25355Y12935D1*
+X25234Y12997D1*
+X24932D1*
+X24810Y13021D1*
+X24706Y13089D1*
+X24635Y13195D1*
+X24501Y13211D1*
+X24389Y13265D1*
+X24299Y13350D1*
+X24239Y13459D1*
+X24224Y13532D1*
+X21751Y16005D1*
+X21741Y15937D1*
+Y15582D1*
+X25273Y12052D1*
+X32937Y24062D2*
+X4312D1*
+Y4312D1*
+X33062D1*
+Y24062D1*
+X32937D1*
+D18*
+X29812Y10813D3*
+D19*
+Y9813D3*
+D24*
+X8075Y8687D3*
+D26*
+X9165D3*
+X10256D3*
+X11346D3*
+X12437D3*
+X8620Y7569D3*
+X9711D3*
+X10801D3*
+X11892D3*
+D27*
+X5337Y8128D3*
+X15175D3*
+D24*
+X21428Y8687D3*
+D26*
+X22519D3*
+X23609D3*
+X24700D3*
+X25790D3*
+X26881D3*
+X27971D3*
+X29062D3*
+X21973Y7569D3*
+X23064D3*
+X24155D3*
+X25245D3*
+X26336D3*
+X27426D3*
+X28517D3*
+D28*
+X18686Y8128D3*
+X31804D3*
+D24*
+X29071Y19687D3*
+D26*
+X27980D3*
+X26890D3*
+X25799D3*
+X24709D3*
+X23618D3*
+X22528D3*
+X21437D3*
+X28526Y20805D3*
+X27435D3*
+X26344D3*
+X25254D3*
+X24163D3*
+X23073D3*
+X21982D3*
+D28*
+X31813Y20246D3*
+X18695D3*
+D24*
+X12424Y19687D3*
+D26*
+X11334D3*
+X10243D3*
+X9153D3*
+X8062D3*
+X11879Y20805D3*
+X10788D3*
+X9698D3*
+X8607D3*
+D27*
+X15162Y20246D3*
+X5324D3*
+M02*
diff --git a/board/BottomMask.gbr b/board/BottomMask.gbr
new file mode 100644
index 0000000..1c2a193
--- /dev/null
+++ b/board/BottomMask.gbr
@@ -0,0 +1,94 @@
+G04 DipTrace 2.4.0.2*
+%INBottomMask.gbr*%
+%MOIN*%
+%ADD35C,0.0354*%
+%ADD45C,0.1969*%
+%ADD47C,0.1953*%
+%ADD49C,0.0744*%
+%ADD53R,0.0744X0.0744*%
+%ADD61C,0.0709*%
+%ADD63R,0.0709X0.0709*%
+%FSLAX44Y44*%
+G04*
+G70*
+G90*
+G75*
+G01*
+%LNBotMask*%
+%LPD*%
+D63*
+X29812Y10813D3*
+D61*
+Y9813D3*
+D35*
+X31594Y13199D3*
+Y14931D3*
+D53*
+X8075Y8687D3*
+D49*
+X9165D3*
+X10256D3*
+X11346D3*
+X12437D3*
+X8620Y7569D3*
+X9711D3*
+X10801D3*
+X11892D3*
+D47*
+X5337Y8128D3*
+X15175D3*
+D53*
+X21428Y8687D3*
+D49*
+X22519D3*
+X23609D3*
+X24700D3*
+X25790D3*
+X26881D3*
+X27971D3*
+X29062D3*
+X21973Y7569D3*
+X23064D3*
+X24155D3*
+X25245D3*
+X26336D3*
+X27426D3*
+X28517D3*
+D45*
+X18686Y8128D3*
+X31804D3*
+D53*
+X29071Y19687D3*
+D49*
+X27980D3*
+X26890D3*
+X25799D3*
+X24709D3*
+X23618D3*
+X22528D3*
+X21437D3*
+X28526Y20805D3*
+X27435D3*
+X26344D3*
+X25254D3*
+X24163D3*
+X23073D3*
+X21982D3*
+D45*
+X31813Y20246D3*
+X18695D3*
+D53*
+X12424Y19687D3*
+D49*
+X11334D3*
+X10243D3*
+X9153D3*
+X8062D3*
+X11879Y20805D3*
+X10788D3*
+X9698D3*
+X8607D3*
+D47*
+X15162Y20246D3*
+X5324D3*
+M02*
diff --git a/board/BottomSilk.gbr b/board/BottomSilk.gbr
new file mode 100644
index 0000000..995ecc0
--- /dev/null
+++ b/board/BottomSilk.gbr
@@ -0,0 +1,12 @@
+G04 DipTrace 2.4.0.2*
+%INBottomSilk.gbr*%
+%MOIN*%
+%FSLAX44Y44*%
+G04*
+G70*
+G90*
+G75*
+G01*
+%LNBotSilk*%
+%LPD*%
+M02*
diff --git a/board/Top.gbr b/board/Top.gbr
new file mode 100644
index 0000000..81faab8
--- /dev/null
+++ b/board/Top.gbr
@@ -0,0 +1,2322 @@
+G04 DipTrace 2.4.0.2*
+%INTop.gbr*%
+%MOIN*%
+%ADD13C,0.0118*%
+%ADD14C,0.0079*%
+%ADD15C,0.025*%
+%ADD16R,0.0276X0.0354*%
+%ADD17R,0.0354X0.0276*%
+%ADD18R,0.063X0.063*%
+%ADD19C,0.063*%
+%ADD21R,0.0906X0.0197*%
+%ADD22R,0.0984X0.0787*%
+%ADD23R,0.0571X0.0394*%
+%ADD24R,0.0665X0.0665*%
+%ADD25R,0.0591X0.0591*%
+%ADD26C,0.0665*%
+%ADD27C,0.1874*%
+%ADD28C,0.189*%
+%ADD30R,0.0197X0.0669*%
+%ADD31R,0.0669X0.0197*%
+%ADD33R,0.2165X0.0787*%
+%ADD34C,0.0276*%
+%FSLAX44Y44*%
+G04*
+G70*
+G90*
+G75*
+G01*
+%LNTop*%
+%LPD*%
+X22806Y12376D2*
+D13*
+X21749D1*
+X24932Y14187D2*
+Y14622D1*
+X24936Y14626D1*
+X26113Y12376D2*
+X26874D1*
+X26937Y12438D1*
+X11935Y12376D2*
+X13623D1*
+X22806D2*
+X23436D1*
+X23561Y12251D1*
+Y11751D1*
+X24932Y14187D2*
+Y13068D1*
+X25499Y12501D1*
+X26113Y12376D2*
+X25624D1*
+X25499Y12501D1*
+X4499Y16062D2*
+D14*
+X5446D1*
+X6062D1*
+X4499Y11687D2*
+X5446D1*
+X6062D1*
+X6574Y15727D2*
+Y16062D1*
+X24302Y11411D2*
+Y10880D1*
+X24617D2*
+Y9315D1*
+X24479Y9177D1*
+X20430D1*
+X20292Y9039D1*
+Y7026D1*
+X20154Y6888D1*
+X6712D1*
+X6574Y7026D1*
+Y11687D1*
+X26645Y11431D2*
+X26113D1*
+X25582Y11746D2*
+X26113D1*
+X25247Y11648D2*
+Y10880D1*
+X29062Y8687D2*
+X28631Y9118D1*
+X25070D1*
+X24932Y9256D1*
+Y10880D1*
+X25562D2*
+Y10375D1*
+X25624Y10313D1*
+X32812D1*
+Y11188D1*
+Y10313D2*
+X28062D1*
+Y11063D1*
+X22806Y12691D2*
+X13189D1*
+X7644D1*
+X7506Y12553D1*
+Y8138D1*
+X7644Y8000D1*
+X9280D1*
+X9711Y7569D1*
+X12424Y19687D2*
+X17353Y14758D1*
+X23849D1*
+X23987Y14620D1*
+Y14187D1*
+X11334Y19687D2*
+X16401Y14620D1*
+X23672D1*
+Y14187D1*
+X10243Y19687D2*
+X15743Y14187D1*
+X23357D1*
+X9153Y19687D2*
+X15204Y13636D1*
+X22806D1*
+X13882Y13321D2*
+X22806D1*
+X8607Y20805D2*
+Y13144D1*
+X8745Y13006D1*
+X22806D1*
+X8075Y12061D2*
+X22806D1*
+X9165Y11746D2*
+X22806D1*
+X10256Y11431D2*
+X22806D1*
+X11346Y8687D2*
+X10915Y9118D1*
+X8384D1*
+X8246Y9256D1*
+Y10014D1*
+X8384Y10152D1*
+X23220D1*
+X23357Y10289D1*
+Y10880D1*
+X8620Y9915D2*
+X23534D1*
+X23672Y10053D1*
+Y10880D1*
+X11892Y7569D2*
+Y9177D1*
+X12030Y9315D1*
+X23849D1*
+X23987Y9453D1*
+Y10880D1*
+X26113Y12061D2*
+X26546D1*
+X26670Y11937D1*
+X27312D1*
+X30570Y14065D2*
+X28417D1*
+X28279Y13927D1*
+Y12921D1*
+X28142Y12783D1*
+X26925D1*
+X26833Y12691D1*
+X26113D1*
+X27706Y13293D2*
+X27418Y13006D1*
+X26113D1*
+X28516Y13293D2*
+Y13612D1*
+X28653Y13750D1*
+X30570D1*
+X27984Y13687D2*
+D13*
+X27312D1*
+X30570Y13435D2*
+X29011D1*
+X24617Y13596D2*
+Y14187D1*
+X25470Y13321D2*
+X26113D1*
+Y13636D2*
+X25608D1*
+X25470Y13498D1*
+Y13321D1*
+X27312Y13687D2*
+X26676D1*
+X26625Y13636D1*
+X26113D1*
+X29011Y13435D2*
+Y11063D1*
+X28574D1*
+X30062D1*
+X29812Y10813D1*
+X22562Y16687D2*
+D14*
+X21381D1*
+Y15575D1*
+X21519Y15437D1*
+X21812D1*
+Y15033D1*
+X21950Y14896D1*
+X25109D1*
+X25247Y14758D1*
+Y14187D1*
+X26302Y16687D2*
+X27542D1*
+Y15870D1*
+X27405Y15732D1*
+X26562D1*
+Y15437D1*
+X25700D1*
+X25562Y15299D1*
+Y14187D1*
+D34*
+X10872Y14938D3*
+X8997D3*
+Y18126D3*
+Y16126D3*
+X12562Y14937D3*
+X12123Y16126D3*
+X10497Y18876D3*
+X12873Y16439D3*
+X12935Y17501D3*
+X11623Y18876D3*
+X12748D3*
+X13560Y18064D3*
+X16623Y15001D3*
+X15935Y14563D3*
+X15248Y14126D3*
+X13560Y16939D3*
+X21749Y12376D3*
+X17873D3*
+X13623D3*
+X11935D3*
+X8560D3*
+X8622Y11438D3*
+Y10438D3*
+X9685Y11313D3*
+Y10438D3*
+X10685Y10750D3*
+X11998D3*
+X12935Y10625D3*
+X17998D3*
+X22936D3*
+X6434Y16876D3*
+X8997Y13438D3*
+X11998D3*
+X13498D3*
+Y14813D3*
+X24936Y14626D3*
+X26187Y14938D3*
+Y14063D3*
+X26937Y12438D3*
+X28624Y12938D3*
+X27749Y10625D3*
+X25937Y10688D3*
+X22374Y18001D3*
+X24874D3*
+X24374Y15563D3*
+X13560Y15813D3*
+X4309Y24064D3*
+X33062D3*
+Y4312D3*
+X4309D3*
+X7810Y9250D3*
+X25624Y18001D3*
+X27999D3*
+X25749Y9625D3*
+X7872Y7375D3*
+X6997Y8500D3*
+X23561Y11751D3*
+X24061Y13501D3*
+X25499Y12501D3*
+X6574Y15727D3*
+X24302Y11411D3*
+X26645Y11431D3*
+X25582Y11746D3*
+X25247Y11648D3*
+X13189Y12691D3*
+X13882Y13321D3*
+X8075Y12061D3*
+X9165Y11746D3*
+X10256Y11431D3*
+X8620Y9915D3*
+X27706Y13293D3*
+X28516D3*
+X27984Y13687D3*
+X29011Y13435D3*
+X25470Y13321D3*
+X24617Y13596D3*
+X4337Y23813D2*
+D15*
+X33039D1*
+X4337Y23565D2*
+X33039D1*
+X4337Y23316D2*
+X33039D1*
+X4337Y23067D2*
+X33039D1*
+X4337Y22819D2*
+X33039D1*
+X4337Y22570D2*
+X33039D1*
+X4337Y22321D2*
+X33039D1*
+X4337Y22073D2*
+X33039D1*
+X4337Y21824D2*
+X33039D1*
+X4337Y21575D2*
+X33039D1*
+X4337Y21326D2*
+X8289D1*
+X8925D2*
+X10473D1*
+X11105D2*
+X11562D1*
+X12194D2*
+X21664D1*
+X22300D2*
+X22758D1*
+X23390D2*
+X23848D1*
+X24480D2*
+X24937D1*
+X25569D2*
+X26027D1*
+X26663D2*
+X27117D1*
+X27753D2*
+X28207D1*
+X28843D2*
+X33039D1*
+X4337Y21078D2*
+X8051D1*
+X9163D2*
+X10230D1*
+X12437D2*
+X21426D1*
+X29081D2*
+X33039D1*
+X4337Y20829D2*
+X7984D1*
+X9230D2*
+X10168D1*
+X12499D2*
+X21359D1*
+X29148D2*
+X33039D1*
+X4337Y20580D2*
+X8027D1*
+X9187D2*
+X10211D1*
+X12456D2*
+X21402D1*
+X29105D2*
+X33039D1*
+X4337Y20332D2*
+X8219D1*
+X8995D2*
+X10398D1*
+X11179D2*
+X11488D1*
+X12269D2*
+X21594D1*
+X22370D2*
+X22683D1*
+X23464D2*
+X23773D1*
+X24554D2*
+X24863D1*
+X25644D2*
+X25957D1*
+X26733D2*
+X27047D1*
+X27823D2*
+X28137D1*
+X28913D2*
+X33039D1*
+X4337Y20083D2*
+X7590D1*
+X9624D2*
+X9770D1*
+X10714D2*
+X10862D1*
+X13046D2*
+X20965D1*
+X21909D2*
+X22055D1*
+X22999D2*
+X23145D1*
+X24089D2*
+X24237D1*
+X25183D2*
+X25328D1*
+X26273D2*
+X26418D1*
+X27362D2*
+X27505D1*
+X28452D2*
+X33039D1*
+X4337Y19834D2*
+X7457D1*
+X13046D2*
+X20832D1*
+X28585D2*
+X33039D1*
+X4337Y19586D2*
+X7449D1*
+X13046D2*
+X20824D1*
+X28593D2*
+X33039D1*
+X4337Y19337D2*
+X7555D1*
+X13230D2*
+X20930D1*
+X28491D2*
+X33039D1*
+X4337Y19088D2*
+X8277D1*
+X8937D2*
+X9297D1*
+X10206D2*
+X10387D1*
+X11296D2*
+X11476D1*
+X12386D2*
+X12566D1*
+X13480D2*
+X33039D1*
+X4337Y18840D2*
+X8277D1*
+X8937D2*
+X9547D1*
+X10456D2*
+X10637D1*
+X11546D2*
+X11726D1*
+X12636D2*
+X12816D1*
+X13726D2*
+X33039D1*
+X4337Y18591D2*
+X8277D1*
+X8937D2*
+X9793D1*
+X10702D2*
+X10883D1*
+X11796D2*
+X11976D1*
+X12886D2*
+X13066D1*
+X13976D2*
+X33039D1*
+X4337Y18342D2*
+X8277D1*
+X8937D2*
+X10043D1*
+X10952D2*
+X11133D1*
+X12042D2*
+X12223D1*
+X13132D2*
+X13312D1*
+X14226D2*
+X33039D1*
+X4337Y18094D2*
+X8277D1*
+X8937D2*
+X10293D1*
+X11202D2*
+X11383D1*
+X12292D2*
+X12473D1*
+X13382D2*
+X13562D1*
+X14472D2*
+X33039D1*
+X4337Y17845D2*
+X8277D1*
+X8937D2*
+X10539D1*
+X11448D2*
+X11629D1*
+X12542D2*
+X12723D1*
+X13632D2*
+X13812D1*
+X14722D2*
+X33039D1*
+X4337Y17596D2*
+X8277D1*
+X8937D2*
+X10789D1*
+X11698D2*
+X11879D1*
+X12788D2*
+X12969D1*
+X13878D2*
+X14058D1*
+X14972D2*
+X33039D1*
+X4337Y17347D2*
+X8277D1*
+X8937D2*
+X11035D1*
+X11948D2*
+X12129D1*
+X13038D2*
+X13219D1*
+X14128D2*
+X14308D1*
+X15218D2*
+X33039D1*
+X4337Y17099D2*
+X8277D1*
+X8937D2*
+X11285D1*
+X12194D2*
+X12375D1*
+X13288D2*
+X13469D1*
+X14378D2*
+X14558D1*
+X15468D2*
+X21191D1*
+X23933D2*
+X24930D1*
+X27675D2*
+X33039D1*
+X4337Y16850D2*
+X8277D1*
+X8937D2*
+X11535D1*
+X12444D2*
+X12625D1*
+X13534D2*
+X13715D1*
+X14624D2*
+X14805D1*
+X15718D2*
+X21098D1*
+X23933D2*
+X24930D1*
+X27823D2*
+X33039D1*
+X4337Y16601D2*
+X8277D1*
+X8937D2*
+X11781D1*
+X12694D2*
+X12875D1*
+X13784D2*
+X13965D1*
+X14874D2*
+X15055D1*
+X15964D2*
+X21051D1*
+X23933D2*
+X24930D1*
+X27870D2*
+X33039D1*
+X7042Y16353D2*
+X8277D1*
+X8937D2*
+X12031D1*
+X12941D2*
+X13121D1*
+X14034D2*
+X14215D1*
+X15124D2*
+X15305D1*
+X16214D2*
+X21051D1*
+X23933D2*
+X24930D1*
+X27870D2*
+X33039D1*
+X7042Y16104D2*
+X8277D1*
+X8937D2*
+X12281D1*
+X13191D2*
+X13371D1*
+X14280D2*
+X14461D1*
+X15370D2*
+X15551D1*
+X16464D2*
+X21051D1*
+X23933D2*
+X24930D1*
+X27870D2*
+X33039D1*
+X7042Y15855D2*
+X8277D1*
+X8937D2*
+X12527D1*
+X13441D2*
+X13621D1*
+X14530D2*
+X14711D1*
+X15620D2*
+X15801D1*
+X16710D2*
+X21051D1*
+X21710D2*
+X26258D1*
+X27870D2*
+X33039D1*
+X5073Y15607D2*
+X6164D1*
+X6983D2*
+X8277D1*
+X8937D2*
+X12777D1*
+X13687D2*
+X13867D1*
+X14780D2*
+X14961D1*
+X15870D2*
+X16051D1*
+X16960D2*
+X21051D1*
+X22280D2*
+X25414D1*
+X27733D2*
+X33039D1*
+X4337Y15358D2*
+X6391D1*
+X6757D2*
+X8277D1*
+X8937D2*
+X13027D1*
+X13937D2*
+X14117D1*
+X15026D2*
+X15207D1*
+X16116D2*
+X16297D1*
+X17210D2*
+X21144D1*
+X22280D2*
+X25238D1*
+X27030D2*
+X31453D1*
+X31733D2*
+X33039D1*
+X4337Y15109D2*
+X8277D1*
+X8937D2*
+X13273D1*
+X14187D2*
+X14367D1*
+X15276D2*
+X15457D1*
+X16366D2*
+X16547D1*
+X17456D2*
+X21344D1*
+X25890D2*
+X26094D1*
+X27030D2*
+X31164D1*
+X32023D2*
+X33039D1*
+X4337Y14861D2*
+X8277D1*
+X8937D2*
+X13523D1*
+X14433D2*
+X14613D1*
+X15526D2*
+X15703D1*
+X25890D2*
+X31133D1*
+X32054D2*
+X33039D1*
+X4337Y14612D2*
+X8277D1*
+X8937D2*
+X13773D1*
+X14683D2*
+X14863D1*
+X15773D2*
+X15953D1*
+X25948D2*
+X29828D1*
+X31925D2*
+X33039D1*
+X4337Y14363D2*
+X8277D1*
+X8937D2*
+X14019D1*
+X14933D2*
+X15113D1*
+X25948D2*
+X28332D1*
+X31312D2*
+X33039D1*
+X4337Y14115D2*
+X8277D1*
+X8937D2*
+X14269D1*
+X15179D2*
+X15359D1*
+X25948D2*
+X26883D1*
+X27741D2*
+X28016D1*
+X31312D2*
+X33039D1*
+X4337Y13866D2*
+X8277D1*
+X8937D2*
+X14519D1*
+X31312D2*
+X33039D1*
+X4337Y13617D2*
+X8277D1*
+X8937D2*
+X13586D1*
+X31761D2*
+X33039D1*
+X4337Y13368D2*
+X8277D1*
+X8937D2*
+X13457D1*
+X23429D2*
+X24262D1*
+X32026D2*
+X33039D1*
+X4337Y13120D2*
+X8277D1*
+X23429D2*
+X25098D1*
+X32054D2*
+X33039D1*
+X4337Y12871D2*
+X7367D1*
+X23429D2*
+X25488D1*
+X29358D2*
+X31273D1*
+X31913D2*
+X33039D1*
+X4337Y12622D2*
+X7183D1*
+X23429D2*
+X25488D1*
+X28437D2*
+X28664D1*
+X29358D2*
+X33039D1*
+X4337Y12374D2*
+X7176D1*
+X8355D2*
+X12918D1*
+X13460D2*
+X22183D1*
+X23429D2*
+X25488D1*
+X26737D2*
+X26887D1*
+X27741D2*
+X28664D1*
+X29358D2*
+X33039D1*
+X5073Y12125D2*
+X7176D1*
+X23429D2*
+X25422D1*
+X27741D2*
+X28664D1*
+X29358D2*
+X33039D1*
+X7042Y11876D2*
+X7176D1*
+X23429D2*
+X24891D1*
+X27741D2*
+X28664D1*
+X29358D2*
+X33039D1*
+X7042Y11628D2*
+X7176D1*
+X7835D2*
+X8754D1*
+X23429D2*
+X23937D1*
+X24667D2*
+X24820D1*
+X27741D2*
+X28664D1*
+X29358D2*
+X32226D1*
+X5073Y11379D2*
+X5594D1*
+X7042D2*
+X7176D1*
+X7835D2*
+X8976D1*
+X9355D2*
+X9832D1*
+X27069D2*
+X27594D1*
+X30417D2*
+X32226D1*
+X4337Y11130D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X7835D2*
+X9965D1*
+X26937D2*
+X27594D1*
+X30417D2*
+X32226D1*
+X4337Y10882D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X7835D2*
+X22969D1*
+X25948D2*
+X27594D1*
+X30417D2*
+X32226D1*
+X4337Y10633D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X7835D2*
+X22969D1*
+X25948D2*
+X27734D1*
+X30417D2*
+X32226D1*
+X4337Y10384D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X7835D2*
+X8164D1*
+X4337Y10135D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X4337Y9887D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X25261D2*
+X33039D1*
+X4337Y9638D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X25261D2*
+X33039D1*
+X4337Y9389D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X28792D2*
+X33039D1*
+X4337Y9141D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X29476D2*
+X33039D1*
+X4337Y8892D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X13023D2*
+X19961D1*
+X29648D2*
+X33039D1*
+X4337Y8643D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X13058D2*
+X19961D1*
+X20620D2*
+X21898D1*
+X29683D2*
+X33039D1*
+X4337Y8395D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X12983D2*
+X19961D1*
+X20620D2*
+X21973D1*
+X29608D2*
+X33039D1*
+X4337Y8146D2*
+X6246D1*
+X6901D2*
+X7176D1*
+X10534D2*
+X11066D1*
+X12714D2*
+X19961D1*
+X20620D2*
+X21793D1*
+X29339D2*
+X33039D1*
+X4337Y7897D2*
+X6246D1*
+X6901D2*
+X7293D1*
+X10233D2*
+X11367D1*
+X12417D2*
+X19961D1*
+X20620D2*
+X21449D1*
+X29042D2*
+X33039D1*
+X4337Y7649D2*
+X6246D1*
+X6901D2*
+X8004D1*
+X10327D2*
+X11273D1*
+X12507D2*
+X19961D1*
+X20620D2*
+X21355D1*
+X29132D2*
+X33039D1*
+X4337Y7400D2*
+X6246D1*
+X6901D2*
+X8023D1*
+X10308D2*
+X11293D1*
+X12491D2*
+X19961D1*
+X20620D2*
+X21375D1*
+X29116D2*
+X33039D1*
+X4337Y7151D2*
+X6246D1*
+X20620D2*
+X21519D1*
+X22425D2*
+X22613D1*
+X23515D2*
+X23703D1*
+X24608D2*
+X24793D1*
+X25698D2*
+X25883D1*
+X26788D2*
+X26973D1*
+X27878D2*
+X28066D1*
+X28968D2*
+X33039D1*
+X4337Y6903D2*
+X6269D1*
+X20597D2*
+X33039D1*
+X4337Y6654D2*
+X6492D1*
+X20374D2*
+X33039D1*
+X4337Y6405D2*
+X33039D1*
+X4337Y6156D2*
+X33039D1*
+X4337Y5908D2*
+X33039D1*
+X4337Y5659D2*
+X33039D1*
+X4337Y5410D2*
+X33039D1*
+X4337Y5162D2*
+X33039D1*
+X4337Y4913D2*
+X33039D1*
+X4337Y4664D2*
+X33039D1*
+X4337Y4416D2*
+X33039D1*
+X27034Y12379D2*
+X27715D1*
+Y11495D1*
+X27039D1*
+X27047Y11431D1*
+X27028Y11308D1*
+X26972Y11197D1*
+X26885Y11108D1*
+X26775Y11050D1*
+X26652Y11028D1*
+X26529Y11045D1*
+X26463Y11068D1*
+X25928D1*
+X25925Y10616D1*
+X27761Y10617D1*
+X27754Y10660D1*
+X27620D1*
+Y11466D1*
+X28504Y11462D1*
+X28690Y11466D1*
+X28687Y12688D1*
+Y12926D1*
+X28581Y12901D1*
+X28544Y12770D1*
+X28495Y12706D1*
+X28357Y12568D1*
+X28249Y12500D1*
+X28142Y12479D1*
+X27048Y12476D1*
+X26978Y12424D1*
+X26913Y12397D1*
+X26833Y12387D1*
+X26712D1*
+X26709Y12328D1*
+X26795Y12243D1*
+X26909Y12245D1*
+Y12379D1*
+X27034D1*
+Y14129D2*
+X27715D1*
+Y14008D1*
+X27840Y14063D1*
+X27961Y14089D1*
+X28019Y14083D1*
+X28064Y14142D1*
+X28202Y14280D1*
+X28310Y14349D1*
+X28417Y14369D1*
+X29851D1*
+X29852Y14743D1*
+X31192D1*
+X31173Y14795D1*
+X31152Y14917D1*
+X31165Y15041D1*
+X31213Y15156D1*
+X31291Y15254D1*
+X31393Y15325D1*
+X31511Y15366D1*
+X31635Y15371D1*
+X31756Y15342D1*
+X31865Y15281D1*
+X31951Y15191D1*
+X32009Y15081D1*
+X32036Y14931D1*
+X32018Y14808D1*
+X31967Y14694D1*
+X31886Y14600D1*
+X31782Y14531D1*
+X31663Y14495D1*
+X31538Y14493D1*
+X31418Y14526D1*
+X31309Y14594D1*
+X31288Y14493D1*
+X31284Y14017D1*
+X31288Y13613D1*
+X31291Y13521D1*
+X31393Y13593D1*
+X31511Y13633D1*
+X31635Y13639D1*
+X31756Y13610D1*
+X31865Y13548D1*
+X31951Y13459D1*
+X32009Y13349D1*
+X32036Y13199D1*
+X32018Y13076D1*
+X31967Y12962D1*
+X31886Y12867D1*
+X31782Y12799D1*
+X31663Y12762D1*
+X31538Y12760D1*
+X31418Y12793D1*
+X31312Y12858D1*
+X31228Y12951D1*
+X31172Y13066D1*
+X31038Y13072D1*
+X29852D1*
+Y13115D1*
+X29445Y13111D1*
+X29332D1*
+X29335Y12560D1*
+Y11392D1*
+X30392Y11393D1*
+Y10615D1*
+X32511Y10617D1*
+X32497Y10628D1*
+X32252D1*
+Y11748D1*
+X33061D1*
+X33062Y24062D1*
+X4312D1*
+Y16527D1*
+X4824Y16524D1*
+X5050D1*
+Y16364D1*
+X5622Y16366D1*
+X5620Y16465D1*
+X6504Y16461D1*
+X6757Y16465D1*
+X7016D1*
+Y15659D1*
+X6973D1*
+X6957Y15604D1*
+X6901Y15493D1*
+X6814Y15404D1*
+X6704Y15346D1*
+X6581Y15325D1*
+X6458Y15342D1*
+X6346Y15395D1*
+X6255Y15481D1*
+X6195Y15590D1*
+X6181Y15663D1*
+X6132D1*
+X5879Y15659D1*
+X5620D1*
+Y15757D1*
+X5051Y15758D1*
+X5050Y15600D1*
+X4312D1*
+Y12152D1*
+X4824Y12149D1*
+X5050D1*
+Y11989D1*
+X5622Y11991D1*
+X5620Y12090D1*
+X6504Y12086D1*
+X6757Y12090D1*
+X7016D1*
+Y11284D1*
+X6879D1*
+X6878Y7191D1*
+X8153Y7192D1*
+X8075Y7324D1*
+X8036Y7442D1*
+X8022Y7566D1*
+X8036Y7694D1*
+X7644Y7696D1*
+X7519Y7723D1*
+X7428Y7785D1*
+X7291Y7923D1*
+X7222Y8030D1*
+X7202Y8138D1*
+Y12553D1*
+X7229Y12678D1*
+X7291Y12768D1*
+X7428Y12906D1*
+X7536Y12975D1*
+X7644Y12995D1*
+X8343D1*
+X8314Y13064D1*
+X8303Y13144D1*
+Y19140D1*
+X8126Y19093D1*
+X8001D1*
+X7879Y19118D1*
+X7765Y19169D1*
+X7663Y19242D1*
+X7580Y19334D1*
+X7517Y19442D1*
+X7478Y19561D1*
+X7464Y19685D1*
+X7477Y19809D1*
+X7515Y19928D1*
+X7577Y20036D1*
+X7660Y20129D1*
+X7760Y20203D1*
+X7874Y20254D1*
+X7996Y20281D1*
+X8121Y20282D1*
+X8243Y20257D1*
+X8304Y20230D1*
+X8303Y20288D1*
+X8209Y20360D1*
+X8125Y20452D1*
+X8062Y20560D1*
+X8023Y20679D1*
+X8010Y20803D1*
+X8022Y20927D1*
+X8060Y21046D1*
+X8122Y21154D1*
+X8205Y21247D1*
+X8306Y21321D1*
+X8419Y21372D1*
+X8541Y21399D1*
+X8666Y21400D1*
+X8788Y21375D1*
+X8903Y21325D1*
+X9004Y21252D1*
+X9088Y21160D1*
+X9151Y21052D1*
+X9191Y20934D1*
+X9205Y20805D1*
+X9192Y20681D1*
+X9153Y20562D1*
+X9091Y20454D1*
+X9008Y20361D1*
+X8910Y20290D1*
+X8965Y20254D1*
+X9087Y20281D1*
+X9211Y20282D1*
+X9334Y20257D1*
+X9448Y20207D1*
+X9549Y20134D1*
+X9633Y20042D1*
+X9698Y19930D1*
+X9758Y20036D1*
+X9841Y20129D1*
+X9942Y20203D1*
+X10055Y20254D1*
+X10177Y20281D1*
+X10302Y20282D1*
+X10424Y20257D1*
+X10538Y20207D1*
+X10640Y20134D1*
+X10724Y20042D1*
+X10788Y19930D1*
+X10849Y20036D1*
+X10932Y20129D1*
+X11032Y20203D1*
+X11146Y20254D1*
+X11268Y20281D1*
+X11392Y20282D1*
+X11515Y20257D1*
+X11629Y20207D1*
+X11730Y20134D1*
+X11828Y20018D1*
+X11827Y20210D1*
+X11696Y20236D1*
+X11582Y20287D1*
+X11480Y20360D1*
+X11397Y20452D1*
+X11333Y20564D1*
+X11272Y20454D1*
+X11189Y20361D1*
+X11088Y20288D1*
+X10974Y20237D1*
+X10852Y20211D1*
+X10727D1*
+X10605Y20236D1*
+X10491Y20287D1*
+X10390Y20360D1*
+X10306Y20452D1*
+X10243Y20560D1*
+X10204Y20679D1*
+X10191Y20803D1*
+X10203Y20927D1*
+X10241Y21046D1*
+X10303Y21154D1*
+X10386Y21247D1*
+X10487Y21321D1*
+X10601Y21372D1*
+X10722Y21399D1*
+X10847Y21400D1*
+X10969Y21375D1*
+X11084Y21325D1*
+X11185Y21252D1*
+X11269Y21160D1*
+X11334Y21049D1*
+X11394Y21154D1*
+X11477Y21247D1*
+X11577Y21321D1*
+X11691Y21372D1*
+X11813Y21399D1*
+X11938Y21400D1*
+X12060Y21375D1*
+X12174Y21325D1*
+X12276Y21252D1*
+X12360Y21160D1*
+X12423Y21052D1*
+X12462Y20934D1*
+X12477Y20805D1*
+X12464Y20681D1*
+X12425Y20562D1*
+X12363Y20454D1*
+X12279Y20361D1*
+X12168Y20283D1*
+X13022Y20285D1*
+Y19523D1*
+X14761Y17781D1*
+X17481Y15060D1*
+X21373Y15062D1*
+X21368Y15173D1*
+X21304Y15222D1*
+X21166Y15360D1*
+X21097Y15467D1*
+X21077Y15575D1*
+Y16687D1*
+X21102Y16809D1*
+X21194Y16926D1*
+X21214Y17028D1*
+Y17346D1*
+X23910D1*
+Y16028D1*
+X21687D1*
+X21685Y15839D1*
+X22254Y15840D1*
+Y15203D1*
+X23200Y15200D1*
+X25109D1*
+X25234Y15172D1*
+X25258Y15187D1*
+Y15299D1*
+X25285Y15424D1*
+X25347Y15514D1*
+X25485Y15652D1*
+X25592Y15721D1*
+X25700Y15741D1*
+X26118D1*
+X26120Y15840D1*
+X26280D1*
+X26355Y15955D1*
+X26485Y16026D1*
+X24955Y16028D1*
+Y17346D1*
+X27650D1*
+Y16975D1*
+X27765Y16894D1*
+X27836Y16767D1*
+X27847Y16687D1*
+Y15870D1*
+X27819Y15745D1*
+X27757Y15655D1*
+X27620Y15517D1*
+X27512Y15448D1*
+X27405Y15428D1*
+X27002D1*
+X27004Y15034D1*
+X26120D1*
+Y15132D1*
+X25863Y15133D1*
+X25866Y14787D1*
+X25925D1*
+Y14001D1*
+X26588Y13999D1*
+X26676Y14011D1*
+X26907D1*
+X26909Y14129D1*
+X27034D1*
+X5050Y11379D2*
+Y11225D1*
+X4312D1*
+Y4312D1*
+X33062D1*
+Y10136D1*
+X33019Y10090D1*
+X32909Y10025D1*
+X32812Y10009D1*
+X25624D1*
+X25499Y10036D1*
+X25424Y10083D1*
+X25310Y10205D1*
+X25281Y10258D1*
+X25236Y10255D1*
+Y9423D1*
+X28631Y9422D1*
+X28756Y9395D1*
+X28846Y9333D1*
+X28915Y9264D1*
+X28996Y9281D1*
+X29121Y9282D1*
+X29243Y9257D1*
+X29357Y9207D1*
+X29459Y9134D1*
+X29543Y9042D1*
+X29606Y8934D1*
+X29646Y8816D1*
+X29660Y8687D1*
+X29647Y8563D1*
+X29608Y8444D1*
+X29546Y8336D1*
+X29462Y8243D1*
+X29362Y8170D1*
+X29248Y8119D1*
+X29126Y8093D1*
+X29001D1*
+X28879Y8118D1*
+X28765Y8169D1*
+X28663Y8242D1*
+X28580Y8334D1*
+X28516Y8446D1*
+X28455Y8336D1*
+X28372Y8243D1*
+X28271Y8170D1*
+X28157Y8119D1*
+X28035Y8093D1*
+X27910D1*
+X27788Y8118D1*
+X27674Y8169D1*
+X27573Y8242D1*
+X27489Y8334D1*
+X27425Y8446D1*
+X27365Y8336D1*
+X27281Y8243D1*
+X27180Y8170D1*
+X27066Y8119D1*
+X26944Y8093D1*
+X26820D1*
+X26698Y8118D1*
+X26584Y8169D1*
+X26482Y8242D1*
+X26399Y8334D1*
+X26335Y8446D1*
+X26274Y8336D1*
+X26191Y8243D1*
+X26090Y8170D1*
+X25976Y8119D1*
+X25854Y8093D1*
+X25729D1*
+X25607Y8118D1*
+X25493Y8169D1*
+X25392Y8242D1*
+X25308Y8334D1*
+X25244Y8446D1*
+X25184Y8336D1*
+X25100Y8243D1*
+X24999Y8170D1*
+X24885Y8119D1*
+X24763Y8093D1*
+X24639D1*
+X24517Y8118D1*
+X24402Y8169D1*
+X24301Y8242D1*
+X24217Y8334D1*
+X24154Y8446D1*
+X24093Y8336D1*
+X24010Y8243D1*
+X23909Y8170D1*
+X23795Y8119D1*
+X23673Y8093D1*
+X23548D1*
+X23426Y8118D1*
+X23312Y8169D1*
+X23211Y8242D1*
+X23127Y8334D1*
+X23063Y8446D1*
+X23002Y8336D1*
+X22919Y8243D1*
+X22818Y8170D1*
+X22704Y8119D1*
+X22582Y8093D1*
+X22458D1*
+X22335Y8118D1*
+X22221Y8169D1*
+X22120Y8242D1*
+X22036Y8334D1*
+X21974Y8442D1*
+X21935Y8561D1*
+X21921Y8685D1*
+X21934Y8809D1*
+X21954Y8872D1*
+X20593Y8873D1*
+X20596Y8164D1*
+Y7026D1*
+X20569Y6901D1*
+X20507Y6810D1*
+X20369Y6673D1*
+X20262Y6604D1*
+X20154Y6584D1*
+X6712D1*
+X6587Y6611D1*
+X6496Y6673D1*
+X6359Y6810D1*
+X6290Y6918D1*
+X6270Y7026D1*
+X6266Y11284D1*
+X6132Y11288D1*
+X5879Y11284D1*
+X5620D1*
+Y11382D1*
+X5051Y11383D1*
+X7809Y9285D2*
+X7942D1*
+Y10014D1*
+X7969Y10139D1*
+X8031Y10229D1*
+X8169Y10367D1*
+X8276Y10435D1*
+X8384Y10456D1*
+X22997D1*
+X22994Y11066D1*
+X22207Y11068D1*
+Y11126D1*
+X10521Y11127D1*
+X10386Y11050D1*
+X10263Y11028D1*
+X10140Y11045D1*
+X10028Y11099D1*
+X9937Y11185D1*
+X9877Y11294D1*
+X9853Y11416D1*
+X9857Y11443D1*
+X9427Y11442D1*
+X9296Y11365D1*
+X9173Y11343D1*
+X9050Y11360D1*
+X8937Y11414D1*
+X8847Y11500D1*
+X8787Y11609D1*
+X8763Y11731D1*
+X8766Y11758D1*
+X8341Y11757D1*
+X8205Y11680D1*
+X8082Y11658D1*
+X7959Y11675D1*
+X7847Y11729D1*
+X7810Y11764D1*
+Y9284D1*
+X9709Y8441D2*
+X9649Y8336D1*
+X9566Y8243D1*
+X9506Y8200D1*
+X9645Y8163D1*
+X9769Y8164D1*
+X9892Y8138D1*
+X10006Y8088D1*
+X10107Y8016D1*
+X10192Y7924D1*
+X10255Y7816D1*
+X10294Y7698D1*
+X10308Y7569D1*
+X10295Y7445D1*
+X10257Y7326D1*
+X10171Y7192D1*
+X11426D1*
+X11347Y7324D1*
+X11308Y7442D1*
+X11294Y7566D1*
+X11307Y7691D1*
+X11345Y7809D1*
+X11407Y7918D1*
+X11490Y8011D1*
+X11587Y8083D1*
+X11532Y8119D1*
+X11410Y8093D1*
+X11285D1*
+X11163Y8118D1*
+X11049Y8169D1*
+X10948Y8242D1*
+X10864Y8334D1*
+X10800Y8446D1*
+X10740Y8336D1*
+X10656Y8243D1*
+X10555Y8170D1*
+X10441Y8119D1*
+X10319Y8093D1*
+X10195D1*
+X10073Y8118D1*
+X9958Y8169D1*
+X9857Y8242D1*
+X9774Y8334D1*
+X9710Y8446D1*
+X13022Y8563D2*
+X12983Y8444D1*
+X12921Y8336D1*
+X12837Y8243D1*
+X12736Y8170D1*
+X12623Y8119D1*
+X12501Y8093D1*
+X12376D1*
+X12254Y8118D1*
+X12193Y8145D1*
+X12288Y8016D1*
+X12373Y7924D1*
+X12436Y7816D1*
+X12475Y7698D1*
+X12489Y7569D1*
+X12476Y7445D1*
+X12438Y7326D1*
+X12352Y7192D1*
+X19989D1*
+X19988Y9014D1*
+X19599Y9011D1*
+X12939D1*
+X12981Y8934D1*
+X13021Y8816D1*
+X13035Y8687D1*
+X13022Y8563D1*
+X22518Y7323D2*
+X22457Y7218D1*
+X22374Y7125D1*
+X22273Y7052D1*
+X22159Y7001D1*
+X22037Y6975D1*
+X21912Y6974D1*
+X21790Y7000D1*
+X21676Y7051D1*
+X21575Y7124D1*
+X21491Y7216D1*
+X21428Y7324D1*
+X21389Y7442D1*
+X21376Y7566D1*
+X21388Y7691D1*
+X21426Y7809D1*
+X21488Y7918D1*
+X21571Y8011D1*
+X21672Y8085D1*
+X21786Y8136D1*
+X21907Y8163D1*
+X22032Y8164D1*
+X22154Y8138D1*
+X22269Y8088D1*
+X22370Y8016D1*
+X22454Y7924D1*
+X22519Y7812D1*
+X22579Y7918D1*
+X22662Y8011D1*
+X22762Y8085D1*
+X22876Y8136D1*
+X22998Y8163D1*
+X23123Y8164D1*
+X23245Y8138D1*
+X23359Y8088D1*
+X23461Y8016D1*
+X23545Y7924D1*
+X23609Y7812D1*
+X23669Y7918D1*
+X23752Y8011D1*
+X23853Y8085D1*
+X23967Y8136D1*
+X24089Y8163D1*
+X24213Y8164D1*
+X24336Y8138D1*
+X24450Y8088D1*
+X24551Y8016D1*
+X24635Y7924D1*
+X24700Y7812D1*
+X24760Y7918D1*
+X24843Y8011D1*
+X24944Y8085D1*
+X25057Y8136D1*
+X25179Y8163D1*
+X25304Y8164D1*
+X25426Y8138D1*
+X25540Y8088D1*
+X25642Y8016D1*
+X25726Y7924D1*
+X25790Y7812D1*
+X25850Y7918D1*
+X25933Y8011D1*
+X26034Y8085D1*
+X26148Y8136D1*
+X26270Y8163D1*
+X26394Y8164D1*
+X26517Y8138D1*
+X26631Y8088D1*
+X26732Y8016D1*
+X26817Y7924D1*
+X26881Y7812D1*
+X26941Y7918D1*
+X27024Y8011D1*
+X27125Y8085D1*
+X27238Y8136D1*
+X27360Y8163D1*
+X27485Y8164D1*
+X27607Y8138D1*
+X27721Y8088D1*
+X27823Y8016D1*
+X27907Y7924D1*
+X27971Y7812D1*
+X28032Y7918D1*
+X28115Y8011D1*
+X28215Y8085D1*
+X28329Y8136D1*
+X28451Y8163D1*
+X28576Y8164D1*
+X28698Y8138D1*
+X28812Y8088D1*
+X28913Y8016D1*
+X28998Y7924D1*
+X29061Y7816D1*
+X29100Y7698D1*
+X29114Y7569D1*
+X29101Y7445D1*
+X29063Y7326D1*
+X29000Y7218D1*
+X28917Y7125D1*
+X28816Y7052D1*
+X28702Y7001D1*
+X28580Y6975D1*
+X28456Y6974D1*
+X28333Y7000D1*
+X28219Y7051D1*
+X28118Y7124D1*
+X28034Y7216D1*
+X27970Y7328D1*
+X27910Y7218D1*
+X27827Y7125D1*
+X27726Y7052D1*
+X27612Y7001D1*
+X27490Y6975D1*
+X27365Y6974D1*
+X27243Y7000D1*
+X27129Y7051D1*
+X27028Y7124D1*
+X26944Y7216D1*
+X26880Y7328D1*
+X26819Y7218D1*
+X26736Y7125D1*
+X26635Y7052D1*
+X26521Y7001D1*
+X26399Y6975D1*
+X26274Y6974D1*
+X26152Y7000D1*
+X26038Y7051D1*
+X25937Y7124D1*
+X25853Y7216D1*
+X25789Y7328D1*
+X25729Y7218D1*
+X25645Y7125D1*
+X25545Y7052D1*
+X25431Y7001D1*
+X25309Y6975D1*
+X25184Y6974D1*
+X25062Y7000D1*
+X24948Y7051D1*
+X24847Y7124D1*
+X24763Y7216D1*
+X24699Y7328D1*
+X24638Y7218D1*
+X24555Y7125D1*
+X24454Y7052D1*
+X24340Y7001D1*
+X24218Y6975D1*
+X24093Y6974D1*
+X23971Y7000D1*
+X23857Y7051D1*
+X23756Y7124D1*
+X23672Y7216D1*
+X23608Y7328D1*
+X23548Y7218D1*
+X23464Y7125D1*
+X23363Y7052D1*
+X23250Y7001D1*
+X23128Y6975D1*
+X23003Y6974D1*
+X22881Y7000D1*
+X22767Y7051D1*
+X22665Y7124D1*
+X22582Y7216D1*
+X22518Y7328D1*
+X28565Y19563D2*
+X28526Y19444D1*
+X28464Y19336D1*
+X28381Y19243D1*
+X28280Y19170D1*
+X28166Y19119D1*
+X28044Y19093D1*
+X27919D1*
+X27797Y19118D1*
+X27683Y19169D1*
+X27582Y19242D1*
+X27498Y19334D1*
+X27434Y19446D1*
+X27374Y19336D1*
+X27290Y19243D1*
+X27189Y19170D1*
+X27075Y19119D1*
+X26953Y19093D1*
+X26829D1*
+X26706Y19118D1*
+X26592Y19169D1*
+X26491Y19242D1*
+X26407Y19334D1*
+X26343Y19446D1*
+X26283Y19336D1*
+X26200Y19243D1*
+X26099Y19170D1*
+X25985Y19119D1*
+X25863Y19093D1*
+X25738D1*
+X25616Y19118D1*
+X25502Y19169D1*
+X25401Y19242D1*
+X25317Y19334D1*
+X25253Y19446D1*
+X25192Y19336D1*
+X25109Y19243D1*
+X25008Y19170D1*
+X24894Y19119D1*
+X24772Y19093D1*
+X24647D1*
+X24525Y19118D1*
+X24411Y19169D1*
+X24310Y19242D1*
+X24226Y19334D1*
+X24162Y19446D1*
+X24102Y19336D1*
+X24018Y19243D1*
+X23918Y19170D1*
+X23804Y19119D1*
+X23682Y19093D1*
+X23557D1*
+X23435Y19118D1*
+X23321Y19169D1*
+X23220Y19242D1*
+X23136Y19334D1*
+X23072Y19446D1*
+X23011Y19336D1*
+X22928Y19243D1*
+X22827Y19170D1*
+X22713Y19119D1*
+X22591Y19093D1*
+X22466D1*
+X22344Y19118D1*
+X22230Y19169D1*
+X22129Y19242D1*
+X22045Y19334D1*
+X21981Y19446D1*
+X21921Y19336D1*
+X21837Y19243D1*
+X21736Y19170D1*
+X21623Y19119D1*
+X21501Y19093D1*
+X21376D1*
+X21254Y19118D1*
+X21140Y19169D1*
+X21038Y19242D1*
+X20955Y19334D1*
+X20892Y19442D1*
+X20853Y19561D1*
+X20839Y19685D1*
+X20852Y19809D1*
+X20890Y19928D1*
+X20952Y20036D1*
+X21035Y20129D1*
+X21135Y20203D1*
+X21249Y20254D1*
+X21371Y20281D1*
+X21496Y20282D1*
+X21618Y20257D1*
+X21732Y20207D1*
+X21834Y20134D1*
+X21918Y20042D1*
+X21982Y19930D1*
+X22042Y20036D1*
+X22125Y20129D1*
+X22226Y20203D1*
+X22340Y20254D1*
+X22462Y20281D1*
+X22586Y20282D1*
+X22709Y20257D1*
+X22823Y20207D1*
+X22924Y20134D1*
+X23008Y20042D1*
+X23073Y19930D1*
+X23133Y20036D1*
+X23216Y20129D1*
+X23317Y20203D1*
+X23430Y20254D1*
+X23552Y20281D1*
+X23677Y20282D1*
+X23799Y20257D1*
+X23913Y20207D1*
+X24015Y20134D1*
+X24099Y20042D1*
+X24163Y19930D1*
+X24223Y20036D1*
+X24307Y20129D1*
+X24407Y20203D1*
+X24521Y20254D1*
+X24643Y20281D1*
+X24767Y20282D1*
+X24890Y20257D1*
+X25004Y20207D1*
+X25105Y20134D1*
+X25190Y20042D1*
+X25254Y19930D1*
+X25314Y20036D1*
+X25397Y20129D1*
+X25498Y20203D1*
+X25611Y20254D1*
+X25733Y20281D1*
+X25858Y20282D1*
+X25980Y20257D1*
+X26095Y20207D1*
+X26196Y20134D1*
+X26280Y20042D1*
+X26345Y19930D1*
+X26405Y20036D1*
+X26488Y20129D1*
+X26588Y20203D1*
+X26702Y20254D1*
+X26824Y20281D1*
+X26949Y20282D1*
+X27071Y20257D1*
+X27185Y20207D1*
+X27287Y20134D1*
+X27371Y20042D1*
+X27435Y19930D1*
+X27495Y20036D1*
+X27578Y20129D1*
+X27679Y20203D1*
+X27792Y20254D1*
+X27914Y20281D1*
+X28039Y20282D1*
+X28161Y20257D1*
+X28276Y20207D1*
+X28377Y20134D1*
+X28461Y20042D1*
+X28524Y19934D1*
+X28564Y19816D1*
+X28578Y19687D1*
+X28565Y19563D1*
+X29110Y20681D2*
+X29072Y20562D1*
+X29009Y20454D1*
+X28926Y20361D1*
+X28825Y20288D1*
+X28711Y20237D1*
+X28589Y20211D1*
+X28464D1*
+X28342Y20236D1*
+X28228Y20287D1*
+X28127Y20360D1*
+X28043Y20452D1*
+X27979Y20564D1*
+X27919Y20454D1*
+X27835Y20361D1*
+X27735Y20288D1*
+X27621Y20237D1*
+X27499Y20211D1*
+X27374D1*
+X27252Y20236D1*
+X27138Y20287D1*
+X27036Y20360D1*
+X26953Y20452D1*
+X26889Y20564D1*
+X26828Y20454D1*
+X26745Y20361D1*
+X26644Y20288D1*
+X26530Y20237D1*
+X26408Y20211D1*
+X26283D1*
+X26161Y20236D1*
+X26047Y20287D1*
+X25946Y20360D1*
+X25862Y20452D1*
+X25798Y20564D1*
+X25738Y20454D1*
+X25654Y20361D1*
+X25553Y20288D1*
+X25440Y20237D1*
+X25318Y20211D1*
+X25193D1*
+X25071Y20236D1*
+X24957Y20287D1*
+X24855Y20360D1*
+X24772Y20452D1*
+X24708Y20564D1*
+X24647Y20454D1*
+X24564Y20361D1*
+X24463Y20288D1*
+X24349Y20237D1*
+X24227Y20211D1*
+X24102D1*
+X23980Y20236D1*
+X23866Y20287D1*
+X23765Y20360D1*
+X23681Y20452D1*
+X23617Y20564D1*
+X23557Y20454D1*
+X23473Y20361D1*
+X23372Y20288D1*
+X23258Y20237D1*
+X23136Y20211D1*
+X23012D1*
+X22890Y20236D1*
+X22775Y20287D1*
+X22674Y20360D1*
+X22590Y20452D1*
+X22527Y20564D1*
+X22466Y20454D1*
+X22383Y20361D1*
+X22282Y20288D1*
+X22168Y20237D1*
+X22046Y20211D1*
+X21921D1*
+X21799Y20236D1*
+X21685Y20287D1*
+X21584Y20360D1*
+X21500Y20452D1*
+X21437Y20560D1*
+X21398Y20679D1*
+X21385Y20803D1*
+X21397Y20927D1*
+X21435Y21046D1*
+X21497Y21154D1*
+X21580Y21247D1*
+X21681Y21321D1*
+X21794Y21372D1*
+X21916Y21399D1*
+X22041Y21400D1*
+X22163Y21375D1*
+X22278Y21325D1*
+X22379Y21252D1*
+X22463Y21160D1*
+X22528Y21049D1*
+X22588Y21154D1*
+X22671Y21247D1*
+X22771Y21321D1*
+X22885Y21372D1*
+X23007Y21399D1*
+X23132Y21400D1*
+X23254Y21375D1*
+X23368Y21325D1*
+X23470Y21252D1*
+X23554Y21160D1*
+X23618Y21049D1*
+X23678Y21154D1*
+X23761Y21247D1*
+X23862Y21321D1*
+X23975Y21372D1*
+X24097Y21399D1*
+X24222Y21400D1*
+X24344Y21375D1*
+X24459Y21325D1*
+X24560Y21252D1*
+X24644Y21160D1*
+X24709Y21049D1*
+X24769Y21154D1*
+X24852Y21247D1*
+X24952Y21321D1*
+X25066Y21372D1*
+X25188Y21399D1*
+X25313Y21400D1*
+X25435Y21375D1*
+X25549Y21325D1*
+X25651Y21252D1*
+X25735Y21160D1*
+X25799Y21049D1*
+X25859Y21154D1*
+X25942Y21247D1*
+X26043Y21321D1*
+X26157Y21372D1*
+X26278Y21399D1*
+X26403Y21400D1*
+X26525Y21375D1*
+X26640Y21325D1*
+X26741Y21252D1*
+X26825Y21160D1*
+X26890Y21049D1*
+X26950Y21154D1*
+X27033Y21247D1*
+X27133Y21321D1*
+X27247Y21372D1*
+X27369Y21399D1*
+X27494Y21400D1*
+X27616Y21375D1*
+X27730Y21325D1*
+X27832Y21252D1*
+X27916Y21160D1*
+X27980Y21049D1*
+X28040Y21154D1*
+X28123Y21247D1*
+X28224Y21321D1*
+X28338Y21372D1*
+X28460Y21399D1*
+X28584Y21400D1*
+X28707Y21375D1*
+X28821Y21325D1*
+X28922Y21252D1*
+X29006Y21160D1*
+X29070Y21052D1*
+X29109Y20934D1*
+X29123Y20805D1*
+X29110Y20681D1*
+X12588Y19089D2*
+X12362D1*
+X16529Y14922D1*
+X16756Y14924D1*
+X12589Y19092D1*
+X11477Y19110D2*
+X11397Y19093D1*
+X11269D1*
+X15869Y14491D1*
+X16097Y14493D1*
+X11482Y19109D1*
+X10387Y19110D2*
+X10307Y19093D1*
+X10178D1*
+X15331Y13939D1*
+X15567Y13940D1*
+X15351Y14149D1*
+X10393Y19107D1*
+X9296Y19110D2*
+X9216Y19093D1*
+X9091D1*
+X8969Y19118D1*
+X8909Y19145D1*
+X8912Y17930D1*
+Y13309D1*
+X13476Y13310D1*
+X13494Y13429D1*
+X13546Y13543D1*
+X13629Y13635D1*
+X13737Y13697D1*
+X13859Y13723D1*
+X13983Y13711D1*
+X14097Y13661D1*
+X14141Y13623D1*
+X14784Y13625D1*
+X9301Y19108D1*
+X25161Y13587D2*
+X25021D1*
+X25001Y13473D1*
+X24945Y13362D1*
+X24858Y13273D1*
+X24747Y13215D1*
+X24625Y13194D1*
+X24501Y13211D1*
+X24389Y13265D1*
+X24299Y13350D1*
+X24239Y13459D1*
+X24215Y13585D1*
+X23939Y13587D1*
+X23407D1*
+X23406Y12958D1*
+Y12328D1*
+Y11698D1*
+Y11481D1*
+X23909Y11479D1*
+X23914Y11520D1*
+X23966Y11633D1*
+X24050Y11725D1*
+X24158Y11787D1*
+X24279Y11813D1*
+X24403Y11801D1*
+X24518Y11752D1*
+X24611Y11670D1*
+X24675Y11563D1*
+X24696Y11476D1*
+X24882Y11479D1*
+X24845Y11633D1*
+X24859Y11757D1*
+X24911Y11870D1*
+X24995Y11962D1*
+X25103Y12024D1*
+X25224Y12050D1*
+X25306Y12042D1*
+X25437Y12122D1*
+X25517Y12139D1*
+X25514Y12424D1*
+Y12920D1*
+X25355Y12935D1*
+X25242Y12989D1*
+X25152Y13074D1*
+X25092Y13184D1*
+X25068Y13306D1*
+X25083Y13429D1*
+X25134Y13543D1*
+X25153Y13563D1*
+X24214Y13587D2*
+X23624Y13591D1*
+X23404Y13587D1*
+X23402Y13272D1*
+X23406Y12869D1*
+X23402Y12643D1*
+X23406Y12299D1*
+X23404Y11479D1*
+X23721Y11476D1*
+X23874Y11479D1*
+X13448Y12387D2*
+X13426Y12366D1*
+X22204Y12365D1*
+X22181Y12387D1*
+X13451D1*
+X12927D2*
+X8310D1*
+X8450Y12365D1*
+X12954D1*
+D16*
+X27312Y11937D3*
+Y12449D3*
+Y13687D3*
+Y14199D3*
+D17*
+X21812Y15437D3*
+X22324D3*
+X26562D3*
+X27074D3*
+D18*
+X29812Y10813D3*
+D19*
+Y9813D3*
+D21*
+X30570Y13435D3*
+Y13750D3*
+Y14065D3*
+Y14380D3*
+Y14695D3*
+D22*
+X30609Y12313D3*
+Y15817D3*
+X32775Y12313D3*
+Y15817D3*
+D23*
+X4499Y16062D3*
+Y16692D3*
+Y11687D3*
+Y12317D3*
+D24*
+X8075Y8687D3*
+D25*
+X32812Y11188D3*
+D26*
+X9165Y8687D3*
+X10256D3*
+X11346D3*
+X12437D3*
+X8620Y7569D3*
+X9711D3*
+X10801D3*
+X11892D3*
+D27*
+X5337Y8128D3*
+X15175D3*
+D24*
+X21428Y8687D3*
+D26*
+X22519D3*
+X23609D3*
+X24700D3*
+X25790D3*
+X26881D3*
+X27971D3*
+X29062D3*
+X21973Y7569D3*
+X23064D3*
+X24155D3*
+X25245D3*
+X26336D3*
+X27426D3*
+X28517D3*
+D28*
+X18686Y8128D3*
+X31804D3*
+D24*
+X29071Y19687D3*
+D26*
+X27980D3*
+X26890D3*
+X25799D3*
+X24709D3*
+X23618D3*
+X22528D3*
+X21437D3*
+X28526Y20805D3*
+X27435D3*
+X26344D3*
+X25254D3*
+X24163D3*
+X23073D3*
+X21982D3*
+D28*
+X31813Y20246D3*
+X18695D3*
+D24*
+X12424Y19687D3*
+D26*
+X11334D3*
+X10243D3*
+X9153D3*
+X8062D3*
+X11879Y20805D3*
+X10788D3*
+X9698D3*
+X8607D3*
+D27*
+X15162Y20246D3*
+X5324D3*
+D17*
+X6062Y16062D3*
+X6574D3*
+X6062Y11687D3*
+X6574D3*
+X28062Y11063D3*
+X28574D3*
+D30*
+X25562Y14187D3*
+X25247D3*
+X24932D3*
+X24617D3*
+X24302D3*
+X23987D3*
+X23672D3*
+X23357D3*
+D31*
+X22806Y13636D3*
+Y13321D3*
+Y13006D3*
+Y12691D3*
+Y12376D3*
+Y12061D3*
+Y11746D3*
+Y11431D3*
+D30*
+X23357Y10880D3*
+X23672D3*
+X23987D3*
+X24302D3*
+X24617D3*
+X24932D3*
+X25247D3*
+X25562D3*
+D31*
+X26113Y11431D3*
+Y11746D3*
+Y12061D3*
+Y12376D3*
+Y12691D3*
+Y13006D3*
+Y13321D3*
+Y13636D3*
+D33*
+X22562Y16687D3*
+X26302D3*
+M02*
diff --git a/board/TopMask.gbr b/board/TopMask.gbr
new file mode 100644
index 0000000..c004bf1
--- /dev/null
+++ b/board/TopMask.gbr
@@ -0,0 +1,177 @@
+G04 DipTrace 2.4.0.2*
+%INTopMask.gbr*%
+%MOIN*%
+%ADD35C,0.0354*%
+%ADD39R,0.2244X0.0866*%
+%ADD41R,0.0748X0.0276*%
+%ADD43R,0.0276X0.0748*%
+%ADD45C,0.1969*%
+%ADD47C,0.1953*%
+%ADD49C,0.0744*%
+%ADD51R,0.0669X0.0669*%
+%ADD53R,0.0744X0.0744*%
+%ADD55R,0.065X0.0472*%
+%ADD57R,0.1063X0.0866*%
+%ADD59R,0.0984X0.0276*%
+%ADD61C,0.0709*%
+%ADD63R,0.0709X0.0709*%
+%ADD65R,0.0433X0.0354*%
+%ADD67R,0.0354X0.0433*%
+%FSLAX44Y44*%
+G04*
+G70*
+G90*
+G75*
+G01*
+%LNTopMask*%
+%LPD*%
+D67*
+X27312Y11937D3*
+Y12449D3*
+Y13687D3*
+Y14199D3*
+D65*
+X21812Y15437D3*
+X22324D3*
+X26562D3*
+X27074D3*
+D63*
+X29812Y10813D3*
+D61*
+Y9813D3*
+D59*
+X30570Y13435D3*
+Y13750D3*
+Y14065D3*
+Y14380D3*
+Y14695D3*
+D57*
+X30609Y12313D3*
+Y15817D3*
+X32775Y12313D3*
+Y15817D3*
+D35*
+X31594Y13199D3*
+Y14931D3*
+D55*
+X4499Y16062D3*
+Y16692D3*
+Y11687D3*
+Y12317D3*
+D53*
+X8075Y8687D3*
+D51*
+X32812Y11188D3*
+D49*
+X9165Y8687D3*
+X10256D3*
+X11346D3*
+X12437D3*
+X8620Y7569D3*
+X9711D3*
+X10801D3*
+X11892D3*
+D47*
+X5337Y8128D3*
+X15175D3*
+D53*
+X21428Y8687D3*
+D49*
+X22519D3*
+X23609D3*
+X24700D3*
+X25790D3*
+X26881D3*
+X27971D3*
+X29062D3*
+X21973Y7569D3*
+X23064D3*
+X24155D3*
+X25245D3*
+X26336D3*
+X27426D3*
+X28517D3*
+D45*
+X18686Y8128D3*
+X31804D3*
+D53*
+X29071Y19687D3*
+D49*
+X27980D3*
+X26890D3*
+X25799D3*
+X24709D3*
+X23618D3*
+X22528D3*
+X21437D3*
+X28526Y20805D3*
+X27435D3*
+X26344D3*
+X25254D3*
+X24163D3*
+X23073D3*
+X21982D3*
+D45*
+X31813Y20246D3*
+X18695D3*
+D53*
+X12424Y19687D3*
+D49*
+X11334D3*
+X10243D3*
+X9153D3*
+X8062D3*
+X11879Y20805D3*
+X10788D3*
+X9698D3*
+X8607D3*
+D47*
+X15162Y20246D3*
+X5324D3*
+D65*
+X6062Y16062D3*
+X6574D3*
+X6062Y11687D3*
+X6574D3*
+X28062Y11063D3*
+X28574D3*
+D43*
+X25562Y14187D3*
+X25247D3*
+X24932D3*
+X24617D3*
+X24302D3*
+X23987D3*
+X23672D3*
+X23357D3*
+D41*
+X22806Y13636D3*
+Y13321D3*
+Y13006D3*
+Y12691D3*
+Y12376D3*
+Y12061D3*
+Y11746D3*
+Y11431D3*
+D43*
+X23357Y10880D3*
+X23672D3*
+X23987D3*
+X24302D3*
+X24617D3*
+X24932D3*
+X25247D3*
+X25562D3*
+D41*
+X26113Y11431D3*
+Y11746D3*
+Y12061D3*
+Y12376D3*
+Y12691D3*
+Y13006D3*
+Y13321D3*
+Y13636D3*
+D39*
+X22562Y16687D3*
+X26302D3*
+M02*
diff --git a/board/TopSilk.gbr b/board/TopSilk.gbr
new file mode 100644
index 0000000..0f0d9ea
--- /dev/null
+++ b/board/TopSilk.gbr
@@ -0,0 +1,1078 @@
+G04 DipTrace 2.4.0.2*
+%INTopSilk.gbr*%
+%MOIN*%
+%ADD10C,0.0098*%
+%ADD20C,0.0197*%
+%ADD29O,0.0164X0.0165*%
+%ADD32C,0.0154*%
+%ADD69C,0.0077*%
+%ADD70C,0.0062*%
+%ADD71C,0.0139*%
+%FSLAX44Y44*%
+G04*
+G70*
+G90*
+G75*
+G01*
+%LNTopSilk*%
+%LPD*%
+X29694Y11612D2*
+D10*
+X29930D1*
+X29812Y11730D2*
+Y11494D1*
+X28812Y10313D2*
+G02X28812Y10313I1000J0D01*
+G01*
+X33936Y12530D2*
+Y15600D1*
+Y12530D2*
+X33444D1*
+X32113D2*
+X31271D1*
+X30235Y12884D2*
+Y13159D1*
+Y14970D2*
+Y15246D1*
+X31271Y15600D2*
+X32113D1*
+X33444D2*
+X33936D1*
+D20*
+X29901Y13435D3*
+X4736Y17058D2*
+D10*
+X4263D1*
+X4736Y12683D2*
+X4263D1*
+X25582Y13675D2*
+X23298D1*
+Y11392D1*
+X25582D1*
+Y13675D1*
+D29*
+X25893Y14192D3*
+G36*
+X25582Y13675D2*
+X25267D1*
+X25582Y13360D1*
+Y13675D1*
+G37*
+D32*
+X21697Y17302D3*
+X22188Y17356D2*
+D10*
+Y17652D1*
+X26676Y15722D2*
+Y16018D1*
+X22188Y15722D2*
+X26676D1*
+X22188D2*
+Y16018D1*
+X26676Y17356D2*
+Y17652D1*
+X22188D2*
+X26676D1*
+X27735Y12235D2*
+D69*
+X27688Y12211D1*
+X27640Y12163D1*
+X27616Y12116D1*
+Y12020D1*
+X27640Y11972D1*
+X27688Y11924D1*
+X27735Y11900D1*
+X27807Y11876D1*
+X27927D1*
+X27998Y11900D1*
+X28047Y11924D1*
+X28094Y11972D1*
+X28118Y12020D1*
+Y12116D1*
+X28094Y12163D1*
+X28047Y12211D1*
+X27998Y12235D1*
+X27712Y12389D2*
+X27688Y12438D1*
+X27617Y12509D1*
+X28118D1*
+X27716Y13878D2*
+X27669Y13854D1*
+X27621Y13806D1*
+X27597Y13758D1*
+Y13663D1*
+X27621Y13615D1*
+X27669Y13567D1*
+X27716Y13543D1*
+X27788Y13519D1*
+X27908D1*
+X27979Y13543D1*
+X28027Y13567D1*
+X28075Y13615D1*
+X28099Y13663D1*
+Y13758D1*
+X28075Y13806D1*
+X28027Y13854D1*
+X27979Y13878D1*
+X27717Y14056D2*
+X27693D1*
+X27645Y14080D1*
+X27621Y14104D1*
+X27597Y14152D1*
+Y14248D1*
+X27621Y14295D1*
+X27645Y14319D1*
+X27693Y14343D1*
+X27741D1*
+X27789Y14319D1*
+X27860Y14271D1*
+X28099Y14032D1*
+Y14367D1*
+X21003Y15438D2*
+X20979Y15485D1*
+X20931Y15533D1*
+X20883Y15557D1*
+X20788D1*
+X20740Y15533D1*
+X20692Y15485D1*
+X20668Y15438D1*
+X20644Y15366D1*
+Y15246D1*
+X20668Y15175D1*
+X20692Y15126D1*
+X20740Y15079D1*
+X20788Y15055D1*
+X20883D1*
+X20931Y15079D1*
+X20979Y15126D1*
+X21003Y15175D1*
+X21205Y15556D2*
+X21468D1*
+X21324Y15365D1*
+X21396D1*
+X21444Y15341D1*
+X21468Y15318D1*
+X21492Y15246D1*
+Y15198D1*
+X21468Y15126D1*
+X21420Y15078D1*
+X21348Y15055D1*
+X21276D1*
+X21205Y15078D1*
+X21181Y15103D1*
+X21157Y15150D1*
+X27741Y15438D2*
+X27717Y15485D1*
+X27669Y15533D1*
+X27621Y15557D1*
+X27526D1*
+X27478Y15533D1*
+X27430Y15485D1*
+X27406Y15438D1*
+X27382Y15366D1*
+Y15246D1*
+X27406Y15175D1*
+X27430Y15126D1*
+X27478Y15079D1*
+X27526Y15055D1*
+X27621D1*
+X27669Y15079D1*
+X27717Y15126D1*
+X27741Y15175D1*
+X28134Y15055D2*
+Y15556D1*
+X27895Y15222D1*
+X28254D1*
+X29747Y12343D2*
+X29723Y12390D1*
+X29675Y12438D1*
+X29627Y12462D1*
+X29532D1*
+X29484Y12438D1*
+X29436Y12390D1*
+X29412Y12343D1*
+X29388Y12271D1*
+Y12151D1*
+X29412Y12080D1*
+X29436Y12032D1*
+X29484Y11984D1*
+X29532Y11960D1*
+X29627D1*
+X29675Y11984D1*
+X29723Y12032D1*
+X29747Y12080D1*
+X30188Y12462D2*
+X29949D1*
+X29925Y12247D1*
+X29949Y12270D1*
+X30021Y12295D1*
+X30092D1*
+X30164Y12270D1*
+X30212Y12223D1*
+X30236Y12151D1*
+Y12103D1*
+X30212Y12032D1*
+X30164Y11984D1*
+X30092Y11960D1*
+X30021D1*
+X29949Y11984D1*
+X29925Y12008D1*
+X29901Y12055D1*
+X31744Y16943D2*
+Y16560D1*
+X31720Y16489D1*
+X31696Y16465D1*
+X31648Y16440D1*
+X31600D1*
+X31553Y16465D1*
+X31529Y16489D1*
+X31505Y16560D1*
+Y16608D1*
+X32185Y16942D2*
+X31947D1*
+X31923Y16727D1*
+X31947Y16751D1*
+X32018Y16775D1*
+X32090D1*
+X32162Y16751D1*
+X32210Y16704D1*
+X32233Y16632D1*
+Y16584D1*
+X32210Y16512D1*
+X32162Y16464D1*
+X32090Y16440D1*
+X32018D1*
+X31947Y16464D1*
+X31923Y16489D1*
+X31898Y16536D1*
+X5044Y15704D2*
+X5547D1*
+Y15991D1*
+X5044Y16456D2*
+Y16145D1*
+X5547D1*
+Y16456D1*
+X5284Y16145D2*
+Y16336D1*
+X5044Y16610D2*
+X5547D1*
+Y16778D1*
+X5523Y16849D1*
+X5475Y16898D1*
+X5427Y16921D1*
+X5356Y16945D1*
+X5236D1*
+X5164Y16921D1*
+X5116Y16898D1*
+X5068Y16849D1*
+X5044Y16778D1*
+Y16610D1*
+X5141Y17099D2*
+X5116Y17148D1*
+X5045Y17219D1*
+X5547D1*
+X4982Y11284D2*
+X5484D1*
+Y11571D1*
+X4982Y12036D2*
+Y11725D1*
+X5484D1*
+Y12036D1*
+X5221Y11725D2*
+Y11916D1*
+X4982Y12190D2*
+X5484D1*
+Y12358D1*
+X5460Y12429D1*
+X5412Y12478D1*
+X5364Y12501D1*
+X5293Y12525D1*
+X5173D1*
+X5101Y12501D1*
+X5054Y12478D1*
+X5006Y12429D1*
+X4982Y12358D1*
+Y12190D1*
+X5102Y12704D2*
+X5078D1*
+X5030Y12728D1*
+X5006Y12751D1*
+X4982Y12799D1*
+Y12895D1*
+X5006Y12943D1*
+X5030Y12966D1*
+X5078Y12991D1*
+X5126D1*
+X5174Y12966D1*
+X5245Y12919D1*
+X5484Y12679D1*
+Y13014D1*
+X6013Y16693D2*
+X6228D1*
+X6300Y16717D1*
+X6324Y16741D1*
+X6348Y16788D1*
+Y16836D1*
+X6324Y16884D1*
+X6300Y16908D1*
+X6228Y16932D1*
+X6013D1*
+Y16430D1*
+X6181Y16693D2*
+X6348Y16430D1*
+X6503Y16836D2*
+X6551Y16860D1*
+X6623Y16931D1*
+Y16430D1*
+X5906Y12318D2*
+X6121D1*
+X6193Y12342D1*
+X6217Y12366D1*
+X6241Y12413D1*
+Y12461D1*
+X6217Y12509D1*
+X6193Y12533D1*
+X6121Y12557D1*
+X5906D1*
+Y12055D1*
+X6073Y12318D2*
+X6241Y12055D1*
+X6419Y12437D2*
+Y12461D1*
+X6443Y12509D1*
+X6467Y12533D1*
+X6515Y12556D1*
+X6611D1*
+X6658Y12533D1*
+X6682Y12509D1*
+X6706Y12461D1*
+Y12413D1*
+X6682Y12365D1*
+X6634Y12294D1*
+X6395Y12055D1*
+X6730D1*
+X27906Y11694D2*
+X28121D1*
+X28192Y11718D1*
+X28217Y11742D1*
+X28240Y11789D1*
+Y11837D1*
+X28217Y11885D1*
+X28192Y11909D1*
+X28121Y11933D1*
+X27906D1*
+Y11431D1*
+X28073Y11694D2*
+X28240Y11431D1*
+X28443Y11932D2*
+X28705D1*
+X28562Y11741D1*
+X28634D1*
+X28682Y11717D1*
+X28705Y11694D1*
+X28730Y11622D1*
+Y11574D1*
+X28705Y11502D1*
+X28658Y11454D1*
+X28586Y11431D1*
+X28514D1*
+X28443Y11454D1*
+X28419Y11479D1*
+X28395Y11526D1*
+X24155Y15254D2*
+Y14895D1*
+X24179Y14823D1*
+X24227Y14776D1*
+X24299Y14751D1*
+X24346D1*
+X24418Y14776D1*
+X24466Y14823D1*
+X24490Y14895D1*
+Y15254D1*
+X24644Y15158D2*
+X24692Y15182D1*
+X24764Y15253D1*
+Y14751D1*
+X24104Y18384D2*
+X24295Y18144D1*
+Y17881D1*
+X24486Y18384D2*
+X24295Y18144D1*
+X24641Y18288D2*
+X24689Y18312D1*
+X24760Y18383D1*
+Y17881D1*
+X31280Y11202D2*
+D70*
+X31452D1*
+X31510Y11221D1*
+X31529Y11240D1*
+X31548Y11278D1*
+Y11317D1*
+X31529Y11355D1*
+X31510Y11374D1*
+X31452Y11393D1*
+X31280D1*
+Y10991D1*
+X31414Y11202D2*
+X31548Y10991D1*
+X31939Y11336D2*
+X31901Y11374D1*
+X31844Y11393D1*
+X31767D1*
+X31710Y11374D1*
+X31672Y11336D1*
+Y11298D1*
+X31691Y11259D1*
+X31710Y11240D1*
+X31748Y11221D1*
+X31863Y11183D1*
+X31901Y11164D1*
+X31920Y11144D1*
+X31939Y11106D1*
+Y11049D1*
+X31901Y11011D1*
+X31844Y10991D1*
+X31767D1*
+X31710Y11011D1*
+X31672Y11049D1*
+X32197Y11393D2*
+Y10991D1*
+X32063Y11393D2*
+X32331D1*
+X8551Y14393D2*
+D71*
+X8509Y14479D1*
+X8422Y14565D1*
+X8337Y14608D1*
+X8164D1*
+X8078Y14565D1*
+X7992Y14479D1*
+X7949Y14393D1*
+X7906Y14264D1*
+Y14048D1*
+X7949Y13919D1*
+X7992Y13833D1*
+X8078Y13747D1*
+X8164Y13704D1*
+X8337D1*
+X8422Y13747D1*
+X8509Y13833D1*
+X8551Y13919D1*
+X8829Y14608D2*
+Y13704D1*
+X9346D1*
+X9624Y14608D2*
+Y13962D1*
+X9666Y13833D1*
+X9753Y13747D1*
+X9882Y13704D1*
+X9968D1*
+X10097Y13747D1*
+X10184Y13833D1*
+X10226Y13962D1*
+Y14608D1*
+X11107Y14479D2*
+X11022Y14565D1*
+X10892Y14608D1*
+X10720D1*
+X10591Y14565D1*
+X10504Y14479D1*
+Y14393D1*
+X10548Y14306D1*
+X10591Y14264D1*
+X10676Y14221D1*
+X10935Y14134D1*
+X11022Y14092D1*
+X11064Y14048D1*
+X11107Y13962D1*
+Y13833D1*
+X11022Y13747D1*
+X10892Y13704D1*
+X10720D1*
+X10591Y13747D1*
+X10504Y13833D1*
+X11687Y14608D2*
+Y13704D1*
+X11385Y14608D2*
+X11988D1*
+X12825D2*
+X12266D1*
+Y13704D1*
+X12825D1*
+X12266Y14177D2*
+X12610D1*
+X13103D2*
+X13490D1*
+X13619Y14221D1*
+X13663Y14264D1*
+X13706Y14349D1*
+Y14436D1*
+X13663Y14521D1*
+X13619Y14565D1*
+X13490Y14608D1*
+X13103D1*
+Y13704D1*
+X13404Y14177D2*
+X13706Y13704D1*
+X13984Y14177D2*
+X14371D1*
+X14500Y14221D1*
+X14544Y14264D1*
+X14587Y14349D1*
+Y14436D1*
+X14544Y14521D1*
+X14500Y14565D1*
+X14371Y14608D1*
+X13984D1*
+Y13704D1*
+X14285Y14177D2*
+X14587Y13704D1*
+X14864Y14177D2*
+X15251D1*
+X15381Y14221D1*
+X15425Y14264D1*
+X15467Y14349D1*
+Y14436D1*
+X15425Y14521D1*
+X15381Y14565D1*
+X15251Y14608D1*
+X14864D1*
+Y13704D1*
+X15166Y14177D2*
+X15467Y13704D1*
+X15788Y13790D2*
+X15745Y13746D1*
+X15788Y13704D1*
+X15832Y13746D1*
+X15788Y13790D1*
+X16755Y14393D2*
+X16713Y14479D1*
+X16626Y14565D1*
+X16540Y14608D1*
+X16368D1*
+X16282Y14565D1*
+X16196Y14479D1*
+X16153Y14393D1*
+X16110Y14264D1*
+Y14048D1*
+X16153Y13919D1*
+X16196Y13833D1*
+X16282Y13747D1*
+X16368Y13704D1*
+X16540D1*
+X16626Y13747D1*
+X16713Y13833D1*
+X16755Y13919D1*
+X17292Y14608D2*
+X17205Y14565D1*
+X17120Y14479D1*
+X17076Y14393D1*
+X17033Y14264D1*
+Y14048D1*
+X17076Y13919D1*
+X17120Y13833D1*
+X17205Y13747D1*
+X17292Y13704D1*
+X17464D1*
+X17550Y13747D1*
+X17636Y13833D1*
+X17679Y13919D1*
+X17722Y14048D1*
+Y14264D1*
+X17679Y14393D1*
+X17636Y14479D1*
+X17550Y14565D1*
+X17464Y14608D1*
+X17292D1*
+X18688Y13704D2*
+Y14608D1*
+X18344Y13704D1*
+X18000Y14608D1*
+Y13704D1*
+X7092Y18915D2*
+D69*
+X7044Y18963D1*
+X6973Y18987D1*
+X6877D1*
+X6805Y18963D1*
+X6757Y18915D1*
+Y18867D1*
+X6781Y18819D1*
+X6805Y18795D1*
+X6853Y18772D1*
+X6996Y18724D1*
+X7044Y18700D1*
+X7068Y18676D1*
+X7092Y18628D1*
+Y18556D1*
+X7044Y18509D1*
+X6973Y18484D1*
+X6877D1*
+X6805Y18509D1*
+X6757Y18556D1*
+X7557Y18987D2*
+X7246D1*
+Y18484D1*
+X7557D1*
+X7246Y18747D2*
+X7438D1*
+X8070Y18867D2*
+X8046Y18915D1*
+X7998Y18963D1*
+X7951Y18987D1*
+X7855D1*
+X7807Y18963D1*
+X7759Y18915D1*
+X7735Y18867D1*
+X7711Y18795D1*
+Y18676D1*
+X7735Y18604D1*
+X7759Y18556D1*
+X7807Y18509D1*
+X7855Y18484D1*
+X7951D1*
+X7998Y18509D1*
+X8046Y18556D1*
+X8070Y18604D1*
+Y18676D1*
+X7951D1*
+X8607Y18484D2*
+X8416Y18987D1*
+X8224Y18484D1*
+X8296Y18652D2*
+X8536D1*
+X9630Y18484D2*
+Y18987D1*
+X9439Y18484D1*
+X9248Y18987D1*
+Y18484D1*
+X9785Y18987D2*
+Y18484D1*
+X9952D1*
+X10024Y18509D1*
+X10072Y18556D1*
+X10096Y18604D1*
+X10120Y18676D1*
+Y18795D1*
+X10096Y18867D1*
+X10072Y18915D1*
+X10024Y18963D1*
+X9952Y18987D1*
+X9785D1*
+X10760Y18724D2*
+X10976D1*
+X11047Y18747D1*
+X11071Y18772D1*
+X11095Y18819D1*
+Y18891D1*
+X11071Y18939D1*
+X11047Y18963D1*
+X10976Y18987D1*
+X10760D1*
+Y18484D1*
+X11393Y18987D2*
+X11345Y18963D1*
+X11297Y18915D1*
+X11273Y18867D1*
+X11249Y18795D1*
+Y18676D1*
+X11273Y18604D1*
+X11297Y18556D1*
+X11345Y18509D1*
+X11393Y18484D1*
+X11489D1*
+X11536Y18509D1*
+X11584Y18556D1*
+X11608Y18604D1*
+X11632Y18676D1*
+Y18795D1*
+X11608Y18867D1*
+X11584Y18915D1*
+X11536Y18963D1*
+X11489Y18987D1*
+X11393D1*
+X11786Y18747D2*
+X12001D1*
+X12073Y18772D1*
+X12097Y18795D1*
+X12121Y18843D1*
+Y18891D1*
+X12097Y18939D1*
+X12073Y18963D1*
+X12001Y18987D1*
+X11786D1*
+Y18484D1*
+X11954Y18747D2*
+X12121Y18484D1*
+X12443Y18987D2*
+Y18484D1*
+X12276Y18987D2*
+X12610D1*
+X13442Y19082D2*
+X13275Y18388D1*
+X13586Y19082D2*
+X13418Y18388D1*
+X13275Y18807D2*
+X13610D1*
+X13251Y18663D2*
+X13586D1*
+X13764Y18891D2*
+X13812Y18915D1*
+X13884Y18986D1*
+Y18484D1*
+X13688Y9495D2*
+X13736Y9447D1*
+X13808Y9423D1*
+X13903D1*
+X13975Y9447D1*
+X14023Y9495D1*
+Y9543D1*
+X13999Y9591D1*
+X13975Y9614D1*
+X13928Y9638D1*
+X13784Y9686D1*
+X13736Y9710D1*
+X13712Y9734D1*
+X13688Y9782D1*
+Y9854D1*
+X13736Y9901D1*
+X13808Y9926D1*
+X13903D1*
+X13975Y9901D1*
+X14023Y9854D1*
+X13223Y9423D2*
+X13534D1*
+Y9926D1*
+X13223D1*
+X13534Y9662D2*
+X13343D1*
+X12710Y9543D2*
+X12734Y9495D1*
+X12782Y9447D1*
+X12830Y9423D1*
+X12925D1*
+X12973Y9447D1*
+X13021Y9495D1*
+X13045Y9543D1*
+X13069Y9614D1*
+Y9734D1*
+X13045Y9806D1*
+X13021Y9854D1*
+X12973Y9901D1*
+X12925Y9926D1*
+X12830D1*
+X12782Y9901D1*
+X12734Y9854D1*
+X12710Y9806D1*
+Y9734D1*
+X12830D1*
+X12173Y9926D2*
+X12365Y9423D1*
+X12556Y9926D1*
+X12484Y9758D2*
+X12245D1*
+X11150Y9926D2*
+Y9423D1*
+X11341Y9926D1*
+X11533Y9423D1*
+Y9926D1*
+X10996Y9423D2*
+Y9926D1*
+X10828D1*
+X10756Y9901D1*
+X10708Y9854D1*
+X10685Y9806D1*
+X10661Y9734D1*
+Y9614D1*
+X10685Y9543D1*
+X10708Y9495D1*
+X10756Y9447D1*
+X10828Y9423D1*
+X10996D1*
+X10020Y9686D2*
+X9805D1*
+X9733Y9662D1*
+X9709Y9638D1*
+X9685Y9591D1*
+Y9519D1*
+X9709Y9471D1*
+X9733Y9447D1*
+X9805Y9423D1*
+X10020D1*
+Y9926D1*
+X9387Y9423D2*
+X9435Y9447D1*
+X9483Y9495D1*
+X9507Y9543D1*
+X9531Y9614D1*
+Y9734D1*
+X9507Y9806D1*
+X9483Y9854D1*
+X9435Y9901D1*
+X9387Y9926D1*
+X9292D1*
+X9244Y9901D1*
+X9196Y9854D1*
+X9172Y9806D1*
+X9149Y9734D1*
+Y9614D1*
+X9172Y9543D1*
+X9196Y9495D1*
+X9244Y9447D1*
+X9292Y9423D1*
+X9387D1*
+X8994Y9662D2*
+X8779D1*
+X8707Y9638D1*
+X8683Y9614D1*
+X8659Y9567D1*
+Y9519D1*
+X8683Y9471D1*
+X8707Y9447D1*
+X8779Y9423D1*
+X8994D1*
+Y9926D1*
+X8827Y9662D2*
+X8659Y9926D1*
+X8337Y9423D2*
+Y9926D1*
+X8505Y9423D2*
+X8170D1*
+X7338Y9328D2*
+X7505Y10021D1*
+X7195Y9328D2*
+X7362Y10021D1*
+X7505Y9603D2*
+X7171D1*
+X7529Y9746D2*
+X7195D1*
+X6992Y9543D2*
+Y9519D1*
+X6968Y9471D1*
+X6945Y9447D1*
+X6896Y9424D1*
+X6801D1*
+X6753Y9447D1*
+X6730Y9471D1*
+X6705Y9519D1*
+Y9567D1*
+X6730Y9615D1*
+X6777Y9686D1*
+X7016Y9926D1*
+X6681D1*
+X22384Y18987D2*
+Y18484D1*
+X22551D1*
+X22623Y18509D1*
+X22671Y18556D1*
+X22695Y18604D1*
+X22719Y18676D1*
+Y18795D1*
+X22695Y18867D1*
+X22671Y18915D1*
+X22623Y18963D1*
+X22551Y18987D1*
+X22384D1*
+X23184D2*
+X22873D1*
+Y18484D1*
+X23184D1*
+X22873Y18747D2*
+X23064D1*
+X23673Y18987D2*
+Y18484D1*
+X23338Y18987D1*
+Y18484D1*
+X23827Y18987D2*
+Y18484D1*
+X23995D1*
+X24067Y18509D1*
+X24115Y18556D1*
+X24138Y18604D1*
+X24162Y18676D1*
+Y18795D1*
+X24138Y18867D1*
+X24115Y18915D1*
+X24067Y18963D1*
+X23995Y18987D1*
+X23827D1*
+X24317D2*
+X24508Y18747D1*
+Y18484D1*
+X24699Y18987D2*
+X24508Y18747D1*
+X25340Y18724D2*
+X25555D1*
+X25626Y18747D1*
+X25651Y18772D1*
+X25674Y18819D1*
+Y18891D1*
+X25651Y18939D1*
+X25626Y18963D1*
+X25555Y18987D1*
+X25340D1*
+Y18484D1*
+X25973Y18987D2*
+X25924Y18963D1*
+X25877Y18915D1*
+X25853Y18867D1*
+X25829Y18795D1*
+Y18676D1*
+X25853Y18604D1*
+X25877Y18556D1*
+X25924Y18509D1*
+X25973Y18484D1*
+X26068D1*
+X26116Y18509D1*
+X26164Y18556D1*
+X26188Y18604D1*
+X26211Y18676D1*
+Y18795D1*
+X26188Y18867D1*
+X26164Y18915D1*
+X26116Y18963D1*
+X26068Y18987D1*
+X25973D1*
+X26366Y18747D2*
+X26581D1*
+X26653Y18772D1*
+X26677Y18795D1*
+X26701Y18843D1*
+Y18891D1*
+X26677Y18939D1*
+X26653Y18963D1*
+X26581Y18987D1*
+X26366D1*
+Y18484D1*
+X26533Y18747D2*
+X26701Y18484D1*
+X27022Y18987D2*
+Y18484D1*
+X26855Y18987D2*
+X27190D1*
+X28022Y19082D2*
+X27855Y18388D1*
+X28165Y19082D2*
+X27998Y18388D1*
+X27855Y18807D2*
+X28189D1*
+X27830Y18663D2*
+X28165D1*
+X28343Y18891D2*
+X28392Y18915D1*
+X28463Y18986D1*
+Y18484D1*
+X28303Y9361D2*
+Y9863D1*
+X28136D1*
+X28064Y9839D1*
+X28016Y9791D1*
+X27992Y9743D1*
+X27968Y9672D1*
+Y9552D1*
+X27992Y9480D1*
+X28016Y9432D1*
+X28064Y9384D1*
+X28136Y9361D1*
+X28303D1*
+X27503D2*
+X27814D1*
+Y9863D1*
+X27503D1*
+X27814Y9600D2*
+X27623D1*
+X27014Y9361D2*
+Y9863D1*
+X27349Y9361D1*
+Y9863D1*
+X26860Y9361D2*
+Y9863D1*
+X26692D1*
+X26620Y9839D1*
+X26572Y9791D1*
+X26549Y9743D1*
+X26525Y9672D1*
+Y9552D1*
+X26549Y9480D1*
+X26572Y9432D1*
+X26620Y9384D1*
+X26692Y9361D1*
+X26860D1*
+X26370D2*
+X26179Y9600D1*
+Y9863D1*
+X25988Y9361D2*
+X26179Y9600D1*
+X25347Y9624D2*
+X25132D1*
+X25061Y9600D1*
+X25036Y9576D1*
+X25013Y9528D1*
+Y9456D1*
+X25036Y9409D1*
+X25061Y9384D1*
+X25132Y9361D1*
+X25347D1*
+Y9863D1*
+X24714Y9361D2*
+X24763Y9384D1*
+X24810Y9432D1*
+X24834Y9480D1*
+X24858Y9552D1*
+Y9672D1*
+X24834Y9743D1*
+X24810Y9791D1*
+X24763Y9839D1*
+X24714Y9863D1*
+X24619D1*
+X24571Y9839D1*
+X24523Y9791D1*
+X24499Y9743D1*
+X24476Y9672D1*
+Y9552D1*
+X24499Y9480D1*
+X24523Y9432D1*
+X24571Y9384D1*
+X24619Y9361D1*
+X24714D1*
+X24321Y9600D2*
+X24106D1*
+X24034Y9576D1*
+X24010Y9552D1*
+X23986Y9504D1*
+Y9456D1*
+X24010Y9409D1*
+X24034Y9384D1*
+X24106Y9361D1*
+X24321D1*
+Y9863D1*
+X24154Y9600D2*
+X23986Y9863D1*
+X23665Y9361D2*
+Y9863D1*
+X23832Y9361D2*
+X23497D1*
+X22665Y9265D2*
+X22832Y9959D1*
+X22522Y9265D2*
+X22689Y9959D1*
+X22832Y9540D2*
+X22498D1*
+X22857Y9684D2*
+X22522D1*
+X22319Y9481D2*
+Y9457D1*
+X22295Y9409D1*
+X22272Y9385D1*
+X22224Y9361D1*
+X22128D1*
+X22080Y9385D1*
+X22057Y9409D1*
+X22032Y9457D1*
+Y9504D1*
+X22057Y9552D1*
+X22104Y9624D1*
+X22344Y9863D1*
+X22009D1*
+M02*
diff --git a/board/nessmd2usb.dip b/board/nessmd2usb.dip
new file mode 100644
index 0000000..da85a14
--- /dev/null
+++ b/board/nessmd2usb.dip
Binary files differ
diff --git a/board/~nessmd2usb.dip~ b/board/~nessmd2usb.dip~
new file mode 100644
index 0000000..d847d8a
--- /dev/null
+++ b/board/~nessmd2usb.dip~
@@ -0,0 +1,3 @@
+CLUSTER-MAIN
+Cluster
+23.04.2016 21:29:56
diff --git a/defines.h b/defines.h
new file mode 100644
index 0000000..2ebf2a2
--- /dev/null
+++ b/defines.h
@@ -0,0 +1,30 @@
+#define SMD_ENABLED
+#define SMD_SECOND_ENABLED
+#define SMD_SELECT_PORT D
+#define SMD_SELECT_PIN 6
+#define SMD_DATA_PORT D
+#define SMD_DATA0_PIN 0
+#define SMD_DATA1_PIN 1
+#define SMD_DATA2_PIN 2
+#define SMD_DATA3_PIN 3
+#define SMD_DATA4_PIN 4
+#define SMD_DATA5_PIN 5
+#define SMD_DATA_PORT2 B
+#define SMD_DATA0_PIN2 0
+#define SMD_DATA1_PIN2 1
+#define SMD_DATA2_PIN2 2
+#define SMD_DATA3_PIN2 3
+#define SMD_DATA4_PIN2 4
+#define SMD_DATA5_PIN2 5
+
+#define NES_ENABLED
+#define NES_SECOND_ENABLED
+#define NES_PORT C
+#define NES_LATCH_PIN 4
+#define NES_CLOCK_PIN 5
+#define NES_DATA_PIN 6
+#define NES_DATA_PIN2 7
+
+#define LED_PORT B
+#define LED_RED_PIN 6
+#define LED_GREEN_PIN 7
diff --git a/doxyfile b/doxyfile
new file mode 100644
index 0000000..a48265c
--- /dev/null
+++ b/doxyfile
@@ -0,0 +1,2364 @@
+# Doxyfile 1.8.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "LUFA Library - Joystick Device Demo"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = ./Documentation/
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = YES
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = NO
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = NO
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = NO
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = NO
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = ./
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS = *.h \
+ *.c \
+ *.txt
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE = Documentation/
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS = __* \
+ INCLUDE_FROM_*
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = NO
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = NO
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# compiled with the --with-libclang option.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = YES
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = YES
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = YES
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 1
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is refered to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = __DOXYGEN__ \
+ PROGMEM
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME =
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = NO
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = NO
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = NO
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = NO
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = NO
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = NO
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 15
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 2
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = YES
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/gamepad.c b/gamepad.c
new file mode 100644
index 0000000..98253a5
--- /dev/null
+++ b/gamepad.c
@@ -0,0 +1,347 @@
+#include "defines.h"
+#include <avr/io.h>
+#include <util/delay.h>
+#include "gamepad.h"
+#include "bits.h"
+
+#ifdef NES_ENABLED
+
+void init_nes_gamepad()
+{
+ NES_PORT_DDR |= 1<<NES_LATCH_PIN; // Latch, output
+ NES_PORT_DDR |= 1<<NES_CLOCK_PIN; // Clock, output
+ NES_PORT_DDR &= ~(1<<NES_DATA_PIN); // Data, input
+#ifdef NES_SECOND_ENABLED
+ NES_PORT_PORT |= 1<<NES_DATA_PIN; // Data, pull-up
+ NES_PORT_DDR &= ~(1<<NES_DATA_PIN2); // Data, input
+ NES_PORT_PORT |= 1<<NES_DATA_PIN2; // Data, pull-up
+#endif
+}
+
+uint16_t get_nes_gamepad()
+{
+ uint16_t gamepad_data = 0;
+ NES_PORT_PORT &= ~(1<<NES_LATCH_PIN); // Latch
+ int b;
+ for (b = 0; b < 8; b++)
+ {
+ NES_PORT_PORT &= ~(1<<NES_CLOCK_PIN); // Clock
+ _delay_us(10);
+ gamepad_data |= (((NES_PORT_PIN>>NES_DATA_PIN)&1)<<b);
+#ifdef NES_SECOND_ENABLED
+ gamepad_data |= (((NES_PORT_PIN>>NES_DATA_PIN2)&1)<<b) * 0x100;
+#endif
+ NES_PORT_PORT |= 1<<NES_CLOCK_PIN; // Clock
+ _delay_us(10);
+ }
+ NES_PORT_PORT |= 1<<NES_LATCH_PIN; // Latch
+ return gamepad_data;
+}
+#endif
+
+uint16_t get_nes_gamepad_decoded(void)
+{
+ return get_nes_gamepad() ^ 0xFFFF;
+}
+
+#ifdef SNES_ENABLED
+void init_snes_gamepad()
+{
+ SNES_PORT_DDR |= 1<<SNES_LATCH_PIN; // Latch, output
+ SNES_PORT_DDR |= 1<<SNES_CLOCK_PIN; // Clock, output
+ SNES_PORT_DDR &= ~(1<<SNES_DATA_PIN); // Data, input
+ SNES_PORT_PORT |= 1<<SNES_DATA_PIN; // Data, pull-up
+}
+
+uint16_t get_snes_gamepad()
+{
+ uint16_t gamepad_data = 0;
+ SNES_PORT_PORT &= ~(1<<SNES_LATCH_PIN); // Latch
+ int b;
+ for (b = 0; b < 16; b++)
+ {
+ SNES_PORT_PORT &= ~(1<<SNES_CLOCK_PIN); // Clock
+ _delay_us(10);
+ gamepad_data |= ((uint16_t)((SNES_PORT_PIN>>SNES_DATA_PIN)&1)<<b);
+ SNES_PORT_PORT |= 1<<SNES_CLOCK_PIN; // Clock
+ _delay_us(10);
+ }
+ SNES_PORT_PORT |= 1<<SNES_LATCH_PIN; // Latch
+ return gamepad_data;
+}
+#endif
+
+#ifdef N64_ENABLED
+void init_n64_gamepad()
+{
+ TCCR0 |= _BV(CS00); // Timer
+ N64_PORT_DDR &= ~(1<<N64_DATA_PIN); // Input
+ N64_PORT_PORT &= ~(1<<N64_DATA_PIN); // No pull-up (using external resistor)
+}
+
+int get_n64_gamepad(uint8_t* data)
+{
+ int b, bit;
+ N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_0; N64SEND_1; N64SEND_STOP;
+ for (b = 0; b < 4; b++)
+ {
+ data[b] = 0;
+ for (bit = 0; bit < 8; bit++)
+ {
+ TCNT0 = 0;
+ while (!N64SIGNAL) if (TCNT0 >= 0xF0) return 0;
+ TCNT0 = 0;
+ while(N64SIGNAL) if (TCNT0 >= 0xF0) return 0;
+ data[b] = data[b]<<1;
+ if (TCNT0 < 0x24 * F_CPU / 20000000UL) data[b] |= 1;
+ }
+ }
+ return 1;
+}
+#endif
+
+#ifdef SMD_ENABLED
+void init_smd_gamepad()
+{
+ SMD_SELECT_PORT_DDR |= 1<<SMD_SELECT_PIN; // Select, output
+ SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA0_PIN); // Data 0, input
+ SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA1_PIN); // Data 1, input
+ SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA2_PIN); // Data 2, input
+ SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA3_PIN); // Data 3, input
+ SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA4_PIN); // Data 4, input
+ SMD_DATA_PORT_DDR &= ~(1<<SMD_DATA5_PIN); // Data 5, input
+ SMD_DATA_PORT_PORT |= 1<<SMD_DATA0_PIN; // Data 0, pull-up
+ SMD_DATA_PORT_PORT |= 1<<SMD_DATA1_PIN; // Data 1, pull-up
+ SMD_DATA_PORT_PORT |= 1<<SMD_DATA2_PIN; // Data 2, pull-up
+ SMD_DATA_PORT_PORT |= 1<<SMD_DATA3_PIN; // Data 3, pull-up
+ SMD_DATA_PORT_PORT |= 1<<SMD_DATA4_PIN; // Data 4, pull-up
+ SMD_DATA_PORT_PORT |= 1<<SMD_DATA5_PIN; // Data 5, pull-up
+#ifdef SMD_SECOND_ENABLED
+ SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA0_PIN2); // Data 0, input
+ SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA1_PIN2); // Data 1, input
+ SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA2_PIN2); // Data 2, input
+ SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA3_PIN2); // Data 3, input
+ SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA4_PIN2); // Data 4, input
+ SMD_DATA_PORT_DDR2 &= ~(1<<SMD_DATA5_PIN2); // Data 5, input
+ SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA0_PIN2; // Data 0, pull-up
+ SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA1_PIN2; // Data 1, pull-up
+ SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA2_PIN2; // Data 2, pull-up
+ SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA3_PIN2; // Data 3, pull-up
+ SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA4_PIN2; // Data 4, pull-up
+ SMD_DATA_PORT_PORT2 |= 1<<SMD_DATA5_PIN2; // Data 5, pull-up
+#endif
+}
+
+uint32_t get_smd_gamepad()
+{
+ uint8_t gamepad_data_low = 0xFF;
+ uint8_t gamepad_data_high = 0xFF;
+ uint8_t gamepad_data_low2 = 0xFF;
+ uint8_t gamepad_data_high2 = 0xFF;
+ SMD_SELECT_PORT_PORT &= ~(1<<SMD_SELECT_PIN); // Select - low
+ _delay_us(50);
+ gamepad_data_low = ((SMD_DATA_PORT_PIN>>SMD_DATA0_PIN)&1)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA1_PIN)&1)<<1)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA2_PIN)&1)<<2)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA3_PIN)&1)<<3)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA4_PIN)&1)<<4)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA5_PIN)&1)<<5);
+#ifdef SMD_SECOND_ENABLED
+ gamepad_data_low2 = ((SMD_DATA_PORT_PIN2>>SMD_DATA0_PIN2)&1)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA1_PIN2)&1)<<1)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA2_PIN2)&1)<<2)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA3_PIN2)&1)<<3)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA4_PIN2)&1)<<4)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA5_PIN2)&1)<<5);
+#endif
+ SMD_SELECT_PORT_PORT |= 1<<SMD_SELECT_PIN; // Select - high
+ _delay_us(50);
+ gamepad_data_high = ((SMD_DATA_PORT_PIN>>SMD_DATA0_PIN)&1)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA1_PIN)&1)<<1)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA2_PIN)&1)<<2)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA3_PIN)&1)<<3)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA4_PIN)&1)<<4)
+ | (((SMD_DATA_PORT_PIN>>SMD_DATA5_PIN)&1)<<5);
+#ifdef SMD_SECOND_ENABLED
+ gamepad_data_high2 = ((SMD_DATA_PORT_PIN2>>SMD_DATA0_PIN2)&1)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA1_PIN2)&1)<<1)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA2_PIN2)&1)<<2)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA3_PIN2)&1)<<3)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA4_PIN2)&1)<<4)
+ | (((SMD_DATA_PORT_PIN2>>SMD_DATA5_PIN2)&1)<<5);
+#endif
+ return ((uint32_t)gamepad_data_high2<<24) | ((uint32_t)gamepad_data_low2<<16) | ((uint32_t)gamepad_data_high<<8) | gamepad_data_low;
+}
+#endif
+
+uint32_t get_smd_gamepad_decoded(void)
+{
+ uint32_t result = 0;
+ uint8_t b, c, d;
+ for (c = 0; c < 4; c++)
+ {
+ uint32_t smd_gamepad_data = get_smd_gamepad();
+ for (d = 0; d < 2; d++)
+ {
+ if ((smd_gamepad_data & 0b00001111) || (c < 2)) // 3-button mode
+ {
+ for (b = 0; b <= 13; b++)
+ {
+ if (!((smd_gamepad_data>>b)&1))
+ {
+ switch (b)
+ {
+ case 0: // Up
+ set_bit(result, 8 + d*16);
+ break;
+ case 1: // Down
+ set_bit(result, 9 + d*16);
+ break;
+ case 4: // A
+ set_bit(result, 0 + d*16);
+ break;
+ case 5: // Start
+ set_bit(result, 6 + d*16);
+ break;
+ case 10: // Left
+ set_bit(result, 10 + d*16);
+ break;
+ case 11: // Right
+ set_bit(result, 11 + d*16);
+ break;
+ case 12: // B
+ set_bit(result, 1 + d*16);
+ break;
+ case 13: // C
+ set_bit(result, 2 + d*16);
+ break;
+ }
+ }
+ }
+ } else { // 6-button mode
+ for (b = 4; b <= 11; b++)
+ {
+ if (!((smd_gamepad_data>>b)&1))
+ {
+ switch (b)
+ {
+ case 4: // A
+ set_bit(result, 0 + d*16);
+ break;
+ case 5: // Start
+ set_bit(result, 6 + d*16);
+ break;
+ case 8: // Z
+ set_bit(result, 5 + d*16);
+ break;
+ case 9: // Y
+ set_bit(result, 4 + d*16);
+ break;
+ case 10: // X
+ set_bit(result, 3 + d*16);
+ break;
+ case 11: // Mode
+ set_bit(result, 7 + d*16);
+ break;
+ }
+ }
+ }
+ }
+ smd_gamepad_data >>= 16;
+ }
+ }
+ return result;
+}
+
+#ifdef DUALSHOCK_ENABLED
+void init_dualshock_gamepad()
+{
+ DUALSHOCK_PORT_DDR |= (1<<DUALSHOCK_COMMAND_PIN); // Command pin - output
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_COMMAND_PIN); // Command pin - login high
+ DUALSHOCK_PORT_DDR &= ~(1<<DUALSHOCK_DATA_PIN); // Data pin - input
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_DATA_PIN); // Data pin - pull-up
+ DUALSHOCK_PORT_DDR |= (1<<DUALSHOCK_ATTENTION_PIN); // Attention - output
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_ATTENTION_PIN); // Attention - logic high
+ DUALSHOCK_PORT_DDR |= (1<<DUALSHOCK_CLOCK_PIN); // Clock - output
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_CLOCK_PIN); // Clock - logic high
+ /*
+ DUALSHOCK_PORT_DDR &= ~(1<<DUALSHOCK_ACK_PIN); // Ack pin - input
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_ACK_PIN); // Ack pin - pull-up
+ */
+}
+
+int dualshock_command(uint8_t* command, uint8_t* data, int length)
+{
+ DUALSHOCK_PORT_PORT &= ~(1<<DUALSHOCK_ATTENTION_PIN); // Attention!
+ _delay_us(20);
+ int b, bit;
+ for (b = 0; b < length; b++) // Each byte...
+ {
+ data[b] = 0;
+ for (bit = 0; bit < 8; bit++)
+ {
+ if ((command[b] >> bit) & 1) // 1?
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_COMMAND_PIN); // 1!
+ else DUALSHOCK_PORT_PORT &= ~(1<<DUALSHOCK_COMMAND_PIN); // 0!
+ DUALSHOCK_PORT_PORT &= ~(1<<DUALSHOCK_CLOCK_PIN); // Clock - logic low
+ _delay_us(20);
+ if ((DUALSHOCK_PORT_PIN >> DUALSHOCK_DATA_PIN) & 1) // Reading data... 1?
+ data[b] |= (1<<bit); // 1!
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_CLOCK_PIN); // Clock - logic high
+ _delay_us(20);
+ }
+ if (b == 1 && data[1] == 0xFF) // Alternative device detection
+ {
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_ATTENTION_PIN); // No attention...
+ return 0;
+ }
+ /*
+ if (b<length-1) // Waiting for ACK
+ {
+ int t;
+ for (t = 0; t < 50; t++)
+ {
+ if (!((DUALSHOCK_PORT_PIN >> DUALSHOCK_ACK_PIN)&1)) // ACK reveived
+ {
+ ok = 1;
+ break;
+ }
+ _delay_us(1);
+ }
+ if ((b < 2) && !ok) return 0; // No ACK in first two bytes? Aboooort! Saving time
+ }
+ */
+ }
+ DUALSHOCK_PORT_PORT |= (1<<DUALSHOCK_ATTENTION_PIN); // No attention...
+ _delay_us(20);
+ return 1;
+}
+
+int get_dualshock_gamepad(uint8_t* data, int size, uint8_t motor_small, uint8_t motor_large) // pointer to uint8_t[21], number of bytes to request, vibration...
+{
+ static char dualshock_configered = 0;
+
+ uint8_t command_query[21] = {0x01, 0x42, 0, motor_small, motor_large, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ if (!dualshock_command(command_query, data, size))
+ {
+ dualshock_configered = 0;
+ return 0;
+ }
+ if (!dualshock_configered) // Need to reconfigure dualshock
+ {
+ uint8_t command_config_mode[5] = {0x01, 0x43, 0x00, 0x01, 0x00};
+ if (!dualshock_command(command_config_mode, data, sizeof(command_config_mode))) return 0;
+ uint8_t command_analog_mode[9] = {0x01, 0x44, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00};
+ if (!dualshock_command(command_analog_mode, data, sizeof(command_analog_mode))) return 0;
+ uint8_t command_config_motors[9] = {0x01, 0x4D, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF};
+ if (!dualshock_command(command_config_motors, data, sizeof(command_config_motors))) return 0;
+ uint8_t command_config_pressure[9] = {0x01, 0x4F, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00};
+ if (!dualshock_command(command_config_pressure, data, sizeof(command_config_pressure))) return 0;
+ uint8_t command_config_mode_exit[8] = {0x01, 0x43, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF};
+ if (!dualshock_command(command_config_mode_exit, data, sizeof(command_config_mode_exit))) return 0;
+ dualshock_configered = 1;
+ if (!dualshock_command(command_query, data, size)) return 0;
+ }
+ return 1;
+}
+#endif
diff --git a/gamepad.h b/gamepad.h
new file mode 100644
index 0000000..2758db3
--- /dev/null
+++ b/gamepad.h
@@ -0,0 +1,59 @@
+#ifndef _GAMEPAD_H_
+#define _GAMEPAD_H_
+
+#include <inttypes.h>
+#include "defines.h"
+
+#define GLUE(a,b) a##b
+#define DDR(p) GLUE(DDR,p)
+#define PORT(p) GLUE(PORT,p)
+#define PIN(p) GLUE(PIN,p)
+
+#define N64_PORT_PORT PORT(N64_PORT)
+#define N64_PORT_DDR DDR(N64_PORT)
+#define N64_PORT_PIN PIN(N64_PORT)
+
+#define NES_PORT_PORT PORT(NES_PORT)
+#define NES_PORT_DDR DDR(NES_PORT)
+#define NES_PORT_PIN PIN(NES_PORT)
+
+#define SNES_PORT_PORT PORT(NES_PORT)
+#define SNES_PORT_DDR DDR(NES_PORT)
+#define SNES_PORT_PIN PIN(NES_PORT)
+
+#define SMD_SELECT_PORT_PORT PORT(SMD_SELECT_PORT)
+#define SMD_SELECT_PORT_DDR DDR(SMD_SELECT_PORT)
+#define SMD_DATA_PORT_PORT PORT(SMD_DATA_PORT)
+#define SMD_DATA_PORT_DDR DDR(SMD_DATA_PORT)
+#define SMD_DATA_PORT_PIN PIN(SMD_DATA_PORT)
+#define SMD_DATA_PORT_PORT2 PORT(SMD_DATA_PORT2)
+#define SMD_DATA_PORT_DDR2 DDR(SMD_DATA_PORT2)
+#define SMD_DATA_PORT_PIN2 PIN(SMD_DATA_PORT2)
+
+#define DUALSHOCK_PORT_PORT PORT(DUALSHOCK_PORT)
+#define DUALSHOCK_PORT_DDR DDR(DUALSHOCK_PORT)
+#define DUALSHOCK_PORT_PIN PIN(DUALSHOCK_PORT)
+
+#define WAIT(t) {TCNT0=0; while(TCNT0 < (F_CPU / 1000000UL) * t);}
+
+#define N64SEND(t) {N64_PORT_DDR |= (1<<N64_DATA_PIN); WAIT(t); N64_PORT_DDR &= ~(1<<N64_DATA_PIN);}
+#define N64SEND_1 {N64SEND(1); WAIT(3);}
+#define N64SEND_0 {N64SEND(3); WAIT(1);}
+#define N64SEND_STOP {N64SEND(1); WAIT(2);}
+#define N64SIGNAL (!((N64_PORT_PIN>>N64_DATA_PIN)&1))
+
+void init_nes_gamepad(void);
+uint16_t get_nes_gamepad(void);
+uint16_t get_nes_gamepad_decoded(void);
+void init_snes_gamepad(void);
+uint16_t get_snes_gamepad(void);
+void init_n64_gamepad(void);
+int get_n64_gamepad(uint8_t* data);
+void init_smd_gamepad(void);
+uint32_t get_smd_gamepad(void);
+uint32_t get_smd_gamepad_decoded(void);
+void init_dualshock_gamepad(void);
+int dualshock_command(uint8_t* command, uint8_t* data, int length);
+int get_dualshock_gamepad(uint8_t* data, int size, uint8_t motor_small, uint8_t motor_large);
+
+#endif
diff --git a/images/board_3d.png b/images/board_3d.png
new file mode 100644
index 0000000..3044f1f
--- /dev/null
+++ b/images/board_3d.png
Binary files differ
diff --git a/images/photo.jpg b/images/photo.jpg
new file mode 100644
index 0000000..8fc5447
--- /dev/null
+++ b/images/photo.jpg
Binary files differ
diff --git a/makefile b/makefile
new file mode 100644
index 0000000..1fae595
--- /dev/null
+++ b/makefile
@@ -0,0 +1,30 @@
+MCU = at90usb162
+ARCH = AVR8
+BOARD = NONE
+F_CPU = 16000000
+F_USB = $(F_CPU)
+OPTIMIZATION = s
+TARGET = nessmd2usb
+SRC = $(TARGET).c Descriptors.c gamepad.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
+LUFA_PATH = ../LUFA/LUFA
+CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/
+LD_FLAGS =
+
+# Default target
+all:
+
+build: $(TARGET).hex
+
+program: $(TARGET).hex
+ ./teensy_loader_cli.exe -mmcu=atmega32u4 -w -v $(TARGET).hex
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_sources.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_dfu.mk
+include $(LUFA_PATH)/Build/lufa_hid.mk
+include $(LUFA_PATH)/Build/lufa_avrdude.mk
+include $(LUFA_PATH)/Build/lufa_atprogram.mk
diff --git a/nessmd2usb.c b/nessmd2usb.c
new file mode 100644
index 0000000..f70c790
--- /dev/null
+++ b/nessmd2usb.c
@@ -0,0 +1,212 @@
+#include <avr/eeprom.h>
+#include "nessmd2usb.h"
+#include "defines.h"
+#include "bits.h"
+#include "gamepad.h"
+
+/** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */
+static uint8_t PrevJoystickHIDReportBuffer[sizeof(USB_JoystickReport_Data_t)];
+
+/** LUFA HID Class driver interface configuration and state information. This structure is
+ * passed to all HID Class driver functions, so that multiple instances of the same class
+ * within a device can be differentiated from one another.
+ */
+USB_ClassInfo_HID_Device_t Joystick_HID_Interface =
+ {
+ .Config =
+ {
+ .InterfaceNumber = INTERFACE_ID_Joystick,
+ .ReportINEndpoint =
+ {
+ .Address = JOYSTICK_EPADDR,
+ .Size = JOYSTICK_EPSIZE,
+ .Banks = 1,
+ },
+ .PrevReportINBuffer = PrevJoystickHIDReportBuffer,
+ .PrevReportINBufferSize = sizeof(PrevJoystickHIDReportBuffer),
+ },
+ };
+
+
+/** Main program entry point. This routine contains the overall program flow, including initial
+ * setup of all components and the main program loop.
+ */
+
+volatile uint8_t current_report = 0;
+volatile uint8_t buttons[4];
+volatile int x[4];
+volatile int y[4];
+
+int main(void)
+{
+ LEDS_INIT;
+ RED_OFF;
+ GREEN_OFF;
+
+ SetupHardware();
+
+ GlobalInterruptEnable();
+
+ int c;
+
+ for (;;)
+ {
+ uint32_t smd_gamepad_data = get_smd_gamepad_decoded();
+ uint16_t nes_gamepad_data = get_nes_gamepad_decoded();
+
+ buttons[0] = smd_gamepad_data & 0xFF;
+ buttons[1] = (smd_gamepad_data>>16) & 0xFF;
+ buttons[2] = nes_gamepad_data&0x0F;
+ buttons[3] = (nes_gamepad_data>>8)&0x0F;
+
+ for (c = 0; c < 4; c++)
+ {
+ uint8_t dpad = 0;
+ switch (c)
+ {
+ case 0:
+ dpad = (smd_gamepad_data>>8) & 0xF;
+ break;
+ case 1:
+ dpad = (smd_gamepad_data>>24) & 0xF;
+ break;
+ case 2:
+ dpad = (nes_gamepad_data>>4) & 0xF;
+ break;
+ case 3:
+ dpad = (nes_gamepad_data>>12) & 0xF;
+ break;
+ }
+ if (dpad&1) y[c] = -100;
+ else if (dpad&2) y[c] = 100;
+ else y[c] = 0;
+ if (dpad&4) x[c] = -100;
+ else if (dpad&8) x[c] = 100;
+ else x[c] = 0;
+ }
+
+ if (smd_gamepad_data || nes_gamepad_data)
+ {
+ GREEN_ON;
+ } else {
+ GREEN_OFF;
+ }
+
+ for (c = 0; c < 1000; c++)
+ {
+ _delay_us(1);
+ HID_Device_USBTask(&Joystick_HID_Interface);
+ USB_USBTask();
+ }
+ }
+}
+
+/** Configures the board hardware and chip peripherals for the demo's functionality. */
+void SetupHardware(void)
+{
+#if (ARCH == ARCH_AVR8)
+ /* Disable watchdog if enabled by bootloader/fuses */
+ MCUSR &= ~(1 << WDRF);
+ wdt_disable();
+
+ /* Disable clock division */
+ clock_prescale_set(clock_div_1);
+#elif (ARCH == ARCH_XMEGA)
+ /* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */
+ XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU);
+ XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL);
+
+ /* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */
+ XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ);
+ XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB);
+
+ PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
+#endif
+
+ /* Hardware Initialization */
+ USB_Init();
+ init_smd_gamepad();
+ init_nes_gamepad();
+}
+
+/** Event handler for the library USB Connection event. */
+void EVENT_USB_Device_Connect(void)
+{
+}
+
+/** Event handler for the library USB Disconnection event. */
+void EVENT_USB_Device_Disconnect(void)
+{
+ RED_OFF;
+}
+
+/** Event handler for the library USB Configuration Changed event. */
+void EVENT_USB_Device_ConfigurationChanged(void)
+{
+ bool ConfigSuccess = true;
+
+ ConfigSuccess &= HID_Device_ConfigureEndpoints(&Joystick_HID_Interface);
+
+ USB_Device_EnableSOFEvents();
+
+ RED_ON;
+}
+
+/** Event handler for the library USB Control Request reception event. */
+void EVENT_USB_Device_ControlRequest(void)
+{
+ HID_Device_ProcessControlRequest(&Joystick_HID_Interface);
+}
+
+/** Event handler for the USB device Start Of Frame event. */
+void EVENT_USB_Device_StartOfFrame(void)
+{
+ HID_Device_MillisecondElapsed(&Joystick_HID_Interface);
+}
+
+/** HID class driver callback function for the creation of HID reports to the host.
+ *
+ * \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
+ * \param[in,out] ReportID Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
+ * \param[in] ReportType Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature
+ * \param[out] ReportData Pointer to a buffer where the created report should be stored
+ * \param[out] ReportSize Number of bytes written in the report (or zero if no report is to be sent)
+ *
+ * \return Boolean \c true to force the sending of the report, \c false to let the library determine if it needs to be sent
+ */
+bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
+ uint8_t* const ReportID,
+ const uint8_t ReportType,
+ void* ReportData,
+ uint16_t* const ReportSize)
+{
+ USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData;
+
+ current_report = (current_report+1) % 4;
+
+ JoystickReport->X = x[current_report];
+ JoystickReport->Y = y[current_report];
+ JoystickReport->Button |= buttons[current_report];
+
+ *ReportID = current_report+1;
+ *ReportSize = sizeof(USB_JoystickReport_Data_t);
+ return true;
+}
+
+/** HID class driver callback function for the processing of HID reports from the host.
+ *
+ * \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
+ * \param[in] ReportID Report ID of the received report from the host
+ * \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature
+ * \param[in] ReportData Pointer to a buffer where the received report has been stored
+ * \param[in] ReportSize Size in bytes of the received HID report
+ */
+void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
+ const uint8_t ReportID,
+ const uint8_t ReportType,
+ const void* ReportData,
+ const uint16_t ReportSize)
+{
+ // Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
+}
+
diff --git a/nessmd2usb.h b/nessmd2usb.h
new file mode 100644
index 0000000..4c05f95
--- /dev/null
+++ b/nessmd2usb.h
@@ -0,0 +1,113 @@
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2014.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaims all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ *
+ * Header file for Joystick.c.
+ */
+
+#ifndef _JOYSTICK_H_
+#define _JOYSTICK_H_
+
+ #define GLUE(a,b) a##b
+ #define DDR(p) GLUE(DDR,p)
+ #define PORT(p) GLUE(PORT,p)
+
+ #define LED_RED_DDR DDR(LED_PORT)
+ #define LED_RED_PORT PORT(LED_PORT)
+
+ #define LEDS_INIT LED_RED_DDR |= (1<<LED_RED_PIN)|(1<<LED_GREEN_PIN)
+ #define RED_ON LED_RED_PORT |= (1<<LED_RED_PIN)
+ #define RED_OFF LED_RED_PORT &= ~(1<<LED_RED_PIN)
+ #define GREEN_ON LED_RED_PORT |= (1<<LED_GREEN_PIN)
+ #define GREEN_OFF LED_RED_PORT &= ~(1<<LED_GREEN_PIN)
+
+ /* Includes: */
+ #include <avr/io.h>
+ #include <avr/wdt.h>
+ #include <avr/power.h>
+ #include <avr/interrupt.h>
+ #include <string.h>
+
+ #include "Descriptors.h"
+
+ #include <LUFA/Drivers/Board/Joystick.h>
+ #include <LUFA/Drivers/Board/LEDs.h>
+ #include <LUFA/Drivers/Board/Buttons.h>
+ #include <LUFA/Drivers/USB/USB.h>
+ #include <LUFA/Platform/Platform.h>
+
+ /* Type Defines: */
+ /** Type define for the joystick HID report structure, for creating and sending HID reports to the host PC.
+ * This mirrors the layout described to the host in the HID report descriptor, in Descriptors.c.
+ */
+ typedef struct
+ {
+ int8_t X; /**< Current absolute joystick X position, as a signed 8-bit integer */
+ int8_t Y; /**< Current absolute joystick Y position, as a signed 8-bit integer */
+ //int8_t Z; /**< Current absolute joystick Z position, as a signed 8-bit integer */
+ uint8_t Button; /**< Bit mask of the currently pressed joystick buttons */
+ } USB_JoystickReport_Data_t;
+
+ /* Macros: */
+ /** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
+ #define LEDMASK_USB_NOTREADY LEDS_LED1
+
+ /** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
+ #define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
+
+ /** LED mask for the library LED driver, to indicate that the USB interface is ready. */
+ #define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
+
+ /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
+ #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
+
+ /* Function Prototypes: */
+ void SetupHardware(void);
+
+ void EVENT_USB_Device_Connect(void);
+ void EVENT_USB_Device_Disconnect(void);
+ void EVENT_USB_Device_ConfigurationChanged(void);
+ void EVENT_USB_Device_ControlRequest(void);
+ void EVENT_USB_Device_StartOfFrame(void);
+
+ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
+ uint8_t* const ReportID,
+ const uint8_t ReportType,
+ void* ReportData,
+ uint16_t* const ReportSize);
+ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
+ const uint8_t ReportID,
+ const uint8_t ReportType,
+ const void* ReportData,
+ const uint16_t ReportSize);
+
+#endif
+
diff --git a/nessmd2usb.hex b/nessmd2usb.hex
new file mode 100644
index 0000000..a43d520
--- /dev/null
+++ b/nessmd2usb.hex
@@ -0,0 +1,418 @@
+:10000000EAC0000004C1000002C1000000C10000FD
+:10001000FEC00000FCC00000FAC00000F8C00000F4
+:10002000F6C00000F4C00000F2C000000C947F088D
+:10003000EEC00000ECC00000EAC00000E8C0000014
+:10004000E6C00000E4C00000E2C00000E0C0000024
+:10005000DEC00000DCC00000DAC00000D8C0000034
+:10006000D6C00000D4C00000D2C00000D0C0000044
+:10007000CEC0000005010904A1010901A10085010C
+:1000800009300931169CFF26640036FFFF46010047
+:10009000950275088102C005091901290815002576
+:1000A00001750195088102750095018101C0050166
+:1000B0000904A1010901A100850209300931169C3A
+:1000C000FF26640036FFFF46010095027508810295
+:1000D000C005091901290815002501750195088138
+:1000E00002750095018101C005010904A101090102
+:1000F000A100850309300931169CFF26640036FFF4
+:10010000FF460100950275088102C0050919012901
+:10011000041500250175019504810275049501817E
+:1001200001C005010904A1010901A10085040930EC
+:100130000931169CFF26640036FFFF460100950238
+:1001400075088102C00509190129041500250175EA
+:100150000195048102750495018101C0120110010D
+:1001600000000008EB034420010001020001090225
+:100170002200010100C03209040000010300000058
+:1001800009211101000122E800070581030800058B
+:1001900004030904100343006C007500730074002D
+:1001A0006500720000002E035300650067006100C7
+:1001B0002F00440065006E00640079002000630099
+:1001C0006F006E00740072006F006C006C006500C0
+:1001D00072007300000011241FBECFEFD2E0DEBF1B
+:1001E000CDBF11E0A0E0B1E0E8EFF9E102C0059079
+:1001F0000D92A031B107D9F711E0A0E1B1E001C043
+:100200001D92A533B107E1F776D00C94FA0CF8CE25
+:1002100008952E98089580910E0190910F010097F6
+:1002200029F0019790930F0180930E0108950F9389
+:100230001F93D9018091100190E001968370907016
+:1002400080931001E0911001F0E0EE0FFF1FEC5ED3
+:10025000FE4F808191818C93E0911001F0E0EE0FD0
+:10026000FF1FE05EFE4F8081918111968C93119764
+:1002700080911001ECE1F1E0E80FF11D9081129600
+:100280008C911297892B12968C93809110018F5F1D
+:10029000FB01808383E090E0F8019183808381E01B
+:1002A0001F910F910895089580E091E00C94930BB5
+:1002B00080E091E00E94720BE2EEF0E080818460C9
+:1002C00080832E9A089584B7877F84BF88E10FB614
+:1002D000F89480936000109260000FBE80E090E080
+:1002E00020E80FB6F89420936100809361000FBE60
+:1002F000F7D637D1F4C08F929F92AF92BF92CF9230
+:10030000DF92EF92FF920F931F93CF93DF9384B10D
+:10031000806C84B92E982F98D6DF7894B4E68B2E13
+:10032000912CACE9AA2EAFEFBA2EF5E0CF2EA2D2D7
+:100330007B018C0110D1AC01E0921C01C801AA27FD
+:10034000BB2780931D01842F8F7080931E01852F02
+:100350008F7080931F01BB27A12F902F8F2D6FE0EF
+:10036000D62ED822812F9927AA27BB27782F7F70D6
+:10037000CA0124E0969587952A95E1F78F70652F3D
+:1003800062956F7020E030E02130310589F0223035
+:10039000310524F42115310549F006C0223031051C
+:1003A00049F02330310541F090E007C09D2D05C094
+:1003B000972F03C0982F01C0962F90FF08C0F90116
+:1003C000EE0FFF1FE05EFE4FB182A0820EC0F9016A
+:1003D000EE0FFF1F91FF05C0E05EFE4F918280820D
+:1003E00004C0E05EFE4F1182108292FF08C0F90146
+:1003F000EE0FFF1FEC5EFE4FB182A0820EC0F9012E
+:10040000EE0FFF1F93FF05C0EC5EFE4F91828082CE
+:1004100004C0EC5EFE4F118210822F5F3F4F2430EC
+:10042000310509F0B1CFE114F1040105110511F412
+:10043000452B11F02F9A01C02F98C0E0D0E08C2DF1
+:100440008A95F1F780E091E00E94A30A0E948E0A4B
+:10045000219683E0C83ED80709F469CFF0CFDA01CE
+:100460009330B1F0943028F4913041F0923079F526
+:100470000AC0913211F1923251F524C0ECE5F1E05D
+:1004800022E130E028C0EEE6F1E022E230E023C0D5
+:10049000813049F0813018F08230C9F40AC0E0E9B7
+:1004A000F1E0849103C0E4E9F1E08491282F30E089
+:1004B00012C0E6EAF1E08491F9CFE0E8F1E029E04A
+:1004C00030E009C0E4E7F0E028EE30E004C0E0E00E
+:1004D000F0E020E030E0ED93FC93C90108953C9AF0
+:1004E0003D9A3E98469A3F98479A0895449860E00E
+:1004F00070E040E050E0E5E345988E2F8A95F1F7F3
+:1005000026B186B1229526952695237030E021707C
+:100510003070042E02C0220F331F0A94E2F7881FA6
+:100520008827881F90E0042E02C0880F991F0A9424
+:10053000E2F7982F8827282B392B622B732B459AAB
+:100540008E2F8A95F1F74F5F5F4F48305105A1F626
+:10055000449ACB010895CADF9C0120953095C901CA
+:100560000895569A5098519852985398549855987F
+:10057000589A599A5A9A5B9A5C9A5D9A209821984F
+:100580002298239824982598289A299A2A9A2B9A6F
+:100590002C9A2D9A08952F923F924F925F926F92CC
+:1005A0007F928F929F92AF92BF92CF92DF92EF9203
+:1005B000FF920F931F93DF93CF93CDB7DEB72797AB
+:1005C0000FB6F894DEBF0FBECDBF5E9888EC90E00A
+:1005D000FC013197F1F7F9B009B149B029B029B15F
+:1005E0002F8369B16E8313B1A3B1C3B0A3B083B03D
+:1005F00063B05E9A0197F1F789B18D83E9B0E9B1F3
+:10060000EC83F9B1FB8329B12A8369B1698353B1C2
+:1006100083B123B143B163B1E3B1869590E08170BA
+:100620009070880F991F2695269530E021703070C4
+:10063000220F331F220F331F822B5170852B4695BB
+:100640004695469550E041705070B3E0440F551FF9
+:10065000BA95E1F7842B62956F7070E061707070ED
+:10066000F4E0660F771FFA95E1F7862BE295E695A1
+:10067000E770F0E0E170F07075E0EE0FFF1F7A9523
+:10068000E1F78E2B282F30E040E050E0522F442736
+:1006900033272227A695B0E0A170B070AA0FBB1F28
+:1006A000C694C694DD2481E0C822DD24CC0CDD1C78
+:1006B000CC0CDD1CAC291170A12BA694A694A69499
+:1006C000BB24E1E0AE22BB2413E0AA0CBB1C1A95AC
+:1006D000E1F7AA298294BFE08B229924F1E08F22CE
+:1006E0009924F4E0880C991CFA95E1F7A829629402
+:1006F0006694E7E06E22772461E06622772475E055
+:10070000660C771C7A95E1F7A6298A2F90E0A0E085
+:10071000B0E0DC0199278827282B392B4A2B5B2B4B
+:10072000069510E001701070000F111F469446945A
+:10073000552481E048225524440C551C440C551C7A
+:100740000429E1E0FE220F292694269426943324DE
+:10075000F1E02F22332413E0220C331C1A95E1F729
+:1007600002296F8162956F70862F90E08170907082
+:10077000B4E0880F991FBA95E1F7082B8E81829516
+:10078000869587708E8390E081709070A5E0880FC9
+:10079000991FAA95E1F7082B802F90E0A0E0B0E028
+:1007A000282B392B4A2B5B2BE694FF24E1E0EE2229
+:1007B000FF24EE0CFF1CFC81F695F6958F2F90E040
+:1007C00081709070880F991F880F991FE82A6D819A
+:1007D0006170E62A8B818695869586958B8390E05D
+:1007E0008170907073E0880F991F7A95E1F7E82A7D
+:1007F000EA81E295EF708E2F90E08170907064E056
+:10080000880F991F6A95E1F7E82AF981F295F69524
+:10081000F7708F2F90E08170907005E0880F991F1E
+:100820000A95E1F7E82A8E2D90E0A0E0B0E0BA2F1B
+:10083000A92F982F8827282B392B4A2B5B2BB901FE
+:10084000CA0127960FB6F894DEBF0FBECDBFCF9179
+:10085000DF911F910F91FF90EF90DF90CF90BF90AD
+:10086000AF909F908F907F906F905F904F903F9050
+:100870002F9008952F923F924F925F926F927F92A6
+:100880008F929F92AF92BF92CF92DF92EF92FF92A0
+:100890000F931F93DF93CF93CDB7DEB7E1970FB6DA
+:1008A000F894DEBF0FBECDBFEE24FF24870119866A
+:1008B00051E0A52EB12CC12CD12C6DDE3B014C0199
+:1008C00020E030E066E070E0D401C3018F709070EA
+:1008D000A070B0700097A105B10509F47FC0285F32
+:1008E0003F4FD601C501022E04C0880F991FAA1FD1
+:1008F000BB1F0A94D2F78EA79FA7A8ABB9AB2F5FF7
+:100900003F4FD601C501022E04C0880F991FAA1FB0
+:10091000BB1F0A94D2F78AA79BA7ACA7BDA72950F3
+:100920003040D601C501022E04C0880F991FAA1FAE
+:10093000BB1F0A94D2F78D839E83AF83B887D601FD
+:10094000C501062E04C0880F991FAA1FBB1F0A9459
+:10095000D2F789839A83AB83BC83265F3F4FD6014E
+:10096000C501022E04C0880F991FAA1FBB1F0A943D
+:10097000D2F78E8F9F8FA8A3B9A32F5F3F4FD601C9
+:10098000C501022E04C0880F991FAA1FBB1F0A941D
+:10099000D2F78A8F9B8FAC8FBD8F2A503040D60103
+:1009A000C501022E04C0880F991FAA1FBB1F0A94FD
+:1009B000D2F78E8B9F8BA88FB98F2F5F3F4F15017A
+:1009C0002601022E04C0220C331C441C551C0A9420
+:1009D000D2F722503040E0E0F0E005C09985923037
+:1009E00008F058C07CCFD401C3010E2E04C0B695C8
+:1009F000A795979587950A94D2F781709070892B67
+:100A000009F042C0E53041F1E63038F4E130B1F0B0
+:100A1000E13078F0E430C1F51AC0EB3039F1EC3058
+:100A200018F4EA3089F51DC0EC3029F1ED3061F59C
+:100A300027C08EA59FA5A8A9B9A904C08AA59BA572
+:100A4000ACA5BDA5E82AF92A0A2B1B2B1DC08D8158
+:100A50009E81AF81B885F6CF89819A81AB81BC81B7
+:100A6000F1CF8E8D9F8DA8A1B9A1ECCF8A8D9B8DE2
+:100A7000AC8DBD8DE7CF8E899F89A88DB98DE2CFD2
+:100A8000E228F328042915293196EE30F10509F002
+:100A9000AACFA0C0D601C501022E04C0880F991F9D
+:100AA000AA1FBB1F0A94D2F78EA39FA3A8A7B9A71A
+:100AB000D601C501062E04C0880F991FAA1FBB1FAF
+:100AC0000A94D2F78AA39BA3ACA3BDA32B5F3F4F8D
+:100AD000D601C501022E04C0880F991FAA1FBB1F93
+:100AE0000A94D2F78A8B9B8BAC8BBD8B2150304004
+:100AF000D601C501022E04C0880F991FAA1FBB1F73
+:100B00000A94D2F78E879F87A88BB98B21503040EB
+:100B1000D601C501022E04C0880F991FAA1FBB1F52
+:100B20000A94D2F78A879B87AC87BD872C5F3F4F9B
+:100B300015012601022E04C0220C331C441C551C36
+:100B40000A94D2F727503040E4E0F0E0D401C3012A
+:100B50000E2E04C0B695A795979587950A94D2F75F
+:100B600081709070892B89F5E830E1F0E93028F444
+:100B7000E43051F0E53049F50CC0EA30E9F0EA30F4
+:100B8000B0F0EB3011F51DC08EA19FA1A8A5B9A5AD
+:100B900004C08AA19BA1ACA1BDA1E82AF92A0A2B15
+:100BA0001B2B13C08A899B89AC89BD89F6CF8E85A2
+:100BB0009F85A889B989F1CF8A859B85AC85BD853C
+:100BC000ECCFE228F328042915293196EC30F10501
+:100BD00009F0BCCF205F3F4F605F7F4F203231056F
+:100BE00021F03401882499246FCE99859F5F9987DD
+:100BF000943009F062CEB701C801E1960FB6F894BF
+:100C0000DEBF0FBECDBFCF91DF911F910F91FF903F
+:100C1000EF90DF90CF90BF90AF909F908F907F909C
+:100C20006F905F904F903F902F9008959C0140915E
+:100C30003301509134014617570718F4F90190E039
+:100C40003DC06115710511F0AB01F8CF8091E8004E
+:100C50008E778093E80040E050E0F0CF80912C0147
+:100C6000882309F441C0853009F440C08091E80030
+:100C700083FD3EC08091E80082FD30C08091E80095
+:100C800080FF1CC08091F200282F30E007C08191C6
+:100C90008093F100415050402F5F3F4F4115510567
+:100CA00019F02830310598F390E02830310509F427
+:100CB00091E08091E8008E778093E800411551051E
+:100CC00069F6992359F60AC080912C01882361F0B6
+:100CD000853061F08091E80083FD0AC08091E800D2
+:100CE00082FFF2CF80E0089582E0089583E00895C6
+:100CF00081E008959C016115710529F48091E80057
+:100D00008B778093E800F90120C080912C01882323
+:100D100061F1853061F18091E80083FF02C081E0DC
+:100D200008958091E80082FFF0CF06C08091F10025
+:100D300081936150704021F08091F2008823B1F7D7
+:100D40008091E8008B778093E80061157105E9F6E2
+:100D500006C080912C01882341F0853041F08091BC
+:100D6000E80080FFF6CF80E0089582E0089583E0F8
+:100D700008959C0140913301509134014617570763
+:100D800018F4F90190E03EC06115710511F0AB0156
+:100D9000F8CF8091E8008E778093E80040E050E043
+:100DA000F0CF80912C01882309F442C0853009F4EA
+:100DB00041C08091E80083FD3FC08091E80082FD42
+:100DC00031C08091E80080FF1DC08091F200282F83
+:100DD00030E008C084918093F1003196415050403A
+:100DE0002F5F3F4F4115510519F02830310590F321
+:100DF00090E02830310509F491E08091E8008E7789
+:100E00008093E8004115510561F6992351F60AC017
+:100E100080912C01882361F0853061F08091E80099
+:100E200083FD0AC08091E80082FFF2CF80E0089540
+:100E300082E0089583E0089581E00895BF92CF9203
+:100E4000DF92EF92FF920F931F93CF93DF93182FB0
+:100E5000092F7B016A01D9D0B82E8823B1F5812FE3
+:100E6000902F9C01E901C114D10439F0F601808171
+:100E70009181E81AF90AC80FD91F00E010E022C0DA
+:100E80008091E80085FD16C08091E8008E77809300
+:100E9000E80044D3C114D10449F0F6018081918166
+:100EA000800F911F9183808385E010C0AED088238E
+:100EB00049F00CC089918093F1000894E108F10891
+:100EC0000F5F1F4FE114F104D9F68B2DDF91CF9105
+:100ED0001F910F91FF90EF90DF90CF90BF900895FA
+:100EE000382F282F2EC0822F8F708093E900231770
+:100EF00021F4762F942F50E006C07091EC00909171
+:100F0000ED005091F00091FF1BC08091EB008E7FAF
+:100F10008093EB008091ED008D7F8093ED008091B8
+:100F2000EB0081608093EB007093EC009093ED00F8
+:100F30005093F0008091EE0087FD02C080E008959C
+:100F40002F5F253080F23F703093E90081E00895F3
+:100F50000F931F93CF93DF93062FEC0110E02AC06D
+:100F60009881992329F16B81E981FA812C81892F5C
+:100F70008F70853018F5223010F452E001C056E031
+:100F800040E028E030E003C04F5F220F331F2E17F0
+:100F90003F07D0F36295660F660F607C991F992713
+:100FA000991F692B4295407F452B9ADF882331F0AA
+:100FB0001F5F25961017A0F281E001C080E0DF914D
+:100FC000CF911F910F91089580912D0188239CF45A
+:100FD00004C080912C018823B9F08091E80082FF41
+:100FE000F8CF8091E8008B778093E8000895809196
+:100FF0002C01882349F08091E80080FFF8CF809190
+:10100000E8008E778093E80008954091E4005091C5
+:10101000E50024E68091EC0080FF24C08091E80088
+:1010200080FD1EC080912C01882311F482E0089578
+:10103000853011F483E008958091EB0085FF02C0B4
+:1010400081E008958091E4009091E5008417950770
+:1010500009F3222311F484E008952150AC01DACF82
+:1010600080E008958091E80082FFDCCFF9CF41D085
+:1010700043D08091D8008F778093D8008091D8009A
+:1010800080688093D8008091D8008F7D8093D800AD
+:1010900084E089BD86E089BD09B400FEFDCF1092D1
+:1010A0002C011092280110922A011092290180E04F
+:1010B00060E042E015DF8091E1008E7F8093E100E7
+:1010C0008091E20081608093E2008091E20088607C
+:1010D0008093E2008091E0008E7F8093E00008958D
+:1010E000E3E6F0E080818E7F808381E080932B01B6
+:1010F000BECF1092E20008951092E10008951F9271
+:101100000F920FB60F9211242F933F934F935F933B
+:101110006F937F938F939F93AF93BF93EF93FF93BF
+:101120008091E10082FF0AC08091E20082FF06C048
+:101130008091E1008B7F8093E1006DD88091E10088
+:1011400080FF17C08091E20080FF13C08091E20011
+:101150008E7F8093E2008091E20080618093E200C4
+:101160008091D80080628093D80019BC10922C0125
+:1011700050D88091E10084FF2FC08091E20084FF6D
+:101180002BC084E089BD86E089BD09B400FEFDCF97
+:101190008091D8008F7D8093D8008091E1008F7E70
+:1011A0008093E1008091E2008F7E8093E200809145
+:1011B000E20081608093E20080912801882311F091
+:1011C00084E007C08091E30087FD02C081E001C098
+:1011D00083E080932C011CD88091E10083FF22C022
+:1011E0008091E20083FF1EC08091E100877F8093A1
+:1011F000E10082E080932C01109228018091E100AF
+:101200008E7F8093E1008091E2008E7F8093E200E8
+:101210008091E20080618093E20080E060E042E043
+:101220005FDE7BD1FF91EF91BF91AF919F918F9145
+:101230007F916F915F914F913F912F910F900FBED2
+:101240000F901F9018951F93DF93CF93CDB7DEB704
+:10125000AC970FB6F894DEBF0FBECDBFEDE2F1E064
+:101260008091F100819321E0E533F207C9F71CD8A2
+:101270008091E80083FF39C180912D0130912E01CA
+:10128000353009F487C0363040F43130C9F131309F
+:1012900070F0333009F029C133C0383009F4F6C09A
+:1012A000393009F405C1363009F01FC196C08038C5
+:1012B00021F0823809F019C108C09091290180916C
+:1012C0002A01882399F0926011C0809131018F70BA
+:1012D0008093E9008091EB0090E025E0969587955A
+:1012E0002A95E1F7982F91701092E9008091E8001B
+:1012F000877F8093E8009093F1001092F100D1C0B5
+:10130000882319F0823009F0F0C090E08F7190705E
+:10131000009721F0029709F0E8C00CC080912F01DE
+:10132000813009F0E2C010922A01333069F58093D0
+:101330002A012AC080912F01882331F520913101A3
+:101340002F7009F4D2C02093E9008091EB0080FF58
+:101350001BC0333021F48091EB00806213C0809178
+:10136000EB0080618093EB0081E090E002C0880F89
+:10137000991F2A95E2F78093EA001092EA00809183
+:10138000EB0088608093EB001092E9008091E80008
+:10139000877F8AC0882309F0A8C010912F011F778A
+:1013A0008091E3008078812B8093E3008091E800B6
+:1013B000877F8093E80008DE8091E80080FFFCCF03
+:1013C0008091E30080688093E300112311F482E0B0
+:1013D00001C083E080932C0188C08058823008F0DF
+:1013E00084C080912F019091300123E08C3D9207C1
+:1013F00009F033C083E08C838AE28B837FB7F89453
+:10140000DE0115966EE040E050E011E2E62FF0E0DC
+:1014100010935700849140FF03C082958F706F5FD7
+:101420008F70282F30E08A3018F0C901C79602C0AB
+:10143000C901C0968D939D934F5F5F4F4431510515
+:1014400029F77FBF8091E800877F8093E800CE0175
+:1014500003966AE270E0EADB13C060913101AE01ED
+:101460004F5F5F4F0E942F02BC01009709F43DC0FF
+:101470008091E800877F8093E80089819A8179DCF8
+:101480008091E8008B778093E8002FC0803869F561
+:101490008091E800877F8093E80080912801809305
+:1014A000F1008091E8008E778093E8008DDD1DC00B
+:1014B0008823D9F490912F019230B8F48091E800FC
+:1014C000877F8093E800909328017EDD809128013A
+:1014D000882331F48091E30087FD02C081E001C0E0
+:1014E00084E080932C010E9458018091E80083FFE2
+:1014F0000AC08091E800877F8093E8008091EB002C
+:1015000080628093EB00AC960FB6F894DEBF0FBEFE
+:10151000CDBFCF91DF911F91089508951F938091C2
+:101520002C01882371F01091E9008091EC00109259
+:10153000E9008091E80083FF01C085DE1F701093F1
+:10154000E9001F9108954F925F926F927F928F9260
+:101550009F92AF92BF92CF92DF92EF92FF920F9342
+:101560001F93DF93CF9300D00F92CDB7DEB77C01EE
+:101570006DB67EB680912C01843009F09AC020911E
+:10158000E4003091E500F701828593858217930787
+:1015900009F48FC081818F708093E9008091E80009
+:1015A00085FF87C05DB64EB6408550E08DB79EB7CB
+:1015B000841B950B0FB6F8949EBF0FBE8DBF0DB761
+:1015C0001EB70F5F1F4F19821B821A82C02E912EE9
+:1015D000C80160E070E050E006D2C701BE016F5F55
+:1015E0007F4F40E098018E010E5F1F4F0E94170150
+:1015F000882EF70184859585892B19F4AA24BB24AC
+:101600000BC020E0F70186859785892B09F021E042
+:1016100081E02827A22EBB24F7010681178101153E
+:10162000110511F4DD2412C04A815B818C2D992DA6
+:10163000B801C3D1DD24009711F0DD24D394F70164
+:101640004085C8016C2D792D50E0C4D18A819B81E1
+:10165000892B01F1882021F4DD2011F4AB28D1F091
+:10166000F701848595859787868781818F70809320
+:10167000E9008981882311F08093F1006A817B81E0
+:101680008C2D992D40E050E0D9DB8091E8008E77D9
+:101690008093E8008091E4009091E500F701938742
+:1016A0008287252D342DC9010FB6F8949EBF0FBE39
+:1016B0008DBF0FB6F8947EBE0FBE6DBE0F900F901B
+:1016C0000F90CF91DF911F910F91FF90EF90DF90DE
+:1016D000CF90BF90AF909F908F907F906F905F90D2
+:1016E0004F900895CF93DF93DC010996FC0187E0CA
+:1016F000EF0119928A95E9F781E019968C93199771
+:1017000084EF91E01D969C938E931C9783E0149632
+:101710008C931497CD01019661E01ADC811181E070
+:10172000DF91CF9108956F927F928F929F92AF92A7
+:10173000BF92CF92DF92EF92FF920F931F93DF93AE
+:10174000CF9300D00F92CDB7DEB76C016DB67EB6E9
+:101750008091E80083FF1AC1F601808190E020911A
+:101760003101309132012817390709F00FC18091FA
+:101770002E01833009F4B2C0843030F4813071F02E
+:10178000823009F003C1E6C08A3009F4CBC08B3047
+:1017900009F4B5C0893009F0F9C05CC080912D0111
+:1017A000813A09F0F3C09DB68EB61B821A828091F1
+:1017B0002F01109130018983F601408550E08DB7EB
+:1017C0009EB7841B950B0FB6F8949EBF0FBE8DBFBE
+:1017D000EDB6FEB60894E11CF11CBE2CAF2CC7017F
+:1017E00060E070E050E0FFD01150C601BE016F5FB5
+:1017F0007F4F412F97018E010E5F1F4F0E941701EF
+:10180000F601268137812115310529F04085C9016E
+:10181000B70150E0DFD01092E9008091E800877FA7
+:101820008093E8008981882311F08093F1006A8118
+:101830007B818B2D9A2DFAD98091E8008B7780934C
+:10184000E800292D382DC9010FB6F8949EBF0FBEB0
+:101850008DBF9CC080912D01813209F097C09DB64B
+:101860008EB60091330110913401A0902F01B090F9
+:1018700030018DB79EB7801B910B0FB6F8949EBFB9
+:101880000FBE8DBFEDB6FEB60894E11CF11C809131
+:10189000E800877F8093E800C701B8012BDA8091C8
+:1018A000E8008E778093E80080E090E0AA2011F0B5
+:1018B00081E090E0BA94E80EF91E081B190BC601EE
+:1018C0006A2D4B2D97010E945301892D982D9C0163
+:1018D0000FB6F8943EBF0FBE2DBF58C080912D01AA
+:1018E000813A09F053C08091E800877F8093E80037
+:1018F0008091E80080FFFCCFF60181853FC0809198
+:101900002D01813209F042C08091E800877F8093E9
+:10191000E8005ADB90E080912F01811191E0F601FF
+:10192000918734C080912D01813281F58091E8004A
+:10193000877F8093E80048DB80912F0190913001F0
+:10194000807036E0969587953A95E1F7F601958790
+:1019500084871CC080912D01813AC1F48091E800F8
+:10196000877F8093E8008091E80080FFFCCFF6013C
+:101970008485958596958795969587958093F100B2
+:101980008091E8008E778093E8001EDB0FB6F89414
+:101990007EBE0FBE6DBE0F900F900F90CF91DF9166
+:1019A0001F910F91FF90EF90DF90CF90BF90AF907D
+:1019B0009F908F907F906F900895FB01DC0104C091
+:1019C0008D910190801921F441505040C8F7881B37
+:1019D000990B0895FB01DC0102C001900D9241506A
+:1019E0005040D8F70895DC0101C06D93415050403C
+:0819F000E0F70895F894FFCF21
+:1019F8000081080000011101030000000000000040
+:00000001FF