diff --git a/.gitignore b/.gitignore
index 5dd601d3..7558e5ea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,11 @@ Installers
/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Logs
/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/bin/*
/LabVIEW/resource
+/LabVIEW/vi.lib/MakerHub/LINX/*.aliases
+/LabVIEW/vi.lib/MakerHub/LINX/*.lvlps
+/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/make/VS2005/*.user
+/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/make/VS2005/*.res
+/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/make/VS2005/*.ncb
+/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/make/VS2005/*.suo
+/LabVIEW/vi.lib/MakerHub/LINX/API/*.aliases
+/LabVIEW/vi.lib/MakerHub/LINX/API/*.lvlps
diff --git a/All LINX VIs.vi b/All LINX VIs.vi
new file mode 100644
index 00000000..9d8c26ac
Binary files /dev/null and b/All LINX VIs.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - AD9850.vi b/LabVIEW/examples/MakerHub/LINX/LINX - AD9850.vi
index 0a6d6c07..6eb3d889 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - AD9850.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - AD9850.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Analog Read 1 Channel.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Analog Read 1 Channel.vi
index 84769810..49994334 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Analog Read 1 Channel.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Analog Read 1 Channel.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Analog Read N Channels.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Analog Read N Channels.vi
index 7ff10b6f..7b724279 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Analog Read N Channels.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Analog Read N Channels.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Analog Set Voltage Reference.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Analog Set Voltage Reference.vi
index 4eba2424..33f4ab09 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Analog Set Voltage Reference.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Analog Set Voltage Reference.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Advanced).vi b/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Advanced).vi
index 9130d41f..e1282e6d 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Advanced).vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Advanced).vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Simple) (TCP).vi b/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Simple) (TCP).vi
index dd2bed33..f8c2d0f2 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Simple) (TCP).vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Simple) (TCP).vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Simple).vi b/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Simple).vi
index bfbfa1a1..d1c28107 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Simple).vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Blink (Simple).vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - BlinkM Smart LED.vi b/LabVIEW/examples/MakerHub/LINX/LINX - BlinkM Smart LED.vi
index 576559c5..58cdfe83 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - BlinkM Smart LED.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - BlinkM Smart LED.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - DS1307 Real Time Clock.vi b/LabVIEW/examples/MakerHub/LINX/LINX - DS1307 Real Time Clock.vi
index 9b91b3c1..e73ab7e3 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - DS1307 Real Time Clock.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - DS1307 Real Time Clock.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Digital Read 1 Channel.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Digital Read 1 Channel.vi
index 0a0dde82..ddf8ec2e 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Digital Read 1 Channel.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Digital Read 1 Channel.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Digital Read N Channels.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Digital Read N Channels.vi
index dbba7159..6e2df9ff 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Digital Read N Channels.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Digital Read N Channels.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Digital Write N Channels.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Digital Write N Channels.vi
index 2db55637..2e18839e 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Digital Write N Channels.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Digital Write N Channels.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Digital Write Square Wave.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Digital Write Square Wave.vi
index 1afa5cb0..26e6ced1 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Digital Write Square Wave.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Digital Write Square Wave.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Interactions DHT11.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Interactions DHT11.vi
index 5a97ac6b..3921885b 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Interactions DHT11.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Interactions DHT11.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Interactions LED Matrix.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Interactions LED Matrix.vi
index 6f7b060d..03877dff 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Interactions LED Matrix.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Interactions LED Matrix.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Interactions Seven Segement Display.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Interactions Seven Segement Display.vi
index 9169b252..9a97c185 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Interactions Seven Segement Display.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Interactions Seven Segement Display.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - MMA8452Q Accelerometer.vi b/LabVIEW/examples/MakerHub/LINX/LINX - MMA8452Q Accelerometer.vi
index 2f8c9877..ada91d68 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - MMA8452Q Accelerometer.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - MMA8452Q Accelerometer.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PWM 1 Channel.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PWM 1 Channel.vi
index 25464548..7b97dfc0 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PWM 1 Channel.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PWM 1 Channel.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PWM N Channel.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PWM N Channel.vi
index 4119307e..1a8fc1aa 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PWM N Channel.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PWM N Channel.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Photocell.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Photocell.vi
index f583d3eb..76d48471 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Photocell.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Photocell.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodACL2.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodACL2.vi
index c34a860c..c17c22ed 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodACL2.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodACL2.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodALS.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodALS.vi
index a16377e5..218a7d6e 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodALS.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodALS.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodBT2.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodBT2.vi
index 50034c4f..f3ca3a32 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodBT2.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodBT2.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodCMPS.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodCMPS.vi
index 590abb79..380e92fb 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodCMPS.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodCMPS.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodGPS.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodGPS.vi
index 73acb1aa..a467ed57 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodGPS.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodGPS.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodGYRO.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodGYRO.vi
index 61fdda33..1d9c1976 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodGYRO.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodGYRO.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodJSTK.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodJSTK.vi
index 5ec12227..0d3610cb 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodJSTK.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodJSTK.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodMIC3.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodMIC3.vi
index ffea23a1..4e4642ae 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodMIC3.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodMIC3.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodSONOR.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodSONOR.vi
index 991243f0..1e1de02e 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodSONOR.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodSONOR.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodTC1.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodTC1.vi
index f6d7fafa..97e3b918 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodTC1.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodTC1.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - PmodTMP3.vi b/LabVIEW/examples/MakerHub/LINX/LINX - PmodTMP3.vi
index caa7990f..34929292 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - PmodTMP3.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - PmodTMP3.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - SPI Loopback.vi b/LabVIEW/examples/MakerHub/LINX/LINX - SPI Loopback.vi
index b154bf30..29a29249 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - SPI Loopback.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - SPI Loopback.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - SSD1306 OLED.vi b/LabVIEW/examples/MakerHub/LINX/LINX - SSD1306 OLED.vi
index 434da5f1..73f6df9c 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - SSD1306 OLED.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - SSD1306 OLED.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Servo 1 Channel.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Servo 1 Channel.vi
index c89d8fd9..657f75ec 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Servo 1 Channel.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Servo 1 Channel.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Set RGB LED Color.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Set RGB LED Color.vi
index c9c8122a..4c272b4e 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Set RGB LED Color.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Set RGB LED Color.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Seven Segment Display.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Seven Segment Display.vi
index 05ce2934..6e39d932 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Seven Segment Display.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Seven Segment Display.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - TMP3x.vi b/LabVIEW/examples/MakerHub/LINX/LINX - TMP3x.vi
index addeee04..3d1e6050 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - TMP3x.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - TMP3x.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Thermistor Read.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Thermistor Read.vi
index 410a9901..2d33c4c3 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Thermistor Read.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Thermistor Read.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Thumbstick Read.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Thumbstick Read.vi
index 9e294efd..58be2648 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Thumbstick Read.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Thumbstick Read.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - Ultrasonic.vi b/LabVIEW/examples/MakerHub/LINX/LINX - Ultrasonic.vi
index 9355d033..55ac8fef 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - Ultrasonic.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - Ultrasonic.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Strip Controller.vi b/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Strip Controller.vi
index ffc6c8fb..8e1a92fe 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Strip Controller.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Strip Controller.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Write N LEDs.vi b/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Write N LEDs.vi
index bbcb411d..b00cccf8 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Write N LEDs.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Write N LEDs.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Write One LED.vi b/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Write One LED.vi
index 678ed5d1..313f087a 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Write One LED.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - WS2812 Write One LED.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/LINX - chipKIT Basic IO Shield.vi b/LabVIEW/examples/MakerHub/LINX/LINX - chipKIT Basic IO Shield.vi
index aa453c9d..15d74853 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/LINX - chipKIT Basic IO Shield.vi and b/LabVIEW/examples/MakerHub/LINX/LINX - chipKIT Basic IO Shield.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Analog Read Benchmark.vi b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Analog Read Benchmark.vi
index e3055f30..4c6021e9 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Analog Read Benchmark.vi and b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Analog Read Benchmark.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Digital Read Benchmark.vi b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Digital Read Benchmark.vi
index 9a4c18f2..50df1f71 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Digital Read Benchmark.vi and b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Digital Read Benchmark.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Digital Write Benchmark.vi b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Digital Write Benchmark.vi
index 40b4032b..dc66b45d 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Digital Write Benchmark.vi and b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - Digital Write Benchmark.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - I2C Write Benchmark.vi b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - I2C Write Benchmark.vi
index d5e8ba0c..6126cbf1 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - I2C Write Benchmark.vi and b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - I2C Write Benchmark.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - PWM Set Duty Cycle Benchmark.vi b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - PWM Set Duty Cycle Benchmark.vi
index 1967eead..f503c8b5 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - PWM Set Duty Cycle Benchmark.vi and b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - PWM Set Duty Cycle Benchmark.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - SPI Loopback Benchmark.vi b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - SPI Loopback Benchmark.vi
index c2337448..f2184349 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - SPI Loopback Benchmark.vi and b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - SPI Loopback Benchmark.vi differ
diff --git a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - UART Loopback Benchmark.vi b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - UART Loopback Benchmark.vi
index 79f6a3fb..ef40ac00 100644
Binary files a/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - UART Loopback Benchmark.vi and b/LabVIEW/examples/MakerHub/LINX/Local IO Benchmarks/LINX - UART Loopback Benchmark.vi differ
diff --git a/LabVIEW/help/Hobbyist/Forums.vi b/LabVIEW/help/Hobbyist/Forums.vi
index aa84333f..2b0578d3 100644
Binary files a/LabVIEW/help/Hobbyist/Forums.vi and b/LabVIEW/help/Hobbyist/Forums.vi differ
diff --git a/LabVIEW/help/Hobbyist/Pinout - BeagleBone Black.vi b/LabVIEW/help/Hobbyist/Pinout - BeagleBone Black.vi
index a5fdb715..13a22c6f 100644
Binary files a/LabVIEW/help/Hobbyist/Pinout - BeagleBone Black.vi and b/LabVIEW/help/Hobbyist/Pinout - BeagleBone Black.vi differ
diff --git a/LabVIEW/help/Hobbyist/Pinout - Raspberry Pi 2 B.vi b/LabVIEW/help/Hobbyist/Pinout - Raspberry Pi 2 B.vi
index 4178bf49..3ad203cc 100644
Binary files a/LabVIEW/help/Hobbyist/Pinout - Raspberry Pi 2 B.vi and b/LabVIEW/help/Hobbyist/Pinout - Raspberry Pi 2 B.vi differ
diff --git a/LabVIEW/project/Hobbyist/Firmware Wizard.vi b/LabVIEW/project/Hobbyist/Firmware Wizard.vi
index 5fb7e65e..7c317940 100644
Binary files a/LabVIEW/project/Hobbyist/Firmware Wizard.vi and b/LabVIEW/project/Hobbyist/Firmware Wizard.vi differ
diff --git a/LabVIEW/project/Hobbyist/Target Configuration.vi b/LabVIEW/project/Hobbyist/Target Configuration.vi
index 78c32950..beae80fa 100644
Binary files a/LabVIEW/project/Hobbyist/Target Configuration.vi and b/LabVIEW/project/Hobbyist/Target Configuration.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Error Handler.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Error Handler.vi
new file mode 100644
index 00000000..99c61f3a
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Error Handler.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Format Error.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Format Error.vi
new file mode 100644
index 00000000..7cedea32
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Format Error.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Get Name.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Get Name.vi
new file mode 100644
index 00000000..19563bd2
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Get Name.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Base/GetSet Handle.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/GetSet Handle.vi
new file mode 100644
index 00000000..249a6699
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/GetSet Handle.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Shared Library Path.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Shared Library Path.vi
new file mode 100644
index 00000000..43d8c7cf
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Base/Shared Library Path.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open Local.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open Local.vi
new file mode 100644
index 00000000..07ed4b92
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open Local.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open Serial.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open Serial.vi
new file mode 100644
index 00000000..75a54d2d
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open Serial.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open TCP.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open TCP.vi
new file mode 100644
index 00000000..d473e05b
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Client/Open TCP.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Close.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Close.vi
new file mode 100644
index 00000000..f3d6f868
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Close.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Create.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Create.vi
new file mode 100644
index 00000000..b7514bd5
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Create.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/LINX API.lvlps b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX API.lvlps
new file mode 100644
index 00000000..87d627bb
--- /dev/null
+++ b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX API.lvlps
@@ -0,0 +1,2 @@
+[ProjectWindow_Data]
+ProjectExplorer.ClassicPosition[String] = "297,206,942,1226"
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/LINX API.lvproj b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX API.lvproj
new file mode 100644
index 00000000..14f83b9e
--- /dev/null
+++ b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX API.lvproj
@@ -0,0 +1,24 @@
+
+
+ -
+ 3
+ true
+ true
+ false
+ 0
+ My Computer/VI Server
+ My Computer/VI Server
+ true
+ true
+ false
+
+
+
+ -
+
-
+
+
+
+
+
+
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Base.lvclass b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Base.lvclass
new file mode 100644
index 00000000..27f84059
--- /dev/null
+++ b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Base.lvclass
@@ -0,0 +1,105 @@
+
+
+
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!*)!!!*Q(C=\>5^<NN!%)<BDU9+![Q-Z!#"LD"85/F7L=OZ!FP$>K(#6<KZAK[A+]Q66,P4&:BXFR-BAGWIM9-A-+GFK'``(CUJ3OL<N@2.][6N('`?WM:FKXL;^7/>^G[H?BL-SWNZ7Q\H^68VO^&]6D]O6@-S3TM\#6\V8]YYH0H?YY]8P\[_NK`N`^\O,`Y)0PVX-+A^C#B*#9J44'X;/=G40-G40-G40-C$0-C$0-C$X-G>X-G>X-G>X-C.X-C.X-C.P/`E)B?ZS#%FES=4*9-G!S3.I3AZ**\%EXA3$R_6?"*0YEE]C9=G3DS**`%EHM2$.S7?R*.Y%E`C9;AOS<[4YUE]$+`!%XA#4_!*0%SJQ"-!AMG#A9."9#CI$%Y#4_!*0*QK]!3?Q".Y!A`6#DS"*`!%HM"$F\YKU46N*]@$-()]DM@R/"\(Q^"S0)\(]4A?R].U=DS/RU%Y%TK$1Z$4S7HA@(!]DI=X/2\(YXA=D_/BKF]B\SP4.'UHRW.Y$)`B-4S'BS&E?!S0Y4%]BI>B:8A-D_%R0);(K72Y$)`B-3$'J%QP9T#DI^()#!Q0LX[X7,^+U387>[FO8N6.K<L:6$?2[O:18846R62>*.8CKR:6N6CK26"^/26;B6&.IOL='OL)]5$:5X;5,77C<#BLSIJSU\J_=-0D];D$Y;$^@K`><K@N>KNJGL4:<,2?L\6;L=3@]?ER])0^^%"9HEPXH$]_4]0$\>0Q_./(B\PPP,]-,@],`]``Q,.26`JT$N<I&XH!1<Y!!!!!
+ 536903680
+ 1.0.0.1
+ true
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!";W5F.31QU+!!.-6E.$4%*76Q!!%C1!!!33!!!!)!!!%A1!!!!7!!!!!2&-35Z9)%*B=W5O<(:D<'&T=Q!!!!!!I#!!A!!!-!!!+!!!!!!!!!1!!Q!]!,Q!(U#!!A!!!!!"!!%!"P````]!!!!!!!!!!!!!!!!9XO'[^J2I4;+1,PL+^[V^!!!!$!!!!"!!!!!"9DZO2,.'(E#PVT6IW,F><>1>D.G0!,)%[9!*G/TY1HY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!`````^1>D.G0!,)%[9!*G/TY1HY!!!!1!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!*Q!"4&:$1Q!!!!%!!F:*4%)!!!!!5&2)-!!!!!5!!1!"!!!!!!)!!Q!!!!!#!!%!!!!!!#1!!!!=?*RD9'>A;G#YQ!$%D!Z-$6R!&F-'E0?"A9%"!&Q/"K%!!!!5!!!!#HC=9W"GY'4A!%)'!!#E!"U!!!"*!!!"'(C=9W$!"0_"!%AR-D!Q01(3L'DC9"L'JC<!:3YOO[$CT%$-AO2/I"D4(C$.""+(KO'"3$(>!/)4[/<Q1_E,3')!IGEJ*Q!!!!!!!!Q!!6:*2&-!!!!!!!-!!!&Y!!!$+(C=+W"E9-AUND!\!+3:A6C"I9%B/4]FF:="S'?!A$>-$"3$!+BZ7GDCBA=/JQ'"(L^]#ZD@\;,#UFSDQM.5SP?`2)5DY!6)M0E)R_&ODZTDDD:A*2R:$&E-!@]$-ZK0])"V)_H09A"K%Q&BK%Y?.0.^6&A-$T25+D/5#B^P.''%O#)1KJDF-%(^10="T?!Y_*#F>S*9I".%>I9Q3BRX9>12!\*\?2A$%?Z'=V^9.^"879RB-0FONO-/'C$W=1=2#*5"I3IA6!')WA%CYAZD#^?VL_`N9A83<%BC$F$=!-3A?)6B01:'"J#(G9#Q!UD`_@``PQV1B!EKJAA6!\&P1NG-$0:Q0</B9BJ)ZPS%[U'ICY;+/3#Z"W1(S+;^1&I$SDY-:4>!X1]39Q5;-A(+ZA'S#["M93"\!Z1N"71,1.G+109(+&M.SDY!D66UWNH@R25Z\%$J'J<'?9!Y/<@!Q%#POD21*\C7']1P3#[$=BE!0A?,B!!!!,9!!!%=?*RT9'"AS$3W-$M!J*E:'2A5'"I9EP.45BG1Q"='X#!YL0E.2X?)CE3XDYJ)JY]+3[?)3H=BC_%"[S)7`CG(3YW[$9&M)R"4P>?2I^.&B;88C;/42?6`%=@`1IY8)$/;DX!9HGT_Q=A`Z7$HC>>-(4?!!H(2B`(9CA"L8^`<"81W!S/3G!-1+T&)A-79I0Q`````>Y$+/`O\O+,\$[37"YC4=QM-$03K3Q.VAGM"<8!V(A!!!!!!FA!!!.RYH(.A9'$).,9Q;Q$3T)Q-$!I-$1T*_3GJ$%BA#Q.OU0S'I^N&2;$<2Y7HUU?&J:.&Z2/`!/-H@E%'I$",LQ=(3,3<2[8Z)%=HDULA`Q+/&W"N2Q1/A`7P@8VP&^";"E9E-RW!/!MI!B*D!G*D)0\T``^`"[C]M\_,+\L\1'KZA4CZ),F-L\IU5#?YFA%!#*!EKA!!!!!!$C!"A!=!!!9S-#YQ,D%!!!!!!!!-)!#!!!!!"$)Q,D!!!!!!$C!"A!=!!!9S-#YQ,D%!!!!!!!!-)!#!!!!!"$)Q,D!!!!!!$C!"A!=!!!9S-#YQ,D%!!!!!!!!5!1!!!068.9*Z*K+-,H.34A:*/:U!!!!.!!!!!!!!!!!!!!!!!!!!!!!!!)$`````A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!9!!"A:A!!99'!!'9!9!"I!"!!<!!Q!'M!U!"IQ\!!;$V1!'A+M!"I$6!!;!KQ!'A.5!"I#L!!;!V1!'9+Y!"BD9!!9'Y!!'!9!!"`````Q!!"!$```````````````````````````````````````````],#R%2%2%2%2%2%2%2%2%2%2%2%2%2%1M,#QM,#QP``QM,%2%2````%2%2``]2%2(```]2````#QM,#QM,#```#QM,%2(`%2(`%2(``R%2`R%2%2(`%2%2#QM,#QM,``],#QM2%@```R%2`R%2`R%2``]2%@``%2%,#QM,#QP``QM,#QM2`R%2`R(`````%2%2%@]2`R%2%2%,#QM,#```#QM,%2(```]2%@]2%@]2````%2(```]2#QM,#QM,``],#R%2%2%2%2%2%2%2%2%2%2%2%2%2#QM,#QM,#QP`````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!"Y?!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!"YL+KLL(A!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!"YL+I+#AI+K[RY!!!!!!!!!!!!!!!!!!!!!0``!!"YL+I+#AI+#AI+#KOM?!!!!!!!!!!!!!!!!!!!``]!K[I+#AI+#AI+#AI+#AKLL!!!!!!!!!!!!!!!!!$``Q#KKAI+#AI+#AI+#AI+#P[L!!!!!!!!!!!!!!!!!0``!+I\/[I+#AI+#AI+#P\_`KI!!!!!!!!!!!!!!!!!``]!KDM\/TOK#AI+#P\_`P\_KA!!!!!!!!!!!!!!!!$``Q#K/TM\/TM\KKT_`P\_`P[K!!!!!!!!!!!!!!!!!0``!+I\/TM\/TM\`P\_`P\_`KI!!!!!!!!!!!!!!!!!``]!KDM\/TM\/TP_`P\_`P\_KA!!!!!!!!!!!!!!!!$``Q#K/TM\/TM\/`\_`P\_`P[K!!!!!!!!!!!!!!!!!0``!+I\/TM\/TM\`P\_`P\_`KI!!!!!!!!!!!!!!!!!``]!KDM\/TM\/TP_`P\_`P\_KA!!!!!!!!!!!!!!!!$``Q!\/TM\/TM\/`\_`P\_`KOL!!!!!!!!!!!!!!!!!0``!!#EKDM\/TM\`P\_`KOMJ!!!!!!!!!!!!!!!!!!!``]!!!!!J$M\/TP_`KOLJ!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!+1\/TM\IQ!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!#EIQ!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````!!!!$!!"2F")5!!!!!!!!Q!!!!1!!!!!!!!%&Q!!#;:YH+V74WA56RD`XOQEPNW.Z%UU42;3\B^GJU%4OSB6'\1V/CH9JGFC6+LWDWMG'D';EG2$I;!5BN!=0!6S+!BN$\HWE%.\S#'5V2<G9E'%KL$V\%%P9EC>(<`X:G>H>K)<+=\B]2C_X`>^\`@\@@-')0I,;Z@+=.5'QJ\C:M#'G'%2A')0B=KDT1%\1@Y$MDV"<$B%4\$\5JFUW."E7"L.[@0Q"+/>HZVOO%0'W5--<71*4";TI>GQWJ30V2*4@_V1ZRO]L!JUMOOE,(WO*J`2[_9E&A3TC[^+$SE$U>/S<';']F@'4*7`D@<1B%A:N9(JVN9JN@1/:M43@YC5UE[3E1ZY+1&4>M(S]L)05FS1*NL9DRC3!3"\J*VV-#W[V4GNFLI&*C9Q7'?06U>0FB>Y\RQ5BG\4,9:1R(V</4,(?DD\U%NRYT:M6UO(;9)_./YV<"UW@Q-#J0AV>8ZX:DF?'?1KC.A7&#,<3^A)\E>MW'&;UFG108IH95())(MS(%!:S%>#BKA_T]$897%4(83ZG/E]-F'9HBG<3EW?4YV/Z+?H5^^-8:T.TYSFD0R-@K.#"X5LOI_@HB=4ZI"7E/%3D!@:HI3FJ35E!&=@_A&#W^23&;?)UUR5'4>]ZHB6H\E0E4F^\@A&TF[W6`)]+QH0^IPVF/`=X?B=B97<KX(O?W`?O8P25&>$TA5$4E+BDAPXO3$@O2A0=!'-/JD^C,E7>#ZC$-15.H@O_RO=S\%BZSYO,I;>WVNVLES)[VTTNP0=?=\^_^BZB#J_,`QL#=1QSM(T*T"`0_;PI@\-+^W;XN3N:O:+`H+9_\A.RX1LA4UWOSEJ4^G/MKM1Q`0]=_]"HK=Q^Z/3>+@'0?WTPTC_MP]TM,]6W._EC7D3L^0HVJFV[[R[^OI3><$#'[G$((W"A\*<,=5$-^9G[JTVN()5I>8[_DL7R.8FS%T$$_B1F<]*?P0,U/"N1`[[@?&@08B@I@$:5Z!^$4B_.\0@3?Y%2L3Z3#6I#!@1M"LB-,]F(C-Y!8V#]#X?94ZZK?"R&$R88`#5"/YHKN%9G\UY'N<^8RM'$%PG2-6K0E<.I-("VS!+0+,-G?SOX0F+WC9<0E7[^KIF374.C99:6O[!*MSUML+#G8!6-EN=QECKG(2.X)1B+2'3ZCP,6!A?J2F8\8!I(\9U8WN$KW<!<A:>-U1#X<S._"X`PZNTL^`.O:JO=!1_KRGV6:`RVAWDVO$:?SXH7XXNX="_6W$@%RC(PQ-VU<Z$'_[./"[`<X0\$A@M?STO?F@7ZC1N"6L;U4)9'BU-@'LJ`6O&[J]2(6&VJVY![]=KVWRIV9_UL,+D`0KG2WE`OY(8%.Z)<^%<^'HR<P8@K4B12:KXQ9S=6H^-UP98C4+V"!!!!!!%!!!!-Q!!!!1!!!!!!!!!$!!"1E2)5!!!!!!!!Q!!!!1!!!!!!!!!:1!!!(6YH'.A9#A5E'$[RV$XFY&*Y#O1)@W8A6H1D`%X!Q/HH]"B)-UI)!E5FPX,Q#[I$2<70K,,Q1!&KGS-(*)=BQ5ZQ$)=,2I-````6SFCZ0B[Z"J=U2%@/&.FFDS("!"F#"G;!!!!!!!!"!!!!!=!!!(D!!!!"A!!!"J-6E.M98.T5(*J>G&U:52B>'&597*0=G2F=A!!!#UA!)!!!!!!!A!&!!=!!!Q!1!!"`````Q!!!!%!!1!!!!)!!!!!!!!!!1!!!!!!!!!<4&:$<'&T=V"S;8:B>'6%982B6'FN:8.U97VQ!!!!'3!!A!!!!!!"!!5!"Q!!!1!!Y>3<"A!!!!!!!!!G4&:$<'&T=V"S;8:B>'6%982B4'&T>%&Q='RJ:725;7VF=X2B<8!!!!!:)!#!!!!!!!%!"1!(!!!"!!$BV*M'!!!!!!!!!"J-6E.M98.T5(*J>G&U:52B>'&5?8"F2'6T9Q!!!%EA!)!!!!!!!1!)!$$`````!!%!!!!!!#U!!!!$!!V!#!!':'6W;7.F!!!/1$$`````"'ZB<75!!!I!5!!#!!!!!1!"!!)!!!!!!!!!(ER71WRB=X.1=GFW982F2'&U952G<(2%982B5WF[:1!!!"EA!)!!!!!!!1!&!!-!!!%!!!!!!!Q!!!!!!!!!'ER71WRB=X.1=GFW982F2'&U952G<(2%982B!!!!13!!A!!!!!!$!!V!#!!':'6W;7.F!!!/1$$`````"'ZB<75!!!I!5!!#!!!!!1!"!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!1!"!!-!!!!"!!!!&Y!!!!I!!!!!A!!"!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1E!!!'>?*S.4]V+!T%9H'WWWWVV[^;`?B&S^#!C^!7#AC#)C(DQ;.D.3C'[UEU8D\[(L_5,_!<["$L*&HLQ9C9*G?]<:LY!/%#G5C3F;??&!=<K^)=L@N:0:(@Y`PRY4Q$U*F?8V`@S4$@GR,;&V5W4L3O&MTB7._B2'2W?WW8DT%,7F1R#_<+9N^I:77KHU3=Q1EHF&Q3*7&(-3):K!&(:2[4K4>3XLCO9OE*/@Y%"5AT&MKSI4=%>RO890HQ$G]+^FL4T<)3-J["RD!B(`R[0KDY3@U5_Y#%98."39I*NTO#R%`\21;TQN\,O\!:U`YSQ2U>ACV%RE]:]Z>D(.03G@/=__B=9FE)@!!!!!!!!:1!"!!)!!Q!%!!!!3!!0"!!!!!!0!.E!V!!!!&%!$Q1!!!!!$Q$:!.1!!!";!!]%!!!!!!]!W1$5!!!!9Y!!B!#!!!!0!.E!V!B4:7>P:3"631B4:7>P:3"631B4:7>P:3"631%Q!!!!5F.31QU+!!.-6E.$4%*76Q!!%C1!!!33!!!!)!!!%A1!!!!!!!!!!!!!!#!!!!!U!!!%B!!!!"V-35*/!!!!!!!!!7R-6F.3!!!!!!!!!9"36&.(!!!!!!!!!:2$1V.5!!!!!!!!!;B-38:J!!!!!!!!!<R$4UZ1!!!!!!!!!>"544AQ!!!!!1!!!?2%2E24!!!!!!!!!AR-372T!!!!!!!!!C"735.%!!!!!A!!!D2W:8*T!!!!"!!!!H"41V.3!!!!!!!!!N2(1V"3!!!!!!!!!OB*1U^/!!!!!!!!!PRJ9WQY!!!!!!!!!R"-37:Q!!!!!!!!!S2'5%6Y!!!!!!!!!TB'5%BC!!!!!!!!!UR'5&.&!!!!!!!!!W"75%21!!!!!!!!!X2-37*E!!!!!!!!!YB#2%6Y!!!!!!!!!ZR#2%BC!!!!!!!!!\"#2&.&!!!!!!!!!]273624!!!!!!!!!^B%6%B1!!!!!!!!!_R.65F%!!!!!!!!"!")36.5!!!!!!!!""271V21!!!!!!!!"#B'6%&#!!!!!!!!"$Q!!!!!`````Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"Q!!!!!!!!!!0````]!!!!!!!!!Q!!!!!!!!!!!`````Q!!!!!!!!$5!!!!!!!!!!$`````!!!!!!!!!.Q!!!!!!!!!!0````]!!!!!!!!"#!!!!!!!!!!!`````Q!!!!!!!!%1!!!!!!!!!!,`````!!!!!!!!!4A!!!!!!!!!!0````]!!!!!!!!"5!!!!!!!!!!!`````Q!!!!!!!!'A!!!!!!!!!!$`````!!!!!!!!!<!!!!!!!!!!!@````]!!!!!!!!$,!!!!!!!!!!#`````Q!!!!!!!!0I!!!!!!!!!!4`````!!!!!!!!")1!!!!!!!!!"`````]!!!!!!!!%G!!!!!!!!!!)`````Q!!!!!!!!3I!!!!!!!!!!H`````!!!!!!!!",Q!!!!!!!!!#P````]!!!!!!!!%T!!!!!!!!!!!`````Q!!!!!!!!4A!!!!!!!!!!$`````!!!!!!!!"0A!!!!!!!!!!0````]!!!!!!!!&$!!!!!!!!!!!`````Q!!!!!!!!71!!!!!!!!!!$`````!!!!!!!!#:1!!!!!!!!!!0````]!!!!!!!!*J!!!!!!!!!!!`````Q!!!!!!!!GM!!!!!!!!!!$`````!!!!!!!!$=A!!!!!!!!!!0````]!!!!!!!!.U!!!!!!!!!!!`````Q!!!!!!!!X9!!!!!!!!!!$`````!!!!!!!!$?A!!!!!!!!!!0````]!!!!!!!!.]!!!!!!!!!!!`````Q!!!!!!!!Z=!!!!!!!!!!$`````!!!!!!!!$G1!!!!!!!!!!0````]!!!!!!!!14!!!!!!!!!!!`````Q!!!!!!!""5!!!!!!!!!!$`````!!!!!!!!%&Q!!!!!!!!!!0````]!!!!!!!!1C!!!!!!!!!#!`````Q!!!!!!!"'9!!!!!!V-35Z9)%*B=W5O9X2M!!!!!!
+
+
+
+
+!!!!!2&-35Z9)%*B=W5O<(:D<'&T=V"53$!!!!!!!!!!!!!!!!!!!A!"!!!!!!!!!!!!!!%!"A"1!!!!!1!!!!!!!!!!!!!"$ERB9F:*26=A4W*K:7.U!&"53$!!!!!!!!!!!!!)9)!"!!!!!!!!!!!!!!!!!1!!!!!!!1!!!!!$!!V!#!!':'6W;7.F!!!/1$$`````"'ZB<75!!&1!]?(5GQ9!!!!#%5R*4FAA1G&T:3ZM>G.M98.T$5R*4FAA1G&T:3ZD>'Q!,%"1!!)!!!!"(5.M>8.U:8)A<W9A9WRB=X-A=(*J>G&U:3"E982B!!%!!A!!!!,``````````Q!!!!!!!!!!!!!!!!!!!!%/4'&C6EF&6S"09GJF9X1!5&2)-!!!!!!!!!!!!!BAA!%!!!!!!!!!!!!!
+
+
+
+
+ false
+ 1.0.0.1
+ 3
+ -
+ 2
+
+ -
+ 2
+
-
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!(.!!!!#1!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO<S"F=H*P=CE!%%!Q`````Q>.:8.T97>F!1!!]?(5AJ9!!!!#%5R*4FAA1G&T:3ZM>G.M98.T$E6S=G^S)&2Z='5O9X2M!.>!&A!,"V6O;WZP>WY(6'FN:7^V>"6$<X*S>8"U)&*F>(6S<C"197.L:81267ZB9GRF)&2P)%.P<GZF9X161W^N<7&O:#"/<X1A5X6Q='^S>'6E#U.I97ZO:7QA2%Z&%EFO>G&M;71A1U^.)%.P<G:J:RF';8*N>W&S:3"7:8*T;7^O)%VJ=WVB>'.I$7VZ5EF0)&.V=("P=H131UV%)&.Q:7.J:GFD)%6S=G^S&ERP9W&M)%F0)%ZP>#"4>8"Q<X*U:71!!!J&=H*P=C"5?8"F!!"5!0!!$!!$!!1!"!!%!!1!"!!%!!1!"1!%!!9!"Q-!!(A!!!U)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!)!!!!%!!!!!!"!!A!!!!!
+ -1
+ 0
+ true
+ 2
+ 1
+ 1082139152
+
+
+ -
+
-
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!"B!!!!!1":!0%!!!!!!!!!!B&-35Z9)%*B=W5O<(:D<'&T=QF$<WZU=G^M)$%!.5!6!!9(37ZW97RJ:!2/<WZF!U^E:!2&>G6O"%VB=GM&5X"B9W5!!!:198*J>(E!!!%!!!!!!!!
+ -1
+ 1048576
+ true
+ 1
+ 1
+ 1074266624
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!%)!!!!!1%!!0(BV)+7!!!!!B&-35Z9)%*B=W5O<(:D<'&T=QZ&=H*P=C"5?8"F,G.U<!$81"9!#Q>6<GNO<X>O"V2J<76P>8161W^S=H6Q>#"3:82V=GYA5'&D;W6U%66O97*M:3"5<S"$<WZO:7.U&5.P<7VB<G1A4G^U)&.V=("P=H2F:!N$;'&O<G6M)%2/22**<H:B<'FE)%.043"$<WZG;7=:2GFS<8>B=G5A6G6S=WFP<C".;8.N982D;!VN?6**4S"4>8"Q<X*U%E..2#"4='6D;7:J9S"&=H*P=B:-<W.B<#"*4S"/<X1A5X6Q='^S>'6E!!!+28*S<X)A6(FQ:1!!!1!!!!!!!!
+ -1
+ 3145728
+ true
+ 2
+ 1
+ 1082130944
+ 2
+
+
+ -
+ 3
+
-
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!%M!!!!#A!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!!Z!-0````]%<G&N:1!!+E"Q!"Y!!"-24%F/7#"#98.F,GRW9WRB=X-!$5R*4FAA1G&T:3"P>81!)%"1!!-!!!!"!!)4:8*S<X)A;7YA+'ZP)'6S=G^S+1!K1(!!(A!!%R&-35Z9)%*B=W5O<(:D<'&T=Q!-4%F/7#"#98.F)'FO!!"B!0!!$!!$!!1!"1!'!!1!"!!%!!1!"Q!%!!1!#!-!!(A!!!U)!!!!!!!!#1!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!!!!!!#A!!$1!!!!Q!!!!!!!!!!!!!!1!*!!!!!!
+ -1
+ 0
+ true
+ 3
+ 1
+ 1074266640
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&8!!!!$A!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!%5!)!!JI97ZE<'5A<X6U!!!/1$$`````"'ZB<75!!#J!=!!?!!!4%5R*4FAA1G&T:3ZM>G.M98.T!!V-35Z9)%*B=W5A<X6U!!1!!!!/1#%*=X2P=G5A+%9J!":!5!!$!!!!!1!##'6S=G^S)'FO!!!01!A!#7BB<G2M:3"J<A!51$$`````#G.P<GZF9X2J<WY!!#J!=!!?!!!4%5R*4FAA1G&T:3ZM>G.M98.T!!R-35Z9)%*B=W5A;7Y!!&1!]!!-!!-!"!!&!!9!"Q!(!!=!#!!*!!I!#Q!-!Q!!?!!!$1A!!!U*!!!*!!!!D1M!!!!!!!!!!!!!!!!!!!A!!!!+!!!!#A!!!!I!!!#3!!!!!!%!$1!!!!!
+ -1
+ 0
+ false
+ 3
+ 1
+ 1107821072
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&*!!!!#Q!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#J!=!!?!!!4%5R*4FAA1G&T:3ZM>G.M98.T!!V-35Z9)%*B=W5A<X6U!#"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO<S"F=H*P=CE!&E!Q`````QV'>7ZD>'FP<C"/97VF!"6!!Q!04%F/7#"F=H*P=C"D<W2F!#J!=!!?!!!4%5R*4FAA1G&T:3ZM>G.M98.T!!R-35Z9)%*B=W5A;7Y!!'%!]!!-!!-!"!!%!!5!"!!%!!1!"!!'!!=!#!!*!Q!!?!!!$1A!!!!!!!!!!!!!$1M!!!!!!!!!!!!!!!!!!!!!!!!+!!!"#A!!!!A!!!!1!!!.!!!!$!!!!!!!!!!!!!!"!!I!!!!!
+ -1
+ 0
+ true
+ 3
+ 1
+ 1107821072
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!$,!!!!#!!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!!Z!-P````]%5'&U;!!!)%"1!!-!!!!"!!)4:8*S<X)A;7YA+'ZP)'6S=G^S+1"5!0!!$!!$!!1!"!!&!!1!"!!%!!1!"A!%!!1!"!-!!(A!!!U)!!!!!!!!!!!!!!E!!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!!!!!!!!!!!!!"!!=!!!!!
+ -1
+ 0
+ true
+ 3
+ 1
+ 1082130960
+
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!%2!!!!#1!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#J!=!!?!!!4%5R*4FAA1G&T:3ZM>G.M98.T!!V-35Z9)%*B=W5A<X6U!#"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO<S"F=H*P=CE!+E"Q!"Y!!"-24%F/7#"#98.F,GRW9WRB=X-!$%R*4FAA1G&T:3"J<A!!6!$Q!!Q!!Q!%!!1!"1!%!!1!"!!%!!9!"!!%!!=$!!"Y!!!.#!!!!!!!!!!!!!#*!!!!!!!!!!!!!!!!!!!!!!!!!!I!!!!!!!!!!!!!!*!!!!!!!1!)!!!!!!
+ -1
+ 0
+ false
+ 1
+ 1
+ 1109918224
+
+
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Client.lvclass b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Client.lvclass
new file mode 100644
index 00000000..6e0a3e46
--- /dev/null
+++ b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Client.lvclass
@@ -0,0 +1,174 @@
+
+
+
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!*1!!!*Q(C=\>8.D2."%)<B$]1"K5`$E2.S#B7"*4M%JV!:)&`XN*J.!+F3=!J/I5Z\^Y%%H-,Q>LPQ'AHB#S#%NM@N(8`^^WT0?#S.]FZ[J_6?;7X[37F6,OX,1JV[:5!`7^I9?7FPI\8;J^&\G>L3<NN@RF`@<^L<D_-PLZ@W.PK0;<_P@^P_;`_>IN@S7P\P]H$X3`$(PQ>PV"^%V+1'V;GGPOS3Z%G?Z%G?Z%E?Z%%?Z%%?Z%(OZ%\OZ%\OZ%ZOZ%:OZ%:OZ%9_$H+2CVTEE*,&EY733:-*EMZ1F,QFHM34?")0(Z6Y%E`C34S*BSZ+0)EH]33?R--Q*:\%EXA34_*BKC(*=:$D34R-L]!4?!*0Y!E],+H!%Q##R9+*AUFA+'A-4A*0Y!E]H#LQ"*\!%XA#$]U+0)%H]!3?Q-/1M3MR.0UAR]-U=DS/R`%Y(M@$V()]DM@R/"\(QX*S0)\(14A,/J.$E$0)[?"]=$S/BT^S0)\(]4A?RU04O%)_>K:L_E'/R`!9(M.D?!Q05]DQ'"\$9XA-$^0+]"A?QW.Y$!^,S@!9(M.D1)R&76\':-:!IZ-2'"Z?YW[R=:6C3'Q=5NW]KJN3></J<C,6T;'[[+K,K<J)KMV8<;JKMV3<I0LH6'A62L7);H$PK$0P*_K2?K$/V$VV2^V16^3J$`X.(=`HMU[HEY\(IQ[(A_:ZVH[`VW[XUW;TU7KV%D`'V]@!*Y\L!_(S8(LA`((\`06J_X%^<\_MH\9@VI_@H^=^`QO`T``!MV&P><M'?`1.V>.(IA!!!!!
+ 536903680
+ 1.0.0.3
+ false
+ true
+ true
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!#%Y5F.31QU+!!.-6E.$4%*76Q!!(-!!!!2Y!!!!)!!!(+!!!!!9!!!!!2.-35Z9)%.M;76O>#ZM>G.M98.T!!!!I#!!A!!!-!!!+!!!!!!!!!1!!Q!]!,Q!(U#!!A!!!!!"!!%!"P````]!!!!!!!!!!!!!!!#G+VPG6RK+1YY7TS0OM#OD!!!!$!!!!"!!!!!!5G+B%>*Z_E+E571EOU2]Q.1>D.G0!,)%[9!*G/TY1HY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!`````^1>D.G0!,)%[9!*G/TY1HY!!!!1!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!*Q!"4&:$1Q!!!!%!!F:*4%)!!!!!5&2)-!!!!!5!!1!"!!!!!!)!!Q!!!!!#!!%!!!!!!#)!!!!=?*RD9'.A;G#YQ!$%D%$-V-$U!]D_!/)T!!"I!1AW!!!!!!"&!!!"'(C=9W$!"0_"!%AR-D!QH1$3,'DC9"L'JC<!:3YOO[$CT&!XME*%'9&C4(O!$#;1(+J?E(`!@E)"<&D-"A"W^3A6!!!!!!!!$!!"6EF%5Q!!!!!!!Q!!!5-!!!+=?*RT9'2AS$3W-'M!UMR!L-$1Q*#=HZ,+R1$E-U"!#R-$R3!!;JY7GLDBA=.J1+$(,^]#ZH?\K,!UV[DQ-*8S`3^2Y1BY!2*M0M*RO.MDZ\CD$6A*2R:$&E0!`]#-ZC-]9.X)_HV57!Q0.&1K-Z1+(W]U9949%AAVBO8Q$J$)964\A(IY$DZE[:U)&OA%E:UBD",(82BVR)$M8B\'1)1\U/Q,[Q;[-IMR$#<@T8<=110%0OYA!K%S)&1&B#I!54N!2.RB%,HW^<V>I("B1QI4"SBO!'&'".:D9'1!/:]*#%'G`PH``\].5)1*+K9)&1/R6U,:'EB[4E,&(*$M!?E&G>!,J$7A\-F1>A0583#RKU#[!-K_!YV0%0MR6"W)`1J)#U$:(Y(U!3D\'Z4>!)U.>.L:X]56/5X!UBM!`Z2KE!!!!!!/)!'!"Q!!"D)Q,D!O-1!!!!!!!!QA!)!!!!!%-D!O-!!!!!!/)!'!"Q!!"D)Q,D!O-1!!!!!!!!QA!)!!!!!%-D!O-!!!!!!/)!'!"Q!!"D)Q,D!O-1!!!!!!!"1"!!!!^6=VAHEGIIQO=V*/"EEZH1!!!!U!!!!!!!!!!!!!!!!!!!!!!!!!A0````_!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!]!!"AQQ!!9Q$!!'Q!-!"M!$!!;1$Q!'B$]!"I(`!!;!`Q!'A0]!"I$`!!;!`Q!'A0]!"A$`!!:A`A!'%0A!"A1A!!9"A!!(`````!!!%!0```````````````````````````````````````````Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!(BY!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!(CMKKOM?!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!(CMKAI+#AKLL(A!!!!!!!!!!!!!!!!!!!!!``]!!(CMKAI+#AI+#AI+K[RY!!!!!!!!!!!!!!!!!!$``Q#LKAI+#AI+#AI+#AI+#KOM!!!!!!!!!!!!!!!!!0``!+KK#AI+#AI+#AI+#AI+`KM!!!!!!!!!!!!!!!!!``]!KDM\KAI+#AI+#AI+`P\_KA!!!!!!!!!!!!!!!!$``Q#K/TM\/[I+#AI+`P\_`P[K!!!!!!!!!!!!!!!!!0``!+I\/TM\/TOKL0\_`P\_`KI!!!!!!!!!!!!!!!!!``]!KDM\/TM\/TP_`P\_`P\_KA!!!!!!!!!!!!!!!!$``Q#K/TM\/TM\/`\_`P\_`P[K!!!!!!!!!!!!!!!!!0``!+I\/TM\/TM\`P\_`P\_`KI!!!!!!!!!!!!!!!!!``]!KDM\/TM\/TP_`P\_`P\_KA!!!!!!!!!!!!!!!!$``Q#K/TM\/TM\/`\_`P\_`P[K!!!!!!!!!!!!!!!!!0``!$M\/TM\/TM\`P\_`P\_K[M!!!!!!!!!!!!!!!!!``]!!+3K/TM\/TP_`P\_K[SE!!!!!!!!!!!!!!!!!!$``Q!!!!#E/TM\/`\_K[OE!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!J$M\/TOD!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!+3D!!!!!!!!!!!!!!!!!!!!!!!!!!$```````````````````````````````````````````]!!!!-!!&'5%B1!!!!!!!$!!!!"!!!!!!!!!*Y!!!%[8C=L:1`;".2(->`\TDF*<4Y,L;WA9<%=IV6%CC#NA;DU<Y)F6)M;='J'LRIB'!E@]3J81YB1R?$'92O)?$E%)K\"*=<\+2AB^D"X;5IN*@T>R@P,EUV,NZQ(-@\@,`P`<Z@(I$YD9U,(6D8A<"^`&D5Q;NI"+!6J@$\#<]!NEI/A)TYC1Y*OMJWB1[:U'&)U=*UBF@A/[YWPBIPY25B<!_8HG2_&00K=%L2RK4<=JP*<S@ESAF<69)!WS1>Y;Y=`%%XV4Q;ADJNPK5I[1$B:U62H<S4@J*2:@/P*UL^FK2("];VY9,=0I?+;0X?EC2L5#>Z7R*1=BK;T;9,36UI<'VDTG4K+,N.VA9Q0KY&CH)\9D&?CU'@<>O("TN6=_]GV)_?ZBJ$&,HH^J(LNB=0[IE`=FE>2O4W4?KH?]I8-LSMPA-#J(70'J_..S9P,:EJ7'N^'-25D,!5@K>UO+"KQHU1<;]E6+U92$O'KRA$O78&Y/%6"GY/V8`EQ-87:'!_6S[7-I61`G(I13Z>,);?&BY`3Z=S)36>3B^0+-YVT[RZ?N0-+A?-AAAX).M\\4QU'AU=!,Z>^"KC9X,<Y34L.$FHYII\/>06H>RVH"T`O@,)H.Z54,!\#WZ<,W*<*>;`I3.NP@4`WXI:3\4?VV:1)!,F!=W<\5)^<9UA&1>F!$/(T-;2NE<1*W\\$'LLF?.ND>B?4FNLN6J`7W./7U6#OGV6>YR$YR!\C_-691;S6G@"M^3T=\L\I?R=,D1F=Y0[`\[!*>&M1Y>20O`\S":1<9AOU#4<QF4R/DJ$N_B_[Z.T`<17(6,>)??&B0Q[3->`!6_]9]A!!!!%!!!!)!!!!!1!!!!!!!!!$!!"1E2)5!!!!!!!!Q!!!!1!!!!!!!!!:1!!!(6YH'.A9#A5E'$[RV$XFY&*Y#O1)@W8A6H1D`%X!Q/HH]"B)-UI)!E5FPX,Q#[I$2<70K,,Q1!&KGS-(*)=BQ5ZQ$)=,2I-````6SFCZ0B[Z"J=U2%@/&.FFDS("!"F#"G;!!!!!!!!"!!!!!=!!!^J!!!!"Q!!!#&@<GF@4'&T>%NO<X>O4X>O;7ZH4&:$<'&T=U.M>8.U:8)!!!"4)!#!!!!!!!%!#!!Q`````Q!"!!!!!!!X!!!!!Q!.1!A!"G2F>GFD:1!!$E!Q`````Q2O97VF!!!51&!!!A!!!!%)4%F/7#""5%E!!!%!!A!!!!!!!!!.4EF@37.P<E6E;82P=A!!$8]A!)!!!!!!!1!/1$$`````"%2B>'%!!!%!!!!!$6US-$!R/$!Q.QU!!!!!!2=64'^B:#!G)&6O<'^B:#ZM>G.M98.T!!!"!!!!!!!*!!!.+Q&E!7216%AQ!!!!"!!!!!!!!!!!!!!!!1!!!!%0$5RB?76S,GRW9WRB=X-!!!%!!!!!!!=!!!S`!!!!!!!!!!!!!!S?!#A!!!S9!!!-!!!!!!!!)!!A!"A!!!!!!0```Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^:JH`:JH````^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^:JH`-T-T-T/:-T.G-T-T:JH````^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^:JH`-T-T-T/:`]Z#`]Z#`]Z#`]Z#-T.G-T-T:JH````^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^:JH`-T-T-T/:`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#-T.G-T-T:JH````^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T.G-T/:`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#-T.G-T-T```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:-T/:`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#%2%2-T.G```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:X'Y!X'Y!-T/:`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#`]Z#%2%2%2%2%2%2-T/:```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:X'Y!X'Y!X'Y!X'Y!-T/:`]Z#`]Z#`]Z#`]Z#%2%2%2%2%2%2%2%2%2%2-T/:```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!-T/:-T-T%2%2%2%2%2%2%2%2%2%2%2%2-T/:```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!%2%2%2%2%2%2%2%2%2%2%2%2%2%2-T/:```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!%2%2%2%2%2%2%2%2%2%2%2%2%2%2-T/:```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!%2%2%2%2%2%2%2%2%2%2%2%2%2%2-T/:```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!%2%2%2%2%2%2%2%2%2%2%2%2%2%2-T/:```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^-T/:X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!%2%2%2%2%2%2%2%2%2%2%2%2%2%2-T/:```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!X'Y!%2%2%2%2%2%2%2%2%2%2%2%2-T.G-T.G```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^-W;:-T/:X'Y!X'Y!X'Y!X'Y!X'Y!%2%2%2%2%2%2%2%2-T.G-T-T-W;:```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^-W;:X'Y!X'Y!X'Y!X'Y!%2%2%2%2-T.G-T.G-W;:```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^-W;:X'Y!X'Y!X'Y!X'Y!-W<-```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!```^```^```^```^```^```^```^```^-W;:-W<-```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^```^!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````]!!!!.476S:W6E)%RB?76S=W1"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!N4<7&M<#"'<WZU=Q!"#!%"!!!!!!!!!"J-6E.M98.T5(*J>G&U:52B>'&597*0=G2F=A!!!#5A!)!!!!!!!A!&!!=!!!Q!1!!"`````Q!!!!%!!1!!!!!!!!!!!!!!'UR71WRB=X.1=GFW982F2'&U962J<76T>'&N=!!!!"EA!)!!!!!!!1!&!!=!!!%!!/(5H`)!!!!!!!!!*ER71WRB=X.1=GFW982F2'&U95RB=X2"=("M;76E6'FN:8.U97VQ!!!!'3!!A!!!!!!"!!5!"Q!!!1!!Y>3@]A!!!!!!!!!;4&:$<'&T=V"S;8:B>'6%982B6(FQ:52F=W-!!!!K)!#!!!!!!!%!#!!Q`````Q!"!!!!!!!/!!!!!1!'!&!!!!!"!!!!!!!!!!!!(ER71WRB=X.1=GFW982F2'&U952G<(2%982B5WF[:1!!!"EA!)!!!!!!!1!&!!-!!!%!!!!!!!!!!!!!!!!!!!!!"!!#!!A!!!!%!!!!1!!!!#A!!!!#!!!%!!!!!!U!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A!!!!!!"!!!!!!!!!!!!!!!!!!!!!"EE%Q!!!!!!!UQ#665&11"/!!E!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!K[IK0KOK+D[LKCI_K[IK0A!!!!!!!UQ#!!!!0Q!!!!!!!!!!!!!!Z!!!!6>YH)W115I$12"&8U_L33:K9L)7?O(#F2MP-"!1!C*"8,BUS-S%1/.)JB/ST%W]F"@Q"JI4Z'=3C?"'0B26P[P_LWKATR0@HR`P;S$KXQ]@HNX!4`08=/-89Z^76?=X.Q[?[W1%FQ-`LU)_=W8B[D<X.JMOUJ#\,!UJRQ)R':APD!K\,\F6WEI;W-*0;#9L7T['(:'8"6VJ7\7@U,$TL#$??NGQT$1^)K**C[N`_5@5-AI'D<X)_IA\C4B//2/ZR<H-@G$W_-M=8DIV>I=9OF*%#_HDF-7UO;#HW.Y!I"MW6A!!!'5!!1!#!!-!"!!!!%A!$Q1!!!!!$Q$:!.1!!!"2!!]%!!!!!!]!W1$5!!!!7A!0"!!!!!!0!.E!V!!!!'/!!)1!A!!!$Q$:!.1)5W6H<W5A65E)5W6H<W5A65E)5W6H<W5A65E"-!!!!&*45E-.#A!$4&:$1UR#6F=!!"T!!!!%?!!!!#!!!"SA!!!!!!!!!!!!!!!A!!!!.!!!"'A!!!!?4%F#4A!!!!!!!!&Y4&:45A!!!!!!!!'-5F242Q!!!!!!!!'A1U.46!!!!!!!!!'U4%FW;1!!!!!!!!()1U^/5!!!!!!!!!(=6%UY-!!!!!!!!!(Q2%:%5Q!!!!!!!!)%4%FE=Q!!!!!!!!)96EF$2!!!!!!!!!)M>G6S=Q!!!!1!!!*!5U.45A!!!!!!!!+E2U.15A!!!!!!!!+Y35.04A!!!!!!!!,-;7.M/!!!!!!!!!,A4%FG=!!!!!!!!!,U2F"&?!!!!!!!!!-)2F")9A!!!!!!!!-=2F"421!!!!!!!!-Q6F"%5!!!!!!!!!.%4%FC:!!!!!!!!!.91E2&?!!!!!!!!!.M1E2)9A!!!!!!!!/!1E2421!!!!!!!!/56EF55Q!!!!!!!!/I2&2)5!!!!!!!!!/]466*2!!!!!!!!!013%F46!!!!!!!!!0E5&*5)!!!!!!!!!0Y6E.55!!!!!!!!!1-2F2"1A!!!!!!!!1A!!!!!0````]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!$`````!!!!!!!!!-!!!!!!!!!!!0````]!!!!!!!!!V!!!!!!!!!!!`````Q!!!!!!!!$=!!!!!!!!!!$`````!!!!!!!!!1A!!!!!!!!!!0````]!!!!!!!!"%!!!!!!!!!!!`````Q!!!!!!!!%Y!!!!!!!!!!$`````!!!!!!!!!91!!!!!!!!!!0````]!!!!!!!!"F!!!!!!!!!!%`````Q!!!!!!!!,=!!!!!!!!!!@`````!!!!!!!!!P!!!!!!!!!!#0````]!!!!!!!!$!!!!!!!!!!!*`````Q!!!!!!!!-5!!!!!!!!!!L`````!!!!!!!!!S1!!!!!!!!!!0````]!!!!!!!!$/!!!!!!!!!!!`````Q!!!!!!!!.1!!!!!!!!!!$`````!!!!!!!!!W1!!!!!!!!!!0````]!!!!!!!!$[!!!!!!!!!!!`````Q!!!!!!!!@M!!!!!!!!!!$`````!!!!!!!!"`Q!!!!!!!!!!0````]!!!!!!!!)"!!!!!!!!!!!`````Q!!!!!!!!K!!!!!!!!!!!$`````!!!!!!!!#IA!!!!!!!!!!0````]!!!!!!!!+E!!!!!!!!!!!`````Q!!!!!!!!KA!!!!!!!!!!$`````!!!!!!!!#KA!!!!!!!!!!0````]!!!!!!!!,&!!!!!!!!!!!`````Q!!!!!!!!M=!!!!!!!!!!$`````!!!!!!!!'IQ!!!!!!!!!!0````]!!!!!!!!;F!!!!!!!!!!!`````Q!!!!!!!"K=!!!!!!!!!!$`````!!!!!!!!'MA!!!!!!!!!!0````]!!!!!!!!<4!!!!!!!!!#!`````Q!!!!!!!"QU!!!!!!^-35Z9)%.M;76O>#ZD>'Q!!!!!
+
+
+
+
+!!!!!2.-35Z9)%.M;76O>#ZM>G.M98.T5&2)-!!!!!!!!!!!!!!!#!!"!!!!!!!!!1!!!!%!%%"1!!!)4%V)8UR*4FA!!!%!!!!!!!!!!!!!!!!"$ERB9F:*26=A4W*K:7.U!&"53$!!!!!!!!!!!!!A!)!!!!!!!!!!!@``!!!!!1!!!!!!!1%!!!!#!!V!#!!':'6W;7.F!!"1!0(BU&,X!!!!!B"-45B@4%F/7#ZM>G.M98.T$%R.3&^-35Z9,G.U<!!K1&!!!1!!(5.M>8.U:8)A<W9A9WRB=X-A=(*J>G&U:3"E982B!!%!!1!!!!(`````!!!!!!!!!!!!!!!!!!%/4'&C6EF&6S"09GJF9X1!5&2)-!!!!!!!!!!!!#!!A!!!!!!!!!!"``]!!!!"!!!!!!!#!1!!!!-!$5!)!!:E:8:J9W5!!!Z!-0````]%<G&N:1!!5A$RY>0:UA!!!!)14%V)8UR*4FAO<(:D<'&T=QR-45B@4%F/7#ZD>'Q!,%"1!!)!!!!"(5.M>8.U:8)A<W9A9WRB=X-A=(*J>G&U:3"E982B!!%!!A!!!!)!!!!!`````Q!!!!!!!!!!!!!!!!!!!!!!!1Z-97*73568)%^C;G6D>!"16%AQ!!!!!!!!!!!!)!#!!!!!!!!!!!(``Q!!!!%!!!!!!!!#!!!!!Q!.1!A!"G2F>GFD:1!!$E!Q`````Q2O97VF!!"3!0(BU^H3!!!!!B"-45B@4%F/7#ZM>G.M98.T$%R.3&^-35Z9,G.U<!!M1&!!!A!!!!%>1WRV=X2F=C"P:C"D<'&T=S"Q=GFW982F)'2B>'%!!1!#!!!!!@````Y!!!!!!!!!!!!!!!!!!!!!!!%/4'&C6EF&6S"09GJF9X1!5&2)-!!!!!!!!!!!!#!!A!!!!!!!!!!"``]!!!!"!!!!!!!!!!!!!!-!$5!)!!:E:8:J9W5!!!Z!-0````]%<G&N:1!!5A$RY>0:UA!!!!)14%V)8UR*4FAO<(:D<'&T=QR-45B@4%F/7#ZD>'Q!,%"1!!)!!!!"(5.M>8.U:8)A<W9A9WRB=X-A=(*J>G&U:3"E982B!!%!!A!!!!(````_!!!!!!!!!!!!!!!!!!!!!!!"$ERB9F:*26=A4W*K:7.U!&"53$!!!!!!!!!!!!!)9)!"!!!!!!!!!@``!!!!!1!!!!!!!1!!!!!$!!V!#!!':'6W;7.F!!!/1$$`````"'ZB<75!!&A!]?(5GQM!!!!#%UR*4FAA1WRJ:7ZU,GRW9WRB=X-04%F/7#"$<'FF<H1O9X2M!#R!5!!#!!!!!2V$<(6T>'6S)'^G)'.M98.T)("S;8:B>'5A:'&U91!"!!)!!!!#``````````]!!!!!!!!!!!!!!!!!!!!"$ERB9F:*26=A4W*K:7.U!&"53$!!!!!!!!!!!!!)9)!"!!!!!!!!!@``!!!!!1!!!!!!!A!!!!!$!!V!#!!':'6W;7.F!!!/1$$`````"'ZB<75!!&A!]?(5GQM!!!!#%UR*4FAA1WRJ:7ZU,GRW9WRB=X-04%F/7#"$<'FF<H1O9X2M!#R!5!!#!!!!!2V$<(6T>'6S)'^G)'.M98.T)("S;8:B>'5A:'&U91!"!!)!!!!"`````A!!!!!!!!!!!!!!!!!!!!%24%F/7#"#98.F,GRW9WRB=X.16%AQ!!!!!!!!!!!!#'#!!1!!!!!!!!!!!!!"!!!!!!!$!!!!!!%!6!$RY>3@]A!!!!)44%F/7#"$<'FF<H1O<(:D<'&T=Q^-35Z9)%.M;76O>#ZD>'Q!+%"1!!!>1WRV=X2F=C"P:C"D<'&T=S"Q=GFW982F)'2B>'%!!1!!!!!!!!!!!!!!!!%24%F/7#"#98.F,GRW9WRB=X.16%AQ!!!!!!!!!!!!#'#!!1!!!!!!!!!!!!)!!!!14%V)8UR*4FAO<(:D<'&T=Q!!!""-35Z9)%&133ZM>G.M98.T
+
+
+
+
+ false
+ 1.0.0.3
+ 3
+ 50 48 48 49 56 48 48 55 13 0 0 0 0 1 23 21 76 111 97 100 32 38 32 85 110 108 111 97 100 46 108 118 99 108 97 115 115 0 0 1 0 0 0 0 0 9 0 0 13 45 1 100 0 0 80 84 72 48 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 15 13 76 97 121 101 114 46 108 118 99 108 97 115 115 0 0 1 0 0 0 0 0 7 0 0 12 187 0 0 0 0 0 0 0 0 0 0 12 158 0 40 0 0 12 152 0 0 12 0 0 0 0 0 0 32 0 32 0 24 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 67 108 105 112 98 111 97 114 100 100 1 0 0 0 0 0 6 67 108 105 101 110 116 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 83 109 97 108 108 32 70 111 110 116 115 0 1 8 1 1
+
+ -
+
+
+ -
+ 2
+
+ -
+
+
+ -
+
-
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&D!!!!$1!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!%%!Q`````Q:T>(*J<G=!!"*!1!!"`````Q!%"5ZB<76T!!5!"1!!&E"!!!(`````!!9)1WBB<GZF<(-!!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$UR*4FAA1WRJ:7ZU)'^V>!!%!!!!)%"1!!-!!!!"!!)4:8*S<X)A;7YA+'ZP)'6S=G^S+1!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!Z-35Z9)%.M;76O>#"J<A!!91$Q!!Q!!Q!&!!=!#!!*!!E!#1!*!!I!#1!*!!M$!!"Y!!!.#!!!#1!!!!E!!!!.#Q!!!!!!!!!!!!!!!!!!!!!!!!I!!!!!!!!!!!!!!!I!!!U!!!!-!!!!!!!!!!!!!!%!$!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1107821072
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&(!!!!#Q!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!!V!"1!(1WBB<GZF<!!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!^-35Z9)%.M;76O>#"P>81!)%"1!!-!!!!"!!)4:8*S<X)A;7YA+'ZP)'6S=G^S+1!51$$`````#V.F=GFB<#"1<X*U!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$ER*4FAA1WRJ:7ZU)'FO!!"B!0!!$!!$!!1!"1!'!!1!"!!%!!1!"Q!%!!A!#1-!!(A!!!U)!!!!!!!!#1!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!)!!!!#A!!$1!!!!Q!!!!!!!!!!!!!!1!+!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1109918224
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&8!!!!$!!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!&5!(!!^"9X2V97QA1G&V:(*B>'5!"!!!!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$UR*4FAA1WRJ:7ZU)'^V>!!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!!^!"Q!)1G&V:(*B>'5!!!V!"1!(1WBB<GZF<!!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!Z-35Z9)%.M;76O>#"J<A!!91$Q!!Q!!Q!%!!5!"A!&!!5!"1!&!!=!#!!*!!I$!!"Y!!!.#!!!#1!!!!!!!!!.#Q!!!!!!!!!!!!!!!!!!!!!!!!I!!!!+!!!!#!!!!!I!!!U!!!!-!!!!!!!!!!!!!!%!#Q!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1107821072
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!(0!!!!$Q!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!&5!(!!^"9X2V97QA1G&V:(*B>'5!"!!!!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$UR*4FAA1WRJ:7ZU)'^V>!!01!5!#6.U<X!A1GFU=Q";!0%!!!!!!!!!!B&-35Z9)%*B=W5O<(:D<'&T=QJ198*J>(EO9X2M!$6!&1!'"UFO>G&M;71%4G^O:1.0:'1%28:F<A2.98*L"6.Q97.F!!!'5'&S;82Z!!!01!5!#52B>'%A1GFU=Q!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!!^!"Q!)1G&V:(*B>'5!!!V!"1!(1WBB<GZF<!!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!Z-35Z9)%.M;76O>#"J<A!!91$Q!!Q!!Q!%!!5!"A!&!!=!#!!*!!I!#Q!-!!U$!!"Y!!!.#!!!#1!!!!!!!!!.#Q!!!!!!!!A!!!!)!!!!#!!!!!I!!!!+!!!!#!!!!!I!!!U!!!!-!!!!!!!!!!!!!!%!$A!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1109918224
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&#!!!!#Q!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!$U!$!!F/>7UA1HFU:8-!"!!!!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$UR*4FAA1WRJ:7ZU)'^V>!!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!!V!"1!(1WBB<GZF<!!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!Z-35Z9)%.M;76O>#"J<A!!91$Q!!Q!!Q!%!!5!"A!&!!5!"1!&!!=!"1!)!!E$!!"Y!!!.#!!!#1!!!!!!!!!.#Q!!!!!!!!!!!!!!!!!!!!!!!!I!!!!!!!!!#!!!!!I!!!U!!!!-!!!!!!!!!!!!!!%!#A!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1109918224
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&J!!!!$1!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$UR*4FAA1WRJ:7ZU)'^V>!!81!-!%&2J<76P>81A+$-Q-$"N=SE!!#"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO<S"F=H*P=CE!$5!&!!>/>7VF=GFD!"*!1!!"`````Q!)"5*Z>'6T!!V!"1!(1WBB<GZF<!!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!Z-35Z9)%.M;76O>#"J<A!!91$Q!!Q!!Q!%!!1!"1!%!!1!"A!%!!=!#1!+!!M$!!"Y!!!.#!!!!!!!!!!!!!!.#Q!!!!!!!!!!!!!)!!!!!!!!!!I!!!)+!!!!#!!!!!I!!!U!!!!-!!!!!!!!!!!!!!%!$!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1342710288
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&9!!!!$!!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$UR*4FAA1WRJ:7ZU)'^V>!!81!-!%&2J<76P>81A+$-Q-$"N=SE!!#"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO<S"F=H*P=CE!$E!Q`````Q2%982B!!!.1!5!"U.I97ZO:7Q!,E"Q!"Y!!"544%F/7#"$<'FF<H1O<(:D<'&T=Q!/4%F/7#"$<'FF<H1A;7Y!!'%!]!!-!!-!"!!%!!5!"!!%!!9!"!!(!!A!#1!+!Q!!?!!!$1A!!!!!!!!!!!!!$1M!!!!!!!!!!!!!#!!!!!!!!!!+!!!##A!!!!A!!!!+!!!.!!!!$!!!!!!!!!!!!!!"!!M!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1342710288
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&]!!!!$A!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!$5!&!!>/>7VF=GFD!"*!1!!"`````Q!%"5*Z>'6T!!1!!!!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!^-35Z9)%.M;76O>#"P>81!&U!$!""5;7VF<X6U)#AT-$!Q<8-J!!!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!".!!Q!.1HFU:8-A6']A5G6B:!!.1!5!"U.I97ZO:7Q!,E"Q!"Y!!"544%F/7#"$<'FF<H1O<(:D<'&T=Q!/4%F/7#"$<'FF<H1A;7Y!!'%!]!!-!!-!"1!'!!=!"A!'!!A!"A!*!!I!#Q!-!Q!!?!!!$1A!!!E!!!!!!!!!$1M!!!!!!!!!!!!!#!!!!!!!!!!+!!!!#!!!!!A!!!!+!!!.!!!!$!!!!!!!!!!!!!!"!!U!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1107821072
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!&L!!!!$1!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!$E!Q`````Q6#?82F=Q!%!!!!,E"Q!"Y!!"544%F/7#"$<'FF<H1O<(:D<'&T=Q!04%F/7#"$<'FF<H1A<X6U!">!!Q!16'FN:7^V>#!I-T!Q-'VT+1!!)%"1!!-!!!!"!!)4:8*S<X)A;7YA+'ZP)'6S=G^S+1!41!-!$5*Z>'6T)&2P)&*F971!$5!&!!>$;'&O<G6M!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$ER*4FAA1WRJ:7ZU)'FO!!"B!0!!$!!$!!1!"1!'!!5!"1!(!!5!#!!*!!I!#Q-!!(A!!!U)!!!*!!!!!!!!!!U,!!!!!!!!!!!!!!A!!!!!!!!!#A!!!!A!!!!)!!!!#A!!$1!!!!Q!!!!!!!!!!!!!!1!-!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1115685392
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!%T!!!!#A!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$UR*4FAA1WRJ:7ZU)'^V>!!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!!V!"1!(1WBB<GZF<!!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!Z-35Z9)%.M;76O>#"J<A!!91$Q!!Q!!Q!%!!1!"1!%!!1!"!!%!!9!"!!(!!A$!!"Y!!!.#!!!!!!!!!!!!!!.#Q!!!!!!!!!!!!!!!!!!!!!!!!I!!!!!!!!!#!!!!!I!!!U!!!!-!!!!!!!!!!!!!!%!#1!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1109918224
+
+
+
+ -
+
-
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!$`!!!!#1!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!"2!-0````],2'6W;7.F)%ZB<75!,E"Q!"Y!!"544%F/7#"$<'FF<H1O<(:D<'&T=Q!04%F/7#"$<'FF<H1A<X6U!#"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO<S"F=H*P=CE!6!$Q!!Q!!Q!%!!5!"A!%!!1!"!!%!!=!"!!%!!1$!!"Y!!!.#!!!!!!!!!E!!!!*!!!!!!!!!!!!!!!!!!!!!!!!!!I!!!!!!!!!!!!!!!!!!!!!!1!)!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1342710288
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!(!!!!!%!!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!$U!(!!BC986E=G&U:1!!&%!Q`````QN%:8:J9W5A4G&N:1!O1(!!(A!!&2.-35Z9)%.M;76O>#ZM>G.M98.T!!^-35Z9)%.M;76O>#"P>81!&U!(!""5;7VF<X6U)#AT-$!Q<8-J!!!01!5!#6.U<X!A1GFU=Q";!0%!!!!!!!!!!B&-35Z9)%*B=W5O<(:D<'&T=QJ198*J>(EO9X2M!$6!&1!'"UFO>G&M;71%4G^O:1.0:'1%28:F<A2.98*L"6.Q97.F!!!'5'&S;82Z!!!01!5!#52B>'%A1GFU=Q!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!!^!"Q!)1G&V:(*B>'5!!"2!-0````],5W6S;7&M)&"P=H1!"!!!!&1!]!!-!!-!"!!&!!9!"Q!)!!E!#A!,!!Q!$1!/!Q!!?!!!$1A!!!U*!!!*!!!!#1!!!!A!!!!)!!!!#!!!!!A!!!!+!!!!#A!!!1I!!!!!!!!!!!%!$Q!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1342710288
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!%Z!!!!$!!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!"2!-0````],2'6W;7.F)%ZB<75!,E"Q!"Y!!"544%F/7#"$<'FF<H1O<(:D<'&T=Q!04%F/7#"$<'FF<H1A<X6U!">!"Q!16'FN:7^V>#!I-T!Q-'VT+1!!)%"1!!-!!!!"!!)4:8*S<X)A;7YA+'ZP)'6S=G^S+1!,1!9!"&"P=H1!!"B!-0````]04G6U>W^S;S"":'2S:8.T!&1!]!!-!!-!"!!&!!9!"Q!%!!1!"!!)!!E!#A!%!Q!!?!!!$1A!!!!!!!!*!!!!#1!!!!A!!!!!!!!!!!!!!!!!!!!+!!!!#!!!!1I!!!!!!!!!!!%!#Q!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1342710288
+
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!!1!!!!!1!)!0*U*B;9!!%!!!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1082143248
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!%G!!!!#1!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$UR*4FAA1WRJ:7ZU)'^V>!!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!#Z!=!!?!!!6%UR*4FAA1WRJ:7ZU,GRW9WRB=X-!$ER*4FAA1WRJ:7ZU)'FO!!"B!0!!$!!$!!1!"!!&!!1!"!!%!!1!"A!%!!1!"Q-!!(A!!!U)!!!!!!!!!!!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!!!!!!#A!!$1!!!!Q!!!!!!!!!!!!!!1!)!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1115685392
+
+
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Server.lvclass b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Server.lvclass
new file mode 100644
index 00000000..e2f3fe6b
--- /dev/null
+++ b/LabVIEW/vi.lib/MakerHub/LINX/API/LINX Server.lvclass
@@ -0,0 +1,68 @@
+
+
+
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!*7!!!*Q(C=\:5^DB."%%;`211L441X1"93"[AL/('/Y1;6<_2U2?36%#)NC20Y#LZ#;7`A!Z$-&9<8\7+]Q1IHA"$;<N@]@.66^>T><EO^X5KP.6^LQT!_UY:KX=_IR=:Z\!^$$_X_O18-:ZOLDU.TH0V$$_OWR0?8CG_X3XR^REP]`$0WYG]PC``8`&?;8NJ,_\`<`>5@Q2``(>SI(5299I%Z:GJFZU20^%20^%20^%!0^%!0^%!0>%>X>%>X>%>X>%-X>%-X>%-X^.\2B3ZUI9/5&%]+*5G4"-FA5*2=%J[%*_&*?(B6QJ0Q*$Q*4],$%#5]#5`#E`!E0)1JY5FY%J[%*_%B63@*XN(B38B)LY!HY!FY!J[!BZ)+?!+!I&C1/%A#BA*H]"$Q"$Q"$Y]+?!+?A#@A#8BQ+_!*?!+?A#@A);403H3;VN(B)9U=(I@(Y8&Y("Z3S_&R?"Q?B]@BI:Q=(I@(A8!+/MF"E"0E$("?("[(BZM=(I@(Y8&Y("Z=@97]TUSD;2U>(I0(Y$&Y$"[$BR1S?!Q?A]@A-8B)+Y0(Y$&Y$"[$BV)S?!Q?A]=!-9J38E9S)^!9:!A'$Z__7[SP5H13[VWKT;P;F+L.JNJ%KMWB7H469KI7348ZKEF64::K%F2@4A7NAF%6517XA:KYHL!D>M$WW!\<9GNMB9UN^$=0H+:*J^.*R_.2B]."_`V?O^V/W_V7[`6;K^6+`"EPR]!<_H)AH-_F?Z[`4"`PPD[]XXR_`($X[?(NZNPX>ZOG`Y8`ZX`A<.1L0;X"(0U!1H65#!!!!!!
+ 536903680
+ 1.0.0.1
+ false
+ true
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!"-I5F.31QU+!!.-6E.$4%*76Q!!$L!!!!2Y!!!!)!!!$J!!!!!9!!!!!2.-35Z9)&.F=H:F=CZM>G.M98.T!!!!I#!!A!!!-!!!+!!!!!!!!!1!!Q!]!,Q!(U#!!A!!!!!"!!%!"P````]!!!!!!!!!!!!!!!"*(P!MP3B:2J(NGA-<N69%!!!!$!!!!"!!!!!"+0>Y4VX_55O5B7*)N"<%5.1>D.G0!,)%[9!*G/TY1HY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!`````^1>D.G0!,)%[9!*G/TY1HY!!!!1!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!*Q!"4&:$1Q!!!!%!!F:*4%)!!!!!5&2)-!!!!!5!!1!"!!!!!!)!!Q!!!!!#!!%!!!!!!#)!!!!=?*RD9'.A;G#YQ!$%D%$-V-$U!]D_!/)T!!"I!1AW!!!!!!"&!!!"'(C=9W$!"0_"!%AR-D!QH1$3,'DC9"L'JC<!:3YOO[$CT&!XME*%'9&C4(O!$#;1(+J?E(`!@E)"<&D-"A"W^3A6!!!!!!!!$!!"6EF%5Q!!!!!!!Q!!!5-!!!+=?*RT9'2AS$3W-'M!UMR!L-$1Q*#=HZ,+R1$E-U"!#R-$R3!!;JY7GLDBA=.J1+$(,^]#ZH?\K,!UV[DQ-*8S`3^2Y1BY!2*M0M*RO.MDZ\CD$6A*2R:$&E0!`]#-ZC-]9.X)_HV57!Q0.&1K-Z1+(W]U9949%AAVBO8Q$J$)964\A(IY$DZE[:U)&OA%E:UBD",(82BVR)$M8B\'1)1\U/Q,[Q;[-IMR$#<@T8<=110%0OYA!K%S)&1&B#I!54N!2.RB%,HW^<V>I("B1QI4"SBO!'&'".:D9'1!/:]*#%'G`PH``\].5)1*+K9)&1/R6U,:'EB[4E,&(*$M!?E&G>!,J$7A\-F1>A0583#RKU#[!-K_!YV0%0MR6"W)`1J)#U$:(Y(U!3D\'Z4>!)U.>.L:X]56/5X!UBM!`Z2KE!!!!!!/)!'!"Q!!"D)Q,D!O-1!!!!!!!!QA!)!!!!!%-D!O-!!!!!!/)!'!"Q!!"D)Q,D!O-1!!!!!!!!QA!)!!!!!%-D!O-!!!!!!/)!'!"Q!!"D)Q,D!O-1!!!!!!!"1"!!!!^6=VAHEGIIQO=V*/"EEZH1!!!!U!!!!!!!!!!!!!!!!!!!!!!!!!A0````_!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9"A!!'"G!!"BA9!!:A"A!'A!%!"M!$!!;Q$1!'D$M!"I06!!;!KQ!'A.5!"I#L!!;!V1!'A+M!"I$6!!:ALA!''.A!"A<A!!9"A!!(`````!!!%!0```````````````````````````````````````````Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!(BY!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!(CMKKOM?!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!(CMKAI+#AKLL(A!!!!!!!!!!!!!!!!!!!!!``]!!(CMKAI+#AI+#AI+K[RY!!!!!!!!!!!!!!!!!!$``Q#LKAI+#AI+#AI+#AI+#KOM!!!!!!!!!!!!!!!!!0``!+KK#AI+#AI+#AI+#AI+`KM!!!!!!!!!!!!!!!!!``]!KDM\KAI+#AI+#AI+`P\_KA!!!!!!!!!!!!!!!!$``Q#K/TM\/[I+#AI+`P\_`P[K!!!!!!!!!!!!!!!!!0``!+I\/TM\/TOKL0\_`P\_`KI!!!!!!!!!!!!!!!!!``]!KDM\/TM\/TP_`P\_`P\_KA!!!!!!!!!!!!!!!!$``Q#K/TM\/TM\/`\_`P\_`P[K!!!!!!!!!!!!!!!!!0``!+I\/TM\/TM\`P\_`P\_`KI!!!!!!!!!!!!!!!!!``]!KDM\/TM\/TP_`P\_`P\_KA!!!!!!!!!!!!!!!!$``Q#K/TM\/TM\/`\_`P\_`P[K!!!!!!!!!!!!!!!!!0``!$M\/TM\/TM\`P\_`P\_K[M!!!!!!!!!!!!!!!!!``]!!+3K/TM\/TP_`P\_K[SE!!!!!!!!!!!!!!!!!!$``Q!!!!#E/TM\/`\_K[OE!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!J$M\/TOD!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!+3D!!!!!!!!!!!!!!!!!!!!!!!!!!$```````````````````````````````````````````]!!!!-!!&'5%B1!!!!!!!$!!!!"!!!!!!!!!*X!!!%[8C=L:1`;".2(->`\\D+3\$Y,L;W"QW*Y2K,<5!-;AV6CXU6+K5IN?"1--',6GC.ZE^R;J>$S.!JE%(I)%B7BQQ[/)A%FVM[C)->1A>XF[*A,_@P88JX->7YG-"RB0@Z`>\\@4^Z!0*8.CSV9--#QP<R:>[#I'Y3A%;#QO%H`BT9%PE*:%!F&ET4*<9LN=C)"=>V-U\0]4*]Q^8W3XM#0J%6NI>,DT%6CQ5N/+'<1]J.L=GUVS.;O=_NKE#9<:'7>&?,@+><2AY<AD%GHEK#N)$QU\*MR'ZF(G=.4@Q;3&$6+2GQA('T0[]VTW"&<0X"+3G.EZAUZ:9%,$E'^8L>BZ1W&(?W-9E-C1'1J$4?AQFR-VT1GB-/%X19\*.U_`")KS,W,K"O^#1X';,)04M]MG">TJL_)\>CQ9$7P%Z6OK>`[?O`<<Q"!K2RD^JP\88"+QMC"7>N#)-942'WC/_,&JQV4#H.:(?]*;AY-=BO$&-CBBN/$!&?:O$H50F($FROR-)TK[6#-:O0ZBZ%\[^G#I8IE`SD^5QR'^5TR=T2B+ZQ5UW+UYNGDBQQ#$)]B84HN(.1K^6Q!0DUU;O)$GF.DV/=U_D?R(6`=K+L0\FL/$H_Y]Z$-<X2F/1[#\[NZ^&7B86P[$><,`R`7S_C2"N>NM)S@N>[G(?J$@GWYHK!.6DOQ5QCM^FJ;\O,W[?8L:?0W#L9,FOLV7KXL3H06JG1NKX'DHVA([#T/&Y:UJ"WH)8!1M@/[?\(EH?ZU%7.WV4^_Q)WC]UW,2DE-[(X<%\]!_A=H78<G#J?2[@I.NVP@0;OH];]2RI\])[]UFZ%[0!PA1:B<A!!!!!%!!!!)!!!!!1!!!!!!!!!$!!"1E2)5!!!!!!!!Q!!!!1!!!!!!!!!:1!!!(6YH'.A9#A5E'$[RV$XFY&*Y#O1)@W8A6H1D`%X!Q/HH]"B)-UI)!E5FPX,Q#[I$2<70K,,Q1!&KGS-(*)=BQ5ZQ$)=,2I-````6SFCZ0B[Z"J=U2%@/&.FFDS("!"F#"G;!!!!!!!!"!!!!!=!!!&:!!!!"1!!!"J-6E.M98.T5(*J>G&U:52B>'&597*0=G2F=A!!!#5A!)!!!!!!!A!&!!=!!!Q!1!!"`````Q!!!!%!!1!!!!!!!!!!!!!!'UR71WRB=X.1=GFW982F2'&U962J<76T>'&N=!!!!"EA!)!!!!!!!1!&!!=!!!%!!/(5@%Q!!!!!!!!!*ER71WRB=X.1=GFW982F2'&U95RB=X2"=("M;76E6'FN:8.U97VQ!!!!'3!!A!!!!!!"!!5!"Q!!!1!!Y>2]4!!!!!!!!!!;4&:$<'&T=V"S;8:B>'6%982B6(FQ:52F=W-!!!!K)!#!!!!!!!%!#!!Q`````Q!"!!!!!!!/!!!!!1!'!&!!!!!"!!!!!!!!!!!!(ER71WRB=X.1=GFW982F2'&U952G<(2%982B5WF[:1!!!"EA!)!!!!!!!1!&!!-!!!%!!!!!!!!!!!!!!!!!!!!!"!!#!!A!!!!%!!!!1!!!!#A!!!!#!!!%!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A!!!!!!"!!!!!!!!!!!!!!!!!!!!!"EE%Q!!!!!!!UQ#665&11"/!!E!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!K[IK0KOK+D[LKCI_K[IK0A!!!!!!!UQ#!!!!0Q!!!!!!!!!!!!!!YA!!!6>YH)W115I$12"&8U_L33:KIFE,P8$BSIU8'"!%)5AQ,FQ[:(J%;"C:[1QO8(B),_!.^!<_4#)+<M+(IOJXV@^6$5SYY_PD`85+**0J^=W^G`O[^@6Z;"=B<ZL28WY2!W@:$%YOQ\+*PH:6[<IW^VQ`N8HULMBDTKZ!3A(G%[0#<EIOF![S(L9-D`3T.VP>RD8BKZ+RN+X;^_D::6'3LLRM@#EU03/BTY$4L@Q4/BE&A]9?:,X$F51=_RS)8/&1:D]Q'`RH@F^'(>;('-:32!PJYZ3F$$HC7((Y$>6N.<U!!!!!!'5!!1!#!!-!"!!!!%A!$Q1!!!!!$Q$:!.1!!!"2!!]%!!!!!!]!W1$5!!!!7A!0"!!!!!!0!.E!V!!!!'/!!)1!A!!!$Q$:!.1)5W6H<W5A65E)5W6H<W5A65E)5W6H<W5A65E"-!!!!&*45E-.#A!$4&:$1UR#6F=!!![Q!!!%?!!!!#!!!![1!!!!!!!!!!!!!!!A!!!!.!!!"'A!!!!?4%F#4A!!!!!!!!&Y4&:45A!!!!!!!!'-5F242Q!!!!!!!!'A1U.46!!!!!!!!!'U4%FW;1!!!!!!!!()1U^/5!!!!!!!!!(=6%UY-!!!!!!!!!(Q2%:%5Q!!!!!!!!)%4%FE=Q!!!!!!!!)96EF$2!!!!!!!!!)M>G6S=Q!!!!1!!!*!5U.45A!!!!!!!!+E2U.15A!!!!!!!!+Y35.04A!!!!!!!!,-;7.M/!!!!!!!!!,A4%FG=!!!!!!!!!,U2F"&?!!!!!!!!!-)2F")9A!!!!!!!!-=2F"421!!!!!!!!-Q6F"%5!!!!!!!!!.%4%FC:!!!!!!!!!.91E2&?!!!!!!!!!.M1E2)9A!!!!!!!!/!1E2421!!!!!!!!/56EF55Q!!!!!!!!/I2&2)5!!!!!!!!!/]466*2!!!!!!!!!013%F46!!!!!!!!!0E5&*5)!!!!!!!!!0Y6E.55!!!!!!!!!1-2F2"1A!!!!!!!!1A!!!!!0````]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!$`````!!!!!!!!!-!!!!!!!!!!!0````]!!!!!!!!!V!!!!!!!!!!!`````Q!!!!!!!!$=!!!!!!!!!!$`````!!!!!!!!!1A!!!!!!!!!!0````]!!!!!!!!"%!!!!!!!!!!!`````Q!!!!!!!!%Y!!!!!!!!!!$`````!!!!!!!!!91!!!!!!!!!!0````]!!!!!!!!"F!!!!!!!!!!%`````Q!!!!!!!!,=!!!!!!!!!!@`````!!!!!!!!!P!!!!!!!!!!#0````]!!!!!!!!$!!!!!!!!!!!*`````Q!!!!!!!!-5!!!!!!!!!!L`````!!!!!!!!!S1!!!!!!!!!!0````]!!!!!!!!$/!!!!!!!!!!!`````Q!!!!!!!!.1!!!!!!!!!!$`````!!!!!!!!!W1!!!!!!!!!!0````]!!!!!!!!$[!!!!!!!!!!!`````Q!!!!!!!!@M!!!!!!!!!!$`````!!!!!!!!"`Q!!!!!!!!!!0````]!!!!!!!!)"!!!!!!!!!!!`````Q!!!!!!!!K!!!!!!!!!!!$`````!!!!!!!!#IA!!!!!!!!!!0````]!!!!!!!!+E!!!!!!!!!!!`````Q!!!!!!!!KA!!!!!!!!!!$`````!!!!!!!!#KA!!!!!!!!!!0````]!!!!!!!!,&!!!!!!!!!!!`````Q!!!!!!!!M=!!!!!!!!!!$`````!!!!!!!!$(Q!!!!!!!!!!0````]!!!!!!!!-B!!!!!!!!!!!`````Q!!!!!!!!S-!!!!!!!!!!$`````!!!!!!!!$,A!!!!!!!!!!0````]!!!!!!!!.0!!!!!!!!!#!`````Q!!!!!!!!YE!!!!!!^-35Z9)&.F=H:F=CZD>'Q!!!!!
+
+
+
+
+!!!!!2.-35Z9)&.F=H:F=CZM>G.M98.T5&2)-!!!!!!!!!!!!!!!!A!"!!!!!!!!!!!!!!%!"A"1!!!!!1!!!!!!!!!!!!!"$ERB9F:*26=A4W*K:7.U!&"53$!!!!!!!!!!!!!)9)!"!!!!!!!!!@``!!!!!1!!!!!!!1!!!!!"!!9!5!!!!!%!!!!!!!(````_!!!!!!%24%F/7#"#98.F,GRW9WRB=X.16%AQ!!!!!!!!!!!!#'#!!1!!!!!!!!!!!!!
+
+
+
+
+ false
+ 1.0.0.1
+ 3
+ 50 48 48 49 56 48 48 55 13 0 0 0 0 1 23 21 76 111 97 100 32 38 32 85 110 108 111 97 100 46 108 118 99 108 97 115 115 0 0 1 0 0 0 0 0 9 0 0 13 37 1 100 1 100 80 84 72 48 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 15 13 76 97 121 101 114 46 108 118 99 108 97 115 115 0 0 1 0 0 0 0 0 7 0 0 12 185 0 0 0 0 0 0 0 0 0 0 12 158 0 40 0 0 12 152 0 0 12 0 0 0 0 0 0 32 0 32 0 24 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 153 0 0 0 0 0 0 0 0 0 0 255 153 0 0 0 0 0 0 0 0 0 0 255 153 0 0 0 0 0 0 0 0 0 0 255 153 0 255 153 0 0 0 0 255 153 0 0 0 0 255 153 0 0 0 0 0 0 0 0 0 0 255 204 0 0 0 0 0 0 0 0 0 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 0 0 0 255 153 0 255 153 0 255 153 0 255 153 0 0 0 0 255 153 0 255 153 0 255 153 0 0 0 0 255 153 0 255 153 0 0 0 0 255 153 0 0 0 0 255 153 0 0 0 0 255 153 0 0 0 0 255 153 0 255 153 0 255 204 0 0 0 0 255 204 0 255 204 0 0 0 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 153 0 255 153 0 0 0 0 0 0 0 255 153 0 255 153 0 0 0 0 0 0 0 0 0 0 255 153 0 255 153 0 0 0 0 255 153 0 0 0 0 255 153 0 0 0 0 0 0 0 255 153 0 255 153 0 0 0 0 0 0 0 0 0 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 255 153 0 0 0 0 255 153 0 255 153 0 255 153 0 0 0 0 255 153 0 255 153 0 0 0 0 255 153 0 255 153 0 0 0 0 255 153 0 255 153 0 0 0 0 255 153 0 255 153 0 255 153 0 0 0 0 255 204 0 255 204 0 0 0 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 0 0 0 0 0 0 0 0 0 255 153 0 255 153 0 0 0 0 0 0 0 0 0 0 255 153 0 0 0 0 255 153 0 255 153 0 0 0 0 255 153 0 255 153 0 0 0 0 255 153 0 255 153 0 0 0 0 0 0 0 0 0 0 255 153 0 0 0 0 255 204 0 255 204 0 0 0 0 255 204 0 255 204 0 0 0 0 0 0 0 255 204 0 255 204 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 153 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 255 204 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 86 73 32 73 99 111 110 100 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 83 109 97 108 108 32 70 111 110 116 115 0 1 8 1 1
+
+ -
+
+
+ -
+ 2
+
+ -
+
-
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!'4!!!!$A!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#Z!=!!?!!!6%UR*4FAA5W6S>G6S,GRW9WRB=X-!$UR*4FAA5W6S>G6S)'^V>!!.1!=!"V2J<76P>81!$U!&!!F4>'^Q)%*J>(-!7A$R!!!!!!!!!!)24%F/7#"#98.F,GRW9WRB=X-+5'&S;82Z,G.U<!!V1"5!"A>*<H:B<'FE"%ZP<G5$4W2E"%6W:7Y%47&S;Q64='&D:1!!"F"B=GFU?1!!$U!&!!F%982B)%*J>(-!)%"1!!-!!!!"!!)4:8*S<X)A;7YA+'ZP)'6S=G^S+1!01!=!#%*B>72S982F!!!51$$`````#V.F=GFB<#"1<X*U!&1!]!!-!!-!"!!%!!5!"A!(!!A!#1!+!!M!$!!%!Q!!?!!!$1A!!!!!!!!!!!!!#1!!!!A!!!!)!!!!#!!!!!A!!!!+!!!!#A!!!1I!!!!!!!!!!!%!$1!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1342710288
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!%1!!!!#A!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#Z!=!!?!!!6%UR*4FAA5W6S>G6S,GRW9WRB=X-!$UR*4FAA5W6S>G6S)'^V>!!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!!N!"A!%5'^S>!!!'E!Q`````R&*<H2F=G:B9W5A172E=G6T=Q"5!0!!$!!$!!1!"!!&!!1!"!!%!!1!"A!(!!A!"!-!!(A!!!U)!!!!!!!!!!!!!!E!!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!I!!!%+!!!!!!!!!!!"!!E!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1342972432
+
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!!1!!!!!1!)!0*V=;GY!!%!!!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1082401296
+
+ -
+ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!%Y!!!!#A!-1#%'=X2B>(6T!!!,1!-!"'.P:'5!!""!-0````]'=W^V=G.F!!!71&!!!Q!!!!%!!AFF=H*P=C"P>81!"!!!!#Z!=!!?!!!6%UR*4FAA5W6S>G6S,GRW9WRB=X-!$UR*4FAA5W6S>G6S)'^V>!!A1&!!!Q!!!!%!!B.F=H*P=C"J<C!I<G]A:8*S<X)J!"*!)1RL:76Q)(*V<GZJ<G=!!#Z!=!!?!!!6%UR*4FAA5W6S>G6S,GRW9WRB=X-!$ER*4FAA5W6S>G6S)'FO!!"B!0!!$!!$!!1!"!!&!!1!"!!%!!1!"A!%!!=!#!-!!(A!!!U)!!!!!!!!!!!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!)!!!!%A!!$1!!!!Q!!!!!!!!!!!!!!1!*!!!!!!
+ -1
+ 0
+ true
+ 1
+ 1
+ 1342710288
+
+
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Open.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Open.vi
new file mode 100644
index 00000000..59082126
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Open.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Close.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Close.vi
new file mode 100644
index 00000000..e397e552
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Close.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Get Available Bytes.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Get Available Bytes.vi
new file mode 100644
index 00000000..83d4d850
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Get Available Bytes.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Get Channels.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Get Channels.vi
new file mode 100644
index 00000000..05c507d1
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Get Channels.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Open.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Open.vi
new file mode 100644
index 00000000..2cbb0b6e
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Open.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Read Bytes.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Read Bytes.vi
new file mode 100644
index 00000000..e8fa88bc
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Read Bytes.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Read String.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Read String.vi
new file mode 100644
index 00000000..dd8c59da
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Read String.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Set Baudrate.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Set Baudrate.vi
new file mode 100644
index 00000000..7e86bb79
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Set Baudrate.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Set Parameters.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Set Parameters.vi
new file mode 100644
index 00000000..1ab377d3
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Set Parameters.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Write Bytes.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Write Bytes.vi
new file mode 100644
index 00000000..048c3ecc
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Write Bytes.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Write String.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Write String.vi
new file mode 100644
index 00000000..81fc3396
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Peripherals/Serial/Uart Write String.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Create Serial.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Create Serial.vi
new file mode 100644
index 00000000..f70f05b7
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Create Serial.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Create TCP.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Create TCP.vi
new file mode 100644
index 00000000..c94e94ff
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Create TCP.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Process.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Process.vi
new file mode 100644
index 00000000..3f746bbf
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Server/Process.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Template.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Template.vi
new file mode 100644
index 00000000..9d7afe7b
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Template.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Test Local.vi b/LabVIEW/vi.lib/MakerHub/LINX/API/Test Local.vi
new file mode 100644
index 00000000..9864f8bd
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Test Local.vi differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Typedef/Error Type.ctl b/LabVIEW/vi.lib/MakerHub/LINX/API/Typedef/Error Type.ctl
new file mode 100644
index 00000000..98377798
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Typedef/Error Type.ctl differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/API/Typedef/Parity.ctl b/LabVIEW/vi.lib/MakerHub/LINX/API/Typedef/Parity.ctl
new file mode 100644
index 00000000..2934924e
Binary files /dev/null and b/LabVIEW/vi.lib/MakerHub/LINX/API/Typedef/Parity.ctl differ
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/client/LinxClient.cpp b/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/client/LinxClient.cpp
new file mode 100644
index 00000000..3dea66ad
--- /dev/null
+++ b/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/client/LinxClient.cpp
@@ -0,0 +1,1325 @@
+/****************************************************************************************
+** Generic LINX Client code. This file contains the parent class for LINX client communicators.
+**
+** For more information see: www.labviewmakerhub.com/linx
+** For support visit the forums at: www.labviewmakerhub.com/forums/linx
+**
+** Written By Rolf Kalbermatter
+**
+** BSD2 License.
+****************************************************************************************/
+
+/****************************************************************************************
+** Includes
+****************************************************************************************/
+#include
+#include
+#include
+
+#include "LinxDefines.h"
+#include "LinxDevice.h"
+#if Unix
+#include "LinxLinuxChannel.h"
+#include "LinxLinuxDevice.h"
+#elif Win32
+#include "LinxWindowsChannel.h"
+#include "LinxWindowsDevice.h"
+#endif
+#include "LinxCommand.h"
+#include "LinxUtilities.h"
+#include "LinxClient.h"
+static uint8_t m_Unknown[] = "Uninitialized Device Client";
+
+/****************************************************************************************
+** Constructors/Destructor
+****************************************************************************************/
+LinxClient::LinxClient(const uint8_t *uartDevice, uint32_t *baudrate, uint8_t dataBits, uint8_t stopBits, LinxUartParity parity, int32_t timeout) : LinxDevice(NULL)
+{
+ m_DeviceName = m_Unknown;
+ m_CommChannel = NULL;
+
+ LinxUartChannel *channelObj = NULL;
+#if Unix
+ channelObj = new LinxUnixUartChannel(m_Debug, uartDevice);
+#elif Win32
+ channelObj = new LinxWindowsUartChannel(m_Debug, uartDevice);
+#endif
+ if (channelObj)
+ {
+ int32_t status = channelObj->SetSpeed(*baudrate, baudrate);
+ if (!status)
+ status = channelObj->SetParameters(dataBits, stopBits, parity);
+ if (!status)
+ {
+ Initialize(channelObj, timeout);
+ }
+ }
+}
+
+LinxClient::LinxClient(const uint8_t *netAddress, uint16_t port, int32_t timeout) : LinxDevice(NULL)
+{
+ m_DeviceName = m_Unknown;
+ m_CommChannel = NULL;
+
+ LinxCommChannel *channelObj = NULL;
+#if Unix
+ channelObj = new LinxUnixCommChannel(m_Debug, netAddress, port);
+#elif Win32
+ channelObj = new LinxWindowsCommChannel(m_Debug, netAddress, port);
+#endif
+ if (channelObj)
+ {
+ Initialize(channelObj, timeout);
+ }
+}
+
+LinxClient::~LinxClient(void)
+{
+ if (m_CommChannel)
+ m_CommChannel->Release();
+ if (m_DeviceName != m_Unknown)
+ free(m_DeviceName);
+}
+
+/****************************************************************************************
+** Public Functions
+****************************************************************************************/
+int32_t LinxClient::IsInitialized(void)
+{
+ return (m_CommChannel != NULL);
+}
+
+uint8_t LinxClient::GetDeviceName(uint8_t *buffer, uint8_t length)
+{
+ size_t len = strlen((char*)m_DeviceName);
+ if (buffer)
+ {
+ if (len > length)
+ len = length;
+ memcpy(buffer, m_DeviceName, len);
+ if (length > len)
+ buffer[len] = 0;
+ }
+ return (uint8_t)len;
+}
+
+// ANALOG
+int32_t LinxClient::AnalogRead(uint8_t numChans, uint8_t* channels, uint8_t* values)
+{
+ int32_t status = VerifyChannels(IID_LinxAiChannel, numChans, channels);
+ if (!status)
+ {
+ // Command parameters
+ // uint8[length] : channels
+ // Response parameters
+ // uint8 : analog input resolution
+ // uint8[] : analog values, bit-packed with resolution bits per channel
+ uint32_t offset, length = ((numChans * this->AiResolution + 7) / 8) + 1;
+ uint8_t *buffer = (uint8_t *)malloc(10 + numChans);
+ if (buffer)
+ {
+ status = PrepareHeader(buffer, LCMD_ANALOG_READ, numChans, length, &offset);
+ if (!status)
+ {
+ memcpy(buffer + offset, channels, numChans);
+
+ // send data and read response
+ status = WriteAndRead(buffer, 10 + length, &offset, numChans, values, 0, &length, getMsTicks(), m_Timeout);
+ if (!status && buffer[offset] != this->AiResolution)
+ {
+ status = LANALOG_REF_VAL_ERROR;
+ }
+ }
+ free(buffer);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::AnalogReadNoPacking(uint8_t numChans, uint8_t* channels, uint32_t* values)
+{
+ int32_t status = LERR_MEMORY;
+ uint32_t length = ((numChans * this->AiResolution + 7) / 8) + 1;
+ uint8_t *buffer = (uint8_t *)malloc(length);
+ if (buffer)
+ {
+ status = AnalogRead(numChans, channels, buffer);
+ if (!status)
+ {
+ uint32_t offset = 0, remaining = 8;
+ uint32_t resolution = buffer[offset++];
+
+ for (int32_t i = 0; i < numChans; i++)
+ {
+ values[i] = UnpackData(resolution, &remaining, buffer, &offset);
+ }
+ }
+ free(buffer);
+ }
+ return status;
+}
+
+int32_t LinxClient::AnalogReadValues(uint8_t numChans, uint8_t* channels, double* values)
+{
+ int32_t status = LERR_MEMORY;
+ uint32_t length = ((numChans * this->AiResolution + 7) / 8) + 1;
+ uint8_t *buffer = (uint8_t *)malloc(length);
+ if (buffer)
+ {
+ status = AnalogRead(numChans, channels, buffer);
+ if (!status)
+ {
+ uint32_t offset = 0, remaining = 8;
+ uint32_t resolution = buffer[offset++];
+ double scale = ((double)this->AiRefSet / 1000000.0) / (1 << resolution);
+
+ for (int32_t i = 0; i < numChans; i++)
+ {
+ values[i] = scale * UnpackData(resolution, &remaining, buffer, &offset);
+ }
+ }
+ free(buffer);
+ }
+ return status;
+}
+
+int32_t LinxClient::AnalogWrite(uint8_t numChans, uint8_t* channels, uint8_t* values)
+{
+ int32_t status = VerifyChannels(IID_LinxAoChannel, numChans, channels);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : number of channels
+ // uint8 : analog output resolution
+ // uint8[numChans] : channels
+ // uint8[] : analog values, bit-packed with resolution bits per channel
+ // Response parameters
+ // None
+ uint32_t offset, readLen = 0, length = (numChans * this->AoResolution + 7) / 8;
+ uint8_t *buffer = (uint8_t *)malloc(12 + numChans);
+ if (buffer)
+ {
+ status = PrepareHeader(buffer, LCMD_ANALOG_WRITE, length, 0, &offset);
+ if (!status)
+ {
+ buffer[offset + 0] = numChans;
+ buffer[offset + 1] = this->AoResolution;
+ memcpy(buffer + offset + 2, channels, numChans);
+ status = WriteAndRead(buffer, 12 + numChans, &offset, 2 + numChans, values, length, &readLen, getMsTicks(), m_Timeout);
+ }
+ free(buffer);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::AnalogWriteValues(uint8_t numChans, uint8_t* channels, double* values)
+{
+ int32_t status = LERR_MEMORY;
+ uint32_t length = ((numChans * this->AoResolution + 7) / 8) + 1;
+ uint8_t *buffer = (uint8_t *)malloc(length);
+ if (buffer)
+ {
+ uint32_t aoVal, offset = 0, remaining = 8;
+ double scale = (1 << this->AoResolution) / ((double)this->AoRefSet / 1000000.0);
+
+ for (int32_t i = 0; i < numChans; i++)
+ {
+ aoVal = (uint32_t)(values[i] * scale);
+ offset = PackData(aoVal, this->AoResolution, &remaining, buffer, offset);
+ }
+ status = AnalogWrite(numChans, channels, buffer);
+ free(buffer);
+ }
+ return status;
+}
+
+// DIGITAL
+int32_t LinxClient::DigitalSetState(uint8_t numChans, uint8_t* channels, uint8_t* states)
+{
+ int32_t status = VerifyChannels(IID_LinxDioChannel, numChans, channels);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : num channels
+ // uint8[numChans] : channels
+ // uint8[numChans] : states
+ // Response parameters
+ // None
+ uint32_t offset, length = 1 + 2 * numChans;
+ uint8_t *buffer = (uint8_t *)malloc(10 + length);
+ if (buffer)
+ {
+ status = PrepareHeader(buffer, LCMD_SET_PIN_MODE, length, 0, &offset);
+ if (!status)
+ {
+ buffer[offset] = numChans;
+ memcpy(buffer + offset + 1, channels, numChans);
+ memcpy(buffer + offset + 1 + numChans, states, numChans);
+
+ // send data and read response
+ status = WriteAndRead(buffer, 10 + length, &offset, length, &length);
+ }
+ free(buffer);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::DigitalWrite(uint8_t numChans, uint8_t* channels, uint8_t* values)
+{
+ int32_t status = VerifyChannels(IID_LinxDioChannel, numChans, channels);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : num channels
+ // uint8[numChans] : channels
+ // uint8[numChans + 7 / 8] : packed values
+ // Response parameters
+ // None
+ uint32_t offset, length = 1 + numChans + ((numChans + 7) >> 3);
+ uint8_t *buffer = (uint8_t *)malloc(10 + length);
+ if (buffer)
+ {
+ status = PrepareHeader(buffer, LCMD_DIGITAL_WRITE, length, 0, &offset);
+ if (!status)
+ {
+ buffer[offset] = numChans;
+ memcpy(buffer + offset + 1, channels, numChans);
+ memcpy(buffer + offset + 1 + numChans, values, (numChans + 7) >> 3);
+
+ // send data and read response
+ status = WriteAndRead(buffer, 10 + length, &offset, length, &length);
+ }
+ free(buffer);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::DigitalWriteNoPacking(uint8_t numChans, uint8_t* channels, uint8_t* values)
+{
+ int32_t status = VerifyChannels(IID_LinxDioChannel, numChans, channels);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : num channels
+ // uint8[numChans] : channels
+ // uint8[numChans] : values
+ // Response parameters
+ // None
+ uint32_t offset, length = 1 + numChans + ((numChans + 7) >> 3);
+ uint8_t *buffer = (uint8_t *)malloc(10 + length);
+ if (buffer)
+ {
+ status = PrepareHeader(buffer, LCMD_DIGITAL_WRITE, length, 0, &offset);
+ if (!status)
+ {
+ uint8_t bitOffset = 0;
+ uint8_t byteOffset = 0;
+ uint8_t diVal = 0;
+
+ buffer[offset] = numChans;
+ memcpy(buffer + offset + 1, channels, numChans);
+
+ for (int32_t i = 0; i < numChans; i++)
+ {
+ if (bitOffset == 8)
+ {
+ buffer[offset + 1 + numChans + byteOffset] = diVal;
+ bitOffset = 0;
+ byteOffset++;
+ diVal = 0;
+ }
+ diVal |= (values[i] ? 0x1 : 0x0) << bitOffset++;
+ }
+ buffer[offset + 1 + numChans + byteOffset] = diVal;
+ // send data and read response
+ status = WriteAndRead(buffer, 10 + length, &offset, length, &length);
+ }
+ free(buffer);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::DigitalRead(uint8_t numChans, uint8_t* channels, uint8_t* values)
+{
+ int32_t status = VerifyChannels(IID_LinxDioChannel, numChans, channels);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : num channels
+ // uint8[numChans] : channels
+ // Response parameters
+ // uint8[numChans + 7 / 8] : packed values
+ uint32_t offset, length = 1 + numChans;
+ uint8_t *buffer = (uint8_t *)malloc(10 + length);
+ if (buffer)
+ {
+ status = PrepareHeader(buffer, LCMD_DIGITAL_READ, length, (numChans + 7) / 8, &offset);
+ if (!status)
+ {
+ buffer[offset] = numChans;
+ memcpy(buffer + offset + 1, channels, numChans);
+
+ // send data and read response
+ status = WriteAndRead(buffer, 10 + length, &offset, length, &length);
+ if (!status && length >= (uint32_t)((numChans + 7) >> 3))
+ {
+ memcpy(values, buffer + offset, ((numChans + 7) >> 3));
+ }
+ }
+ free(buffer);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::DigitalReadNoPacking(uint8_t numChans, uint8_t* channels, uint8_t* values)
+{
+ int32_t status = VerifyChannels(IID_LinxDioChannel, numChans, channels);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : num channels
+ // uint8[numChans] : channels
+ // Response parameters
+ // uint8[numChans] : values
+ uint32_t offset, length = 1 + numChans;
+ uint8_t *buffer = (uint8_t *)malloc(10 + length);
+ if (buffer)
+ {
+ status = PrepareHeader(buffer, LCMD_DIGITAL_READ, length, (numChans + 7) / 8, &offset);
+ if (!status)
+ {
+ buffer[offset] = numChans;
+ memcpy(buffer + offset + 1, channels, numChans);
+
+ // send data and read response
+ status = WriteAndRead(buffer, 10 + length, &offset, length, &length);
+ if (!status && length >= (uint32_t)((numChans + 7) >> 3))
+ {
+ for (int32_t i = 0; i < numChans; i++)
+ {
+ values[i] = buffer[offset + i / 8] << (7 - i % 8);
+ }
+ }
+ }
+ free(buffer);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::DigitalWriteSquareWave(uint8_t channel, uint32_t freq, uint32_t duration)
+{
+ int32_t status = VerifyChannels(IID_LinxDioChannel, 1, &channel);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : channel
+ // uint32 : frequency
+ // uint32 : duration
+ // Response parameters
+ // None
+ uint32_t offset, length = 9;
+ uint8_t buffer[20];
+ status = PrepareHeader(buffer, LCMD_SET_SQUARE_WAVE, length, 0, &offset);
+ if (!status)
+ {
+ length = WriteU8ToBuff(buffer, offset, channel);
+ length = WriteU32ToBuff(buffer, length, freq);
+ length = WriteU32ToBuff(buffer, length, duration);
+
+ // send data and read response
+ status = WriteAndRead(buffer, 20, &offset, length, &length);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::DigitalReadPulseWidth(uint8_t stimChan, uint8_t stimType, uint8_t respChan, uint8_t respType, uint32_t timeout, uint32_t* width)
+{
+ uint8_t channels[2] = {stimChan, respChan};
+ int32_t status = VerifyChannels(IID_LinxDioChannel, 2, channels);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : response channel
+ // uint8 : stimulation channel
+ // uint8 : stimulation type
+ // uint8 : response type
+ // uint32 : timeout
+ // Response parameters
+ // uint32 : pulse width
+ uint32_t offset, length = 8;
+ uint8_t buffer[20];
+ status = PrepareHeader(buffer, LCMD_SET_SQUARE_WAVE, length, 4, &offset);
+ if (!status)
+ {
+ length = WriteU8ToBuff(buffer, offset, respChan);
+ length = WriteU8ToBuff(buffer, length, stimChan);
+ length = WriteU8ToBuff(buffer, length, stimType);
+ length = WriteU8ToBuff(buffer, length, respType);
+ length = WriteU32ToBuff(buffer, length, timeout);
+
+ // send data and read response
+ status = WriteAndRead(buffer, 20, &offset, length, &length);
+ if (!status && length >= sizeof(uint32_t))
+ {
+ ReadU32FromBuff(buffer, offset, width);
+ }
+ }
+ }
+ return status;
+}
+
+//PWM
+int32_t LinxClient::PwmSetDutyCycle(uint8_t numChans, uint8_t* channels, uint8_t* values)
+{
+ int32_t status = VerifyChannels(IID_LinxPwmChannel, numChans, channels);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+//SPI
+int32_t LinxClient::SpiOpenMaster(uint8_t channel)
+{
+ int32_t status = VerifyChannels(IID_LinxSpiChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::SpiSetBitOrder(uint8_t channel, uint8_t bitOrder)
+{
+ int32_t status = VerifyChannels(IID_LinxSpiChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::SpiSetMode(uint8_t channel, uint8_t mode)
+{
+ int32_t status = VerifyChannels(IID_LinxSpiChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::SpiSetSpeed(uint8_t channel, uint32_t speed, uint32_t* actualSpeed)
+{
+ int32_t status = VerifyChannels(IID_LinxSpiChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::SpiWriteRead(uint8_t channel, uint8_t frameSize, uint8_t numFrames, uint8_t csChan, uint8_t csLL, uint8_t* sendBuffer, uint8_t* recBuffer)
+{
+ int32_t status = VerifyChannels(IID_LinxSpiChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::SpiCloseMaster(uint8_t channel)
+{
+ int32_t status = VerifyChannels(IID_LinxSpiChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+//I2C
+int32_t LinxClient::I2cOpenMaster(uint8_t channel)
+{
+ int32_t status = VerifyChannels(IID_LinxI2cChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::I2cSetSpeed(uint8_t channel, uint32_t speed, uint32_t* actualSpeed)
+{
+ int32_t status = VerifyChannels(IID_LinxI2cChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::I2cWrite(uint8_t channel, uint8_t slaveAddress, uint8_t eofConfig, uint8_t numBytes, uint8_t* sendBuffer)
+{
+ int32_t status = VerifyChannels(IID_LinxI2cChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::I2cRead(uint8_t channel, uint8_t slaveAddress, uint8_t eofConfig, uint8_t numBytes, uint32_t timeout, uint8_t* recBuffer)
+{
+ int32_t status = VerifyChannels(IID_LinxI2cChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::I2cClose(uint8_t channel)
+{
+ int32_t status = VerifyChannels(IID_LinxI2cChannel, 1, &channel);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+//UART
+int32_t LinxClient::UartOpen(uint8_t channel, LinxUartChannel **channelObj)
+{
+ int32_t status = VerifyChannels(IID_LinxUartChannel, 1, &channel);
+ if (!status)
+ {
+ // Command parameters
+ // uint8 : channel
+ // uint32 : baudrate
+ // Response parameters
+ // uint32 : actual baudrate
+ uint8_t buffer[20];
+ uint32_t offset, length = 1 + sizeof(uint32_t);
+
+ status = PrepareHeader(buffer, LCMD_UART_OPEN, length, sizeof(uint32_t), &offset);
+ if (!status)
+ {
+ buffer[offset] = channel;
+ WriteU32ToBuff(buffer, offset, 9600);
+
+ // send data and read response
+ status = WriteAndRead(buffer, 20, &offset, length, &length);
+ if (!status && length >= sizeof(uint32_t))
+ {
+
+ }
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::UartOpen(const unsigned char *deviceName, uint8_t *channel, LinxUartChannel **channelObj)
+{
+ // Command parameters
+ // uint8[] : device name
+ // Response parameters
+ // uint8 : assigned channel
+ int32_t status = LERR_MEMORY;
+ uint32_t offset, length = (uint32_t)strlen((const char*)deviceName);
+ uint8_t *buffer = (uint8_t *)malloc(10 + length);
+ if (buffer)
+ {
+ status = PrepareHeader(buffer, LCMD_UART_OPEN_BY_NAME, length, 1, &offset);
+ if (!status)
+ {
+ memcpy(buffer + offset, deviceName, length);
+ // send data and read response
+ status = WriteAndRead(buffer, 10 + length, &offset, length, &length);
+ if (!status && length >= 1)
+ {
+ LinxUartChannel *channelObj = new LinxClientUartChannel(m_Debug, this, buffer[offset], m_ProtocolVersion, deviceName);
+ RegisterChannel(IID_LinxUartChannel, buffer[offset], channelObj);
+ *channel = buffer[offset];
+ }
+ }
+ }
+ return status;
+}
+
+//Servo
+int32_t LinxClient::ServoOpen(uint8_t numChans, uint8_t* channels)
+{
+ int32_t status = VerifyChannels(IID_LinxServoChannel, numChans, channels);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::ServoSetPulseWidth(uint8_t numChans, uint8_t* channels, uint16_t* pulseWidths)
+{
+ int32_t status = VerifyChannels(IID_LinxServoChannel, numChans, channels);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+int32_t LinxClient::ServoClose(uint8_t numChans, uint8_t* channels)
+{
+ int32_t status = VerifyChannels(IID_LinxServoChannel, numChans, channels);
+ if (!status)
+ {
+ return L_FUNCTION_NOT_SUPPORTED;
+ }
+ return status;
+}
+
+// General
+void LinxClient::NonVolatileWrite(int32_t address, uint8_t data)
+{
+ return;
+}
+
+uint8_t LinxClient::NonVolatileRead(int32_t address)
+{
+ return L_FUNCTION_NOT_SUPPORTED;
+}
+
+/****************************************************************************************
+** Protected Functions
+****************************************************************************************/
+int32_t LinxClient::Initialize(LinxCommChannel *channel, int32_t timeout)
+{
+ uint8_t buffer[1024];
+ uint32_t dataRead, offset;
+
+ m_Timeout = timeout;
+ if (m_CommChannel)
+ m_CommChannel->Release();
+ m_CommChannel = channel;
+ if (!channel)
+ return L_DISCONNECT;
+
+ m_PacketNum = (uint32_t)((double)rand() / RAND_MAX * 0xFFFF);
+
+ int32_t status = GetSyncCommand(true);
+ if (!status)
+ {
+ status = GetU8ArrParameter(LCMD_GET_API_VER, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ }
+ if (!status)
+ {
+ if (dataRead >= 3)
+ {
+ LinxApiMajor = buffer[offset++];
+ LinxApiMinor = buffer[offset++];
+ LinxApiSubminor = buffer[offset++];
+ }
+ status = GetU8ArrParameter(LCMD_GET_DEV_ID, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ }
+ if (!status)
+ {
+ if (dataRead >= 2)
+ {
+ DeviceFamily = buffer[offset++];
+ DeviceId = buffer[offset++];
+ }
+ status = GetU8ArrParameter(LCMD_GET_DEV_NAME, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ }
+ if (!status)
+ {
+ if (dataRead > 0)
+ {
+ if (m_DeviceName == m_Unknown)
+ m_DeviceName = (unsigned char*)malloc(dataRead + 1);
+ else
+ m_DeviceName = (unsigned char*)realloc(m_DeviceName, dataRead + 1);
+
+ if (m_DeviceName)
+ {
+ memcpy(m_DeviceName, buffer + offset, dataRead);
+ m_DeviceName[dataRead] = 0;
+ }
+ }
+ }
+
+ if (!status)
+ {
+ status = GetU8ArrParameter(LCMD_GET_MAX_PACK_SIZE, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status && dataRead >= 4)
+ {
+ ReadU32FromBuff(buffer, offset, &m_ListenerBufferSize);
+ }
+ //ignore error
+
+ status = GetU8ArrParameter(LCMD_GET_AI_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxAiChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_AO_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxAoChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_DIO_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxDioChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_PWM_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxPwmChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_QE_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxQeChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_UART_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxUartChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_I2C_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxI2cChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_SPI_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxSpiChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_CAN_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxCanChannel, buffer, dataRead);
+
+ status = GetU8ArrParameter(LCMD_GET_SERVO_CHANS, buffer, 1024, m_ProtocolVersion, &offset, &dataRead);
+ if (!status)
+ CopyArrayToSet(IID_LinxServoChannel, buffer, dataRead);
+ }
+ //----Peripherals----
+ // Uart
+ // UartMaxBaud = 0;
+ if (!status)
+ {
+ status = GetU32Parameter(LCMD_GET_UART_MAX_BAUD, &UartMaxBaud);
+ }
+
+ // AI
+ // uint8_t AiResolution;
+ // uint32_t AiRefDefault;
+ // uint32_t AiRefSet;
+ if (!status)
+ {
+ status = GetU32Parameter(LCMD_GET_AI_REF_VOLT, &AiRefSet);
+ }
+ if (!status)
+ {
+ status = GetU8Parameter(LCMD_GET_AI_RESOLUTION, &AiResolution);
+ }
+ // AO
+ // AoResolution;
+ // AoRefDefault;
+ // AoRefSet;
+ if (!status)
+ {
+ status = GetU8Parameter(LCMD_GET_AO_RESOLUTION, &AoResolution);
+ }
+/*
+ // User Configured Values
+ userId = 0;
+
+ uint32_t ethernetIp;
+ uint16_t ethernetPort;
+
+ uint32_t WifiIp;
+ uint16_t WifiPort;
+ uint8_t WifiSsidSize;
+ char WifiSsid[32];
+ uint8_t WifiSecurity;
+ uint8_t WifiPwSize;
+ char WifiPw[64];
+*/
+ if (status && m_CommChannel)
+ {
+ m_CommChannel->Release();
+ m_CommChannel = NULL;
+ }
+ return status;
+}
+
+/****************************************************************************************
+** Private Functions
+****************************************************************************************/
+uint16_t LinxClient::GetNextPacketNum(void)
+{
+ return m_PacketNum++;
+}
+
+/*
+ packet format
+ uint8_t : header marker, 0xFF or 0xFE
+ if header marker == 0xFF
+ uint8_t[1] : packet length
+ if header marker == 0xFE
+ uint8_t[3] : MSB first packet length
+ uint16_t : packet number
+ uint16_t : command
+ uint8_t[n - header - 1] : data
+ uint8_t : checksum
+*/
+int32_t LinxClient::PrepareHeader(uint8_t* buffer, uint16_t command, uint32_t dataLength, uint32_t expLength, uint32_t *headerLength)
+{
+ uint32_t overhead = 7;
+ if (!m_ProtocolVersion)
+ {
+ if (dataLength > 0xF8 || (dataLength + overhead) >= (uint32_t)m_ListenerBufferSize)
+ return LERR_MSG_TO_LONG;
+ }
+ else
+ {
+ if (dataLength > 248 || expLength > 249)
+ overhead = 9;
+ if (dataLength > 0xFFFFF6 || (dataLength + overhead) >= (uint32_t)m_ListenerBufferSize)
+ return LERR_MSG_TO_LONG;
+ }
+
+ if (overhead == 7)
+ {
+ *headerLength = WriteU16ToBuff(buffer, 0, 0xFF00 + (uint16_t)dataLength + overhead);
+ }
+ else
+ {
+ *headerLength = WriteU32ToBuff(buffer, 0, 0xFE000000 + dataLength + overhead);
+ }
+ *headerLength += WriteU16ToBuff(buffer, *headerLength, GetNextPacketNum());
+ *headerLength += WriteU16ToBuff(buffer, *headerLength, command);
+ return L_OK;
+}
+
+int32_t LinxClient::WriteAndRead(uint8_t *buffer, uint32_t bufLength, uint32_t *headerOffset, uint32_t dataLength, uint32_t *dataRead)
+{
+ return WriteAndRead(buffer, bufLength, headerOffset, dataLength, NULL, 0, dataRead, getMsTicks(), m_Timeout);
+}
+
+int32_t LinxClient::WriteAndRead(uint8_t *header, uint32_t headerLength, uint32_t *headerOffset, uint32_t headerData, uint8_t *dataBuffer, uint32_t dataLength, uint32_t *dataRead, uint32_t start, int32_t timeout)
+{
+ int32_t status;
+ uint8_t checksum = ComputeChecksum(0, header, *headerOffset + headerData);
+ uint16_t packetNum = GetU16FromBuff(header, *headerOffset - 4);
+
+ if (!dataLength)
+ {
+ header[*headerOffset + headerData] = checksum;
+ status = m_CommChannel->Write(header, *headerOffset + headerData + 1, start, timeout);
+ }
+ else
+ {
+ checksum = ComputeChecksum(checksum, dataBuffer, dataLength);
+ status = m_CommChannel->Write(header, *headerOffset, start, timeout);
+ if (!status)
+ {
+ status = m_CommChannel->Write(dataBuffer, dataLength, start, timeout);
+ if (!status)
+ {
+ status = m_CommChannel->Write(&checksum, 1, start, timeout);
+ }
+ }
+ }
+ if (!status)
+ {
+ status = m_CommChannel->Read(header, 5, start, timeout, dataRead);
+ if (!status && *dataRead == 5)
+ {
+ uint32_t extraData = 0;
+ if ((header[0] & 0xFE) != 0xFE)
+ {
+ return LERR_INVALID_FRAME;
+ }
+
+ if (header[0] == 0xFF)
+ {
+ *headerOffset = 2;
+ dataLength = header[1];
+ }
+ else
+ {
+ *headerOffset = 4;
+ dataLength = GetU32FromBuff(header, 0) & 0x00FFFFFF;
+ extraData = 2;
+ }
+
+ if (!dataBuffer || !(*dataRead))
+ {
+ extraData = dataLength - 5;
+ }
+
+ if (extraData)
+ {
+ status = m_CommChannel->Read(header + 5, extraData, start, timeout, dataRead);
+ if (status || *dataRead != extraData)
+ {
+ return status ? status : LERR_IO;
+ }
+ }
+ if (packetNum != GetU16FromBuff(header, *headerOffset))
+ {
+ *headerOffset += 3;
+ return LERR_PACKET_NUM;
+ }
+ *headerOffset += 2;
+
+ status = GetU8FromBuff(header, *headerOffset);
+ *headerOffset += 1;
+ if (status)
+ {
+ return status;
+ }
+
+ if (!dataBuffer || !(*dataRead))
+ {
+ checksum = ComputeChecksum(0, header, extraData + 4);
+ if (checksum != header[extraData + 4])
+ {
+ return LERR_CHECKSUM;
+ }
+ *dataRead = dataLength - (*headerOffset + 1);
+ }
+ else
+ {
+ checksum = ComputeChecksum(0, header, extraData + 5);
+ dataLength -= *headerOffset + 1;
+ status = m_CommChannel->Read(dataBuffer, dataLength, start, timeout, dataRead);
+ if (!status && *dataRead == dataLength)
+ {
+ checksum = ComputeChecksum(checksum, dataBuffer, *dataRead);
+ status = m_CommChannel->Read(header + *headerOffset, 1, start, timeout, dataRead);
+ if (!status && *dataRead == 1)
+ {
+ if (GetU8FromBuff(header, *headerOffset) != checksum)
+ return LERR_CHECKSUM;
+ }
+ *dataRead = dataLength;
+ }
+ }
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::GetSyncCommand(bool negotiate)
+{
+ uint8_t buffer[20];
+ uint32_t headerLength;
+ int32_t status = PrepareHeader(buffer, LCMD_SYNC, negotiate, negotiate, &headerLength);
+ if (!status)
+ {
+ uint32_t dataRead = 0;
+ buffer[headerLength] = PROTOCOL_VERSION;
+ // send data and read response
+ status = WriteAndRead(buffer, 20, &headerLength, 1, &dataRead);
+ if (!status && dataRead >= sizeof(uint8_t))
+ m_ProtocolVersion = buffer[headerLength];
+ }
+ return status;
+}
+
+int32_t LinxClient::GetU8Parameter(uint16_t command, uint8_t *val)
+{
+ uint8_t buffer[20];
+ uint32_t headerLength;
+ int32_t status = PrepareHeader(buffer, command, 0, 1, &headerLength);
+ if (!status)
+ {
+ uint32_t dataRead;
+ // send data and read response
+ status = WriteAndRead(buffer, 20, &headerLength, 0, &dataRead);
+ if (!status && dataRead >= sizeof(uint8_t))
+ {
+ ReadU8FromBuff(buffer, headerLength, val);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::GetU16Parameter(uint16_t command, uint16_t *val)
+{
+ uint8_t buffer[20];
+ uint32_t headerLength;
+ int32_t status = PrepareHeader(buffer, command, 0, 2, &headerLength);
+ if (!status)
+ {
+ uint32_t dataRead;
+ // send data and read response
+ status = WriteAndRead(buffer, 20, &headerLength, 0, &dataRead);
+ if (!status && dataRead >= sizeof(uint16_t))
+ {
+ ReadU16FromBuff(buffer, headerLength, val);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::GetU32Parameter(uint16_t command, uint32_t *val)
+{
+ uint8_t buffer[20];
+ uint32_t headerLength;
+ int32_t status = PrepareHeader(buffer, command, 0, 4, &headerLength);
+ if (!status)
+ {
+ uint32_t dataRead;
+ // send data and read response
+ status = WriteAndRead(buffer, 20, &headerLength, 0, &dataRead);
+ if (!status && dataRead >= sizeof(uint32_t))
+ {
+ ReadU32FromBuff(buffer, headerLength, val);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClient::GetU8ArrParameter(uint16_t command, uint8_t *buffer, uint32_t bufLength, uint8_t param, uint32_t *headerLength, uint32_t *dataRead)
+{
+ int32_t status = PrepareHeader(buffer, command, param ? 1 : 0, bufLength - 7, headerLength);
+ if (!status)
+ {
+ buffer[*headerLength] = param;
+ // send data and read response
+ status = WriteAndRead(buffer, bufLength, headerLength, param ? 1 : 0, dataRead);
+ }
+ return status;
+}
+
+void LinxClient::CopyArrayToSet(int32_t type, uint8_t *arr, uint32_t length, LinxChannel *chan)
+{
+ ClearChannels(type);
+ for (uint32_t i = 0; i < length; i++)
+ {
+ RegisterChannel(type, arr[i], chan);
+ }
+}
+
+/****************************************************************************************
+** Constructors
+****************************************************************************************/
+LinxClientUartChannel::LinxClientUartChannel(LinxFmtChannel *debug, LinxClient *client, uint8_t channel, uint8_t protVersion, const unsigned char *deviceName) : LinxUartChannel(debug, deviceName)
+{
+ m_Client = client;
+ m_Client->AddRef();
+ m_Channel = channel;
+ m_ProtocolVersion = protVersion;
+}
+
+LinxClientUartChannel::~LinxClientUartChannel(void)
+{
+ m_Client->Release();
+}
+
+int32_t LinxClientUartChannel::SetSpeed(uint32_t speed, uint32_t* actualSpeed)
+{
+ // Command parameters
+ // uint8 : channel
+ // uint32 : baudrate
+ // Response parameters
+ // uint32 : actual baudrate
+ uint8_t buffer[20];
+ uint32_t offset, length = 1 + sizeof(uint32_t);
+ int32_t status = m_Client->PrepareHeader(buffer, LCMD_UART_SET_BAUD, length, sizeof(uint32_t), &offset);
+ if (!status)
+ {
+ buffer[offset] = m_Channel;
+ WriteU32ToBuff(buffer, offset, speed);
+
+ // send data and read response
+ status = m_Client->WriteAndRead(buffer, 20, &offset, length, &length);
+ if (!status && length >= sizeof(uint32_t) && actualSpeed)
+ {
+ *actualSpeed = GetU32FromBuff(buffer, offset);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClientUartChannel::SetParameters(uint8_t dataBits, uint8_t stopBits, LinxUartParity parity)
+{
+ // Command parameters
+ // uint8 : channel
+ // uint8 : data bits
+ // uint8 : stop bits
+ // uint8 : parity
+ // Response parameters
+ // None
+ uint8_t buffer[20];
+ uint32_t offset, length = 4;
+ int32_t status = m_Client->PrepareHeader(buffer, LCMD_UART_SET_ATTRIBUTE, length, 0, &offset);
+ if (!status)
+ {
+ buffer[offset + 0] = m_Channel;
+ buffer[offset + 1] = dataBits;
+ buffer[offset + 2] = stopBits;
+ buffer[offset + 3] = parity;
+
+ // send data and read response
+ status = m_Client->WriteAndRead(buffer, 20, &offset, length, &length);
+ }
+ return status;
+}
+
+int32_t LinxClientUartChannel::Read(uint8_t* dataBuffer, uint32_t numBytes, uint32_t start, int32_t timeout, uint32_t* numBytesRead)
+{
+ int32_t status;
+ uint8_t header[20];
+ uint32_t offset = 0, length = 1;
+ if (!dataBuffer || !numBytes)
+ {
+ // Command parameters
+ // uint8 : channel
+ // Response parameters
+ // uint8 : available bytes
+ // or
+ // uint32 : available bytes
+ status = m_Client->PrepareHeader(header, LCMD_UART_GET_BYTES, length, sizeof(uint32_t), &offset);
+ if (!status)
+ {
+ header[offset] = m_Channel;
+
+ // send data and read response
+ status = m_Client->WriteAndRead(header, 20, &offset, length, NULL, 0, &numBytes, start, timeout);
+ if (!status)
+ {
+ if (numBytes >= sizeof(uint32_t))
+ {
+ *numBytesRead = GetU32FromBuff(header, offset);
+ }
+ else if (numBytes >= sizeof(uint8_t))
+ {
+ *numBytesRead = header[offset];
+ }
+ else
+ {
+ *numBytesRead = 0;
+ }
+ }
+
+ }
+ }
+ else
+ {
+ // Command parameters
+ // Either:
+ // uint8 : channel
+ // uint8 : bytes to read
+ // or
+ // uint8 : 0
+ // uint8 : channel
+ // int32 : timeout
+ // uint32 : bytes to read
+ // end
+ // Response parameters
+ // uint8[] : read bytes
+ if (m_ProtocolVersion && (numBytes > 249 || timeout >= 0))
+ {
+ length = 10;
+ }
+ else
+ {
+ length = 2;
+ }
+ status = m_Client->PrepareHeader(header, LCMD_UART_READ, length, numBytes, &offset);
+ if (!status)
+ {
+ if (length == 10)
+ {
+ WriteU8ToBuff(header, offset + 0, 0);
+ WriteU8ToBuff(header, offset + 1, m_Channel);
+ WriteU32ToBuff(header, offset + 2, timeout);
+ WriteU32ToBuff(header, offset + 6, numBytes);
+ }
+ else
+ {
+ WriteU8ToBuff(header, offset + 0, m_Channel);
+ WriteU8ToBuff(header, offset + 1, numBytes);
+ }
+ *numBytesRead = numBytes;
+
+ // send data and read response
+ status = m_Client->WriteAndRead(header, 20, &offset, length, dataBuffer, 0, numBytesRead, start, timeout);
+ }
+ }
+ return status;
+}
+
+int32_t LinxClientUartChannel::Write(const uint8_t* dataBuffer, uint32_t numBytes, uint32_t start, int32_t timeout)
+{
+ // Command parameters
+ // Either:
+ // uint8 : channel
+ // or
+ // uint8 : 0
+ // uint8 : channel
+ // int32 : timeout
+ // int32 : number of bytes
+ // end
+ // uint8[] : bytes to write
+ // Response parameters
+ // None
+ int32_t status;
+ uint8_t header[20];
+ uint32_t offset, length, dataRead = 0;
+ if (m_ProtocolVersion && (numBytes > 248 || timeout >= 0))
+ {
+ length = 10;
+ }
+ else
+ {
+ length = 2;
+ }
+ status = m_Client->PrepareHeader(header, LCMD_UART_WRITE, length, sizeof(uint32_t), &offset);
+ if (!status)
+ {
+ if (length == 10)
+ {
+ WriteU8ToBuff(header, offset + 0, 0);
+ WriteU8ToBuff(header, offset + 1, m_Channel);
+ WriteU32ToBuff(header, offset + 2, timeout);
+ WriteU32ToBuff(header, offset + 6, numBytes);
+ }
+ else
+ {
+ WriteU8ToBuff(header, offset + 0, m_Channel);
+ WriteU8ToBuff(header, offset + 1, numBytes);
+ }
+
+ // send data and read response
+ status = m_Client->WriteAndRead(header, 20, &offset, length, (uint8_t*)dataBuffer, numBytes, &dataRead, start, timeout);
+ }
+ return status;
+}
+
+int32_t LinxClientUartChannel::Close(void)
+{
+ // Command parameters
+ // uint8 : channel
+ // Response parameters
+ // None
+ uint8_t buffer[20];
+ uint32_t offset, length = 1;
+ int32_t status = m_Client->PrepareHeader(buffer, LCMD_UART_CLOSE, length, sizeof(uint32_t), &offset);
+ if (!status)
+ {
+ buffer[offset] = m_Channel;
+
+ // send data and read response
+ status = m_Client->WriteAndRead(buffer, 20, &offset, length, &length);
+ }
+ return status;
+}
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/client/LinxClient.h b/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/client/LinxClient.h
new file mode 100644
index 00000000..8b314c9a
--- /dev/null
+++ b/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/client/LinxClient.h
@@ -0,0 +1,167 @@
+/****************************************************************************************
+** LINX header for generic LINX Client interface.
+**
+** For more information see: www.labviewmakerhub.com/linx
+** For support visit the forums at: www.labviewmakerhub.com/forums/linx
+**
+** Written By Rolf Kalbermatter
+**
+** BSD2 License.
+****************************************************************************************/
+
+#ifndef LINX_CLIENT_H
+#define LINX_CLIENT_H
+
+/****************************************************************************************
+** Defines
+****************************************************************************************/
+
+/****************************************************************************************
+** Includes
+****************************************************************************************/
+#include
+#include "LinxDevice.h"
+
+/****************************************************************************************
+** Typedefs
+****************************************************************************************/
+
+class LinxClient : public LinxDevice
+{
+ public:
+ /****************************************************************************************
+ ** Variables
+ ****************************************************************************************/
+
+ /****************************************************************************************
+ ** Constructors
+ ****************************************************************************************/
+ LinxClient(const unsigned char *uartDevice, uint32_t *baudrate, uint8_t dataBits, uint8_t stopBits, LinxUartParity parity, int32_t timeout);
+ LinxClient(const unsigned char *netAddress, uint16_t port, int32_t timeout);
+ virtual ~LinxClient(void);
+
+ /****************************************************************************************
+ ** Functions
+ ****************************************************************************************/
+ virtual unsigned char GetDeviceName(unsigned char *buffer, uint8_t length);
+ int32_t IsInitialized(void);
+
+ //Analog
+ virtual int32_t AnalogRead(uint8_t numChans, uint8_t* channels, uint8_t* values);
+ virtual int32_t AnalogReadNoPacking(uint8_t numChans, uint8_t* channels, uint32_t* values); //Values Are ADC Ticks And Not Bit Packed
+ virtual int32_t AnalogReadValues(uint8_t numChans, uint8_t* channels, double* values);
+ virtual int32_t AnalogWrite(uint8_t numChans, uint8_t* channels, uint8_t* values);
+ virtual int32_t AnalogWriteValues(uint8_t numChans, uint8_t* channels, double* values);
+
+ //DIGITAL
+ virtual int32_t DigitalSetState(uint8_t numChans, uint8_t* channels, uint8_t* values);
+ virtual int32_t DigitalWrite(uint8_t numChans, uint8_t* channels, uint8_t* values);
+ virtual int32_t DigitalWriteNoPacking(uint8_t numChans, uint8_t* channels, uint8_t* values); //Values Not Bit Packed
+ virtual int32_t DigitalRead(uint8_t numChans, uint8_t* channels, uint8_t* values);
+ virtual int32_t DigitalReadNoPacking(uint8_t numChans, uint8_t* channels, uint8_t* values); //Response Not Bit Packed
+ virtual int32_t DigitalWriteSquareWave(uint8_t channel, uint32_t freq, uint32_t duration);
+ virtual int32_t DigitalReadPulseWidth(uint8_t stimChan, uint8_t stimType, uint8_t respChan, uint8_t respType, uint32_t timeout, uint32_t* width);
+
+ //PWM
+ virtual int32_t PwmSetDutyCycle(uint8_t numChans, uint8_t* channels, uint8_t* values);
+
+ //SPI
+ virtual int32_t SpiOpenMaster(uint8_t channel);
+ virtual int32_t SpiSetBitOrder(uint8_t channel, uint8_t bitOrder);
+ virtual int32_t SpiSetMode(uint8_t channel, uint8_t mode);
+ virtual int32_t SpiSetSpeed(uint8_t channel, uint32_t speed, uint32_t* actualSpeed);
+ virtual int32_t SpiWriteRead(uint8_t channel, uint8_t frameSize, uint8_t numFrames, uint8_t csChan, uint8_t csLL, uint8_t* sendBuffer, uint8_t* recBuffer);
+ virtual int32_t SpiCloseMaster(uint8_t channel);
+
+ //I2C
+ virtual int32_t I2cOpenMaster(uint8_t channel);
+ virtual int32_t I2cSetSpeed(uint8_t channel, uint32_t speed, uint32_t* actualSpeed);
+ virtual int32_t I2cWrite(uint8_t channel, uint8_t slaveAddress, uint8_t eofConfig, uint8_t numBytes, uint8_t* sendBuffer);
+ virtual int32_t I2cRead(uint8_t channel, uint8_t slaveAddress, uint8_t eofConfig, uint8_t numBytes, uint32_t timeout, uint8_t* recBuffer);
+ virtual int32_t I2cClose(uint8_t channel);
+
+ //UART
+ virtual int32_t UartOpen(uint8_t channel, LinxUartChannel **channelObj = NULL);
+ virtual int32_t UartOpen(const unsigned char *deviceName, uint8_t *channel, LinxUartChannel **channelObj = NULL);
+
+ //Servo
+ virtual int32_t ServoOpen(uint8_t numChans, uint8_t* chans);
+ virtual int32_t ServoSetPulseWidth(uint8_t numChans, uint8_t* chans, uint16_t* pulseWidths);
+ virtual int32_t ServoClose(uint8_t numChans, uint8_t* chans);
+
+ // General
+ virtual void NonVolatileWrite(int32_t address, uint8_t data);
+ virtual uint8_t NonVolatileRead(int32_t address);
+
+ int32_t PrepareHeader(uint8_t *buffer, uint16_t command, uint32_t dataLength, uint32_t expLength, uint32_t *headerLength);
+ int32_t WriteAndRead(uint8_t *buffer, uint32_t buffLength, uint32_t *headerOffset, uint32_t dataLength, uint32_t *dataRead);
+ int32_t WriteAndRead(uint8_t *header, uint32_t headerLength, uint32_t *headerOffset, uint32_t headerData, uint8_t *dataBuffer, uint32_t dataLength, uint32_t *dataRead, uint32_t start, int32_t timeout);
+
+ protected:
+ /****************************************************************************************
+ ** Variables
+ ****************************************************************************************/
+
+ /****************************************************************************************
+ ** Functions
+ ****************************************************************************************/
+ virtual int32_t Initialize(LinxCommChannel *channel, int32_t timeout);
+
+ private:
+ /****************************************************************************************
+ ** Variables
+ ****************************************************************************************/
+ unsigned char *m_DeviceName;
+ LinxCommChannel *m_CommChannel;
+
+ uint32_t m_ListenerBufferSize;
+ uint16_t m_PacketNum;
+ uint8_t m_ProtocolVersion;
+
+ int32_t m_Timeout;
+
+ /****************************************************************************************
+ ** Functions
+ ****************************************************************************************/
+ uint16_t GetNextPacketNum(void);
+ void CopyArrayToSet(int32_t type, uint8_t *arr, uint32_t length, LinxChannel *chan = NULL);
+
+ int32_t GetSyncCommand(bool negotiate);
+ int32_t GetU8Parameter(uint16_t command, uint8_t *val);
+ int32_t GetU16Parameter(uint16_t command, uint16_t *val);
+ int32_t GetU32Parameter(uint16_t command, uint32_t *val);
+ int32_t GetU8ArrParameter(uint16_t command, uint8_t *val, uint32_t buffLength, uint8_t param, uint32_t *headerLength, uint32_t *dataRead);
+};
+
+class LinxClientUartChannel : public LinxUartChannel
+{
+ public:
+ /****************************************************************************************
+ ** Constructors
+ ****************************************************************************************/
+ LinxClientUartChannel(LinxFmtChannel *debug, LinxClient *client, uint8_t channel, uint8_t protVersion, const unsigned char *deviceName);
+ virtual ~LinxClientUartChannel(void);
+
+ /****************************************************************************************
+ ** Functions
+ ****************************************************************************************/
+ virtual int32_t SetSpeed(uint32_t speed, uint32_t* actualSpeed);
+ virtual int32_t SetParameters(uint8_t dataBits, uint8_t stopBits, LinxUartParity parity);
+ virtual int32_t Read(unsigned char* recBuffer, uint32_t numBytes, uint32_t start, int32_t timeout, uint32_t* numBytesRead);
+ virtual int32_t Write(const unsigned char* sendBuffer, uint32_t numBytes, uint32_t start, int32_t timeout);
+ virtual int32_t Close(void);
+
+ protected:
+
+
+ private:
+ /****************************************************************************************
+ ** Variables
+ ****************************************************************************************/
+ LinxClient *m_Client;
+ uint8_t m_Channel;
+ uint8_t m_ProtocolVersion;
+
+};
+
+#endif //LINX_CLIENT_H
\ No newline at end of file
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/device/Class hierarchy.txt b/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/device/Class hierarchy.txt
new file mode 100644
index 00000000..4fef2fde
--- /dev/null
+++ b/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/device/Class hierarchy.txt
@@ -0,0 +1,47 @@
+Class Name Declaration Implemented Description
+
+LinxChannel LinxChannel.h A Generic Channel
+ LinxAiChannel LinxChannel.h A R Analog Input channel
+ LinxSysfsAiChannel LinxLinuxChannel.h Y For Linux like systems
+ LinxWiringAiChannel LinxWiringChannel.h For Arduino
+ LinxAoChannel LinxChannel.h A R Analog Output channel
+ LinxSysfsAoChannel LinxLinuxChannel.h Y For Linux like systems
+ LinxWiringAoChannel LinxWiringChannel.h For Arduino
+ LinxDioChannel LinxChannel.h A R Digital IO channel
+ LinxSysfsDioChannel LinxLinuxChannel.h Y For Linux like systems
+ LinxRaspiDioChannel LinxRaspberryPi.h Y For Raspberry Pi, using direct memory mapped register access
+ LinxWiringDioChannel LinxWiringChannel.h For Arduino
+ LinxPwmChannel LinxChannel.h A R Generic Puls Witch Modulation channel
+ LinxSysfsPwmChannel LinxLinuxChannel.h For Linux like systems
+ LinxBBBPwmChannel LinxBeagleboneBlack.h For Beaglebone Black, special DTO handling
+ LinxWiringPwmChannel LinxWiringChannel.h For Arduino
+ LinxQeChannel LinxChannel.h A R Generic Quadrature Encoder channel
+ LinxCommChannel LinxChannel.h A Generic communication channel with read and write
+ LinxUartChannel LinxChannel.h A R Generic serial port channel with baudrate etc.
+ LinxUnixUartChannel LinxLinuxChannel.h Y For Unix termio based systems
+ LinxBBBUartChannel LinxBeagleboneBlack.h Y For Beaglebone Black, special DTO handling
+ LinxWindowsUartChannel LinxWindowsDevice.h For Windows, using Windows COMM API
+ LinxWiringUartChannel LinxWiringChannel.h For Arduino
+ LinxUnixTcpChannel LinxLinuxChannel.h For Unix BSD sockets
+ LinxWindowsTcpChannel LinxWindowsDevice.h For Windows sockets
+ LinxWiringTcpChannel LinxWiringChannel.h For Arduino TCP connections
+ LinxFmtChannel LinxChannel.h Y Output channel with formatting, pass through to composited LinxCommChannel or /dev/nul
+ LinxI2cChannel LinxChannel.h A R Generic I2C channel
+ LinxSysfsI2cChannel LinxLinuxChannel.h For Linux like systems
+ LinxBBBI2cChannel LinxBeagleboneBlack.h For Beaglebone Black, special DTO handling
+ LinxWiringI2cChannel LinxWiringChannel.h For Arduino
+ LinxSpiChannel LinxChannel.h A R Generic SPI channel
+ LinxSysfsSpiChannel LinxLinuxChannel.h For Linux like systems
+ LinxBBBSpiChannel LinxBeagleboneBlack.h For Beaglebone Black, special DTO handling
+ LinxWiringSpiChannel LinxWiringChannel.h For Arduino
+ LinxCanChannel LinxChannel.h A R Generic CAN channel
+ LinxServoChannel LinxChannel.h A R Generic Servo channel
+
+
+LinxDevice LinxDevice.h A Generic Device
+ LinxLinuxDevice LinxLinuxDevice.h A Linux based devices
+ LinxBeagleboneBlack LinxBeagleboneBlack.h Y BeagleBone Black
+ LinxRaspberryPi LinxRaspberryPi.h Y Raspberry Pi
+ LinxWindowsDevice LinxWindowsDevice.h Y Windows based device
+ LinxWiringDevice LinxWiringDevice.h Y Arduino based device
+
\ No newline at end of file
diff --git a/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/device/LinxBeagleBoneBlack.cpp b/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/device/LinxBeagleBoneBlack.cpp
index 0a853afb..616ffe30 100644
--- a/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/device/LinxBeagleBoneBlack.cpp
+++ b/LabVIEW/vi.lib/MakerHub/LINX/Firmware/Source/core/device/LinxBeagleBoneBlack.cpp
@@ -4,7 +4,8 @@
** For more information see: www.labviewmakerhub.com/linx
** For support visit the forums at: www.labviewmakerhub.com/forums/linx
**
-** Written By Sam Kristoff
+** Written by Sam Kristoff
+** Modifications by Rolf Kalbermatter
**
** BSD2 License.
****************************************************************************************/
@@ -13,301 +14,351 @@
** Includes
****************************************************************************************/
#include
-#include
#include
#include
#include
-#include
#include