diff --git a/src/Makefile b/src/Makefile
index 6d4862d..adc1650 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -21,7 +21,7 @@ CPPFLAGS += -D__MK20DX256__ -DTEENSYDUINO=128
include ../build_scripts/Teensy.mk
-TEENSY_LOADER_CLI = ~/hardware/teensy_loader_cli/teensy_loader_cli
+TEENSY_LOADER_CLI = ../teensy_loader_cli/teensy_loader_cli
REBOOT_TEENSY = stty -f $(MONITOR_PORT) 134
burn:
diff --git a/teensy_loader_cli/.gitignore b/teensy_loader_cli/.gitignore
new file mode 100644
index 0000000..b1d0905
--- /dev/null
+++ b/teensy_loader_cli/.gitignore
@@ -0,0 +1 @@
+teensy_loader_cli
diff --git a/teensy_loader_cli/Makefile b/teensy_loader_cli/Makefile
new file mode 100644
index 0000000..6956d5d
--- /dev/null
+++ b/teensy_loader_cli/Makefile
@@ -0,0 +1,40 @@
+#OS ?= LINUX
+#OS ?= WINDOWS
+OS ?= MACOSX
+#OS ?= BSD
+
+ifeq ($(OS), LINUX) # also works on FreeBSD
+CC ?= gcc
+CFLAGS ?= -O2 -Wall
+teensy_loader_cli: teensy_loader_cli.c
+ $(CC) $(CFLAGS) -s -DUSE_LIBUSB -o teensy_loader_cli teensy_loader_cli.c -lusb
+
+
+else ifeq ($(OS), WINDOWS)
+CC = i586-mingw32msvc-gcc
+CFLAGS ?= -O2 -Wall
+teensy_loader_cli.exe: teensy_loader_cli.c
+ $(CC) $(CFLAGS) -s -DUSE_WIN32 -o teensy_loader_cli.exe teensy_loader_cli.c -lhid -lsetupapi
+
+
+else ifeq ($(OS), MACOSX)
+CC ?= gcc
+SDK ?= $(shell xcrun --show-sdk-path)
+#SDK ?= /Developer/SDKs/MacOSX10.5.sdk # the old way...
+CFLAGS ?= -O2 -Wall
+teensy_loader_cli: teensy_loader_cli.c
+ $(CC) $(CFLAGS) -DUSE_APPLE_IOKIT -isysroot $(SDK) -o teensy_loader_cli teensy_loader_cli.c -Wl,-syslibroot,$(SDK) -framework IOKit -framework CoreFoundation
+
+
+else ifeq ($(OS), BSD) # works on NetBSD and OpenBSD
+CC ?= gcc
+CFLAGS ?= -O2 -Wall
+teensy_loader_cli: teensy_loader_cli.c
+ $(CC) $(CFLAGS) -s -DUSE_UHID -o teensy_loader_cli teensy_loader_cli.c
+
+
+endif
+
+
+clean:
+ rm -f teensy_loader_cli teensy_loader_cli.exe
diff --git a/teensy_loader_cli/Makefile.bsd b/teensy_loader_cli/Makefile.bsd
new file mode 100644
index 0000000..2aea86d
--- /dev/null
+++ b/teensy_loader_cli/Makefile.bsd
@@ -0,0 +1,21 @@
+OS ?= FreeBSD
+#OS ?= NetBSD
+#OS ?= OpenBSD
+
+CFLAGS ?= -O2 -Wall
+CC ?= gcc
+
+.if $(OS) == "FreeBSD"
+CFLAGS += -DUSE_LIBUSB
+LIBS = -lusb
+.elif $(OS) == "NetBSD" || $(OS) == "OpenBSD"
+CFLAGS += -DUSE_UHID
+LIBS =
+.endif
+
+
+teensy_loader_cli: teensy_loader_cli.c
+ $(CC) $(CFLAGS) -s -o teensy_loader_cli teensy_loader_cli.c $(LIBS)
+
+clean:
+ rm -f teensy_loader_cli
diff --git a/teensy_loader_cli/README.md b/teensy_loader_cli/README.md
new file mode 100644
index 0000000..edf2864
--- /dev/null
+++ b/teensy_loader_cli/README.md
@@ -0,0 +1,8 @@
+#Teensy Loader - Command Line Version#
+
+The Teensy Loader is available in a command line version for advanced users who want to automate programming, typically using a Makefile. For most uses, the graphical version in Automatic Mode is much easier.
+
+http://www.pjrc.com/teensy/loader_cli.html
+
+
+
diff --git a/teensy_loader_cli/blink_slow_Teensy3.hex b/teensy_loader_cli/blink_slow_Teensy3.hex
new file mode 100644
index 0000000..bf064b2
--- /dev/null
+++ b/teensy_loader_cli/blink_slow_Teensy3.hex
@@ -0,0 +1,767 @@
+:1000000000200020F9000000370F0000370F00002B
+:10001000370F0000370F0000370F0000350F0000CA
+:10002000350F0000350F0000350F0000370F0000BE
+:10003000370F0000350F0000370F0000390F0000A8
+:10004000370F0000370F0000370F0000370F000098
+:10005000370F0000370F0000370F0000370F000088
+:10006000370F0000370F0000370F0000370F000078
+:10007000370F0000370F0000370F0000370F000068
+:10008000950C0000370F0000C5190000370F000065
+:10009000810E0000370F0000370F0000370F0000FF
+:1000A000370F0000370F0000370F0000370F000038
+:1000B000370F0000370F0000BD1B0000D51B0000EC
+:1000C000ED1B0000051C0000370F00005911000057
+:1000D000370F0000370F0000370F0000370F000008
+:1000E000310500008105000009060000C50600007A
+:1000F00049070000370F00004A4B4CF2205210B560
+:100100001A804DF628121A80102223F80E2C00F0C7
+:100110001BFF454B454A1A60454A5A60454B1A68D1
+:1001200012F4807204D144490A604FF4A8521A6054
+:10013000424B1A7802F00802D2B21AB11A7842F091
+:1001400008021A7000233E4A3E483F4C02E019590B
+:100150009950043399188142F9D33C4B3C4A002111
+:1001600001E043F8041B9342FBD33A4B00221A6090
+:10017000394B0A221A70394B24221A70A02203F834
+:10018000012C374A137803F00203DBB2002BF9D0BD
+:10019000334A137803F01003DBB2002BF9D1304A55
+:1001A000137803F00C03082BFAD12E4B03221A709C
+:1001B00040225A702A4A137803F02003DBB2002B46
+:1001C000F9D0274A137803F04003DBB2002BF9D0B3
+:1001D000254A264B1A60264B20221A70204A137893
+:1001E00003F00C030C2BFAD1224B02221A60224A94
+:1001F00043F8442C214B4BF67F321A60072243F818
+:10020000042C62B600F0C8FA0B4B1B68DB0702D562
+:100210001B4800F0B1FA01F001FE00F095FE01F07C
+:10022000C1FDFEE70E20054038800440823F0400F7
+:100230000100002B10D0034014D0034002D007402F
+:1002400040E4FF1F44EAFF1FD029000044EAFF1FDB
+:100250001CEEFF1F08ED00E0005006400140064084
+:10026000064006400440064000000311448004405C
+:100270000040064048800440C010050014E000E043
+:100280006B94CB51FFFFFFFFFFFFFFFFFFFFFFFF5F
+:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
+:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
+:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
+:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
+:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
+:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
+:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
+:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
+:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
+:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
+:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
+:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
+:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
+:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
+:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
+:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
+:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
+:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
+:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
+:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
+:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
+:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
+:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
+:10040000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFD
+:1004100008B54EF64420074BC1F6FF701B1A062B99
+:1004200000D808BD40F20003C0F20003002BF8D052
+:100430009847F6E747EAFF1F08B54EF644204EF608
+:100440004423C1F6FF70C1F6FF731B1A9B1003EB28
+:10045000D373591000D108BD40F20002C0F200026F
+:10046000002AF8D09047F6E710B54EF64424C1F6BE
+:10047000FF74237873B9FFF7CBFF40F20003C0F29B
+:1004800000032BB142F6D010C0F20000AFF30080A1
+:100490000123237010BD00BF08B540F20003C0F275
+:1004A00000034BB142F6D0104EF64821C0F20000D6
+:1004B000C1F6FF71AFF300804EF64420C1F6FF7025
+:1004C00003682BB140F20003C0F2000303B1984768
+:1004D000BDE80840FFF7B0BF0D20012100F0B0B922
+:1004E00008B501210D2000F08BF94FF47A7000F06F
+:1004F000E1F90D20002100F083F94FF47A70BDE896
+:10050000084000F0D7B9FFFF084B4FF480721A6023
+:100510004FF400721A604FF480621A604FF4006268
+:100520001A604FF480521A60704700BF04E100E087
+:10053000114B10B51C68E0041C6004D50F4BDA6841
+:100540000AB1DB689847A10404D50C4B1A690AB1BB
+:100550001B699847A20604D5084B1A6E0AB11B6E98
+:100560009847E30606D5054BD3F8842012B1D3F89B
+:100570008430984710BD00BFA090044060EAFF1F80
+:100580001F4B10B51C68E0031C6004D51D4B1A6896
+:100590000AB11B689847A10304D51A4B5A680AB1DF
+:1005A0005B689847E20704D5164B1A6C0AB11B6CBE
+:1005B0009847A30704D5134B5A6C0AB15B6C984754
+:1005C000200704D50F4B9A6C0AB19B6C98476107C2
+:1005D00004D50C4BDA6C0AB1DB6C9847220304D5C6
+:1005E000084B5A6E0AB15B6E9847630306D5054BFC
+:1005F000D3F8802012B1D3F88030984710BD00BFE7
+:10060000A0A0044060EAFF1F2C4B10B51C68200717
+:100610001C6004D52A4B5A6A0AB15B6A9847E10606
+:1006200004D5274B9A6A0AB19B6A9847620604D59B
+:10063000234BDA6A0AB1DB6A9847230604D5204BBC
+:100640001A6B0AB11B6B9847A00604D51C4B5A6B5A
+:100650000AB15B6B9847E10704D5194BDA6B0AB115
+:10066000DB6B9847A20704D5154B9A6D0AB19B6DB9
+:100670009847630704D5124BDA6D0AB1DB6D9847D2
+:10068000A00504D50E4BDA6E0AB1DB6E9847E10582
+:1006900004D50B4B1A6F0AB11B6F9847620504D53E
+:1006A000074B5A6F0AB15B6F9847230504D5044B7B
+:1006B0009A6F0AB19B6F984710BD00BFA0B004406D
+:1006C00060EAFF1F1E4B10B51C68E0071C6004D5D4
+:1006D0001C4B9A680AB19B689847210604D5194BB0
+:1006E0005A690AB15B699847E20604D5154B9A69C5
+:1006F0000AB19B699847630704D5124BDA690AB1BE
+:10070000DB699847200704D50E4B1A6A0AB11B6AA9
+:100710009847A10704D50B4B9A6B0AB19B6B98477E
+:10072000A20604D5074B1A6D0AB11B6D98476306E4
+:1007300004D5044B5A6D0AB15B6D984710BD00BFDC
+:10074000A0C0044060EAFF1F094B10B51C68A20757
+:100750001C6004D5074B9A6E0AB19B6E9847E3075D
+:1007600004D5044BDA6F0AB1DB6F984710BD00BFA8
+:10077000A0D0044060EAFF1F044B054900221A6024
+:100780000A60044A106010221A60704714D00340B7
+:1007900004D0034000D0034010B5FFF7B5FE114B65
+:1007A000114A124C00204BF6FF7118605960282343
+:1007B0001360936013619361136293621363936395
+:1007C000092222600A4C20600A4801600A490B6035
+:1007D0008B600A4B1A6001F04FF9BDE8104000F041
+:1007E000D1BF00BF048003400C8003400080034061
+:1007F00004900340089003400C9003400090034095
+:10080000212810B518D80D4A52F8303093F880429C
+:100810003CB1012211B183F8802010BD83F8002182
+:1008200010BD02EBC00043681A6811B142F0030228
+:1008300001E022F002021A6010BD00BF7427000020
+:10084000212816D80B4A02EBC00301295B6852F835
+:10085000302004D182F880124FF4A27208E0002008
+:1008600082F8800211B94FF4807201E040F2031265
+:100870001A6070477427000072B60B4B0B491A6858
+:100880000B4B1B68096862B6490102D5322A88BF42
+:100890000133C2F53B427F323021B2FBF1F24FF41B
+:1008A0007A7000FB0320704718E000E004ED00E0E0
+:1008B000E8EAFF1F70B50446FFF7DEFF05466CB19E
+:1008C00040F2E736FFF7D8FF401BB04203D9013CA6
+:1008D00004D005F57A7500F057FAF3E770BDFFFF15
+:1008E000F8B5124D124E2F463378DBB12B681BB989
+:1008F000022000F083FB2860386898B14388C21852
+:10090000147A5CB102880133934205D300F0A0FF52
+:10091000064B00221A6007E0438005E000F098FFD4
+:100920002C60E1E74FF0FF342046F8BDF8EAFF1FE6
+:10093000F3ECFF1FF8B50C4D0C4E2F4633787BB10E
+:100940002B681BB9022000F059FB2860386838B1C9
+:100950004388C3181C7A2CB900F07AFF2C60EDE7AD
+:100960004FF0FF342046F8BDF8EAFF1FF3ECFF1FFD
+:1009700038B5124C236833B1104B1868438802888D
+:100980000024C51810E00E4B1B781BB1022000F0AC
+:1009900035FB20602468002CEED10DE02919097A7E
+:1009A00009B94CB904E00134E1189142F6DBF8E7EB
+:1009B00000F04EFF014B1C60204638BDF8EAFF1FD7
+:1009C000F3ECFF1F2DE9F843314B324DDFF8D090A7
+:1009D00001220C461A70064653E02B685BBB2C4F75
+:1009E00043F2292899F8003013B9294A137018E006
+:1009F000012000F01FFB052804D9B8F10108264AA0
+:100A000008D109E001233B7000F004FF28600028B2
+:100A1000F3D010E0137843B1012313701C4B002274
+:100A20001A704FF0FF30BDE8F8833B7000F0ACF96E
+:100A300001233B70D6E72968174A488800231370C2
+:100A4000C0F14002944238BF224600F108078018E6
+:100A5000CF194880A41A02E0F05CF85401339342A5
+:100A6000FAD1F6184B883F2B0C4B02D805221A708E
+:100A700007E040220A80002701201F7000F02CFBB5
+:100A80002F60002CA9D1024B20461C70BDE8F883D2
+:100A9000ECEAFF1FF0EAFF1FF4EAFF1FFCEAFF1F6A
+:100AA000F3ECFF1F07B502AB012103F8010D184657
+:100AB000FFF788FF0EBDFFFF38B50E4B1B78C3B1A3
+:100AC0000D4B1968A9B14A889AB10C4800230370EC
+:100AD0008C181D4602E0E0180133057298183F2873
+:100AE000F9DD40230B80012000F0F6FA024B0022D2
+:100AF0001A6038BDF3ECFF1FF0EAFF1FFCEAFF1F8E
+:100B000038B50C4B1B789BB90B4A11684A881D46B7
+:100B10008C1802E0E0180133057298183F28F9DDBF
+:100B200040230B80012000F0D7FA034B00221A600B
+:100B300038BD00BFECEAFF1FF0EAFF1F0E4B1B6839
+:100B40005A0570B5064616D50C4B0D4D1C78013470
+:100B50003F2C88BF002401E000F016F92B78A34257
+:100B6000FAD0084B1E55084B01221A70034B1C701B
+:100B7000064BBC221A7070BD3480044081EBFF1F0D
+:100B800080EBFF1FFFEAFF1FFDEAFF1F03A00640E7
+:100B9000184B1B682DE9F0478A465905064627D5AC
+:100BA0000546154FDFF860801BE03C7898F8009010
+:100BB00001343F2C88BF0024A14508D015F8012B33
+:100BC0000E4B1A550E4B01221A703C7009E00D4B6A
+:100BD000BC221A7000F0D8F898F800304B45F9D0D4
+:100BE000ECE706EB0A039D42DFD3064BBC221A70EA
+:100BF000BDE8F0873480044081EBFF1FFFEAFF1F50
+:100C0000FDEAFF1F03A0064080EBFF1F10B5044C58
+:100C100001E000F0B9F82378002BFAD110BD00BF35
+:100C2000FDEAFF1F044B1878044B1B78984238BF2D
+:100C30004030C01A704700BF7FEBFF1FFEEAFF1F66
+:100C4000084B094A19781378994208D00133DBB26E
+:100C50003F2B88BF00230549C85C137070474FF0D5
+:100C6000FF3070477FEBFF1FFEEAFF1F3FEBFF1FC8
+:100C7000054B1A78054B1B789A4202D0044AD05C87
+:100C800070474FF0FF3070477FEBFF1FFEEAFF1FFA
+:100C90003FEBFF1FF0B52F4B1B7813F0300F21D027
+:100CA00072B62D4B197831B90F3B40221B782B4B74
+:100CB0001A7062B616E062B6294B2A4C1A782A4B93
+:100CC0002A4D1878531CDBB23F2B88BF00232678AF
+:100CD00083421CBFEE541A46013911F0FF01F1D1D5
+:100CE0001F4B1A70224B1B7819465BB2002B20DA7F
+:100CF000184A137818061CD51E4B1F4E1F781F4B21
+:100D0000184D1B781E4CBB420AD00133DBB23F2B7F
+:100D100088BF00231078F05C287020780728F2D96B
+:100D2000164A13700B4B1B781B0602D5104B7C2206
+:100D30001A7001F04003DBB25BB1064B1B7803F085
+:100D40004003DBB22BB10F4B00221A70084B3C2240
+:100D50001A70F0BD04A0064016A0064011A006407F
+:100D60007FEBFF1F07A00640FEEAFF1F3FEBFF1FC0
+:100D700003A0064081EBFF1FFFEAFF1F80EBFF1F70
+:100D800014A00640FDEAFF1F7047FFFF0E4B1B68D3
+:100D9000DA0470B5064616D50C4B0D4D1C7801349F
+:100DA000272C88BF002401E0FFF7EEFF2B78A34239
+:100DB000FAD0084B1E55084B01221A70034B1C70C9
+:100DC000064BAC221A7070BD34800440EEEBFF1F5E
+:100DD000EDEBFF1F84EBFF1F82EBFF1F03C00640FC
+:100DE00038B54518044603E014F8010BFFF7CEFFB1
+:100DF000AC42F9D138BDFFFF10B5044C01E0FFF75C
+:100E0000C3FF2378002BFAD110BD00BF82EBFF1F78
+:100E1000044B1878044B1B78984238BF4030C01AF6
+:100E2000704700BFECEBFF1F83EBFF1F084B094A25
+:100E300019781378994208D00133DBB23F2B88BF71
+:100E400000230549C85C137070474FF0FF307047AE
+:100E5000ECEBFF1F83EBFF1FACEBFF1F054B1A787A
+:100E6000054B1B789A4202D0044AD05C70474FF081
+:100E7000FF307047ECEBFF1F83EBFF1FACEBFF1F56
+:100E800010B5224B1B7803F02003DBB27BB1204B63
+:100E9000204A1878137820490133DBB209783F2BB8
+:100EA00088BF00238B4202D01C49C85413701C49D0
+:100EB0000B7818465BB2002B16DA144B1B781B0616
+:100EC00012D5184B184A1C7813789C4202D16C2317
+:100ED0000B7009E00133DBB2272B88BF00231349D5
+:100EE000CC5C0B490C70137000F04003DBB25BB1BB
+:100EF000064B1B7803F04003DBB22BB10C4B0022F6
+:100F00001A70074B2C221A7010BD00BF04C0064097
+:100F100007C00640ECEBFF1F83EBFF1FACEBFF1F8E
+:100F200003C00640EEEBFF1FEDEBFF1F84EBFF1F3E
+:100F300082EBFF1FFEE7FEE7024B1A6801321A60E0
+:100F4000704700BFE8EAFF1F7047FFFF024A1368BF
+:100F5000181810601846704744E4FF1F1FB572B69A
+:100F6000124B70221A70124A412111700F2102F89F
+:100F7000011C80221A701A781206FCD562B60D4B3D
+:100F800001A918680A2200F085FC0B48002301AA79
+:100F90009A5C2AB100EB430101330A2B4A80F6D157
+:100FA0000133054A5B00137005B000BD000002402C
+:100FB000070002400800024022E5FF1FF0B50C4B7D
+:100FC0000C4C1A7842F0020504EBC50682F00102CF
+:100FD000706009481A700678002E0CBF8827C82751
+:100FE00047EA014186F0010644F835100670F0BD6D
+:100FF0006CECFF1F00E0FF1FF4ECFF1F431E052BEE
+:1010000010B510D872B6094A52F8230010B14168E1
+:1010100042F82310064A018832F81340611A22F878
+:10102000131062B610BD002010BD00BF54ECFF1FAE
+:101030000CEEFF1F013805280BD8074B53F8203062
+:1010400072B6002001E05B680130002BFBD162B674
+:1010500070470020704700BFB0ECFF1F70B572B63C
+:10106000184E194C01239A1912F8012C02F00802AB
+:10107000D2B2E2B19900144A54F831502DB902EBC2
+:10108000431308305860114B09E041F0010154F856
+:10109000315065B902EBC103083058600C4B42F87F
+:1010A00031300C4B1A78013A1A7062B670BD0133B8
+:1010B000072BD8D162B6074B00221A70BDE87040EA
+:1010C00000F0C6BB8428000000E0FF1F880040003D
+:1010D000C8004000EAECFF1F431E052B30B532D894
+:1010E0004001194A40F01000101872B6174CE25C2B
+:1010F000032A09D8DFE802F0160218050830022298
+:1011000013E00830042210E01148124A50F823403E
+:1011100014B940F8231002E052F82300416042F86D
+:1011200023100FE0032200E00522E25410F0080F24
+:1011300001F108030A8843600CBF8823C82343EAEF
+:101140000243036062B630BD00E0FF1F0CECFF1FDE
+:10115000B0ECFF1FC8ECFF1F2DE9F74FA34EA44CC6
+:10116000357805F00403DBB2ABB1A24B1B7883B139
+:10117000A14A137823B1013BDBB2137003B900BE5F
+:101180009E4A13782BB1013BDBB213700BB9FFF70A
+:10119000B7FC0423337005F00802D2B2002A00F035
+:1011A0007B82974B1B781D094FEA930940F0F98128
+:1011B00054F8392004EBC903C2F38302013A5B6897
+:1011C0000C2A00F2EB81DFE812F0A001A001E90196
+:1011D000E901E901E901E901E901C001E901E901E8
+:1011E000E9010D001A6887495B68874D4B60874BA2
+:1011F0000A6044F83930864B0020186001232B70B8
+:1012000092B240F28165AA422061A06117D8B2F57E
+:10121000D06F80F02881B2F5817F00F0D58006D8AC
+:10122000802A00F0BB80822A40F03581BAE040F28B
+:1012300002339A4200F00881B2F5A06F10E0B2F5D7
+:10124000106F10D004D8B2F5086F40F02481A0E0F0
+:1012500040F621139A4200F0558103F580739A42BB
+:1012600040F019811BE18A78624B614D1A702B6A3C
+:10127000180603D5686A083800F0EAFA65490835A7
+:101280008D42F4D1DFF8B491DFF8B4B10025A8465F
+:10129000CA4655F8090005E04368009300F0D8FA03
+:1012A000009B18460028F7D15B4B4AF8050045F82B
+:1012B0000B00E85807E042680093019200F0C8FA7A
+:1012C000019A009B10460028F5D15851534BE85025
+:1012D000534B23F81800534B18F80320023A032A03
+:1012E00008D8DFE802F002040204002200E0012234
+:1012F00003F8082008F101080435B8F1060FC8D139
+:10130000494BDFF8409100221A7001259846474B5F
+:1013100005EB0902EB1812F8012C9B001A7002F081
+:101320000802D2B23AB300F075FAAB0038B104EB60
+:101330004512083050603E4A44F8332006E044F835
+:10134000330098F80030013388F8003000F062FA7A
+:10135000AB0043F0010338B104EBC3020830506026
+:101360002A4A44F8332006E044F8330098F8003065
+:10137000013388F80030AA0042F00201013542F042
+:1013800003020023072D44F8313044F83230BED137
+:1013900029E0184A274D12782A7083E0254D2870DD
+:1013A00068707EE08A88062A00D974E09100224A9B
+:1013B000204D8A1828706870127802F00202D2B2AA
+:1013C000002A6ED02B706CE08A8802F07F03062B17
+:1013D00061DC4B8803B15EE09100174A8A181178EE
+:1013E00021F0020111701D465CE000BF8020074023
+:1013F00000E0FF1FF3ECFF1F6DECFF1FFCEAFF1F77
+:1014000090200740E0ECFF1FF4ECFF1FC8004000F5
+:10141000F0EBFF1FA8E0FF1FB0ECFF1FC8ECFF1FA1
+:101420000CEEFF1F0CECFF1FEAECFF1F30C8011091
+:1014300088004000EBECFF1FC020074054ECFF1F6A
+:10144000F4EBFF1F842800008A8802F07F03062B3C
+:1014500021DC4B8803B11EE09100A04A8A18117864
+:1014600041F00201BEE74A889D4B898853F8085C29
+:10147000A3F10C007DB133F80CCC944509D133F8BD
+:101480000ACC8C4505D1120A032A0CBF2B7803899C
+:1014900008E00C33EAE7914B0F221A7032E0002388
+:1014A000A1E702238F4AB2F806904B4538BF994610
+:1014B000B9F1400F34BFC8464FF0400828464146B6
+:1014C000FFF77CFDB9EB0809454403D1B8F1400FA3
+:1014D00007D017E0B9F1400F34BFC8464FF04008BD
+:1014E00000E0C84628464146FFF768FDB9EB080909
+:1014F000454402D1B8F1400F04D17B4B7B4A1D60BB
+:10150000A2F8009001227A4B47E0764A79481168A8
+:10151000814216D15168784A914212D11A78A92A8B
+:101520000FD15A78452A0CD19A78C22A09D1DB7892
+:101530006B2B06D1714B0020052201461A70FFF774
+:101540003DFD6F4B44F8393028E0674BD3F80080FD
+:10155000B8F1000F18D0DFF89491B9F800A0BAF1F3
+:10156000400F34BF5546402540462946FFF726FD2B
+:10157000C5EB0A039BB2A9F800300BB9402D01D18D
+:1015800008EB0503584A1360564B1A88B2F5A06F52
+:1015900004D100225A709A785A4B1A700122544B87
+:1015A0006DE004EBC90803F00803D8F80420013DFE
+:1015B000D9B2A2F10800EDB2002937D000F048F905
+:1015C0005148524B50F82510F1B14A6840F8252097
+:1015D00001F10802C8F804205A5D032A0BD8DFE89D
+:1015E00002F002040608032204E0022202E00522BF
+:1015F00000E004225A5518F0080F0A880CBF88230F
+:10160000C82343EA024342E05A5D032A07D8DFE8D1
+:1016100002F040400204002206E0012204E018F03B
+:10162000080F0CBF022203225A5532E054F8393019
+:101630001B0C22F8083C23B322F8061C42F8041CB9
+:10164000334A344952F8257017B942F8250002E0B0
+:1016500051F825205060304A41F8250032F8151025
+:101660005B1822F8153000F0D5F818B10830C8F82A
+:10167000040006E0294B44F839001A7801321A7048
+:1016800007E01F4B264A18F0080F08BF134644F81E
+:1016900039300823337063E5E90751D514492048F0
+:1016A000204C02230B70204B1A70204B186098605E
+:1016B0001F481A61D8609A615C60084B0D20187051
+:1016C0001C48FF23037000F8083C02741A4A137088
+:1016D0001A4B9F221A7001230B704AE0C02007406A
+:1016E00098280000E0ECFF1FF0EBFF1FE8ECFF1F65
+:1016F0009420074021090003010004006DECFF1F46
+:10170000C800400098200740B0ECFF1F0CECFF1F02
+:1017100054ECFF1FF4EBFF1F0CEEFF1FEAECFF1F62
+:101720008800400014ECFF1F6CECFF1F00E0FF1F5F
+:1017300070ECFF1F882007408C2007408420074062
+:101740002B0605D50C4B0D221A70802203F8402C75
+:1017500005F00203DBB22BB1084B1A781A70022293
+:1017600003F8082C05F01005EDB215B1044B10225A
+:101770001A70BDE8FE8F00BFC020074088200740D8
+:101780008020074008B5FFF7E9FB00231B491A46F4
+:101790005A50C8180833C82B4260F9D1184B1A6840
+:1017A00042F480221A60174B80221A701978154A69
+:1017B0000906FBD4114B1449C3F307200870C3F387
+:1017C00007401B0E08750B76FF2301F81C3C01F83F
+:1017D000143C01F88C3C137843F040031370002153
+:1017E000012302F8783C02F80C1C02F8883C074BF5
+:1017F00008221A60064B10221A7008BD00E0FF1F75
+:10180000348004400C2107409C20074004E100E0A4
+:101810000821074072B60C4A1168B1FA81F30B2B0C
+:1018200002D962B6002070474FF0004020FA03F062
+:1018300021EA0001116062B6044948225343C818E6
+:101840000022CA504260704738E5FF1FE0E0FF1FEA
+:101850000C4B4822C31AB3FBF2F30B2B11D80A4AE4
+:10186000127822B1094A12780AB1FFF7F7BB72B6B3
+:10187000074A4FF0004121FA03F311681943116040
+:1018800062B67047E0E0FF1FEAECFF1FF3ECFF1FBA
+:1018900038E5FF1F10B50023B0FBF2F402FB140083
+:1018A000092801D8303000E03730C85420460CB148
+:1018B0000133F1E7CA185470224605E0885CCC5C1D
+:1018C0008C54C8540132013B9A42F7DB084610BDE4
+:1018D0000E4B1B681A0570B5064616D50C4B0D4D00
+:1018E0001C780134272C88BF002401E0FFF74CFA54
+:1018F0002B78A342FAD0084B1E55084B01221A70D0
+:10190000034B1C70064BAC221A7070BD348004402F
+:1019100061EDFF1F60EDFF1FF7ECFF1FF5ECFF1FF0
+:1019200003B0064038B54518044603E014F8010B2F
+:10193000FFF7CEFFAC42F9D138BDFFFF10B5044C24
+:1019400001E0FFF721FA2378002BFAD110BD00BF88
+:10195000F5ECFF1F044B1878044B1B78984238BFF6
+:101960004030C01A704700BF5FEDFF1FF6ECFF1F4D
+:10197000084B094A19781378994208D00133DBB231
+:101980003F2B88BF00230549C85C137070474FF098
+:10199000FF3070475FEDFF1FF6ECFF1F1FEDFF1FCD
+:1019A000054B1A78054B1B789A4202D0044AD05C4A
+:1019B00070474FF0FF3070475FEDFF1FF6ECFF1FE1
+:1019C0001FEDFF1F10B5224B1B7803F02003DBB285
+:1019D0007BB1204B204A1878137820490133DBB2C1
+:1019E00009783F2B88BF00238B4202D01C49C85482
+:1019F00013701C490B7818465BB2002B16DA144B97
+:101A00001B781B0612D5184B184A1C7813789C4279
+:101A100002D16C230B7009E00133DBB2272B88BFA6
+:101A200000231349CC5C0B490C70137000F0400389
+:101A3000DBB25BB1064B1B7803F04003DBB22BB18A
+:101A40000C4B00221A70074B2C221A7010BD00BFDD
+:101A500004B0064007B006405FEDFF1FF6ECFF1F25
+:101A60001FEDFF1F03B0064061EDFF1F60EDFF1F7C
+:101A7000F7ECFF1FF5ECFF1F1C4B60221A70E122F0
+:101A80005A701B4B1B4A19781B4B082901D10121A5
+:101A900002E00A2903D139211160132206E00C2942
+:101AA00001D1352100E03D21116012221A60134B53
+:101AB0001A78134B02B101221A60124B1A78124B9A
+:101AC000012A01D880220CE0042A01D8842208E0EF
+:101AD000082A01D8852204E0102A01D8862200E0D5
+:101AE00087221A60094B01221A7070470040074094
+:101AF0003CE5FF1F08B003400CB0034063EDFF1F3F
+:101B000020B003403DE5FF1F24B0034062EDFF1FFE
+:101B1000F0B505468BB022B90368C9B21B68984777
+:101B20002CE0012A08BF0A2221B930228DF8252095
+:101B3000212413E02124B1FBF2F002FB1011C9B201
+:101B4000092901D8303100E037310AAF3E1906F8D3
+:101B5000241C014610B1013CE4B2ECE733B1013C76
+:101B60000AAAE4B213192D2203F8242C2B6801AF22
+:101B70005B6828463919C4F1220298470BB0F0BDC2
+:101B800008461146FEF71EBF0846FEF78BBFFEF75C
+:101B900093BFFEF7CFBEFEF7A3BEFEF7E9BEFFFF81
+:101BA000044B00221A711A73034A4FF47A71996038
+:101BB0001A60704764EDFF1F1829000008B5034B39
+:101BC00001221A60024B1B68984708BD0C71034044
+:101BD0007CEDFF1F08B5034B01221A60024B5B68C6
+:101BE000984708BD1C7103407CEDFF1F08B5034BEF
+:101BF00001221A60024B9B68984708BD2C71034074
+:101C00007CEDFF1F08B5034B01221A60024BDB6815
+:101C1000984708BD3C7103407CEDFF1F054B012236
+:101C20001A60054B1A6822F400021A60034B002266
+:101C30001A707047007003403C80044078EDFF1F2D
+:101C4000037B0122591103F01F0302FA03F3084A30
+:101C500042F821308268002313604178054A5354CA
+:101C6000D15C21B90133042BFAD1FFF7D7BF7047FC
+:101C700080E100E074EDFF1F037810B504460BB15E
+:101C8000FFF7DEFF0023237010BD10B50446FFF7F9
+:101C9000F3FF204610BDFFFF03480449044A002318
+:101CA000037000F0ABB800BF8CEDFF1F8B1C000071
+:101CB00040E4FF1F10B5084614461146FFF790F8A0
+:101CC000204610BD084608B5FFF760F8012008BDA2
+:101CD000FFF792B8FFF7AAB8FFF7C0B8FFF798B8B8
+:101CE00010B5084614461146FEF752FF204610BDB7
+:101CF000084608B5FEF722FF012008BDFEF786BFA3
+:101D0000FEF79EBFFEF7B4BFFEF78CBF044B002268
+:101D10001A711A73034A4FF47A7199601A60704706
+:101D2000A0EDFF1F382900002DE9F04100240746EF
+:101D30000D4626463B190A22197928460023FFF74B
+:101D4000E7FE2B6880462E211B6828469847013401
+:101D50004044032C0644EDD12846F9790A22002399
+:101D6000FFF7D6FE8019BDE8F081FFFF044B054A5E
+:101D70001A6000221A715A719A71DA71704700BFA5
+:101D8000B0EDFF1F58290000044B00221A711A738E
+:101D9000034A4FF47A7199601A607047B8EDFF1FDB
+:101DA0006829000008B5FEF797FBFEF799FBFEF7E0
+:101DB000EBFFFAE710B5084614461146FFF7B2FDEF
+:101DC000204610BD084608B5FFF782FD012008BD7A
+:101DD000FFF7B4BDFFF7CCBDFFF7E2BDFFF7BABD1B
+:101DE000044B00221A711A73034A4FF47A719960F6
+:101DF0001A607047C8EDFF1F882900000346084697
+:101E0000194600F001B800BF30B405460C46134631
+:101E100002202946224630BC00F020BB70B542F6B5
+:101E2000B41642F6B415C0F20006C0F20005761BE7
+:101E3000B61007D0043D002455F8043F01349847FC
+:101E4000A642F9D142F6D01642F6B415C0F2000609
+:101E5000C0F20005761B00F0A7FDB61008D0043DC7
+:101E6000002455F8043F01349847A642F9D170BDCB
+:101E700070BD00BF4EF240530146C1F6FF731868B3
+:101E800000F008B84EF240530146C1F6FF731868DF
+:101E900000F0A6BB2DE9F04F01F10B04162C83B026
+:101EA000074630D924F00704E30F8C422CBF1946B3
+:101EB00043F0010100292FD1384600F0B7FAB4F5FC
+:101EC000FC7F2ED24FEAD40C4EF23466C1F6FF7678
+:101ED00006EBCC02D368934200F01182596803F1FB
+:101EE0000808DA68384621F0030499681B195C6811
+:101EF000CA6044F0010491605C6000F099FA4046C9
+:101F000003B0BDE8F08F002310248C422CBF19468B
+:101F100043F001010029CFD00C234FF000083B60B3
+:101F2000EDE75FEA542C04BF4FEAD40C4FEA4C05AE
+:101F300040F08F804EF23466C1F6FF7606EB8505E1
+:101F4000EB689D4206D10DE0002A80F25581DB68E6
+:101F50009D4207D0596821F003010A1B0F2AF3DDC7
+:101F60000CF1FF3C0CF1010C4EF234623369C1F606
+:101F7000FF7202F1080E734508BFD2F8049022D018
+:101F8000586820F00300011B0F2900F38481002909
+:101F9000C2F814E0C2F810E066DAB0F5007F80F015
+:101FA0004E81C1084FF0010802EBC100891008FA08
+:101FB00001F851688568D86048EA0109C2F80490C0
+:101FC0009D60EB60836001224FEAAC0302FA03F3E9
+:101FD0004B4554D819EA030F0DD193402CF0030C54
+:101FE00019EA030F0CF1040C05D15B000CF1040C91
+:101FF00019EA030FF9D006EBCC09E0464846C2685F
+:10200000904207D15BE1002980F28381D26890423F
+:1020100000F05581556825F00305291B0F29F2DDD5
+:1020200090461319D56844F0010058F8084F41F064
+:10203000010C50603846C3F804C0E560AC607361C1
+:102040003361C3F80CE0C3F808E0595000F0F0F930
+:1020500055E7BCF1040F00F2DE804FEA941C0CF14E
+:10206000380C4FEA4C0565E71A1803F108083846A2
+:10207000536843F00103536000F0DAF93FE7B568B5
+:102080006B6823F0030A544504D8C4EB0A030F2BF2
+:1020900000F3A4804EF6D859D6F80814C1F6FF799B
+:1020A00005EB0A020131D9F80030234408BF03F1DF
+:1020B000100B06D003F580530F3323F47F6323F016
+:1020C0000F0B38465946019200F0B4F9019A411CB1
+:1020D000804600F06881824200F23181D9F80430F4
+:1020E00042455B44C9F8043000F06681D6F8081414
+:1020F0004EF23460C1F6FF70013117BFC2EB080227
+:10210000C0F808849B18C9F8043018F00703384653
+:102110001FBFC3F10802C3F58053904403F10802C6
+:1021200008EB0B0308BF4FF480521B051B0DC3EBDC
+:10213000020B594600F07EF9431C00F04981C8EBC0
+:102140000001594441F00101D9F80430B5424EF67E
+:10215000D852C6F808805B44C1F6FF72C8F8041074
+:10216000C9F8043018D0BAF10F0F40F20B81AAF170
+:102170000C00696820F007004FF0050C05EB000E1D
+:102180000F2801F0010140EA01016960CEF804C0A6
+:10219000CEF808C000F220814EF6D852D9F82C10A3
+:1021A000C1F6FF72B5688B42D9F8301088BFD36290
+:1021B0004EF6D852C1F6FF728B4288BF13636A682D
+:1021C00022F003029442C4EB020301D80F2B05DC7A
+:1021D00038464FF0000800F02BF990E62A1943F03A
+:1021E000010344F0010438466C6005F108085360AF
+:1021F000B26000F01DF982E65918DA689C6838462A
+:102200004D6803F1080845F00105E26094604D60F7
+:1022100000F00EF973E6BCF1140F9CBF0CF15B0CDF
+:102220004FEA4C057FF686AEBCF1540F00F2938066
+:102230004FEA143C0CF16E0C4FEA4C057AE6420A68
+:10224000042A75D9142A9CBF02F15B094FEA49059B
+:1022500008D9542A00F2C9804FEA103909F16E09F1
+:102260004FEA490506EB85054EF23468C1F6FF7862
+:10227000AA68AA4279D0516821F00301884202D2AB
+:1022800092689542F7D1D068D6F80490D8609A60E9
+:10229000D360836097E61D1941F00106556144F053
+:1022A0000104156138465C6003F10808C5F80CE0CC
+:1022B000C5F808E06E60695000F0BAF81FE608F152
+:1022C0000108083018F0030F7FF499AE4A461CF05D
+:1022D000030FA2F108010CF1FF3C00F09E80126890
+:1022E0008A42F4D072685B0093423FF6C8AE002B7E
+:1022F0003FF4C5AE1A4200F09580C4467BE603F178
+:1023000008025B699A4208BF0CF1020C3FF42CAE44
+:10231000E4E590465519D368384658F8082F69689F
+:10232000D36041F001019A60696000F081F8E6E550
+:102330004FEA901909F138094FEA490592E7B54289
+:102340004EF23463C1F6FF733FF4C8AE9D686A680D
+:1023500022F0030236E7BCF5AA7F19D84FEAD43C35
+:102360000CF1770C4FEA4C05E4E50125D8F8041090
+:102370004FEAA909104605FA09F545EA0109C8F826
+:10238000049083E701234546C8F80430002219E78A
+:1023900040F254539C450BD84FEA944C0CF17C0C02
+:1023A0004FEA4C05C6E5B5686A6822F0030209E702
+:1023B000FC254FF07E0CBDE51105090D00297FF4C9
+:1023C00095AEB2680BEB0A0141F001015160E3E602
+:1023D00001214FF0000BB7E6384605F108010192E4
+:1023E00000F0FEF8019A5368D6E6B2F5AA7F06D847
+:1023F0004FEAD03909F177094FEA490532E740F24F
+:102400005451FC258A424FF07E099EBF4FEA904905
+:1024100009F17C094FEA490524E7726822EA0302C0
+:10242000726060E75B0008F1040863E7704700BF73
+:10243000704700BF38B54EF61864C1F6FF74054604
+:10244000084600232360FEF781FD431C00D038BD01
+:102450002368002BFBD02B6038BD00BF2DE9F04175
+:1024600042F6A014C0F2000484B007462568AC6CA4
+:10247000002C42D066681F2E1ADD41F67564C0F24A
+:10248000000424B94FF0FF3004B0BDE8F0818C2087
+:10249000039102920193FFF7EDFC0399029A019BCD
+:1024A00004460028EED0A86C002684E84100AC6405
+:1024B000DFB1D4F8886026B3D6F8008165680120C2
+:1024C000022F05F1200C00FA05F046F8252048EA15
+:1024D000000246F82C3008BFD6F80431C6F80021B7
+:1024E00004BF1843C6F8040100E06568AB1C002077
+:1024F0000135656044F82310C6E705F14C04AC646F
+:10250000B8E741F67560C0F200000028BAD04FF479
+:102510008470039102920193FFF7ACFC0399029A35
+:10252000019B06460028ADD00020C6F80001C6F881
+:1025300004018046C4F88860C0E700BFF8B54EF2D9
+:102540003464C1F6FF740F460546FFF76FFFA368BA
+:102550005E6826F0030606F6EF73DF1B3F0B013FB4
+:102560003F03B7F5805F07DB00212846FFF762FFD6
+:10257000A3689B19984204D02846FFF759FF002012
+:10258000F8BD79422846FFF755FF013010D04EF6CE
+:10259000DC53A168C1F6FF73F61B284646F001061E
+:1025A0001A684E60D71B1F60FFF742FF0120F8BD7D
+:1025B00000212846FFF73EFFA368C21A0F2ADBDD81
+:1025C0004EF63C244EF6DC51C1F6FF74C1F6FF71A5
+:1025D00042F001025A602368C01A0860CCE700BFCD
+:1025E0002DE9F0410E46804600295CD0FFF71EFF22
+:1025F0004EF2346556F8041CC1F6FF75A6F10804C6
+:1026000021F00103AF68E2189742506820F0030000
+:1026100067D011F00101506035D00021161876689E
+:1026200016F0010F06D11B18906800294DD0D26812
+:10263000C260906043F00102E3506260F1B9B3F50B
+:10264000007F32D35A0A042A6CD8980938304100E6
+:1026500005EB81054EF23461C1F6FF71AA68AA420A
+:102660006BD0516821F003018B4202D292689542EF
+:10267000F7D1D368E360A260D4609C604046BDE8B7
+:10268000F041FFF7D5BE56F8086C05F1080CA41B05
+:102690009B19A668664543D0D4F80CC0C6F80CC098
+:1026A000CCF80860BAE7BDE8F081DB080121686872
+:1026B00005EBC3029B1001FA03F3E2609168184333
+:1026C0006860A160CC609460D8E7294EB042AED17A
+:1026D0006C6143F001022C61E060A0606260E35035
+:1026E000CCE7C018CB0707D456F8083CE41AC0184A
+:1026F000A268E368D3609A604EF6402240F001037E
+:10270000C1F6FF726360AC6013689842B6D34EF6B0
+:10271000D8534046C1F6FF731968FFF70FFFADE7C6
+:1027200001217BE702F15B004100142A90D9542A71
+:102730000CD8180B6E3041008AE701264D688010D6
+:10274000134606FA00F005434D6093E7B2F5AA7F01
+:1027500003D8D80B773041007AE740F254518A42CF
+:1027600003D8980C7C30410072E7FC217E206FE793
+:102770003CE6FF1F4008FE4340A004404408FE43DF
+:1027800044A004400018FE4300C004403000FE4353
+:10279000309004403400FE43349004401C18FE4343
+:1027A0001CC004401018FE4310C004400818FE432B
+:1027B00008C004400C18FE430CC004400C10FE433B
+:1027C0000CB004401010FE4310B004401810FE433B
+:1027D00018B004401C10FE431CB004401410FE430B
+:1027E00014B004400418FE4304C004400010FE432B
+:1027F00000B004400008FE4300A004400408FE436B
+:1028000004A004400C08FE430CA004400808FE434A
+:1028100008A004401418FE4314C004401818FE43D6
+:1028200018C004400410FE4304B004400810FE43E6
+:1028300008B004401400FE43149004404C08FE43CA
+:102840004CA004400420FE4304D004402410FE4366
+:1028500024B004402010FE4320B004402810FE4362
+:1028600028B004402C10FE432CB004400020FE434E
+:1028700000D004404808FE4348A004401000FE4336
+:1028800010900440151915190000FFFF0001000009
+:1028900048E4FF1F120000000002000072E4FF1F66
+:1028A0004900000000220100BBE4FF1F21000000DE
+:1028B00000210100A4E4FF1F090000000022000025
+:1028C000DCE4FF1F1C0000000021000084E4FF1F67
+:1028D00009000000000300001EE5FF1F00000000CB
+:1028E000010309045AE4FF1F000000000203090469
+:1028F000F8E4FF1F000000000303090422E5FF1FA6
+:1029000000000000000000000000000000000000C7
+:102910000000000000000000891B0000811B000077
+:102920009B1B0000971B0000931B00008F1B0000E7
+:102930000000000000000000C51C0000B51C0000E5
+:10294000DD1C0000D51C0000D91C0000D11C0000BB
+:102950000000000000000000291D00000000000031
+:102960000000000000000000F11C0000E11C00005D
+:10297000091D0000011D0000051D0000FD1C0000D8
+:102980000000000000000000C51D0000B51D000093
+:10299000DD1D0000D51D0000D91D0000D11D000067
+:1029A00044E5FF1F43000000F8B500BFF8BC08BCB9
+:1029B0009E46704799040000A11B0000991C00006E
+:1029C0000D1D00006D1D0000891D0000E11D0000AF
+:1029D000000000001CEEFF1F12010002000000407A
+:1029E000C0168604000101020301180354006500AB
+:1029F00065006E00730079006400750069006E0068
+:102A00006F0009024900020100C0320904000002FF
+:102A100003000000092111010001221C00070583A9
+:102A200003400001070504034000010904010002FE
+:102A30000300000009211101000122210007058186
+:102A4000034000010705020320000206C9FF090434
+:102A5000A15C7508150026FF009540097581029557
+:102A6000200976910295040976B102C006ABFF0AEF
+:102A70000002A1017508150026FF0095400901819B
+:102A800002954009029102C02603540065006500CA
+:102A90006E00730079006400750069006E006F00BD
+:102AA0002000520061007700480049004400040300
+:102AB00009040C03000000000000000000000000FA
+:102AC0000000000000000000FFFFFFFF0A040000FC
+:102AD00044E5FF1F000000000000000000000000AF
+:102AE00000000000000000000000000000000000E6
+:102AF00000000000A4290000000000000000000009
+:102B000000000000000000000000000000000000C5
+:102B100000000000000000000000000000000000B5
+:102B200000000000000000000000000000000000A5
+:102B30000000000000000000000000000000000095
+:102B40000000000000000000000000000000000085
+:102B50000000000000000000000000000000000075
+:102B60000000000000000000000000000000000065
+:102B70000000000000000000000000000000000055
+:102B80000000000000000000000000000000000045
+:102B90000000000000000000000000000000000035
+:102BA0000000000000000000000000000000000025
+:102BB0000000000000000000000000000000000015
+:102BC00000000000000000000000000034E6FF1FCD
+:102BD00034E6FF1F3CE6FF1F3CE6FF1F44E6FF1FF5
+:102BE00044E6FF1F4CE6FF1F4CE6FF1F54E6FF1FA5
+:102BF00054E6FF1F5CE6FF1F5CE6FF1F64E6FF1F55
+:102C000064E6FF1F6CE6FF1F6CE6FF1F74E6FF1F04
+:102C100074E6FF1F7CE6FF1F7CE6FF1F84E6FF1FB4
+:102C200084E6FF1F8CE6FF1F8CE6FF1F94E6FF1F64
+:102C300094E6FF1F9CE6FF1F9CE6FF1FA4E6FF1F14
+:102C4000A4E6FF1FACE6FF1FACE6FF1FB4E6FF1FC4
+:102C5000B4E6FF1FBCE6FF1FBCE6FF1FC4E6FF1F74
+:102C6000C4E6FF1FCCE6FF1FCCE6FF1FD4E6FF1F24
+:102C7000D4E6FF1FDCE6FF1FDCE6FF1FE4E6FF1FD4
+:102C8000E4E6FF1FECE6FF1FECE6FF1FF4E6FF1F84
+:102C9000F4E6FF1FFCE6FF1FFCE6FF1F04E7FF1F33
+:102CA00004E7FF1F0CE7FF1F0CE7FF1F14E7FF1FE0
+:102CB00014E7FF1F1CE7FF1F1CE7FF1F24E7FF1F90
+:102CC00024E7FF1F2CE7FF1F2CE7FF1F34E7FF1F40
+:102CD00034E7FF1F3CE7FF1F3CE7FF1F44E7FF1FF0
+:102CE00044E7FF1F4CE7FF1F4CE7FF1F54E7FF1FA0
+:102CF00054E7FF1F5CE7FF1F5CE7FF1F64E7FF1F50
+:102D000064E7FF1F6CE7FF1F6CE7FF1F74E7FF1FFF
+:102D100074E7FF1F7CE7FF1F7CE7FF1F84E7FF1FAF
+:102D200084E7FF1F8CE7FF1F8CE7FF1F94E7FF1F5F
+:102D300094E7FF1F9CE7FF1F9CE7FF1FA4E7FF1F0F
+:102D4000A4E7FF1FACE7FF1FACE7FF1FB4E7FF1FBF
+:102D5000B4E7FF1FBCE7FF1FBCE7FF1FC4E7FF1F6F
+:102D6000C4E7FF1FCCE7FF1FCCE7FF1FD4E7FF1F1F
+:102D7000D4E7FF1FDCE7FF1FDCE7FF1FE4E7FF1FCF
+:102D8000E4E7FF1FECE7FF1FECE7FF1FF4E7FF1F7F
+:102D9000F4E7FF1FFCE7FF1FFCE7FF1F04E8FF1F2E
+:102DA00004E8FF1F0CE8FF1F0CE8FF1F14E8FF1FDB
+:102DB00014E8FF1F1CE8FF1F1CE8FF1F24E8FF1F8B
+:102DC00024E8FF1F2CE8FF1F2CE8FF1F34E8FF1F3B
+:102DD00034E8FF1F3CE8FF1F3CE8FF1F44E8FF1FEB
+:102DE00044E8FF1F4CE8FF1F4CE8FF1F54E8FF1F9B
+:102DF00054E8FF1F5CE8FF1F5CE8FF1F64E8FF1F4B
+:102E000064E8FF1F6CE8FF1F6CE8FF1F74E8FF1FFA
+:102E100074E8FF1F7CE8FF1F7CE8FF1F84E8FF1FAA
+:102E200084E8FF1F8CE8FF1F8CE8FF1F94E8FF1F5A
+:102E300094E8FF1F9CE8FF1F9CE8FF1FA4E8FF1F0A
+:102E4000A4E8FF1FACE8FF1FACE8FF1FB4E8FF1FBA
+:102E5000B4E8FF1FBCE8FF1FBCE8FF1FC4E8FF1F6A
+:102E6000C4E8FF1FCCE8FF1FCCE8FF1FD4E8FF1F1A
+:102E7000D4E8FF1FDCE8FF1FDCE8FF1FE4E8FF1FCA
+:102E8000E4E8FF1FECE8FF1FECE8FF1FF4E8FF1F7A
+:102E9000F4E8FF1FFCE8FF1FFCE8FF1F04E9FF1F29
+:102EA00004E9FF1F0CE9FF1F0CE9FF1F14E9FF1FD6
+:102EB00014E9FF1F1CE9FF1F1CE9FF1F24E9FF1F86
+:102EC00024E9FF1F2CE9FF1F2CE9FF1F34E9FF1F36
+:102ED00034E9FF1F3CE9FF1F3CE9FF1F44E9FF1FE6
+:102EE00044E9FF1F4CE9FF1F4CE9FF1F54E9FF1F96
+:102EF00054E9FF1F5CE9FF1F5CE9FF1F64E9FF1F46
+:102F000064E9FF1F6CE9FF1F6CE9FF1F74E9FF1FF5
+:102F100074E9FF1F7CE9FF1F7CE9FF1F84E9FF1FA5
+:102F200084E9FF1F8CE9FF1F8CE9FF1F94E9FF1F55
+:102F300094E9FF1F9CE9FF1F9CE9FF1FA4E9FF1F05
+:102F4000A4E9FF1FACE9FF1FACE9FF1FB4E9FF1FB5
+:102F5000B4E9FF1FBCE9FF1FBCE9FF1FC4E9FF1F65
+:102F6000C4E9FF1FCCE9FF1FCCE9FF1FD4E9FF1F15
+:102F7000D4E9FF1FDCE9FF1FDCE9FF1FE4E9FF1FC5
+:102F8000E4E9FF1FECE9FF1FECE9FF1FF4E9FF1F75
+:102F9000F4E9FF1FFCE9FF1FFCE9FF1F04EAFF1F24
+:102FA00004EAFF1F0CEAFF1F0CEAFF1F14EAFF1FD1
+:102FB00014EAFF1F1CEAFF1F1CEAFF1F24EAFF1F81
+:102FC00024EAFF1F2CEAFF1F2CEAFF1FFFFFFFFF71
+:042FD00000000200FB
+:00000001FF
diff --git a/teensy_loader_cli/blink_slow_Teensy31.hex b/teensy_loader_cli/blink_slow_Teensy31.hex
new file mode 100644
index 0000000..981b713
--- /dev/null
+++ b/teensy_loader_cli/blink_slow_Teensy31.hex
@@ -0,0 +1,897 @@
+:1000000000800020BD01000081130000811300006A
+:100010008113000081130000811300004D130000C4
+:100020004D1300004D1300004D130000811300001C
+:10003000811300004D130000811300003D130000E8
+:100040008113000081130000811300008113000060
+:100050008113000081130000811300008113000050
+:100060008113000081130000811300008113000040
+:100070008113000081130000811300008113000030
+:100080008113000081130000811300008113000020
+:100090008113000081130000811300008113000010
+:1000A0008113000081130000811300008113000000
+:1000B00081130000811300008113000081130000F0
+:1000C00081130000811300008113000081130000E0
+:1000D00081130000811300008113000081130000D0
+:1000E00081130000811300008113000081130000C0
+:1000F00081130000050F000081130000ED1F0000B8
+:10010000811300008D120000811300008113000094
+:10011000811300008113000081130000811300008F
+:10012000811300008113000081130000811300007F
+:10013000811300008113000081130000811300006F
+:10014000811300008113000081130000811300005F
+:100150007D22000095220000AD220000C522000093
+:1001600081130000E11500008113000081130000DD
+:10017000811300008113000081130000811300002F
+:10018000811300008113000081130000811300001F
+:10019000811300008113000081130000310500006D
+:1001A0008105000009060000C5060000490700009F
+:1001B00081130000811300005D2100004F4B4CF2C1
+:1001C000205210B51A804DF628121A8000BF00BFC9
+:1001D00001F0DAF84A4B4FF010621A60494A9A600F
+:1001E000494ADA60494B1A6812F4807204D14849CE
+:1001F0000A604FF4A8521A60464B1A7802F00802BF
+:10020000D2B21AB11A7842F008021A700023424A98
+:100210004248434C02E019599950043399188142DD
+:10022000F9D3404B404A002101E043F8041B9342BC
+:10023000FBD33E4B00221A603D4B3E4A802103F81F
+:10024000011B9342FBD13C4B0A221A703B4B2422E8
+:100250001A70A02203F8012C394A137803F0020324
+:10026000DBB2002BF9D0364A137803F01003DBB26F
+:10027000002BF9D1324A137803F00C03082BFAD182
+:10028000304B03221A7040225A702D4A137803F023
+:100290002003DBB2002BF9D0294A137803F0400386
+:1002A000DBB2002BF9D0284A284B1A60284B2022B9
+:1002B0001A70234A137803F00C030C2BFAD1254B48
+:1002C00002221A60244A43F8442C244B4BF67F3216
+:1002D0001A60072243F8042C62B600F0CDFA0C4BEA
+:1002E0001B68DC0702D51E4800F046FA02F052F9FE
+:1002F00001F050F802F0F4F8FEE700BF0E200540D0
+:1003000030800440823F04000100002B10D00340E5
+:1003100014D0034002D007404084FF1F448AFF1FCF
+:10032000F0310000448AFF1F2C8EFF1F08ED00E013
+:1003300000E400E05FE400E00050064001400640B9
+:10034000064006400440064000000311448004407B
+:100350000040064048800440C010050014E000E062
+:10036000370A1053FFFFFFFFFFFFFFFFFFFFFFFFF5
+:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
+:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
+:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
+:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
+:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
+:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
+:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
+:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
+:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
+:10040000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFD
+:1004100008B548F64420074BC1F6FF701B1A062B9F
+:1004200000D808BD40F20003C0F20003002BF8D052
+:100430009847F6E7478AFF1F08B548F6442048F674
+:100440004423C1F6FF70C1F6FF731B1A9B1003EB28
+:10045000D373591000D108BD40F20002C0F200026F
+:10046000002AF8D09047F6E710B548F64424C1F6C4
+:10047000FF74237873B9FFF7CBFF40F20003C0F29B
+:1004800000032BB143F2F010C0F20000AFF3008084
+:100490000123237010BD00BF08B540F20003C0F275
+:1004A00000034BB143F2F01048F64821C0F20000BF
+:1004B000C1F6FF71AFF3008048F64420C1F6FF702B
+:1004C00003682BB140F20003C0F2000303B1984768
+:1004D000BDE80840FFF7B0BF0D20012100F07CB956
+:1004E00008B501210D2000F057F94FF47A7000F0A3
+:1004F000ADF90D20002100F04FF94FF47A70BDE8FE
+:10050000084000F0A3B9FFFF084B4FF400021A6047
+:100510004FF080721A604FF000721A604FF08062E4
+:100520001A604FF000621A60704700BF08E100E0F7
+:10053000114B10B51C68E0041C6004D50F4BDA6841
+:100540000AB1DB689847A10404D50C4B1A690AB1BB
+:100550001B699847A20604D5084B1A6E0AB11B6E98
+:100560009847E30606D5054BD3F8842012B1D3F89B
+:100570008430984710BD00BFA0900440608AFF1FE0
+:100580001F4B10B51C68E0031C6004D51D4B1A6896
+:100590000AB11B689847A10304D51A4B5A680AB1DF
+:1005A0005B689847E20704D5164B1A6C0AB11B6CBE
+:1005B0009847A30704D5134B5A6C0AB15B6C984754
+:1005C000200704D50F4B9A6C0AB19B6C98476107C2
+:1005D00004D50C4BDA6C0AB1DB6C9847220304D5C6
+:1005E000084B5A6E0AB15B6E9847630306D5054BFC
+:1005F000D3F8802012B1D3F88030984710BD00BFE7
+:10060000A0A00440608AFF1F2C4B10B51C68200777
+:100610001C6004D52A4B5A6A0AB15B6A9847E10606
+:1006200004D5274B9A6A0AB19B6A9847620604D59B
+:10063000234BDA6A0AB1DB6A9847230604D5204BBC
+:100640001A6B0AB11B6B9847A00604D51C4B5A6B5A
+:100650000AB15B6B9847E10704D5194BDA6B0AB115
+:10066000DB6B9847A20704D5154B9A6D0AB19B6DB9
+:100670009847630704D5124BDA6D0AB1DB6D9847D2
+:10068000A00504D50E4BDA6E0AB1DB6E9847E10582
+:1006900004D50B4B1A6F0AB11B6F9847620504D53E
+:1006A000074B5A6F0AB15B6F9847230504D5044B7B
+:1006B0009A6F0AB19B6F984710BD00BFA0B004406D
+:1006C000608AFF1F1E4B10B51C68E0071C6004D534
+:1006D0001C4B9A680AB19B689847210604D5194BB0
+:1006E0005A690AB15B699847E20604D5154B9A69C5
+:1006F0000AB19B699847630704D5124BDA690AB1BE
+:10070000DB699847200704D50E4B1A6A0AB11B6AA9
+:100710009847A10704D50B4B9A6B0AB19B6B98477E
+:10072000A20604D5074B1A6D0AB11B6D98476306E4
+:1007300004D5044B5A6D0AB15B6D984710BD00BFDC
+:10074000A0C00440608AFF1F094B10B51C68A207B7
+:100750001C6004D5074B9A6E0AB19B6E9847E3075D
+:1007600004D5044BDA6F0AB1DB6F984710BD00BFA8
+:10077000A0D00440608AFF1F044B054900221A6084
+:100780000A60044A106010221A60704714D00340B7
+:1007900004D0034000D00340212810B518D80D4ADA
+:1007A00052F8303093F880423CB1012211B183F805
+:1007B000802010BD83F8002110BD02EBC00043680B
+:1007C0001A6811B142F0030201E022F002021A603D
+:1007D00010BD00BFEC2E0000212816D80B4A02EBFA
+:1007E000C00301295B6852F8302004D182F88012DE
+:1007F0004FF4A27208E0002082F8800211B94FF491
+:10080000807201E040F203121A607047EC2E000083
+:1008100072B60B4B0B491A680B4B1B68096862B622
+:10082000490102D5322A88BF0133C2F53B427F32EB
+:100830003021B2FBF1F24FF47A7000FB03207047D5
+:1008400018E000E004ED00E0E88AFF1F70B5044600
+:10085000FFF7DEFF05466CB140F2E736FFF7D8FF41
+:10086000401BB04203D9013C04D005F57A7500F075
+:10087000C7FBF3E770BDFFFF10B5FFF745FE164B52
+:10088000164A174C00204BF6FF7118605960282358
+:1008900013609360136193611362936213639363B4
+:1008A000092222600F4C20606160A360236144F83C
+:1008B000042C0D4C20600D4801600D490B608B60CD
+:1008C0000C4B1A6001F0EAFB0420FFF7BFFFBDE804
+:1008D000104001F09BB900BF048003400C8003402E
+:1008E000008003400490034004800B4008800B40CC
+:1008F0000C800B4000800B40F8B5124D124E2F4675
+:100900003378DBB12B681BB9022000F0BBFD2860F7
+:10091000386898B14388C218147A5CB102880133F0
+:10092000934205D301F0DEF9064B00221A6007E07E
+:10093000438005E001F0D6F92C60E1E74FF0FF3489
+:100940002046F8BDF88AFF1FFB8CFF1FF8B50C4D41
+:100950000C4E2F4633787BB12B681BB9022000F078
+:1009600091FD2860386838B14388C3181C7A2CB9C7
+:1009700001F0B8F92C60EDE74FF0FF342046F8BDE8
+:10098000F88AFF1FFB8CFF1F38B5124C236833B168
+:10099000104B1868438802880024C51810E00E4BDD
+:1009A0001B781BB1022000F06DFD20602468002C34
+:1009B000EED10DE02919097A09B94CB904E00134E6
+:1009C000E1189142F6DBF8E701F08CF9014B1C606D
+:1009D000204638BDF88AFF1FFB8CFF1F2DE9F84326
+:1009E000314B324DDFF8D09001220C461A7006468A
+:1009F00053E02B685BBB2C4F43F2292899F8003059
+:100A000013B9294A137018E0012000F057FD05289A
+:100A100004D9B8F10108264A08D109E001233B7046
+:100A200001F042F928600028F3D010E0137843B1B8
+:100A3000012313701C4B00221A704FF0FF30BDE8E9
+:100A4000F8833B7000F0DCFA01233B70D6E729689D
+:100A5000174A488800231370C0F14002944238BFFF
+:100A6000224600F108078018CF194880A41A02E036
+:100A7000F05CF85401339342FAD1F6184B883F2BBF
+:100A80000C4B02D805221A7007E040220A8000278A
+:100A900001201F7000F064FD2F60002CA9D1024BD3
+:100AA00020461C70BDE8F883EC8AFF1FF08AFF1F08
+:100AB000F48AFF1FFC8AFF1FFB8CFF1F07B502ABE8
+:100AC000012103F8010D1846FFF788FF0EBDFFFF57
+:100AD00038B50E4B1B78C3B10D4B1968A9B14A88C4
+:100AE0009AB10C48002303708C181D4602E0E018F0
+:100AF0000133057298183F28F9DD40230B8001204F
+:100B000000F02EFD024B00221A6038BDFB8CFF1F47
+:100B1000F08AFF1FFC8AFF1F38B50C4B1B789BB96E
+:100B20000B4A11684A881D468C1802E0E018013310
+:100B3000057298183F28F9DD40230B80012000F052
+:100B40000FFD034B00221A6038BD00BFEC8AFF1F67
+:100B5000F08AFF1F1B4B1A6842F480621A601A4A1F
+:100B600000231370194A1370194A1370194A13702D
+:100B7000194A1370194B40F213321A604FF4517234
+:100B80005A60174BC0F344321A70C0F347125A70C0
+:100B900000F01F00134A987202210423137051744D
+:100BA000D374114B88221A703C2203F80D2C0F4B82
+:100BB00040226FF44A711A705B184FF400521A60A9
+:100BC000704700BF348004407F8BFF1FFE8AFF1FE9
+:100BD000888BFF1F808BFF1FFD8AFF1F40A00440F2
+:100BE00000A0064002A0064010A006402DE400E050
+:100BF000134A137800F0030103F0EC030B434107A1
+:100C000048BF43F01003137000F00F03042B04D10E
+:100C10000C4B1A7842F040021A700B4A1378C10646
+:100C200003F0EF0348BF43F010031370054A137835
+:100C3000800603F0EF0348BF43F0100313707047C2
+:100C400002A0064006A0064005A006400E4B1B6809
+:100C5000580510B503D410BD00F0D2F900E00B4CDC
+:100C60002378002BF8D10A4A4FF400511160094A49
+:100C70000949137040F203120A604A60074A137070
+:100C8000074A137010BD00BF34800440FD8AFF1F67
+:100C900084E100E003A0064040A004407F8BFF1FDA
+:100CA000FE8AFF1F38B5094B04461D78002DFCD184
+:100CB00020460121FFF790FD20462946FFF76CFDF5
+:100CC000034B53F83420034B1A6038BDFD8AFF1FD5
+:100CD000EC2E0000848BFF1F1D4B1B685A052DE96D
+:100CE000F041064632D51B4B1B680BB101221A702E
+:100CF000194B1A4D1C781A4FDFF86C8001343F2CC9
+:100D000088BF002415E000F04FFB40280DDC3B7845
+:100D10001B060ED52B78134A01333F2B88BF0023C7
+:100D200018F8031011702B7003E0FF2801DD00F0AC
+:100D300067F92B78A342E6D00B4B1E550B4B0122D3
+:100D40001A70054B1C700A4BBC221A70BDE8F0816A
+:100D500034800440848BFF1F888BFF1F808BFF1F14
+:100D600004A0064007A00640FF8AFF1FFD8AFF1F60
+:100D700003A006402DE9F84F254B1B680646580591
+:100D8000884643D5234B1B680BB101221A70224DB4
+:100D9000B346A94633E0214B1C782F7801343F2C11
+:100DA00088BF0024A74209D01BF8012B1C4B1A5501
+:100DB0001C4B01221A70194B1C7020E01A4BDFF8F3
+:100DC00070A0BC221A7000F0EFFA40280FDC9AF8ED
+:100DD000003019060FD52B78114A01333F2B88BFFD
+:100DE0000023D15C114A117089F8003003E0FF281C
+:100DF00001DD00F005F92B78BB42E4D0D4E706EB27
+:100E000008039B45C7D3084BBC221A70BDE8F88F76
+:100E100034800440848BFF1F808BFF1F888BFF1F53
+:100E2000FF8AFF1FFD8AFF1F03A0064007A00640A0
+:100E300004A0064010B5044C01E000F0E1F823786E
+:100E4000002BFAD110BD00BFFD8AFF1F044B18789C
+:100E5000044B1B78984238BF4030C01A704700BF1F
+:100E60007F8BFF1FFE8AFF1F084B094A19781378F2
+:100E7000994207D001333F2B88BF00230549C85C46
+:100E8000137070474FF0FF30704700BF7F8BFF1F1C
+:100E9000FE8AFF1F3F8BFF1F074B1A78074B1B78FB
+:100EA0009A4206D001333F2B88BF0023044AD05C0E
+:100EB00070474FF0FF3070477F8BFF1FFE8AFF1F88
+:100EC0003F8BFF1F0A4B1B685B050FD5094B1A7838
+:100ED00002F0CB021A70084A402111701A7842F0D1
+:100EE00034021A70054B1A78054B1A70704700BF10
+:100EF0003480044003A0064011A00640FE8AFF1F74
+:100F00007F8BFF1FF0B5304B1B7813F0300F20D0D4
+:100F100072B62E4B197831B90F3B40221B782C4BFF
+:100F20001A7062B615E062B62A4B2B4C1A782B4B1E
+:100F30002B4D1878531C3F2B88BF00232678834203
+:100F40001CBFEE541A46013911F0FF01F2D1214BBA
+:100F50001A70244B1B7819465BB2002B1FDA1A4A11
+:100F6000137818061BD5204B204E1F78204B1A4DA6
+:100F70001B78204CBB4209D001333F2B88BF002394
+:100F80001078F05C287020780728F3D9184A13707D
+:100F90000D4B1B781A0602D5124B7C221A7001F0F9
+:100FA0004003DBB27BB1084B1B7803F04003DBB29C
+:100FB0004BB1114B00221A70104B1B6803B11A7011
+:100FC000084B3C221A70F0BD04A0064016A0064053
+:100FD00011A006407F8BFF1F07A00640FE8AFF1F5F
+:100FE0003F8BFF1F03A00640888BFF1FFF8AFF1F58
+:100FF000808BFF1F14A00640FD8AFF1F848BFF1FFC
+:101000007047FFFF174B1A6842F480521A60164A65
+:1010100000231370154A1370154A1370154A137084
+:10102000154A1370154A40F2133111604FF4517193
+:101030005160134AC0F344311170C0F3471100F0FE
+:101040001F0051709072937013740E4B2C221A7003
+:101050000D4B40226FF44B711A705B184FF4003245
+:101060001A60704734800440F38BFF1F8A8BFF1F88
+:10107000F58BFF1FF48BFF1F898BFF1F08C00440F7
+:1010800000C0064003C0064031E400E0134A137874
+:1010900000F0030103F0EC030B43410748BF43F0AA
+:1010A0001003137000F00F03042B04D10C4B1A78BB
+:1010B00042F040021A700B4A1378C10603F0EF03A6
+:1010C00048BF43F010031370054A1378800603F0FD
+:1010D000EF0348BF43F010031370704702C006408F
+:1010E00006C0064005C006400E4B1B68D80410B56C
+:1010F00003D410BDFFF784FF00E00B4C2378002BD6
+:10110000F8D10A4A4FF400311160094A09491370B5
+:1011100040F203120A604A60074A1370074A1370CC
+:1011200010BD00BF34800440898BFF1F84E100E0C4
+:1011300003C0064008C00440F38BFF1F8A8BFF1FCB
+:101140001B4B1B68DA042DE9F04106462DD5194BDF
+:10115000194D1C78194FDFF86C800134272C88BF9B
+:10116000002415E000F020F940280DDC3B781B0638
+:101170000ED52B78124A0133272B88BF002318F88D
+:10118000031011702B7003E0FF2801DDFFF738FF1B
+:101190002B78A342E6D00B4B1E550B4B01221A7045
+:1011A000044B1C70094BAC221A70BDE8F08100BFE3
+:1011B00034800440F58BFF1FF48BFF1F04C00640F2
+:1011C00007C006408B8BFF1F898BFF1F03C00640A3
+:1011D00038B54518044603E014F8010BFFF7B0FFDB
+:1011E000AC42F9D138BDFFFF10B5044C01E0FFF768
+:1011F00007FF2378002BFAD110BD00BF898BFF1F9A
+:10120000044B1878044B1B78984238BF4030C01A02
+:10121000704700BFF38BFF1F8A8BFF1F084B094AE3
+:1012200019781378994207D001333F2B88BF0023E8
+:101230000549C85C137070474FF0FF30704700BF1E
+:10124000F38BFF1F8A8BFF1FB38BFF1F074B1A788F
+:10125000074B1B789A4206D001333F2B88BF0023EF
+:10126000044AD05C70474FF0FF307047F38BFF1F8C
+:101270008A8BFF1FB38BFF1F024B1A78024B1A7029
+:10128000704700BF8A8BFF1FF38BFF1F10B5214BE8
+:101290001B7803F02003DBB273B11F4B1F4A187891
+:1012A0001F491378097801333F2B88BF00238B42F5
+:1012B00002D01C49C85413701B490B7818465BB206
+:1012C000002B15DA134B1B781B0611D5174B184A48
+:1012D0001C7813789C4202D16C230B7008E0013318
+:1012E000272B88BF00231349CC5C0B490C7013706B
+:1012F00000F04003DBB25BB1064B1B7803F0400308
+:10130000DBB22BB10C4B00221A70074B2C221A7047
+:1013100010BD00BF04C0064007C00640F38BFF1F8E
+:101320008A8BFF1FB38BFF1F03C00640F58BFF1F87
+:10133000F48BFF1F8B8BFF1F898BFF1F024B1A68DB
+:1013400001321A60704700BFE88AFF1F38B50B4CA6
+:1013500025462368580301D500F042F92B6859054A
+:1013600001D5FFF7CFFD2B681A0501D500F03EFE31
+:101370002368DB04EDD5FFF789FFEAE734800440FA
+:1013800008B5FFF7E3FFFFFF014B10221A807047FB
+:10139000002005407047FFFF024A136818181060CC
+:1013A000184670474484FF1FEFF313839BB9EFF394
+:1013B000108098B9EFF3058323B10F2B04D9084AA5
+:1013C000985C01E04FF48070EFF311833BB19842D9
+:1013D00028BF184670474FF0FF30704718467047D7
+:1013E000F0E300E01FB572B6124B70221A70124A79
+:1013F000412111700F2102F8011C80221A701A7805
+:101400001206FCD562B60D4B01A918680A2200F03D
+:101410008BFC0B48002301AA9A5C2AB100EB430124
+:1014200001330A2B4A80F6D10133054A5B00137061
+:1014300005B000BD00000240070002400800024065
+:101440002285FF1FF0B50C4B0C4C1A7842F00205B8
+:1014500004EBC50682F00102706009481A70067834
+:10146000002E0CBF8827C82747EA014186F00106F5
+:1014700044F835100670F0BD748CFF1F0080FF1F0C
+:10148000FC8CFF1F431E052B10B510D872B6094AFD
+:1014900052F8230048B1416842F82310064A0188F7
+:1014A00032F81340611A22F8131062B610BD002002
+:1014B00010BD00BF5C8CFF1F1C8EFF1F013805286C
+:1014C0000BD872B6064B53F82030002001E05B6861
+:1014D0000130002BFBD162B670470020704700BF7F
+:1014E000B88CFF1F70B572B6184E194C01239A19AB
+:1014F00012F8012C02F00802D2B2E2B19900144AAB
+:1015000054F831502DB902EB431308305860114B99
+:1015100009E041F0010154F8315065B902EBC10313
+:10152000083058600C4B42F831300C4B1A78013AB5
+:101530001A7062B670BD0133072BD8D162B6074B63
+:1015400000221A70BDE8704000F0CCBBFC2F0000F8
+:101550000080FF1F88004000C8004000F28CFF1F81
+:10156000431E052B30B532D84001194A40F0100017
+:10157000101872B6174CE25C032A09D8DFE802F0B3
+:10158000160218050830022213E00830042210E089
+:101590001148124A50F8234014B940F8231002E0D1
+:1015A00052F82300416042F823100FE0032200E0CC
+:1015B0000522E25410F0080F01F108030A88436085
+:1015C0000CBF8823C82343EA0243036062B630BDE0
+:1015D0000080FF1F148CFF1FB88CFF1FD08CFF1FD3
+:1015E0002DE9F74FA34EA44C357805F00403DBB288
+:1015F000ABB1A24B1B7883B1A14A137823B1013B55
+:10160000DBB2137003B900BE9E4A13782BB1013BC5
+:10161000DBB213700BB9FFF77FFA0423337005F0C8
+:101620000802D2B2002A00F07B82974B1B781D097A
+:101630004FEA930940F0F98154F8392004EBC903CB
+:10164000C2F38302013A5B680C2A00F2EB81DFE807
+:1016500012F0A001A001E901E901E901E901E901B4
+:10166000E901C001E901E901E9010D001A688749B2
+:101670005B68874D4B60874B0A6044F83930864B76
+:101680000020186001232B7092B240F28165AA42BB
+:101690002061A06117D8B2F5D06F80F02881B2F533
+:1016A000817F00F0D58006D8802A00F0BB80822A96
+:1016B00040F03581BAE040F202339A4200F00881EE
+:1016C000B2F5A06F10E0B2F5106F10D004D8B2F5EB
+:1016D000086F40F02481A0E040F621139A4200F008
+:1016E000558103F580739A4240F019811BE18A7895
+:1016F000624B614D1A702B6A180603D5686A083868
+:1017000000F0F0FA654908358D42F4D1DFF8B49164
+:10171000DFF8B4B10025A846CA4655F8090005E02F
+:101720004368009300F0DEFA009B18460028F7D1CA
+:101730005B4B4AF8050045F80B00E85807E04268A3
+:101740000093019200F0CEFA019A009B1046002807
+:10175000F5D15851534BE850534B23F81800534BD5
+:1017600018F80320023A032A08D8DFE802F002043E
+:101770000204002200E0012203F8082008F1010819
+:101780000435B8F1060FC8D1494BDFF8409100226B
+:101790001A7001259846474B05EB0902EB1812F821
+:1017A000012C9B001A7002F00802D2B23AB300F08A
+:1017B0007BFAAB0038B104EB4512083050603E4A6A
+:1017C00044F8332006E044F8330098F80030013341
+:1017D00088F8003000F068FAAB0043F0010338B13C
+:1017E00004EBC302083050602A4A44F8332006E074
+:1017F00044F8330098F80030013388F80030AA002C
+:1018000042F00201013542F003020023072D44F8A3
+:10181000313044F83230BED129E0184A274D1278D1
+:101820002A7083E0254D287068707EE08A88062A39
+:1018300000D974E09100224A204D8A1828706870FF
+:10184000127802F00202D2B2002A6ED02B706CE045
+:101850008A8802F07F03062B61DC4B8803B15EE0CF
+:101860009100174A8A18117821F0020111701D4663
+:101870005CE000BF802007400080FF1FFB8CFF1F43
+:10188000758CFF1FFC8AFF1F90200740E88CFF1F0C
+:10189000FC8CFF1FC8004000F88BFF1FC080FF1F9B
+:1018A000B88CFF1FD08CFF1F1C8EFF1F148CFF1FD6
+:1018B000F28CFF1F30C8011088004000F38CFF1F1E
+:1018C000C02007405C8CFF1FFC8BFF1FFC2F00001B
+:1018D0008A8802F07F03062B21DC4B8803B11EE0CF
+:1018E0009100A04A8A18117841F00201BEE74A88A7
+:1018F0009D4B898853F8085CA3F10C007DB133F847
+:101900000CCC944509D133F80ACC8C4505D1120A88
+:10191000032A0CBF2B78038908E00C33EAE7914BCC
+:101920000F221A7032E00023A1E702238F4AB2F897
+:1019300006904B4538BF9946B9F1400F34BFC846B1
+:101940004FF0400828464146FFF77CFDB9EB0809F7
+:10195000454403D1B8F1400F07D017E0B9F1400F6B
+:1019600034BFC8464FF0400800E0C846284641460C
+:10197000FFF768FDB9EB0809454402D1B8F1400F03
+:1019800004D17B4B7B4A1D60A2F8009001227A4B68
+:1019900047E0764A79481168814216D15168784A01
+:1019A000914212D11A78A92A0FD15A78452A0CD11E
+:1019B0009A78C22A09D1DB786B2B06D1714B0020B3
+:1019C000052201461A70FFF73DFD6F4B44F8393090
+:1019D00028E0674BD3F80080B8F1000F18D0DFF88B
+:1019E0009491B9F800A0BAF1400F34BF5546402594
+:1019F00040462946FFF726FDC5EB0A039BB2A9F82E
+:101A000000300BB9402D01D108EB0503584A136093
+:101A1000564B1A88B2F5A06F04D100225A709A78FA
+:101A20005A4B1A700122544B6DE004EBC90803F0C5
+:101A30000803D8F80420013DD9B2A2F10800EDB2A4
+:101A4000002937D000F04EF95148524B50F825107C
+:101A5000F1B14A6840F8252001F10802C8F80420D5
+:101A60005A5D032A0BD8DFE802F0020406080322BD
+:101A700004E0022202E0052200E004225A5518F098
+:101A8000080F0A880CBF8823C82343EA024342E0B8
+:101A90005A5D032A07D8DFE802F040400204002222
+:101AA00006E0012204E018F0080F0CBF0222032216
+:101AB0005A5532E054F839301B0C22F8083C23B355
+:101AC00022F8061C42F8041C334A344952F82570A7
+:101AD00017B942F8250002E051F825205060304A3D
+:101AE00041F8250032F815105B1822F8153000F087
+:101AF000DBF818B10830C8F8040006E0294B44F8B8
+:101B000039001A7801321A7007E01F4B264A18F084
+:101B1000080F08BF134644F839300823337063E5D3
+:101B2000E90751D514492048204C02230B70204B63
+:101B30001A70204B186098601F481A61D8609A612B
+:101B40005C60084B0D2018701C48FF23037000F8E0
+:101B5000083C02741A4A13701A4B9F221A70012310
+:101B60000B704AE0C020074010300000E88CFF1FD7
+:101B7000F88BFF1FF08CFF1F942007402109000302
+:101B800001000400758CFF1FC8004000982007402A
+:101B9000B88CFF1F148CFF1F5C8CFF1FFC8BFF1F7A
+:101BA0001C8EFF1FF28CFF1F880040001C8CFF1F43
+:101BB000748CFF1F0080FF1F788CFF1F8820074058
+:101BC0008C200740842007402B0605D50C4B0D22A6
+:101BD0001A70802203F8402C05F00203DBB22BB10F
+:101BE000084B1A781A70022203F8082C05F0100529
+:101BF000EDB215B1044B10221A70BDE8FE8F00BF84
+:101C0000C0200740882007408020074008B5FFF724
+:101C1000E9FB00231E491A465A50C8180833C82B3E
+:101C20004260F9D11B4B1A6842F480221A601A4BA9
+:101C300080221A701978184A0906FBD4144B1749E8
+:101C4000C3F307200870C3F307401B0E08750B761B
+:101C5000FF2301F81C3C01F8143C01F88C3C13787C
+:101C600043F0400313700021012302F8783C02F88E
+:101C70000C1C02F8883C0A4B70226FF4507C1A70DE
+:101C800063444FF400721A60064B10221A7008BDAC
+:101C90000080FF1F348004400C2107409C20074037
+:101CA00049E400E00821074072B60C4A1168B1FA15
+:101CB00081F30B2B02D962B6002070474FF0004031
+:101CC00020FA03F021EA0001116062B604494822BB
+:101CD0005343C8180022CA50426070473885FF1F1E
+:101CE000E080FF1F0C4B4822C31AB3FBF2F30B2B0F
+:101CF00011D80A4A127822B1094A12780AB1FFF7BC
+:101D0000F1BB72B6074A4FF0004121FA03F31168A4
+:101D10001943116062B67047E080FF1FF28CFF1F0D
+:101D2000FB8CFF1F3885FF1F10B50023B0FBF2F4BA
+:101D300002FB1400092801D8303000E03730C854C5
+:101D400020460CB10133F1E7CA185470224605E071
+:101D5000885CCC5C8C54C8540132013B9A42F7DB5E
+:101D6000084610BD164B1A6842F400621A60154A04
+:101D700000231370144A1370144A1370144A13701A
+:101D8000144A1370144A40F2133111604FF4517128
+:101D90005160124AC0F344311170C0F3471100F092
+:101DA0001F0051709072937013740D4B2C221A7097
+:101DB0000C4B40221A700C4B4FF400421A607047D3
+:101DC00034800440678DFF1FFE8CFF1F698DFF1F4D
+:101DD000688DFF1FFD8CFF1F0CB0044000B0064053
+:101DE00003B006402FE400E004E100E0134A13785A
+:101DF00000F0030103F0EC030B43410748BF43F03D
+:101E00001003137000F00F03042B04D10C4B1A784D
+:101E100042F040021A700B4A1378C10603F0EF0338
+:101E200048BF43F010031370054A1378810603F08E
+:101E3000EF0348BF43F010031370704702B0064031
+:101E400006B0064005B006400E4B1B68180510B5DD
+:101E500003D410BDFFF7D4F800E00B4C2378002B1F
+:101E6000F8D10A4A4FF400411160094A0949137038
+:101E700040F203120A604A60074A1370074A13705F
+:101E800010BD00BF34800440FD8CFF1F84E100E0E2
+:101E900003B006400CB00440678DFF1FFE8CFF1F8F
+:101EA0001B4B1B681A052DE9F04106462DD5194B31
+:101EB000194D1C78194FDFF86C800134272C88BF2E
+:101EC000002415E0FFF770FA40280DDC3B781B0674
+:101ED0000ED52B78124A0133272B88BF002318F820
+:101EE000031011702B7003E0FF2801DDFFF788F865
+:101EF0002B78A342E6D00B4B1E550B4B01221A70D8
+:101F0000044B1C70094BAC221A70BDE8F08100BF75
+:101F100034800440698DFF1F688DFF1F04B00640A8
+:101F200007B00640FF8CFF1FFD8CFF1F03B006406B
+:101F300038B54518044603E014F8010BFFF7B0FF6D
+:101F4000AC42F9D138BDFFFF10B5044C01E0FFF7FA
+:101F500057F82378002BFAD110BD00BFFD8CFF1F6E
+:101F6000044B1878044B1B78984238BF4030C01A95
+:101F7000704700BF678DFF1FFE8CFF1F084B094A8B
+:101F800019781378994207D001333F2B88BF00237B
+:101F90000549C85C137070474FF0FF30704700BFB1
+:101FA000678DFF1FFE8CFF1F278DFF1F074B1A78C1
+:101FB000074B1B789A4206D001333F2B88BF002382
+:101FC000044AD05C70474FF0FF307047678DFF1FA9
+:101FD000FE8CFF1F278DFF1F024B1A78024B1A70D1
+:101FE000704700BFFE8CFF1F678DFF1F10B5214B90
+:101FF0001B7803F02003DBB273B11F4B1F4A187824
+:102000001F491378097801333F2B88BF00238B4287
+:1020100002D01C49C85413701B490B7818465BB298
+:10202000002B15DA134B1B781B0611D5174B184ADA
+:102030001C7813789C4202D16C230B7008E00133AA
+:10204000272B88BF00231349CC5C0B490C701370FD
+:1020500000F04003DBB25BB1064B1B7803F040039A
+:10206000DBB22BB10C4B00221A70074B2C221A70DA
+:1020700010BD00BF04B0064007B00640678DFF1FCB
+:10208000FE8CFF1F278DFF1F03B00640698DFF1FC9
+:10209000688DFF1FFF8CFF1FFD8CFF1F224B6022EE
+:1020A0001A70E1225A70214B214A1978214B0829D4
+:1020B00001D1012102E00A2907D13921116013223F
+:1020C0001A601D4B19605A600BE00C291A4901D1A6
+:1020D000352000E03D20106012221A60174B086086
+:1020E0001A60174B17491B78174A03B101230B607D
+:1020F0001360164B164A1978164B012901D8802116
+:102100000CE0042901D8842108E0082901D88521A0
+:1021100004E0102901D8862100E0872111601960B0
+:102120000D4B01221A707047004007403C85FF1F8D
+:1021300008B003400CB0034008B00B400CB00B409B
+:102140006B8DFF1F20B0034020B00B403D85FF1F6B
+:1021500024B0034024B00B406A8DFF1FF8B5164B26
+:10216000164D1A6842F080721A60154B1A6842F0D8
+:1021700001021A60134B2E681C680FE0237A63B1CA
+:1021800021682F680B68204698472A68E388D21B8D
+:1021900012099A42A28088BFE2806469002CEDD1C6
+:1021A000064B094A1B689B1B1B091380074A1188B1
+:1021B0008B4288BF1380F8BDFCED00E0041000E006
+:1021C000001000E06C8DFF1F728DFF1F708DFF1FD0
+:1021D000F0B505468BB022B90368C9B21B689847B1
+:1021E0002CE0012A08BF0A2221B930228DF82520CF
+:1021F000212413E02124B1FBF2F002FB1011C9B23B
+:10220000092901D8303100E037310AAF3E1906F80C
+:10221000241C014610B1013CE4B2ECE733B1013CAF
+:102220000AAAE4B213192D2203F8242C2B6801AF5B
+:102230005B6828463919C4F1220298470BB0F0BDFB
+:1022400008461146FEF7CABB0846FEF737BCFEF744
+:102250003FBCFEF77BBBFEF74FBBFEF795BBFFFF16
+:10226000044B00221A711A73034A4FF47A71996071
+:102270001A607047748DFF1F9030000008B5034B43
+:1022800001221A60024B1B68984708BD0C7103407D
+:102290008C8DFF1F08B5034B01221A60024B5B684F
+:1022A000984708BD1C7103408C8DFF1F08B5034B78
+:1022B00001221A60024B9B68984708BD2C710340AD
+:1022C0008C8DFF1F08B5034B01221A60024BDB689F
+:1022D000984708BD3C7103408C8DFF1F054B0122C0
+:1022E0001A60054B1A6822F400021A60034B0022A0
+:1022F0001A707047007003403C800440888DFF1FB7
+:10230000037B0122591103F01F0302FA03F3084A69
+:1023100042F821308268002313604178054A535403
+:10232000D15C21B90133042BFAD1FFF7D7BF704735
+:1023300080E100E0848DFF1F037810B504460BB1E7
+:10234000FFF7DEFF0023237010BD10B50446FFF732
+:10235000F3FF204610BDFFFF03480449044A002351
+:10236000037000F007B900BF9C8DFF1F4B230000D6
+:102370004084FF1F10B5084614461146FEF728FF9B
+:10238000204610BD084608B5FEF7DAFE012008BD5C
+:10239000FEF772BFFEF728BFFEF740BFFEF756BF3D
+:1023A000FEF72EBFFEF7A0BE480800F1B76000F5AB
+:1023B0005840B0FBF1F0FEF725BE480800F1B760C9
+:1023C00010B500F55840B0FBF1F01446FEF71AFEC8
+:1023D0002046BDE81040FEF759BE10B50846144629
+:1023E0001146FEF7C7FC204610BD084608B5FEF7AB
+:1023F00073FC012008BDFEF765BDFEF71BBDFEF7AF
+:1024000033BDFEF749BDFEF721BD0846FEF74ABCC5
+:10241000FEF71CBC480800F1B76000F55840B0FB5F
+:10242000F1F0FEF797BB480800F1B76010B500F572
+:102430005840B0FBF1F01446FEF78CFB2046BDE897
+:102440001040FEF7D5BBFFFF044B00221A711A7330
+:10245000034A4FF47A7199601A607047B08DFF1F7C
+:10246000B03000002DE9F041002407460D46264615
+:102470003B190A22197928460023FFF7A9FE2B6889
+:1024800080462E211B682846984701344044032C7F
+:102490000644EDD12846F9790A220023FFF798FE79
+:1024A0008019BDE8F081FFFF044B054A1A60002245
+:1024B0001A715A719A71DA71704700BFC08DFF1F8F
+:1024C000E8300000044B00221A711A73034A4FF4DB
+:1024D0007A7199601A607047C88DFF1FF83000004C
+:1024E00008B5FDF7F9FFFDF7FBFFFEF789FDFAE7F9
+:1024F00010B5084614461146FFF71AFD204610BDD8
+:10250000084608B5FFF7CCFC012008BDFFF764BD05
+:10251000FFF71ABDFFF732BDFFF748BDFFF720BD3B
+:10252000FFF792BC480800F1B76000F55840B0FBD7
+:10253000F1F0FFF717BC480800F1B76010B500F5DF
+:102540005840B0FBF1F01446FFF70CFC2046BDE804
+:102550001040FFF74BBCFFFF044B00221A711A73A7
+:10256000034A4FF47A7199601A607047D88DFF1F43
+:102570003031000003460846194600F001B800BF9C
+:1025800030B405460C46134602202946224630BC8C
+:1025900000F020BB70B543F2D41643F2D415C0F25C
+:1025A0000006C0F20005761BB61007D0043D0024DB
+:1025B00055F8043F01349847A642F9D143F2F0168A
+:1025C00043F2D415C0F20006C0F20005761B00F0FD
+:1025D000FBFDB61008D0043D002455F8043F01343B
+:1025E0009847A642F9D170BD70BD00BF48F2405374
+:1025F0000146C1F6FF73186800F008B848F240536E
+:102600000146C1F6FF73186800F0A6BB2DE9F04F34
+:1026100001F10B04162C83B0074630D924F00704CF
+:10262000E30F8C422CBF194643F0010100292FD142
+:10263000384600F0B7FAB4F5FC7F2ED24FEAD40C3E
+:1026400048F23466C1F6FF7606EBCC02D3689342BB
+:1026500000F01182596803F10808DA68384621F061
+:10266000030499681B195C68CA6044F00104916016
+:102670005C6000F099FA404603B0BDE8F08F00239B
+:1026800010248C422CBF194643F001010029CFD001
+:102690000C234FF000083B60EDE75FEA542C04BFC9
+:1026A0004FEAD40C4FEA4C0540F08F8048F2346674
+:1026B000C1F6FF7606EB8505EB689D4206D10DE07D
+:1026C000002A80F25581DB689D4207D0596821F0CD
+:1026D00003010A1B0F2AF3DD0CF1FF3C0CF1010C86
+:1026E00048F234623369C1F6FF7202F1080E734595
+:1026F00008BFD2F8049022D0586820F00300011BD4
+:102700000F2900F384810029C2F814E0C2F810E018
+:1027100066DAB0F5007F80F04E81C1084FF0010805
+:1027200002EBC100891008FA01F851688568D86089
+:1027300048EA0109C2F804909D60EB6083600122C1
+:102740004FEAAC0302FA03F34B4554D819EA030FDE
+:102750000DD193402CF0030C19EA030F0CF1040C7B
+:1027600005D15B000CF1040C19EA030FF9D006EB5C
+:10277000CC09E0464846C268904207D15BE1002997
+:1027800080F28381D268904200F05581556825F02F
+:102790000305291B0F29F2DD90461319D56844F073
+:1027A000010058F8084F41F0010C50603846C3F85A
+:1027B00004C0E560AC6073613361C3F80CE0C3F83A
+:1027C00008E0595000F0F0F955E7BCF1040F00F2B1
+:1027D000DE804FEA941C0CF1380C4FEA4C0565E79B
+:1027E0001A1803F108083846536843F00103536090
+:1027F00000F0DAF93FE7B5686B6823F0030A544547
+:1028000004D8C4EB0A030F2B00F3A48048F6E85960
+:10281000D6F80814C1F6FF7905EB0A020131D9F8A0
+:102820000030234408BF03F1100B06D003F580539A
+:102830000F3323F47F6323F00F0B38465946019280
+:1028400000F0B4F9019A411C804600F06881824290
+:1028500000F23181D9F8043042455B44C9F80430B4
+:1028600000F06681D6F8081448F23460C1F6FF70B3
+:10287000013117BFC2EB0802C0F808849B18C9F8E1
+:10288000043018F0070338461FBFC3F10802C3F530
+:102890008053904403F1080208EB0B0308BF4FF488
+:1028A00080521B051B0DC3EB020B594600F07EF94D
+:1028B000431C00F04981C8EB0001594441F001017B
+:1028C000D9F80430B54248F6E852C6F808805B44AF
+:1028D000C1F6FF72C8F80410C9F8043018D0BAF174
+:1028E0000F0F40F20B81AAF10C00696820F007007D
+:1028F0004FF0050C05EB000E0F2801F0010140EA36
+:1029000001016960CEF804C0CEF808C000F2208151
+:1029100048F6E852D9F82C10C1F6FF72B5688B4220
+:10292000D9F8301088BFD36248F6E852C1F6FF727A
+:102930008B4288BF13636A6822F003029442C4EB9F
+:10294000020301D80F2B05DC38464FF0000800F0D9
+:102950002BF990E62A1943F0010344F001043846AC
+:102960006C6005F108085360B26000F01DF982E662
+:102970005918DA689C6838464D6803F1080845F034
+:102980000105E26094604D6000F00EF973E6BCF161
+:10299000140F9CBF0CF15B0C4FEA4C057FF686AE22
+:1029A000BCF1540F00F293804FEA143C0CF16E0C12
+:1029B0004FEA4C057AE6420A042A75D9142A9CBFCC
+:1029C00002F15B094FEA490508D9542A00F2C9808F
+:1029D0004FEA103909F16E094FEA490506EB850502
+:1029E00048F23468C1F6FF78AA68AA4279D05168E3
+:1029F00021F00301884202D292689542F7D1D06853
+:102A0000D6F80490D8609A60D360836097E61D1969
+:102A100041F00106556144F00104156138465C60DF
+:102A200003F10808C5F80CE0C5F808E06E606950CD
+:102A300000F0BAF81FE608F10108083018F0030F9B
+:102A40007FF499AE4A461CF0030FA2F108010CF185
+:102A5000FF3C00F09E8012688A42F4D072685B00EE
+:102A600093423FF6C8AE002B3FF4C5AE1A4200F0C9
+:102A70009580C4467BE603F108025B699A4208BF71
+:102A80000CF1020C3FF42CAEE4E590465519D368E6
+:102A9000384658F8082F6968D36041F001019A6000
+:102AA000696000F081F8E6E54FEA901909F138090C
+:102AB0004FEA490592E7B54248F23463C1F6FF7325
+:102AC0003FF4C8AE9D686A6822F0030236E7BCF5A1
+:102AD000AA7F19D84FEAD43C0CF1770C4FEA4C0589
+:102AE000E4E50125D8F804104FEAA909104605FAD3
+:102AF00009F545EA0109C8F8049083E70123454632
+:102B0000C8F80430002219E740F254539C450BD812
+:102B10004FEA944C0CF17C0C4FEA4C05C6E5B568C5
+:102B20006A6822F0030209E7FC254FF07E0CBDE540
+:102B30001105090D00297FF495AEB2680BEB0A016F
+:102B400041F001015160E3E601214FF0000BB7E6CF
+:102B5000384605F10801019200F0FEF8019A536829
+:102B6000D6E6B2F5AA7F06D84FEAD03909F177093F
+:102B70004FEA490532E740F25451FC258A424FF0B2
+:102B80007E099EBF4FEA904909F17C094FEA490549
+:102B900024E7726822EA0302726060E75B0008F1D2
+:102BA000040863E7704700BF704700BF38B548F6B8
+:102BB0002864C1F6FF740546084600232360FEF72B
+:102BC000EBFB431C00D038BD2368002BFBD02B60EF
+:102BD00038BD00BF2DE9F04143F26014C0F200049B
+:102BE00084B007462568AC6C002C42D066681F2E66
+:102BF0001ADD42F2ED54C0F2000424B94FF0FF3068
+:102C000004B0BDE8F0818C20039102920193FFF79C
+:102C1000EDFC0399029A019B04460028EED0A86CB3
+:102C2000002684E84100AC64DFB1D4F8886026B3A4
+:102C3000D6F8008165680120022F05F1200C00FA0A
+:102C400005F046F8252048EA000246F82C3008BF77
+:102C5000D6F80431C6F8002104BF1843C6F80401B1
+:102C600000E06568AB1C00200135656044F8231066
+:102C7000C6E705F14C04AC64B8E742F2ED50C0F28F
+:102C800000000028BAD04FF484700391029201939F
+:102C9000FFF7ACFC0399029A019B06460028ADD0D1
+:102CA0000020C6F80001C6F804018046C4F8886018
+:102CB000C0E700BFF8B548F23464C1F6FF740F46B0
+:102CC0000546FFF76FFFA3685E6826F0030606F669
+:102CD000EF73DF1B3F0B013F3F03B7F5805F07DB5F
+:102CE00000212846FFF762FFA3689B19984204D091
+:102CF0002846FFF759FF0020F8BD79422846FFF724
+:102D000055FF013010D048F6EC53A168C1F6FF73AF
+:102D1000F61B284646F001061A684E60D71B1F6056
+:102D2000FFF742FF0120F8BD00212846FFF73EFFD4
+:102D3000A368C21A0F2ADBDD48F63C2448F6EC51A2
+:102D4000C1F6FF74C1F6FF7142F001025A602368B8
+:102D5000C01A0860CCE700BF2DE9F0410E4680465E
+:102D600000295CD0FFF71EFF48F2346556F8041CBA
+:102D7000C1F6FF75A6F1080421F00103AF68E2185F
+:102D80009742506820F0030067D011F001015060B5
+:102D900035D000211618766816F0010F06D11B18E1
+:102DA000906800294DD0D268C260906043F0010263
+:102DB000E3506260F1B9B3F5007F32D35A0A042AB6
+:102DC0006CD898093830410005EB810548F2346130
+:102DD000C1F6FF71AA68AA426BD0516821F00301C5
+:102DE0008B4202D292689542F7D1D368E360A26029
+:102DF000D4609C604046BDE8F041FFF7D5BE56F870
+:102E0000086C05F1080CA41B9B19A668664543D005
+:102E1000D4F80CC0C6F80CC0CCF80860BAE7BDE81E
+:102E2000F081DB080121686805EBC3029B1001FA01
+:102E300003F3E260916818436860A160CC6094601D
+:102E4000D8E7294EB042AED16C6143F001022C614B
+:102E5000E060A0606260E350CCE7C018CB0707D405
+:102E600056F8083CE41AC018A268E368D3609A6078
+:102E700048F6402240F00103C1F6FF726360AC6087
+:102E800013689842B6D348F6E8534046C1F6FF733C
+:102E90001968FFF70FFFADE701217BE702F15B0047
+:102EA0004100142A90D9542A0CD8180B6E304100D6
+:102EB0008AE701264D688010134606FA00F00543A4
+:102EC0004D6093E7B2F5AA7F03D8D80B7730410065
+:102ED0007AE740F254518A4203D8980C7C30410082
+:102EE00072E7FC217E206FE73C86FF1F4008FE430F
+:102EF00040A004404408FE4344A004400018FE43A0
+:102F000000C004403000FE43309004403400FE43D3
+:102F1000349004401C18FE431CC004401018FE43AB
+:102F200010C004400818FE4308C004400C18FE43BB
+:102F30000CC004400C10FE430CB004401010FE43C3
+:102F400010B004401810FE4318B004401C10FE439B
+:102F50001CB004401410FE4314B004400418FE4397
+:102F600004C004400010FE4300B004400008FE43CB
+:102F700000A004400408FE4304A004400C08FE43E3
+:102F80000CA004400808FE4308A004401418FE43A7
+:102F900014C004401818FE4318C004400410FE4337
+:102FA00004B004400810FE4308B004401400FE437F
+:102FB000149004404C08FE434CA004400420FE43FF
+:102FC00004D004402410FE4324B004402010FE43EB
+:102FD00020B004402810FE4328B004402C10FE43CB
+:102FE0002CB004400020FE4300D004404808FE43BB
+:102FF00048A004401000FE43109004401519151914
+:103000000000FFFF000100004884FF1F12000000C5
+:10301000000200007284FF1F49000000002201002E
+:10302000BB84FF1F2100000000210100A484FF1FBA
+:103030000900000000220000DC84FF1F1C000000CB
+:10304000002100008484FF1F09000000000300002D
+:103050001E85FF1F00000000010309045A84FF1FA2
+:103060000000000002030904F884FF1F00000000B4
+:10307000030309042285FF1F000000000000000078
+:103080000000000000000000000000000000000040
+:1030900049220000412200005B220000572200006C
+:1030A000532200004F22000000000000000000003A
+:1030B0008523000075230000A12300009923000050
+:1030C0009D23000095230000A9230000BB230000DE
+:1030D000A52300000B240000912300000000000045
+:1030E0000000000000000000652400000000000057
+:1030F0000000000000000000EB230000DB230000C4
+:1031000007240000FF23000003240000FB2300002D
+:103110001524000027240000112400000B240000C7
+:10312000F723000000000000000000000000000085
+:1031300001250000F12400001D25000015250000D8
+:103140001925000011250000252500003725000065
+:10315000212500000B2400000D25000000000000C8
+:103160004485FF1F43000000000000000000000035
+:10317000000000000000000000000000000000004F
+:10318000000000000000000000000000000000003F
+:10319000000000000000000000000000000000002F
+:1031A000000000000000000000000000000000001F
+:1031B000000000000000000000000000000000000F
+:1031C0000000000000000000F8B500BFF8BC08BC1B
+:1031D0009E467047990400006122000059230000B8
+:1031E00049240000A9240000C5240000592500003E
+:1031F000000000002C8EFF1F1201000200000040A2
+:10320000C016860400010102030118035400650082
+:1032100065006E00730079006400750069006E003F
+:103220006F0009024900020100C0320904000002D7
+:1032300003000000092111010001221C0007058381
+:1032400003400001070504034000010904010002D6
+:10325000030000000921110100012221000705815E
+:10326000034000010705020320000206C9FF09040C
+:10327000A15C7508150026FF00954009758102952F
+:10328000200976910295040976B102C006ABFF0AC7
+:103290000002A1017508150026FF00954009018173
+:1032A00002954009029102C02603540065006500A2
+:1032B0006E00730079006400750069006E006F0095
+:1032C00020005200610077004800490044000403D8
+:1032D00009040C03000000000000000000000000D2
+:1032E0000000000000000000FFFFFFFF0A040000D4
+:1032F0004485FF1F00000000A83100008831000055
+:103300006831000000000000000000000000000024
+:103310000000000064310000000000000000000018
+:10332000000000000000000000000000000000009D
+:10333000000000000000000000000000000000008D
+:10334000000000000000000000000000000000007D
+:10335000000000000000000000000000000000006D
+:10336000000000000000000000000000000000005D
+:10337000000000000000000000000000000000004D
+:10338000000000000000000000000000000000003D
+:10339000000000000000000000000000000000002D
+:1033A000000000000000000000000000000000001D
+:1033B000000000000000000000000000000000000D
+:1033C00000000000000000000000000000000000FD
+:1033D00000000000000000000000000000000000ED
+:1033E0000000000000000000000000003486FF1F05
+:1033F0003486FF1F3C86FF1F3C86FF1F4486FF1F4D
+:103400004486FF1F4C86FF1F4C86FF1F5486FF1FFC
+:103410005486FF1F5C86FF1F5C86FF1F6486FF1FAC
+:103420006486FF1F6C86FF1F6C86FF1F7486FF1F5C
+:103430007486FF1F7C86FF1F7C86FF1F8486FF1F0C
+:103440008486FF1F8C86FF1F8C86FF1F9486FF1FBC
+:103450009486FF1F9C86FF1F9C86FF1FA486FF1F6C
+:10346000A486FF1FAC86FF1FAC86FF1FB486FF1F1C
+:10347000B486FF1FBC86FF1FBC86FF1FC486FF1FCC
+:10348000C486FF1FCC86FF1FCC86FF1FD486FF1F7C
+:10349000D486FF1FDC86FF1FDC86FF1FE486FF1F2C
+:1034A000E486FF1FEC86FF1FEC86FF1FF486FF1FDC
+:1034B000F486FF1FFC86FF1FFC86FF1F0487FF1F8B
+:1034C0000487FF1F0C87FF1F0C87FF1F1487FF1F38
+:1034D0001487FF1F1C87FF1F1C87FF1F2487FF1FE8
+:1034E0002487FF1F2C87FF1F2C87FF1F3487FF1F98
+:1034F0003487FF1F3C87FF1F3C87FF1F4487FF1F48
+:103500004487FF1F4C87FF1F4C87FF1F5487FF1FF7
+:103510005487FF1F5C87FF1F5C87FF1F6487FF1FA7
+:103520006487FF1F6C87FF1F6C87FF1F7487FF1F57
+:103530007487FF1F7C87FF1F7C87FF1F8487FF1F07
+:103540008487FF1F8C87FF1F8C87FF1F9487FF1FB7
+:103550009487FF1F9C87FF1F9C87FF1FA487FF1F67
+:10356000A487FF1FAC87FF1FAC87FF1FB487FF1F17
+:10357000B487FF1FBC87FF1FBC87FF1FC487FF1FC7
+:10358000C487FF1FCC87FF1FCC87FF1FD487FF1F77
+:10359000D487FF1FDC87FF1FDC87FF1FE487FF1F27
+:1035A000E487FF1FEC87FF1FEC87FF1FF487FF1FD7
+:1035B000F487FF1FFC87FF1FFC87FF1F0488FF1F86
+:1035C0000488FF1F0C88FF1F0C88FF1F1488FF1F33
+:1035D0001488FF1F1C88FF1F1C88FF1F2488FF1FE3
+:1035E0002488FF1F2C88FF1F2C88FF1F3488FF1F93
+:1035F0003488FF1F3C88FF1F3C88FF1F4488FF1F43
+:103600004488FF1F4C88FF1F4C88FF1F5488FF1FF2
+:103610005488FF1F5C88FF1F5C88FF1F6488FF1FA2
+:103620006488FF1F6C88FF1F6C88FF1F7488FF1F52
+:103630007488FF1F7C88FF1F7C88FF1F8488FF1F02
+:103640008488FF1F8C88FF1F8C88FF1F9488FF1FB2
+:103650009488FF1F9C88FF1F9C88FF1FA488FF1F62
+:10366000A488FF1FAC88FF1FAC88FF1FB488FF1F12
+:10367000B488FF1FBC88FF1FBC88FF1FC488FF1FC2
+:10368000C488FF1FCC88FF1FCC88FF1FD488FF1F72
+:10369000D488FF1FDC88FF1FDC88FF1FE488FF1F22
+:1036A000E488FF1FEC88FF1FEC88FF1FF488FF1FD2
+:1036B000F488FF1FFC88FF1FFC88FF1F0489FF1F81
+:1036C0000489FF1F0C89FF1F0C89FF1F1489FF1F2E
+:1036D0001489FF1F1C89FF1F1C89FF1F2489FF1FDE
+:1036E0002489FF1F2C89FF1F2C89FF1F3489FF1F8E
+:1036F0003489FF1F3C89FF1F3C89FF1F4489FF1F3E
+:103700004489FF1F4C89FF1F4C89FF1F5489FF1FED
+:103710005489FF1F5C89FF1F5C89FF1F6489FF1F9D
+:103720006489FF1F6C89FF1F6C89FF1F7489FF1F4D
+:103730007489FF1F7C89FF1F7C89FF1F8489FF1FFD
+:103740008489FF1F8C89FF1F8C89FF1F9489FF1FAD
+:103750009489FF1F9C89FF1F9C89FF1FA489FF1F5D
+:10376000A489FF1FAC89FF1FAC89FF1FB489FF1F0D
+:10377000B489FF1FBC89FF1FBC89FF1FC489FF1FBD
+:10378000C489FF1FCC89FF1FCC89FF1FD489FF1F6D
+:10379000D489FF1FDC89FF1FDC89FF1FE489FF1F1D
+:1037A000E489FF1FEC89FF1FEC89FF1FF489FF1FCD
+:1037B000F489FF1FFC89FF1FFC89FF1F048AFF1F7C
+:1037C000048AFF1F0C8AFF1F0C8AFF1F148AFF1F29
+:1037D000148AFF1F1C8AFF1F1C8AFF1F248AFF1FD9
+:1037E000248AFF1F2C8AFF1F2C8AFF1FFFFFFFFF69
+:0437F00000000200D3
+:00000001FF
diff --git a/teensy_loader_cli/blink_slow_TeensyLC.hex b/teensy_loader_cli/blink_slow_TeensyLC.hex
new file mode 100644
index 0000000..36dfc1f
--- /dev/null
+++ b/teensy_loader_cli/blink_slow_TeensyLC.hex
@@ -0,0 +1,643 @@
+:1000000000180020C1000000A506000071060000D5
+:100010007106000071060000710600007106000004
+:10002000710600007106000071060000A5060000C0
+:10003000A506000071060000A5060000610600008C
+:10004000A5060000A5060000A5060000A506000004
+:10005000A5060000A5060000A5060000A5060000F4
+:10006000A5060000A5060000A5060000A5060000E4
+:10007000791900000D220000591D0000A50600009E
+:10008000A5060000A5060000A5060000A5060000C4
+:10009000A5060000A5060000A5060000A5060000B4
+:1000A00099080000A5060000A5060000A5060000AE
+:1000B000A5060000A5060000A5060000A506000094
+:1000C00038B500F0F3FA444A444B1A60444A454BB1
+:1000D0001A60454A454B1A60454B0822197811426F
+:1000E00002D019780A431A70424B2A221A70002350
+:1000F000414A42499A188A4204D24149C9580433B4
+:100100001160F5E73F4B40491A1F181D00238A4232
+:1001100002D21360031CF6E73C493D4A5958101CB3
+:1001200099500433C02BF7D100239A083949920023
+:10013000521803211940C9001568FF248C40A543BB
+:100140002C1C80258D40291C214301331160202B5C
+:10015000EBD1314B8A221860304B1A70304B24227D
+:100160001A70304BA0221A701A1C2F4B197888076E
+:10017000FBD51978CD06FCD418780C21014008294C
+:10018000FAD12A49032008702949402008701978BB
+:100190008806FCD519784D06FCD52649C020800577
+:1001A00008602021117019780C220A400C2AFAD11B
+:1001B000214A224B1A60224A224B1A60224B072204
+:1001C0001A6062B600F0E8F902F002F900F074FA81
+:1001D00001F078F8FEE7C046300004F034800440B7
+:1001E000823F0000388004400100000F3C80044042
+:1001F00002D0074000E0074060FDFF1F58FEFF1FD0
+:100200001C2700005CFEFF1F5401002000000000BE
+:1002100000F9FF1F00E400E008ED00E00050064098
+:1002200001400640004006400640064004400640AB
+:100230000540064044800440C00005050480044099
+:10024000BF5D000014E000E010E000E0FFFFFFFFF2
+:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
+:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
+:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
+:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
+:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
+:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
+:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
+:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
+:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
+:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
+:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
+:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
+:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
+:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
+:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
+:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
+:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
+:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
+:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
+:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
+:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
+:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
+:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
+:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
+:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
+:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
+:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
+:10040000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFD
+:1004100010B5064C2378002B07D1054B002B02D0DA
+:10042000044800E000BF0123237010BD58FEFF1FE9
+:10043000000000001C27000008B5084B002B03D06B
+:100440000748084900E000BF07480368002B03D0B5
+:10045000064B002B00D0984708BDC04600000000A6
+:100460001C2700005CFEFF1F58FEFF1F000000005D
+:1004700008B50D20012100F033F808BD10B5FA24AD
+:100480000121A4000D2000F00BF8201C00F06AF8F8
+:1004900000210D2000F004F8201C00F063F810BDCE
+:1004A00010B51A2818D80C2358430C4A8358101832
+:1004B0001C7D027A224205D0002901D01A710BE07E
+:1004C0001A7209E043681A68002902D003210A431E
+:1004D00001E002218A431A6010BDC0461C240000BE
+:1004E00010B51A2818D80C2358430C4A14186368FE
+:1004F0008258247A012904D1117D0C431475A2225B
+:1005000005E0107DA0431075002902D18022520021
+:1005100001E00422FF321A6010BDC0461C24000016
+:1005200010B572B60B4B0C491A680C4B1B68096866
+:1005300062B6480104D532219142894149425B1893
+:100540000748FA24801A1821A4005C4301F0D2FE67
+:10055000201810BD18E000E004ED00E074FEFF1F5D
+:10056000BF5D000038B5041CFFF7DAFF051C002C46
+:100570000ED0FFF7D5FF074B401B984205D9013C31
+:10058000002C05D0FA239B00ED1800F043FDF0E7A6
+:1005900038BDC046E70300001C4B8022D20510B5D1
+:1005A0001A60802212061A60194B0020186019493F
+:1005B000194B1A4A196028231360194A194C136001
+:1005C000194A1360194A1360194A1360194A1360D3
+:1005D00009222260184C2060184C2160184C2360BE
+:1005E000184C2360184C2260184C20601848016099
+:1005F00018490B6018490B60184B1A6000F0C2FCD8
+:100600000420FFF7AFFF00F021FC10BD00E100E087
+:1006100004800340FFBF0000088003400C800340BB
+:1006200014800340008003401C800340248003406A
+:100630002C80034034800340049003400890034022
+:100640000C900340149003400090034004A003402A
+:1006500008A003400CA0034014A0034000A00340E6
+:10066000024B1A6801321A607047C04674FEFF1FC1
+:1006700010B50B4C23685A0301D500F00DF923681F
+:100680005A0501D501F078F923681A0501D501F062
+:10069000BDFD2368DA04ECD501F05EFBE9E7C04656
+:1006A0003480044008B5FFF7E3FFFFFF014B002251
+:1006B0001A607047008104407047FFFFEFF313801A
+:1006C000002821D1EFF31082002A1FD1EFF3058318
+:1006D000002B0FD0101C0F2B0ED91A1C103A9208A9
+:1006E0000B49032092000340521883401068D84001
+:1006F000C0B201E080204000EFF31182002A05D053
+:10070000824203D2101C01E0012040427047C046E3
+:1007100000E400E0F0B50B4F02223B780A4E1A438A
+:10072000D2000A4DB418606028788824002800D0D0
+:10073000C82409040C43B45001225040534028708F
+:100740003B70F0BDF4FEFF1F00F8FF1F7CFFFF1F92
+:10075000431E10B5052B0FD872B6084A9900885869
+:10076000002807D044685B008C50054A01889C5AD9
+:10077000611A995262B600E0002010BDDCFEFF1F36
+:1007800046010020431E0020052B09D872B6054AF9
+:100790009B009B58002B02D001305B68FAE762B6E1
+:1007A0007047C04638FFFF1F38B572B60123164A9E
+:1007B0009A18013A127811071CD5144A5C01A55801
+:1007C0009900002D05D1131908305860104BA35023
+:1007D0000AE001242143C9008C58002C0AD1531887
+:1007E000083058600B4B8B500B4B1A78013A1A703B
+:1007F00062B608E00133072BD9D162B6064B00225E
+:100800001A7000F097FB38BD7026000000F8FF1F3B
+:1008100088004000C800400072FFFF1F421E10B554
+:10082000052A30D8022380001843174BC0001B183C
+:1008300072B6164CA05C032809D801F047FD1402DB
+:1008400016050833022011E0083304200EE010489A
+:10085000920014580F4B002C01D1115001E0985810
+:10086000416099500EE0032000E00520A0540A1CCE
+:1008700008325A608822180700D5C822098809045E
+:100880000A431A6062B610BD00F8FF1F94FEFF1FF6
+:1008900038FFFF1F50FFFF1FF7B5B9480478061C4B
+:1008A000E4B261071DD5B74B1B78002B16D0B64AB2
+:1008B0001378DBB2002B05D0013BDBB21370002BA9
+:1008C00000D100BEB14A1378DBB2002B06D0013B49
+:1008D000DBB21370002B01D100F0A0FEA84A042364
+:1008E00013700825221C2A4000D146E2A84BA94CCF
+:1008F0001B78DBB21E099A08002E00D0CFE1D5008C
+:1009000065192B686A689806000F01380C2800D911
+:10091000C2E101F0E5FC7F017F01C101C101C1011C
+:10092000C101C101C1019E01C101C101C1010D008F
+:100930001368994F526899493B6029607A609848DA
+:10094000984F9949002501229BB23D602561A56120
+:1009500002708B4218D8D021C9008B4200D3DFE04F
+:10096000812191408B4200D1B9E006D8802B00D183
+:10097000A0E0822B00D1A2E0E8E08C4A934200D1B3
+:10098000BDE0A022D20014E0902109018B4215D0D5
+:100990000AD8882109018B4200D0D7E0794B844CDA
+:1009A0001B78161C2370D6E0824A934200D12EE1B8
+:1009B000814A0026934200D1CCE0C7E0764F714BCC
+:1009C000BA781A706319186A000603D5586A08388D
+:1009D00000F0B0FA0835C02DF4D100252E1C774F59
+:1009E000E859002805D04168019100F0A3FA019868
+:1009F000F7E77851724B734FE850E859002805D05B
+:100A00004268019200F096FA0198F7E76E4B6F4A40
+:100A1000E8507300D0526E4B7851F05C02380328D6
+:100A200007D801F053FC02040204002200E0012276
+:100A30009A5501360435062ED1D1664F00233B70FE
+:100A40000125654BEA18654B9200EB18013B1B78BA
+:100A50001370180720D500F04FFA6B01002805D05D
+:100A6000E218083050605E4AE25003E0E0503B7804
+:100A700001333B7000F040FA0122AB001343DB006E
+:100A8000002805D04549E21808305060E15003E0E5
+:100A9000E0503B7801333B70AB0002221A43D20096
+:100AA0000026A6500322134393400135E650072D3C
+:100AB000C7D14FE03E4C0226257065704BE0364FA3
+:100AC000BB88062B42D83A4C46489B00257065707F
+:100AD0001B181B78022633423DD022703BE02E4D7E
+:100AE0007F22AB881A40062A30DC6E88002E2DD17A
+:100AF0003C4F9B00DB191A7802218A430EE0264DF9
+:100B00007F22AB881A40062A20DC6E88002E1DD179
+:100B1000344F9B00DB191A7802210A431A7019E03E
+:100B20001D4D314B6A88A9885C68002C0ED018884E
+:100B3000904209D15888884206D1120A032A01D16D
+:100B4000267808E01E8906E00C33EDE7254B0F22DE
+:100B50001A705CE0341C104FFB889E4200D91E1CAA
+:100B6000371E402F00D94027201C391CFFF7D2FD2B
+:100B7000E419F61B3AD1351C402F3BD047E0C04664
+:100B8000802007407BFFFF1FF5FEFF1FD0FFFF1FE8
+:100B90009020074000F8FF1F68FFFF1FC8004000BB
+:100BA0007CFFFF1F78FEFF1F81060000020300008C
+:100BB00073FFFF1F21090000210A0000DCFEFF1F58
+:100BC0007CFEFF1F38FFFF1F50FFFF1F4601002064
+:100BD00094FEFF1F72FFFF1F30C801107026000037
+:100BE00088004000C0200740782600004025B5421C
+:100BF00000D9351C201C291CFFF78CFD6419761BBD
+:100C000001D1402D03D1784D784B2C601E800122FC
+:100C1000774B40E0774B78491F688F4216D159686F
+:100C2000764B994212D11378A92B0FD15378452BCB
+:100C30000CD19378C22B09D1D3786B2B06D1704B92
+:100C400000200522011C1A70FFF764FD6D4B2B601C
+:100C500022E0654F3D68002D13D064480688341E9D
+:100C6000402C00D94024211C281CFFF753FD361BC3
+:100C70005E49B6B20E80002E01D1402C00D12E1953
+:100C80003E605C4BA0221988D200914204D1002220
+:100C90005A709A785C4B1A700122554B61E0D20071
+:100CA000A4186068013E0838F6B22B4036D000F038
+:100CB00041F95649B0004258554B002A1BD055689F
+:100CC0004550111C985D0831616003280BD801F074
+:100CD000FDFA02040608032104E0022102E00521D6
+:100CE00000E0042199558823270700D5C8231288DE
+:100CF000120413433CE0985D032808D801F0E6FA9B
+:100D000039390204002200E001229A5531E02C40DA
+:100D1000624262410324A41A9C552AE06288028040
+:100D2000002A20D03B4D43804360B3005F593A49CD
+:100D3000002F01D1585101E0CD586860C850374BA1
+:100D40007600F15A5218F25200F0D6F8002804D07A
+:100D50000830606020070AD507E0314B20601A7820
+:100D600001321A7005E02C4201D0264B00E02D4BD9
+:100D700023602D4908230B708FE5012004421ED00B
+:100D80001B4902230B70294B264C1A70284B294D06
+:100D90001C609C60284C1A61DC609A615D60274B86
+:100DA0000D241C70264CFF232370174C33702270C7
+:100DB000244A1370244B9F221A70087013E063B208
+:100DC000002B04DA1D4B0D221A708023337002238E
+:100DD0001C4204D01A4A1178C9B211703370102322
+:100DE0001C4200D03370F7BD78FEFF1F70FFFF1F5D
+:100DF0009420074068FFFF1F210900030100040041
+:100E0000F5FEFF1FC80040009820074038FFFF1F75
+:100E100094FEFF1FDCFEFF1F7CFEFF1F460100202B
+:100E200072FFFF1F8800400080200740F4FEFF1F74
+:100E300000F8FF1F9CFEFF1FF8FEFF1FC0200740A9
+:100E4000882007408C2007408420074010B500F020
+:100E5000E3FF00221A4B0021D1509818083241605C
+:100E6000C82AF7D1174A80201468C00220431060B6
+:100E7000180A154AC0B21070180C144AC0B210708B
+:100E8000134A1B0E1370134AFF231370124A1348A0
+:100E90001370134A13700122027012480170124934
+:100EA0000A70124A116899430B1C70210B4313609E
+:100EB0000F4B802252041A600E4B10221A7010BD84
+:100EC00000F8FF1F348004409C200740B0200740FA
+:100ED000B420074080200740882007409420074026
+:100EE00010200740002107408420074018E400E05C
+:100EF00000E100E00821074038B572B60B4C2568C8
+:100F0000281C01F047FA0B2802D962B600200CE039
+:100F100080231B06C3409D43256062B64823584387
+:100F2000034B181800230360436038BD60FDFF1FAA
+:100F300000FAFF1F10B5041C0E484821201A01F0CA
+:100F4000D9F90B2815D80C4B1B78002B07D00B4B6D
+:100F50001B78002B03D0201CFFF726FC09E072B69B
+:100F60008022074B1206C240101C1A6810431860FA
+:100F700062B610BD00FAFF1F72FFFF1F7BFFFF1F4D
+:100F800060FDFF1F1B4B1C4A19781C4B082901D11F
+:100F9000002102E00A2903D138211160132206E062
+:100FA0000C2901D1342100E03C21116012221A6089
+:100FB000134B1A78134B002A01D0002200E00122C3
+:100FC0001A60114B1A78114B012A01D880220CE0CB
+:100FD000042A01D8842208E0082A01D8852204E0E6
+:100FE000102A01D8862200E087221A60084B0122CD
+:100FF0001A70704764FDFF1F08B003400CB0034037
+:101000007EFFFF1F20B0034065FDFF1F24B003409B
+:101010007DFFFF1F10B5104C2378002B1BD101233F
+:10102000237000F02BFA002801D000F032F800F015
+:1010300051FC002801D000F035F901F095F80028A6
+:1010400001D000F0BCF900F035FE002801D000F01E
+:101050001AF90023237010BD7FFFFF1F08B500F0B1
+:101060000DFA08BD08B500F0B9F908BD08B500F0E3
+:10107000E3F908BD08B500F0ABFA08BD08B5081CD7
+:1010800000F09CFA08BD08B5081C111C00F020FAFD
+:1010900008BD7047044B00221A711A73FA21034AE3
+:1010A000890099601A60704780FFFF1F6825000063
+:1010B00008B50368C9B21B68984708BD08B503683E
+:1010C000C9B21B68984708BD08B50368C9B21B6858
+:1010D000984708BD08B50368C9B21B68984708BDA2
+:1010E00008B50368C9B21B68984708BD08B503680E
+:1010F000C9B21B68984708BD08B50368C9B21B6828
+:10110000984708BD08B50368C9B21B68984708BD71
+:1011100008B5044B4808C01801F0ECF800F09EFA3E
+:1011200008BDC046C0C62D0010B5064B4808C01803
+:10113000141C01F0DFF800F091FA201C00F0D4FA42
+:1011400010BDC046C0C62D0008B500F0F5FA08BDB8
+:1011500008B5081C00F01EFB08BD08B500F0BAFB7E
+:1011600008BD08B500F0E2FB08BD08B500F0C2FB01
+:1011700008BD08B500F090FB08BD08B500F0F2FB13
+:1011800008BD08B500F094FB08BD08B5081C00F0C8
+:1011900023FB012008BD08B5081C00F01DFB012041
+:1011A00008BD10B5081C141C111C00F069FB201CA4
+:1011B00010BD38B5081C0D1C00F068FE041C211C75
+:1011C000281C00F05DFB201C38BDFFFF08B5044B58
+:1011D0004808C01801F08EF800F02EFC08BDC0468B
+:1011E00060E3160010B5064B4808C018141C01F047
+:1011F00081F800F021FC201C00F066FC10BDC04608
+:1012000060E3160008B500F087FC08BD08B5081CAF
+:1012100000F0B0FC08BD08B500F04CFD08BD08B5F5
+:1012200000F074FD08BD08B500F054FD08BD08B518
+:1012300000F022FD08BD08B500F084FD08BD08B52A
+:1012400000F026FD08BD08B5081C00F0B5FC012023
+:1012500008BD08B5081C00F0AFFC012008BD10B5A2
+:10126000081C141C111C00F0FBFC201C10BD38B520
+:10127000081C0D1C00F00AFE041C211C281C00F098
+:10128000EFFC201C38BD7047044B00221A711A7302
+:10129000FA21034A890099601A60704790FFFF1F86
+:1012A000882500007047FFFF044B00221A711A7353
+:1012B000FA21034A890099601A607047A0FFFF1F56
+:1012C000D825000008B5FFF7D3F8FFF7D7F8FFF7E8
+:1012D000A1FEFAE708B50368C9B21B68984708BDC4
+:1012E00008B50368C9B21B68984708BD08B503680C
+:1012F000C9B21B68984708BD08B50368C9B21B6826
+:10130000984708BD08B5044B4808C01800F0F2FF24
+:1013100000F0ECFD08BDC04660E3160010B5064BBA
+:101320004808C018141C00F0E5FF00F0DFFD201C89
+:1013300000F024FE10BDC046C0C62D0008B500F068
+:1013400045FE08BD08B5081C00F06EFE08BD08B5D6
+:1013500000F00AFF08BD08B500F032FF08BD08B56F
+:1013600000F012FF08BD08B500F0E0FE08BD08B5AA
+:1013700000F042FF08BD08B500F0E4FE08BD08B566
+:10138000081C00F073FE012008BD08B5081C00F021
+:101390006DFE012008BD10B5081C141C111C00F0C6
+:1013A000B9FE201C10BD38B5081C0D1C00F06EFDE8
+:1013B000041C211C281C00F0ADFE201C38BD704709
+:1013C000044B00221A711A73FA21034A89009960AA
+:1013D0001A607047B0FFFF1F2826000070B5144B3D
+:1013E0001B78002B20D0134C2368261C002B03D124
+:1013F0000220FFF7ADF920602068002814D0438850
+:10140000C218157A002D0BD002880133934204D301
+:10141000FFF790FD0023336000E04380281C05E0C7
+:10142000FFF788FD2560DAE70125684270BDC046F8
+:101430007BFFFF1FCCFFFF1F38B50E4B1B78002B27
+:1014400013D00D4C2368002B03D10220FFF780F945
+:1014500020602068002808D04388C3181D7A002D1A
+:1014600006D1FFF767FD2560E7E70120404200E075
+:10147000281C38BD7BFFFF1FCCFFFF1F38B5124D66
+:101480002B68002B04D0286800240288438811E0D0
+:101490000E4B1B78002B03D00220FFF759F9286070
+:1014A0002C68002CEFD10DE0C1180919097A002928
+:1014B00003D00134E1189142F6DB002C02D1FFF792
+:1014C00039FD2C60201C38BDCCFFFF1F7BFFFF1FA8
+:1014D000F7B5344D0123071C0C1C2B70002C5DD07C
+:1014E000314E306800282BD1304A0192304B1B78A6
+:1014F000DBB2002B1AD00120FFF744F9052806D9EA
+:10150000019B2C4A013B0193002B09D10BE00123E5
+:101510002B70FFF7F1FC244A10600028F0D00FE098
+:101520001378002B06D001231370002301202B70A9
+:10153000404235E02B70FFF76DFD01232B70D5E79E
+:101540001C4B002231681A704B884020C01A00944E
+:10155000844200D90090181C0830081801900098A7
+:101560001B184B80241A0023009A934204D0FA5C83
+:101570000198C2540133F7E74A88FF180E4B3F2AFF
+:1015800002D805221A70A9E7402200200A801870AC
+:101590000120FFF743F9002232609FE72C70201CE6
+:1015A000FEBDC046C0FFFF1FC4FFFF1FB51E0000E9
+:1015B0007BFFFF1FC8FFFF1FD0FFFF1F07B56B4654
+:1015C000D8710733181C0121FFF782FF0EBDFFFF02
+:1015D00038B50F4B1B78002B19D00E4C2168002911
+:1015E00015D04A88002A12D00B480023037098189F
+:1015F0003F2805DC8818C018002505720133F6E77E
+:1016000040230B800120FFF709F90023236038BD38
+:101610007BFFFF1FC4FFFF1FD0FFFF1F38B50D4B1F
+:101620001B78DBB2002B13D10B480168041C4A88DD
+:1016300098183F2805DC8818C0180025057201336A
+:10164000F6E740230B800120FFF7E8F80023236032
+:1016500038BDC046C0FFFF1FC4FFFF1F164B8022CE
+:101660001968D2000A431A60144A00231370144AFE
+:1016700014491370144A1370144A1370144A1370E7
+:10168000144A1160144AD12189001160134AC1041F
+:10169000C90EC0B21170507093702C23D370104BD0
+:1016A000FF22196891430A1C40210A431A600D4B1E
+:1016B000802252011A607047348004405400002098
+:1016C000D2FFFF1F130300005C0000205500002024
+:1016D000D1FFFF1F40A0044044A0044000A00640EA
+:1016E0000CE400E000E100E010B5124B1322997801
+:1016F0009143032202400A43410701D510210A43C6
+:101700009A700F220B490240042A03D18A7940249F
+:1017100022438A715A7910218A43084200D00A4331
+:101720005A719A7910218A43840600D50A439A7126
+:1017300010BDC04600A0064008B50E4B1B685A05F8
+:1017400017D50D4B1B78DBB2002B02D0FFF762FCE4
+:10175000F7E70A4A802149011160094A0949D37013
+:101760000422FF320A6008490A60084A1370084AD6
+:10177000137008BD34800440D1FFFF1F80E100E0FA
+:1017800000A0064040A0044044A0044054000020B3
+:10179000D2FFFF1F38B5041C0B4B1D78EDB2002D96
+:1017A000FAD1201C0121FEF79BFE291C201CFEF70C
+:1017B00077FE0C225443054B054AE1581C19116071
+:1017C000044B227A1A7038BDD1FFFF1F1C24000081
+:1017D0005800002053000020F8B5214B071C1B685F
+:1017E0005A053BD51F4B1B68002B02D01E4A1278AE
+:1017F0001A711E4E002334783F220134A2425B410D
+:101800005B421C401A4D2B78A3421CD1FEF756FFB9
+:10181000402813DC174A13795BB2002BF2DA2B78DD
+:10182000002101333F209842494149420B4012496F
+:10183000C95CDBB2C9B2D1712B70E3E7FF28E1DDEF
+:10184000FFF7E8FBDEE70C4BFFB21F550B4B012205
+:101850001A70084BE4B2AC223470DA70F8BDC0469E
+:101860003480044058000020530000205C00002019
+:101870005500002000A00640D3FFFF1FD1FFFF1F2F
+:1018800038B5041C4518AC4204D02078FFF7A4FFFB
+:101890000134F8E738BDFFFF08B5044B1B78002B77
+:1018A00002D0FFF7B7FBF8E708BDC046D1FFFF1F26
+:1018B000064B074A1B781078DBB2C0B2834201D3D3
+:1018C0003F3000E00138C01A7047C0465C0000207D
+:1018D00055000020054B1878054BC0B21B78DBB2D1
+:1018E000984200D24030C01A7047C04654000020D1
+:1018F000D2FFFF1F0A4B0B4A19781378DBB29942CB
+:101900000BD001333F2000219842494149420B400E
+:101910000549C85CDBB2137001E00120404270470A
+:1019200054000020D2FFFF1F130000200A4B1A783A
+:101930000A4B1B78DBB29A420AD0013300223F21C6
+:101940009942524152421340054AD05CC0B201E074
+:10195000012040427047C04654000020D2FFFF1FC4
+:1019600013000020024B1A78024BD2B21A70704753
+:10197000D2FFFF1F5400002030B5254A1379990685
+:1019800012D52449D4790B78002001333F259D429C
+:101990004041404203402048E4B20078834203D0F3
+:1019A0001E48C454DBB20B70D178194CC9B24BB28B
+:1019B000002B1ADA23795BB2002B16DA184B194880
+:1019C0001D780378DBB29D4202D16C23E3700CE0FA
+:1019D000013300243F259D42644164422340124C60
+:1019E000E45CDBB2E4B2D4710370402319420ED040
+:1019F000117919420BD00D4B002119700C4B1B684B
+:101A00008B4202D00B49097819722C23D37030BD58
+:101A100000A0064054000020D2FFFF1F130000204A
+:101A20005C00002055000020D3FFFF1FD1FFFF1FE7
+:101A30005800002053000020164B802219685201E4
+:101A40000A431A60144A00231370144A144913708D
+:101A5000144A1370144A1370144A1370144A116014
+:101A6000144AD12189001160134AC104C90EC0B2C1
+:101A70001170507093702C23D370104B104A19685A
+:101A80000A408021C9030A431A600E4B8022D2010A
+:101A90001A60704734800440C80000205E000020B7
+:101AA00013030000D0000020C90000205D000020CA
+:101AB00008C004400CC0044000C006400CE400E034
+:101AC000FFFF00FF00E100E010B5124B13229978F0
+:101AD0009143032202400A43410701D510210A43E2
+:101AE0009A700F220B490240042A03D18A794024BC
+:101AF00022438A715A7910218A43084200D00A434E
+:101B00005A719A7910218A43840600D50A439A7142
+:101B100010BDC04600C0064008B50E4B1B68DA0475
+:101B200017D50D4B1B78DBB2002B02D0FFF772FAF2
+:101B3000F7E70A4A8021C9011160094A0949D370AF
+:101B40000422FF320A6008490A60084A1370084AF2
+:101B5000137008BD348004405D00002080E100E087
+:101B600000C0064008C004400CC00440C80000206B
+:101B70005E00002038B5041C0B4B1D78EDB2002D23
+:101B8000FAD1201C0121FEF7ABFC291C201CFEF71A
+:101B900087FC0C225443054B054AE1581C1911607F
+:101BA000044B227A1A7038BD5D0000201C2400000E
+:101BB000CC000020C7000020F8B5214B071C1B6893
+:101BC000DA043BD51F4B1B68002B02D01E4A12784B
+:101BD0001A711E4E0023347827220134A2425B4141
+:101BE0005B421C401A4D2B78A3421CD1FEF766FDC8
+:101BF000402813DC174A13795BB2002BF2DA2B78FA
+:101C00000021013327209842494149420B401249A3
+:101C1000C95CDBB2C9B2D1712B70E3E7FF28E1DD0B
+:101C2000FFF7F8F9DEE70C4BFFB21F550B4B012213
+:101C30001A70084BE4B2AC223470DA70F8BDC046BA
+:101C400034800440CC000020C7000020D0000020D9
+:101C5000C900002000C006405F0000205D00002099
+:101C600038B5041C4518AC4204D02078FFF7A4FF17
+:101C70000134F8E738BDFFFF08B5044B1B78002B93
+:101C800002D0FFF7C7F9F8E708BDC0465D000020A5
+:101C9000064B074A1B781078DBB2C0B2834201D3EF
+:101CA000273000E00138C01A7047C046D00000203D
+:101CB000C9000020054B1878054BC0B21B78DBB279
+:101CC000984200D24030C01A7047C046C800002079
+:101CD0005E0000200A4B0B4A19781378DBB2994258
+:101CE0000BD001333F2000219842494149420B402B
+:101CF0000549C85CDBB2137001E001204042704727
+:101D0000C80000205E000020870000200A4B1A78DF
+:101D10000A4B1B78DBB29A420AD0013300223F21E2
+:101D20009942524152421340054AD05CC0B201E090
+:101D3000012040427047C046C80000205E000020DD
+:101D400087000020024B1A78024BD2B21A707047FB
+:101D50005E000020C800002030B5254A137999069E
+:101D600012D52449D4790B78002001333F259D42B8
+:101D70004041404203402048E4B20078834203D00F
+:101D80001E48C454DBB20B70D178194CC9B24BB2A7
+:101D9000002B1ADA23795BB2002B16DA184B19489C
+:101DA0001D780378DBB29D4202D16C23E3700CE016
+:101DB0000133002427259D42644164422340124C94
+:101DC000E45CDBB2E4B2D4710370402319420ED05C
+:101DD000117919420BD00D4B002119700C4B1B6867
+:101DE0008B4202D00B49097819722C23D37030BD75
+:101DF00000C00640C80000205E00002087000020D0
+:101E0000D0000020C90000205F0000205D000020FD
+:101E1000CC000020C70000201FB572B6154B702201
+:101E20001A70154A41211170144A0F211170802235
+:101E30001A701A7852B2002AFBDA114B186862B68F
+:101E4000104B984201D80A23584301AC211C0A22A6
+:101E500000F025F80023E15C0B4A002905D058006A
+:101E60001018013341800A2BF5D101335B00137048
+:101E70001FBDC046000002400700024006000240AD
+:101E8000080002407F96980040FEFF1F021C031CC2
+:101E9000981A0133591E09780029F9D17047F8B50D
+:101EA000061C0D1C171C0024301C391C00F066FA9F
+:101EB000092901D8303100E03731C9B22955301C29
+:101EC000391C00F017FA061E01D00134ECE72B197B
+:101ED00058702B1C5A1BA24206DA1A78295D197019
+:101EE0002A550133013CF5E7281CF8BD164B80222A
+:101EF000196812010A431A60144A00231370144A25
+:101F000014491370144A1370144A1370144A13704E
+:101F1000144A1160144AD12189001160134AC10486
+:101F2000C90EC0B21170507093702C23D370104B37
+:101F3000104A19680A408021C9010A431A600E4BF1
+:101F4000802292011A607047348004403C010020D6
+:101F5000D200002013030000440100203D010020B6
+:101F6000D10000200CB0044010B0044000B0064086
+:101F70000CE400E0FF00FFFF00E100E010B5124BB1
+:101F8000132299789143032202400A43410701D565
+:101F900010210A439A700F220B490240042A03D1F0
+:101FA0008A79402422438A715A7910218A4308424F
+:101FB00000D00A435A719A7910218A43840600D5C9
+:101FC0000A439A7110BDC04600B0064008B50E4BDA
+:101FD0001B681A0517D50D4B1B78DBB2002B02D0FE
+:101FE000FFF718F8F7E70A4A802189011160094ACA
+:101FF0000949D3700422FF320A6008490A60084A7E
+:102000001370084A137008BD34800440D1000020CA
+:1020100080E100E000B006400CB0044010B0044085
+:102020003C010020D200002038B5041C0B4B1D7869
+:10203000EDB2002DFAD1201C0121FEF751FA291C26
+:10204000201CFEF72DFA0C225443054B054AE1589B
+:102050001C191160044B227A1A7038BDD10000207F
+:102060001C240000400100203B010020F8B5214B5A
+:10207000071C1B681A053BD51F4B1B68002B02D0A1
+:102080001E4A12781A711E4E00233478272201341A
+:10209000A2425B415B421C401A4D2B78A3421CD1EB
+:1020A000FEF70CFB402813DC174A13795BB2002BB8
+:1020B000F2DA2B7800210133272098424941494226
+:1020C0000B401249C95CDBB2C9B2D1712B70E3E796
+:1020D000FF28E1DDFEF79EFFDEE70C4BFFB21F5548
+:1020E0000B4B01221A70084BE4B2AC223470DA7048
+:1020F000F8BDC04634800440400100203B01002070
+:10210000440100203D01002000B00640D300002023
+:10211000D100002038B5041C4518AC4204D020780A
+:10212000FFF7A4FF0134F8E738BDFFFF08B5044B03
+:102130001B78002B02D0FEF76DFFF8E708BDC04604
+:10214000D1000020064B074A1B781078DBB2C0B2E2
+:10215000834201D3273000E00138C01A7047C046DF
+:10216000440100203D010020054B1878054BC0B20A
+:102170001B78DBB2984200D24030C01A7047C0468C
+:102180003C010020D20000200A4B0B4A197813783A
+:10219000DBB299420BD001333F20002198424941E4
+:1021A00049420B400549C85CDBB2137001E00120D5
+:1021B000404270473C010020D2000020FB0000207C
+:1021C0000A4B1A780A4B1B78DBB29A420AD00133C9
+:1021D00000223F219942524152421340054AD05CAD
+:1021E000C0B201E0012040427047C0463C010020DF
+:1021F000D2000020FB000020024B1A78024BD2B222
+:102200001A707047D20000203C01002030B5254AEA
+:102210001379990612D52449D4790B78002001331B
+:102220003F259D424041404203402048E4B20078AF
+:10223000834203D01E48C454DBB20B70D178194CD2
+:10224000C9B24BB2002B1ADA23795BB2002B16DA33
+:10225000184B19481D780378DBB29D4202D16C23DC
+:10226000E3700CE00133002427259D426441644261
+:102270002340124CE45CDBB2E4B2D471037040231F
+:1022800019420ED0117919420BD00D4B0021197053
+:102290000C4B1B688B4202D00B49097819722C2316
+:1022A000D37030BD00B006403C010020D2000020B9
+:1022B000FB000020440100203D010020D30000204D
+:1022C000D1000020400100203B01002002B47146F3
+:1022D00049084900095C49008E4402BC7047C04669
+:1022E00003B47146490840004900095A49008E4428
+:1022F00003BC7047002934D00123002210B4884267
+:102300002CD301242407A14204D2814202D2090124
+:102310001B01F8E7E400A14204D2814202D2490045
+:102320005B00F8E7884201D3401A1A434C08A042E8
+:1023300002D3001B5C0822438C08A04202D3001B7E
+:102340009C082243CC08A04202D3001BDC08224395
+:10235000002803D01B0901D00909E3E7101C10BCB9
+:102360007047002801D00020C04307B4024802A1F2
+:102370004018029003BDC046190000000029F0D0AB
+:1023800003B5FFF7B9FF0EBC4243891A1847C04690
+:102390007047C0461C2101231B04984201D3000C46
+:1023A00010391B0A984201D3000A08391B099842C8
+:1023B00001D30009043902A2105C40187047C046DE
+:1023C00004030202010101010000000000000000FE
+:1023D00070B50E4B0E4D0024ED1AAD101E1CAC4214
+:1023E00004D0A300F35898470134F8E700F086F9C9
+:1023F000084B094D0024ED1AAD101E1CAC4204D050
+:10240000A300F35898470134F8E770BD082700008F
+:1024100008270000082700001C270000420000F8E1
+:1024200040A0044001000000420000F844A0044025
+:1024300002000000C00000F800C0044001000000DD
+:10244000000000F80490044002000000000000F8C2
+:102450000890044004000000C00000F81CC00440C4
+:1024600080000000C00000F810C004401000000010
+:10247000C00000F808C0044004000000C00000F8DC
+:102480000CC0044008000000800000F80CB00440BC
+:1024900008000000800000F810B0044010000000A8
+:1024A000800000F818B0044040000000800000F8F0
+:1024B0001CB0044080000000800000F814B004400C
+:1024C00020000000C00000F804C00440020000002A
+:1024D000800000F800B0044001000000400000F857
+:1024E00000A0044001000000400000F804A00440E7
+:1024F00002000000400000F80CA0044008000000AA
+:10250000400000F808A0044004000000C00000F8EB
+:1025100014C0044020000000C00000F818C00440AF
+:1025200040000000800000F804B0044002000000F9
+:10253000800000F808B0044004000000020100F828
+:1025400050D0044010000000020100F854D00440B4
+:1025500020000000030100F878D004404000000093
+:1025600000000000000000007D1000008710000047
+:102570005D100000651000006D1000007510000077
+:102580000000000000000000471200005F12000081
+:1025900017120000271200001F1200002F12000067
+:1025A000CD110000E5110000051200000D12000021
+:1025B000371200003F120000E1100000ED10000093
+:1025C000F9100000051100006F1200005312000006
+:1025D00000000000000000008B110000A3110000AB
+:1025E0005B1100006B11000063110000731100000B
+:1025F00011110000291100004911000051110000C3
+:102600007B11000083110000B1100000BD1000001C
+:10261000C9100000D5100000B31100009711000090
+:1026200000000000000000007F130000971300006E
+:102630004F1300005F1300005713000067130000E2
+:10264000051300001D1300003D130000451300009A
+:102650006F13000077130000D5120000E112000094
+:10266000ED120000F9120000A71300008B13000008
+:10267000151915190000FFFF0001000066FDFF1F7E
+:10268000120000000002000090FDFF1F4900000042
+:1026900000220100D9FDFF1F2100000000210100E0
+:1026A000C2FDFF1F0900000000220000FAFDFF1F0D
+:1026B0001C00000000210000A2FDFF1F0900000017
+:1026C000000300003CFEFF1F00000000010309049E
+:1026D00078FDFF1F000000000203090416FEFF1F23
+:1026E000000000000303090440FEFF1F000000007B
+:1026F000000000000000000000000000F8B5C04627
+:10270000F8BC08BC9E4670473904000095100000D4
+:0C27100089120000A9120000C113000093
+:10271C00FFFFFFFF0A041201000200000040C01678
+:10272C0086040001010203011803540065006500D2
+:10273C006E00730079006400750069006E006F0014
+:10274C0009024900020100C0320904000002030022
+:10275C000000092111010001221C00070583034020
+:10276C0000010705040340000109040100020300F5
+:10277C0000000921110100012221000705810340FD
+:10278C0000010705020320000206C9FF0904A15C31
+:10279C007508150026FF00954009758102952009E2
+:1027AC0076910295040976B102C006ABFF0A0002CD
+:1027BC00A1017508150026FF0095400901810295BD
+:1027CC004009029102C026035400650065006E00AA
+:1027DC00730079006400750069006E006F002000C2
+:1027EC0052006100770048004900440004030904CA
+:1027FC000C030000000000000000000000000000BE
+:08280C000000000000000000C4
+:00000001FF
diff --git a/teensy_loader_cli/blinky-at90usb1286.hex b/teensy_loader_cli/blinky-at90usb1286.hex
new file mode 100644
index 0000000..b9bbe56
--- /dev/null
+++ b/teensy_loader_cli/blinky-at90usb1286.hex
@@ -0,0 +1,120 @@
+:10000000E8C0000003C1000001C10000FFC0000003
+:10001000FDC00000FBC00000F9C00000F7C00000F8
+:10002000F5C00000F3C00000EEC100002CC20000CB
+:10003000EDC00000EBC00000E9C00000E7C0000018
+:10004000E5C00000E3C00000E1C00000DFC0000028
+:10005000DDC00000DBC00000D9C00000D7C0000038
+:10006000D5C00000D3C00000D1C00000CFC0000048
+:10007000CDC00000CBC00000C9C00000C7C0000058
+:10008000C5C00000C3C00000C1C00000BFC0000068
+:10009000BDC00000BBC000004284A4830124C3048F
+:1000A0000274A344C282E364D4430381231463949F
+:1000B000B4C40A000A002064697400206461680006
+:1000C0004368617220000A004F7070732C20756EB7
+:1000D000737570706F7274656420636861726163B8
+:1000E0007465723A200053706163650A00444F459D
+:1000F0005320414E59424F4459205354494C4C20AF
+:100100004B4E4F57204D4F52534520434F44453F90
+:1001100000534F5300000100004C01120002000088
+:100120005E01220022000080011500210000700104
+:100130000900030000950104010309049901140258
+:10014000030904AF0120000001C1260012010002D2
+:1001500000000020C016790400010102000109021C
+:100160002200010100C03209040000010300000068
+:100170000921110100012215000705830320000158
+:100180000631FF0974A1537508150026FF0095205C
+:1001900009758102C004030904140359006F007536
+:1001A00000720020004E0061006D0065000000201C
+:1001B0000359006F00750072002000550053004283
+:1001C00000200044006500760069006300650000BF
+:1001D000000011241FBECFEFD0E2DEBFCDBF11E083
+:1001E000A0E0B1E0E0E7F7E000E00BBF02C007905D
+:1001F0000D92A030B107D9F711E0A0E0B1E001C045
+:100200001D92A330B107E1F779D0B0C2F9CE0F93B8
+:100210001F93CF93DF93182F803269F486EE90E01E
+:1002200091D280EE95E120E931E0F9013197F1F7C3
+:100230000197D9F74EC081548A3148F088EC90E09C
+:1002400081D2812F9AD086EC90E07CD242C080ECA3
+:1002500090E078D2812F91D08AE38FD0E12FF0E027
+:10026000E95AFF4FE4910E2F07701E2FC0E9D1E02D
+:1002700022C05E9A17FF0BC08BEB90E063D280E642
+:1002800099E0FE013197F1F70197D9F70AC086EBA3
+:1002900090E058D280E293E0FE013197F1F70197A8
+:1002A000D9F75E9880E293E0FE013197F1F701976C
+:1002B000D9F7110F01500023E1F684EB90E042D210
+:1002C00080E496E020E931E0F9013197F1F70197F8
+:1002D000D9F7DF91CF911F910F910895CF93DF93BD
+:1002E000EC01FE0121968491882311F090DFF9CF73
+:1002F00082EB90E027D2DF91CF9108951F93CF93A7
+:10030000DF9380E88093610010926100569A5E98B6
+:100310001DD010E0C0E9D1E00BC081E191E0DEDF4B
+:1003200088E99AE3FE013197F1F70197D9F71F5F4A
+:10033000163098F38DEE90E0D1DF80E49CE9FE0169
+:100340003197F1F70197D9F710E0E7CF81E8809373
+:10035000D70080EA8093D80086E189BD09B400FE09
+:10036000FDCF80E98093D8001092E0001092000148
+:100370008CE08093E20078940895482F80910001EA
+:10038000882309F43EC02FB7F89483E08093E900F6
+:1003900080910201882341F08091E80085FD02C030
+:1003A0002FBF12C0109202019091E4009C5F33E0D5
+:1003B0008091E80085FD13C02FBF8091E40089176C
+:1003C00029F481E0809302018FEF0895809100016C
+:1003D0008823B9F02FB7F8943093E900E9CF409320
+:1003E000F1008091E80085FD06C08AE38093E80073
+:1003F0001092010103C082E0809301012FBF80E0D1
+:1004000008958FEF08951F920F920FB60F92112447
+:100410008F939F938091E1001092E100982F83FFCA
+:100420000FC01092E90081E08093EB001092EC0085
+:1004300082E28093ED0088E08093F000109200014A
+:1004400092FF1AC0809100018823B1F080910101D0
+:10045000882391F0815080930101882369F483E01F
+:100460008093E90002C01092F1008091E80085FDC0
+:10047000FACF8AE38093E8009F918F910F900FBE8F
+:100480000F901F9018951F920F920FB60F920BB6F8
+:100490000F9211242F933F934F935F936F937F930A
+:1004A0008F939F93AF93BF93CF93DF93EF93FF937C
+:1004B0001092E9008091E80083FF2CC14091F10087
+:1004C0003091F1008091F100A82FB0E02091F1006F
+:1004D000922F80E0A82BB92B8091F100682F70E05B
+:1004E0002091F100922F80E0682B792B8091F10010
+:1004F000C82FD0E02091F100922F80E0C82BD92B9B
+:1005000082EF8093E800363009F056C02CE131E0EC
+:10051000A90145505040F9013797859194918A1768
+:100520009B07E1F4FA018591949186179707B1F43E
+:100530009A012E5F3F4FF901659174912E5F3F4FF5
+:10054000F9012491CE01CF3FD10519F010F08FEFC2
+:1005500090E0422F821758F4482F09C0295F3F4F7F
+:10056000495F5F4FF1E02D343F07A9F6D3C05EEF3E
+:100570008091E800282F30E0C90185709070892BA8
+:10058000B9F322FDCAC0342F413208F030E2232FE4
+:10059000CB0106C0FC010196E491E093F1002150EB
+:1005A0002223C1F7630F711D431B5093E8004423BE
+:1005B000F9F63032E9F2B1C0353061F48EEF809354
+:1005C000E8008091E80080FFFCCF8A2F806880934C
+:1005D000E300A3C0393031F5442309F09BC0A09358
+:1005E00000018EEF8093E80086E491E021E0209303
+:1005F000E900FC010196E491E093EB00EE2369F041
+:10060000AC014F5F5F4FFC0184918093EC00CA0105
+:100610000196FA0134913093ED002F5F253039F7C0
+:100620008EE14DC0383061F4403809F073C08091DC
+:10063000E80080FFFCCF809100018093F1001BC097
+:100640003323E9F48091E80080FFFCCF423811F0B9
+:1006500080E00DC06093E9008091EB0090E025E020
+:10066000969587952A95E1F781701092E90080931D
+:10067000F1001092F1008EEF8093E8004EC031300F
+:1006800019F0333009F046C04230F1F4AB2BE1F4FD
+:10069000262F2F77822F81508430B0F48EEF8093F5
+:1006A000E8002093E9003330A9F189E18093EB0061
+:1006B00081E090E002C0880F991F2A95E2F78093AD
+:1006C000EA001092EA0029C0313021F5413A11F5D3
+:1006D000672B01F54C2F5EEF8091E800282F30E06A
+:1006E000C90185709070892BB9F322FD16C0942F33
+:1006F000413208F090E2892F03C01092F10081503E
+:100700008823D9F7491B5093E800442329F79032F6
+:1007100019F303C081E28093EB00FF91EF91DF9129
+:10072000CF91BF91AF919F918F917F916F915F9189
+:100730004F913F912F910F900BBE0F900FBE0F90D6
+:100740001F9018951F93CF93DF93EC01FE01219624
+:100750001491112339F01A3011F48DE00EDE812F3F
+:100760000CDEF4CFDF91CF911F910895F894FFCF65
+:00000001FF
diff --git a/teensy_loader_cli/blinky-at90usb162.hex b/teensy_loader_cli/blinky-at90usb162.hex
new file mode 100644
index 0000000..400df52
--- /dev/null
+++ b/teensy_loader_cli/blinky-at90usb162.hex
@@ -0,0 +1,117 @@
+:10000000D6C00000EFC00000EDC00000EBC0000053
+:10001000E9C00000E7C00000E5C00000E3C0000048
+:10002000E1C00000DFC00000DDC00000D5C100005D
+:1000300013C20000D7C00000D5C00000D3C000002C
+:10004000D1C00000CFC00000CDC00000CBC0000078
+:10005000C9C00000C7C00000C5C00000C3C0000088
+:10006000C1C00000BFC00000BDC00000BBC0000098
+:10007000B9C000004284A4830124C3040274A344D1
+:10008000C282E364D443038123146394B4C40A009A
+:100090000A0020646974002064616800436861722A
+:1000A00020000A004F7070732C20756E737570708D
+:1000B0006F72746564206368617261637465723A1B
+:1000C000200053706163650A00444F455320414E40
+:1000D00059424F4459205354494C4C204B4E4F5792
+:1000E000204D4F52534520434F44453F00534F53FB
+:1000F0000000010000280112000200003A01220065
+:100100002200005C0115002100004C0109000300E1
+:100110000071010401030904750114020309048B31
+:100120000120000001C12600120100020000002091
+:10013000C016790400010102000109022200010138
+:1001400000C0320904000001030000000921110170
+:100150000001221500070583032000010631FF0975
+:1001600074A1537508150026FF00952009758102BA
+:10017000C004030904140359006F007500720020C5
+:10018000004E0061006D0065000000200359006F03
+:10019000007500720020005500530042002000440A
+:1001A000006500760069006300650000000011240E
+:1001B0001FBECFEFD2E0DEBFCDBF11E0A0E0B1E0C7
+:1001C000EAE3F7E002C005900D92A030B107D9F73D
+:1001D00011E0A0E0B1E001C01D92A330B107E1F74A
+:1001E00079D0A9C20DCF0F931F93CF93DF93182F10
+:1001F000803269F482EC90E08AD280EE95E120E9C9
+:1002000031E0F9013197F1F70197D9F74EC08154E8
+:100210008A3148F084EA90E07AD2812F97D082EA3E
+:1002200090E075D242C08CE990E071D2812F8ED0DF
+:100230008AE38CD0E12FF0E0ED5CFF4FE4910E2FCC
+:1002400007701E2FC0E9D1E022C05E9817FF0BC0D7
+:1002500087E990E05CD280E699E0FE013197F1F702
+:100260000197D9F70AC082E990E051D280E293E089
+:10027000FE013197F1F70197D9F75E9A80E293E09A
+:10028000FE013197F1F70197D9F7110F01500023C3
+:10029000E1F680E990E03BD280E496E020E931E0AD
+:1002A000F9013197F1F70197D9F7DF91CF911F91BC
+:1002B0000F910895CF93DF93EC01FE012196849175
+:1002C000882311F090DFF9CF8EE890E020D2DF9103
+:1002D000CF9108951F93CF93DF9380E880936100BF
+:1002E00010926100569A5E9A1DD010E0C0E9D1E0EC
+:1002F0000BC08DEE90E0DEDF88E99AE3FE013197D6
+:10030000F1F70197D9F71F5F163098F389EC90E069
+:10031000D1DF80E49CE9FE013197F1F70197D9F72D
+:1003200010E0E7CF80EA8093D80086E089BD09B469
+:1003300000FEFDCF80E88093D8001092E00010927C
+:1003400000018CE08093E20078940895482F80911A
+:100350000001882309F43EC02FB7F89483E080930E
+:10036000E90080910201882341F08091E80085FD39
+:1003700002C02FBF12C0109202019091E4009C5F56
+:1003800033E08091E80085FD13C02FBF8091E40029
+:10039000891729F481E0809302018FEF08958091FD
+:1003A00000018823B9F02FB7F8943093E900E9CF22
+:1003B0004093F1008091E80085FD06C08AE38093B8
+:1003C000E8001092010103C082E0809301012FBF79
+:1003D00080E008958FEF08951F920F920FB60F924D
+:1003E00011248F939F938091E1001092E100982F48
+:1003F00083FF0FC01092E90081E08093EB00109220
+:10040000EC0082E28093ED0088E08093F00010928F
+:10041000000192FF1AC0809100018823B1F0809101
+:100420000101882391F0815080930101882369F4B0
+:1004300083E08093E90002C01092F1008091E8000F
+:1004400085FDFACF8AE38093E8009F918F910F900A
+:100450000FBE0F901F9018951F920F920FB60F921C
+:1004600011242F933F934F935F936F937F938F93B9
+:100470009F93AF93BF93CF93DF93EF93FF9310922C
+:10048000E9008091E80083FF2CC14091F100309198
+:10049000F1008091F100A82FB0E02091F100922F9F
+:1004A00080E0A82BB92B8091F100682F70E020919B
+:1004B000F100922F80E0682B792B8091F100C82FFA
+:1004C000D0E02091F100922F80E0C82BD92B82EF51
+:1004D0008093E800363009F056C028EF30E0A901DB
+:1004E00045505040F9013797859194918A179B07A1
+:1004F000E1F4FA018591949186179707B1F49A0176
+:100500002E5F3F4FF901659174912E5F3F4FF901C6
+:100510002491CE01CF3FD10519F010F08FEF90E07C
+:10052000422F821758F4482F09C0295F3F4F495F77
+:100530005F4FF1E029323F07A9F6D3C05EEF80910B
+:10054000E800282F30E0C90185709070892BB9F33D
+:1005500022FDCAC0342F413208F030E2232FCB01F4
+:1005600006C0FC010196E491E093F10021502223A2
+:10057000C1F7630F711D431B5093E8004423F9F644
+:100580003032E9F2B1C0353061F48EEF8093E8008B
+:100590008091E80080FFFCCF8A2F80688093E30081
+:1005A000A3C0393031F5442309F09BC0A09300016A
+:1005B0008EEF8093E80082E291E021E02093E90051
+:1005C000FC010196E491E093EB00EE2369F0AC01AD
+:1005D0004F5F5F4FFC0184918093EC00CA0101964C
+:1005E000FA0134913093ED002F5F253039F78EE119
+:1005F0004DC0383061F4403809F073C08091E80094
+:1006000080FFFCCF809100018093F1001BC0332359
+:10061000E9F48091E80080FFFCCF423811F080E0DF
+:100620000DC06093E9008091EB0090E025E0969585
+:1006300087952A95E1F781701092E9008093F10087
+:100640001092F1008EEF8093E8004EC0313019F027
+:10065000333009F046C04230F1F4AB2BE1F4262FE1
+:100660002F77822F81508430B0F48EEF8093E80092
+:100670002093E9003330A9F189E18093EB0081E018
+:1006800090E002C0880F991F2A95E2F78093EA0054
+:100690001092EA0029C0313021F5413A11F5672B5B
+:1006A00001F54C2F5EEF8091E800282F30E0C90162
+:1006B00085709070892BB9F322FD16C0942F4132BA
+:1006C00008F090E2892F03C01092F1008150882336
+:1006D000D9F7491B5093E800442329F7903219F3C6
+:1006E00003C081E28093EB00FF91EF91DF91CF9106
+:1006F000BF91AF919F918F917F916F915F914F913A
+:100700003F912F910F900FBE0F901F9018951F9340
+:10071000CF93DF93EC01FE0121961491112339F060
+:100720001A3011F48DE012DE812F10DEF4CFDF914C
+:0A073000CF911F910895F894FFCFB8
+:00000001FF
diff --git a/teensy_loader_cli/blinky-at90usb646.hex b/teensy_loader_cli/blinky-at90usb646.hex
new file mode 100644
index 0000000..1e5b9c0
--- /dev/null
+++ b/teensy_loader_cli/blinky-at90usb646.hex
@@ -0,0 +1,120 @@
+:10000000E8C0000001C10000FFC00000FDC000000A
+:10001000FBC00000F9C00000F7C00000F5C0000000
+:10002000F3C00000F1C00000ECC100002AC20000D3
+:10003000EBC00000E9C00000E7C00000E5C0000020
+:10004000E3C00000E1C00000DFC00000DDC0000030
+:10005000DBC00000D9C00000D7C00000D5C0000040
+:10006000D3C00000D1C00000CFC00000CDC0000050
+:10007000CBC00000C9C00000C7C00000C5C0000060
+:10008000C3C00000C1C00000BFC00000BDC0000070
+:10009000BBC00000B9C000004284A4830124C30493
+:1000A0000274A344C282E364D4430381231463949F
+:1000B000B4C40A000A002064697400206461680006
+:1000C0004368617220000A004F7070732C20756EB7
+:1000D000737570706F7274656420636861726163B8
+:1000E0007465723A200053706163650A00444F459D
+:1000F0005320414E59424F4459205354494C4C20AF
+:100100004B4E4F57204D4F52534520434F44453F90
+:1001100000534F5300000100004C01120002000088
+:100120005E01220022000080011500210000700104
+:100130000900030000950104010309049901140258
+:10014000030904AF0120000001C1260012010002D2
+:1001500000000020C016790400010102000109021C
+:100160002200010100C03209040000010300000068
+:100170000921110100012215000705830320000158
+:100180000631FF0974A1537508150026FF0095205C
+:1001900009758102C004030904140359006F007536
+:1001A00000720020004E0061006D0065000000201C
+:1001B0000359006F00750072002000550053004283
+:1001C00000200044006500760069006300650000BF
+:1001D000000011241FBECFEFD0E1DEBFCDBF11E084
+:1001E000A0E0B1E0E4E6F7E002C005900D92A03097
+:1001F000B107D9F711E0A0E0B1E001C01D92A33032
+:10020000B107E1F779D0ACC2FBCE0F931F93CF9328
+:10021000DF93182F803269F486EE90E08DD280EE65
+:1002200095E120E931E0F9013197F1F70197D9F72C
+:100230004EC081548A3148F088EC90E07DD2812F05
+:100240009AD086EC90E078D242C080EC90E074D2F4
+:10025000812F91D08AE38FD0E12FF0E0E95AFF4F50
+:10026000E4910E2F07701E2FC0E9D1E022C05E98E6
+:1002700017FF0BC08BEB90E05FD280E699E0FE01A8
+:100280003197F1F70197D9F70AC086EB90E054D285
+:1002900080E293E0FE013197F1F70197D9F75E9A7A
+:1002A00080E293E0FE013197F1F70197D9F7110F42
+:1002B00001500023E1F684EB90E03ED280E496E02A
+:1002C00020E931E0F9013197F1F70197D9F7DF9192
+:1002D000CF911F910F910895CF93DF93EC01FE0111
+:1002E00021968491882311F090DFF9CF82EB90E082
+:1002F00023D2DF91CF9108951F93CF93DF9380E8AE
+:100300008093610010926100569A5E9A1DD010E0B1
+:10031000C0E9D1E00BC081E191E0DEDF88E99AE33A
+:10032000FE013197F1F70197D9F71F5F163098F367
+:100330008DEE90E0D1DF80E49CE9FE013197F1F78A
+:100340000197D9F710E0E7CF81E88093D70080EAE2
+:100350008093D8008AE189BD09B400FEFDCF80E911
+:100360008093D8001092E000109200018CE08093FE
+:10037000E20078940895482F80910001882309F4C1
+:100380003EC02FB7F89483E08093E900809102018A
+:10039000882341F08091E80085FD02C02FBF12C084
+:1003A000109202019091E4009C5F33E08091E8009C
+:1003B00085FD13C02FBF8091E400891729F481E0E7
+:1003C000809302018FEF0895809100018823B9F096
+:1003D0002FB7F8943093E900E9CF4093F100809172
+:1003E000E80085FD06C08AE38093E80010920101D1
+:1003F00003C082E0809301012FBF80E008958FEF5A
+:1004000008951F920F920FB60F9211248F939F930E
+:100410008091E1001092E100982F83FF0FC01092AD
+:10042000E90081E08093EB001092EC0082E280937F
+:10043000ED0088E08093F0001092000192FF1AC056
+:10044000809100018823B1F080910101882391F00F
+:10045000815080930101882369F483E08093E9004F
+:1004600002C01092F1008091E80085FDFACF8AE386
+:100470008093E8009F918F910F900FBE0F901F9077
+:1004800018951F920F920FB60F9211242F933F933E
+:100490004F935F936F937F938F939F93AF93BF938C
+:1004A000CF93DF93EF93FF931092E9008091E800E0
+:1004B00083FF2CC14091F1003091F1008091F10057
+:1004C000A82FB0E02091F100922F80E0A82BB92B4B
+:1004D0008091F100682F70E02091F100922F80E070
+:1004E000682B792B8091F100C82FD0E02091F1008A
+:1004F000922F80E0C82BD92B82EF8093E800363012
+:1005000009F056C02CE131E0A90145505040F901F5
+:100510003797859194918A179B07E1F4FA018591A9
+:10052000949186179707B1F49A012E5F3F4FF90116
+:10053000659174912E5F3F4FF9012491CE01CF3F19
+:10054000D10519F010F08FEF90E0422F821758F488
+:10055000482F09C0295F3F4F495F5F4FF1E02D34BD
+:100560003F07A9F6D3C05EEF8091E800282F30E066
+:10057000C90185709070892BB9F322FDCAC0342F50
+:10058000413208F030E2232FCB0106C0FC01019676
+:10059000E491E093F10021502223C1F7630F711D14
+:1005A000431B5093E8004423F9F63032E9F2B1C01E
+:1005B000353061F48EEF8093E8008091E80080FF91
+:1005C000FCCF8A2F80688093E300A3C0393031F5D7
+:1005D000442309F09BC0A09300018EEF8093E800B4
+:1005E00086E491E021E02093E900FC010196E4918A
+:1005F000E093EB00EE2369F0AC014F5F5F4FFC012D
+:1006000084918093EC00CA010196FA0134913093F1
+:10061000ED002F5F253039F78EE14DC0383061F4A1
+:10062000403809F073C08091E80080FFFCCF8091D2
+:1006300000018093F1001BC03323E9F48091E800AE
+:1006400080FFFCCF423811F080E00DC06093E900DC
+:100650008091EB0090E025E0969587952A95E1F74B
+:1006600081701092E9008093F1001092F1008EEFFA
+:100670008093E8004EC0313019F0333009F046C0A5
+:100680004230F1F4AB2BE1F4262F2F77822F8150EB
+:100690008430B0F48EEF8093E8002093E90033308B
+:1006A000A9F189E18093EB0081E090E002C0880F1E
+:1006B000991F2A95E2F78093EA001092EA0029C078
+:1006C000313021F5413A11F5672B01F54C2F5EEFE2
+:1006D0008091E800282F30E0C90185709070892B47
+:1006E000B9F322FD16C0942F413208F090E2892F11
+:1006F00003C01092F10081508823D9F7491B509311
+:10070000E800442329F7903219F303C081E2809373
+:10071000EB00FF91EF91DF91CF91BF91AF919F914E
+:100720008F917F916F915F914F913F912F910F909A
+:100730000FBE0F901F9018951F93CF93DF93EC017E
+:10074000FE0121961491112339F01A3011F48DE035
+:1007500012DE812F10DEF4CFDF91CF911F9108952B
+:04076000F894FFCF3B
+:00000001FF
diff --git a/teensy_loader_cli/blinky-atmega32u4.hex b/teensy_loader_cli/blinky-atmega32u4.hex
new file mode 100644
index 0000000..a690b74
--- /dev/null
+++ b/teensy_loader_cli/blinky-atmega32u4.hex
@@ -0,0 +1,121 @@
+:10000000F2C000000BC1000009C1000007C10000E0
+:1000100005C1000003C1000001C10000FFC00000D5
+:10002000FDC00000FBC00000F6C1000034C20000AB
+:10003000F5C00000F3C00000F1C00000EFC00000F8
+:10004000EDC00000EBC00000E9C00000E7C0000008
+:10005000E5C00000E3C00000E1C00000DFC0000018
+:10006000DDC00000DBC00000D9C00000D7C0000028
+:10007000D5C00000D3C00000D1C00000CFC0000038
+:10008000CDC00000CBC00000C9C00000C7C0000048
+:10009000C5C00000C3C00000C1C00000BFC0000058
+:1000A000BDC00000BBC00000B9C000004284A483F2
+:1000B0000124C3040274A344C282E364D4430381D1
+:1000C00023146394B4C40A000A00206469740020F5
+:1000D000646168004368617220000A004F707073A9
+:1000E0002C20756E737570706F7274656420636810
+:1000F000617261637465723A200053706163650ACE
+:1001000000444F455320414E59424F4459205354C7
+:10011000494C4C204B4E4F57204D4F525345204396
+:100120004F44453F00534F5300000100006001124F
+:10013000000200007201220022000094011500213B
+:10014000000084010900030000A90104010309045F
+:10015000AD011402030904C30120000001C12600FF
+:100160001201000200000020C01679040001010203
+:10017000000109022200010100C03209040000014F
+:100180000300000009211101000122150007058369
+:10019000032000010631FF0974A1537508150026DC
+:1001A000FF00952009758102C00403090414035956
+:1001B000006F007500720020004E0061006D006548
+:1001C000000000200359006F0075007200200055E8
+:1001D000005300420020004400650076006900637F
+:1001E00000650000000011241FBECFEFDAE0DEBF83
+:1001F000CDBF11E0A0E0B1E0E8E7F7E002C0059074
+:100200000D92A030B107D9F711E0A0E0B1E001C034
+:100210001D92A330B107E1F779D0ACC2F1CE0F93B4
+:100220001F93CF93DF93182F803269F48AEF90E009
+:100230008DD280EE95E120E931E0F9013197F1F7B7
+:100240000197D9F74EC081548A3148F08CED90E087
+:100250007DD2812F9AD08AED90E078D242C084ED91
+:1002600090E074D2812F91D08AE38FD0E12FF0E01B
+:10027000E559FF4FE4910E2F07701E2FC0E9D1E022
+:1002800022C05E9A17FF0BC08FEC90E05FD280E631
+:1002900099E0FE013197F1F70197D9F70AC08AEC8E
+:1002A00090E054D280E293E0FE013197F1F701979C
+:1002B000D9F75E9880E293E0FE013197F1F701975C
+:1002C000D9F7110F01500023E1F688EC90E03ED2FF
+:1002D00080E496E020E931E0F9013197F1F70197E8
+:1002E000D9F7DF91CF911F910F910895CF93DF93AD
+:1002F000EC01FE0121968491882311F090DFF9CF63
+:1003000086EC90E023D2DF91CF9108951F93CF9395
+:10031000DF9380E88093610010926100569A5E98A6
+:100320001DD010E0C0E9D1E00BC085E291E0DEDF36
+:1003300088E99AE3FE013197F1F70197D9F71F5F3A
+:10034000163098F381E091E0D1DF80E49CE9FE0172
+:100350003197F1F70197D9F710E0E7CF81E080936B
+:10036000D70080EA8093D80082E189BD09B400FEFD
+:10037000FDCF80E98093D8001092E0001092000138
+:100380008CE08093E20078940895482F80910001DA
+:10039000882309F43EC02FB7F89483E08093E900E6
+:1003A00080910201882341F08091E80085FD02C020
+:1003B0002FBF12C0109202019091E4009C5F33E0C5
+:1003C0008091E80085FD13C02FBF8091E40089175C
+:1003D00029F481E0809302018FEF0895809100015C
+:1003E0008823B9F02FB7F8943093E900E9CF409310
+:1003F000F1008091E80085FD06C08AE38093E80063
+:100400001092010103C082E0809301012FBF80E0C0
+:1004100008958FEF08951F920F920FB60F92112437
+:100420008F939F938091E1001092E100982F83FFBA
+:100430000FC01092E90081E08093EB001092EC0075
+:1004400082E28093ED0088E08093F000109200013A
+:1004500092FF1AC0809100018823B1F080910101C0
+:10046000882391F0815080930101882369F483E00F
+:100470008093E90002C01092F1008091E80085FDB0
+:10048000FACF8AE38093E8009F918F910F900FBE7F
+:100490000F901F9018951F920F920FB60F92112474
+:1004A0002F933F934F935F936F937F938F939F937C
+:1004B000AF93BF93CF93DF93EF93FF931092E90035
+:1004C0008091E80083FF2CC14091F1003091F10050
+:1004D0008091F100A82FB0E02091F100922F80E0F0
+:1004E000A82BB92B8091F100682F70E02091F100CA
+:1004F000922F80E0682B792B8091F100C82FD0E0FB
+:100500002091F100922F80E0C82BD92B82EF8093AD
+:10051000E800363009F056C020E331E0A90145502B
+:100520005040F9013797859194918A179B07E1F420
+:10053000FA018591949186179707B1F49A012E5F7D
+:100540003F4FF901659174912E5F3F4FF90124915E
+:10055000CE01CF3FD10519F010F08FEF90E0422F80
+:10056000821758F4482F09C0295F3F4F495F5F4FFA
+:10057000F1E021363F07A9F6D3C05EEF8091E80095
+:10058000282F30E0C90185709070892BB9F322FDC6
+:10059000CAC0342F413208F030E2232FCB0106C00D
+:1005A000FC010196E491E093F10021502223C1F770
+:1005B000630F711D431B5093E8004423F9F630325A
+:1005C000E9F2B1C0353061F48EEF8093E80080919C
+:1005D000E80080FFFCCF8A2F80688093E300A3C0EF
+:1005E000393031F5442309F09BC0A09300018EEF10
+:1005F0008093E8008AE591E021E02093E900FC0186
+:100600000196E491E093EB00EE2369F0AC014F5FBB
+:100610005F4FFC0184918093EC00CA010196FA01BE
+:1006200034913093ED002F5F253039F78EE14DC0C6
+:10063000383061F4403809F073C08091E80080FFE1
+:10064000FCCF809100018093F1001BC03323E9F4BB
+:100650008091E80080FFFCCF423811F080E00DC0AF
+:100660006093E9008091EB0090E025E096958795F6
+:100670002A95E1F781701092E9008093F1001092C1
+:10068000F1008EEF8093E8004EC0313019F0333026
+:1006900009F046C04230F1F4AB2BE1F4262F2F775E
+:1006A000822F81508430B0F48EEF8093E800209345
+:1006B000E9003330A9F189E18093EB0081E090E01B
+:1006C00002C0880F991F2A95E2F78093EA001092E2
+:1006D000EA0029C0313021F5413A11F5672B01F5C7
+:1006E0004C2F5EEF8091E800282F30E0C901857023
+:1006F0009070892BB9F322FD16C0942F413208F077
+:1007000090E2892F03C01092F10081508823D9F71D
+:10071000491B5093E800442329F7903219F303C092
+:1007200081E28093EB00FF91EF91DF91CF91BF9138
+:10073000AF919F918F917F916F915F914F913F9179
+:100740002F910F900FBE0F901F9018951F93CF936E
+:10075000DF93EC01FE0121961491112339F01A3038
+:1007600011F48DE012DE812F10DEF4CFDF91CF91F6
+:080770001F910895F894FFCFDA
+:00000001FF
diff --git a/teensy_loader_cli/gpl3.txt b/teensy_loader_cli/gpl3.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/teensy_loader_cli/gpl3.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/teensy_loader_cli/teensy_loader_cli.c b/teensy_loader_cli/teensy_loader_cli.c
new file mode 100644
index 0000000..20ab3ad
--- /dev/null
+++ b/teensy_loader_cli/teensy_loader_cli.c
@@ -0,0 +1,1144 @@
+/* Teensy Loader, Command Line Interface
+ * Program and Reboot Teensy Board with HalfKay Bootloader
+ * http://www.pjrc.com/teensy/loader_cli.html
+ * Copyright 2008-2010, PJRC.COM, LLC
+ *
+ * You may redistribute this program and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software
+ * Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/
+ */
+
+/* Want to incorporate this code into a proprietary application??
+ * Just email paul@pjrc.com to ask. Usually it's not a problem,
+ * but you do need to ask to use this code in any way other than
+ * those permitted by the GNU General Public License, version 3 */
+
+/* For non-root permissions on ubuntu or similar udev-based linux
+ * http://www.pjrc.com/teensy/49-teensy.rules
+ */
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+void usage(const char *err)
+{
+ if(err != NULL) fprintf(stderr, "%s\n\n", err);
+ fprintf(stderr,
+ "Usage: teensy_loader_cli --mcu= [-w] [-h] [-n] [-b] [-v] \n"
+ "\t-w : Wait for device to appear\n"
+ "\t-r : Use hard reboot if device not online\n"
+ "\t-s : Use soft reboot if device not online (Teensy3.x only)\n"
+ "\t-n : No reboot after programming\n"
+ "\t-b : Boot only, do not program\n"
+ "\t-v : Verbose output\n"
+ "\nUse `teensy_loader_cli --list-mcus` to list supported MCUs.\n"
+ "\nFor more information, please visit:\n"
+ "http://www.pjrc.com/teensy/loader_cli.html\n");
+ exit(1);
+}
+
+// USB Access Functions
+int teensy_open(void);
+int teensy_write(void *buf, int len, double timeout);
+void teensy_close(void);
+int hard_reboot(void);
+int soft_reboot(void);
+
+// Intel Hex File Functions
+int read_intel_hex(const char *filename);
+int ihex_bytes_within_range(int begin, int end);
+void ihex_get_data(int addr, int len, unsigned char *bytes);
+int memory_is_blank(int addr, int block_size);
+
+// Misc stuff
+int printf_verbose(const char *format, ...);
+void delay(double seconds);
+void die(const char *str, ...);
+void parse_options(int argc, char **argv);
+void boot(unsigned char *buf, int write_size);
+
+// options (from user via command line args)
+int wait_for_device_to_appear = 0;
+int hard_reboot_device = 0;
+int soft_reboot_device = 0;
+int reboot_after_programming = 1;
+int verbose = 0;
+int boot_only = 0;
+int code_size = 0, block_size = 0;
+const char *filename=NULL;
+
+
+/****************************************************************/
+/* */
+/* Main Program */
+/* */
+/****************************************************************/
+
+int main(int argc, char **argv)
+{
+ unsigned char buf[2048];
+ int num, addr, r, write_size=block_size+2;
+ int first_block=1, waited=0;
+
+ // parse command line arguments
+ parse_options(argc, argv);
+ if (!filename && !boot_only) {
+ usage("Filename must be specified");
+ }
+ if (!code_size) {
+ usage("MCU type must be specified");
+ }
+ printf_verbose("Teensy Loader, Command Line, Version 2.0\n");
+
+ if (boot_only) {
+ if (! teensy_open()) {
+ die("Could not find HalfKay");
+ }
+ printf_verbose("Found HalfKay Bootloader\n");
+
+ boot(buf, block_size+2);
+ exit(0);
+ }
+
+ // read the intel hex file
+ // this is done first so any error is reported before using USB
+ num = read_intel_hex(filename);
+ if (num < 0) die("error reading intel hex file \"%s\"", filename);
+ printf_verbose("Read \"%s\": %d bytes, %.1f%% usage\n",
+ filename, num, (double)num / (double)code_size * 100.0);
+
+ // open the USB device
+ while (1) {
+ if (teensy_open()) break;
+ if (hard_reboot_device) {
+ if (!hard_reboot()) die("Unable to find rebootor\n");
+ printf_verbose("Hard Reboot performed\n");
+ hard_reboot_device = 0; // only hard reboot once
+ wait_for_device_to_appear = 1;
+ }
+ if (soft_reboot_device) {
+ if (soft_reboot()) {
+ printf_verbose("Soft reboot performed\n");
+ }
+ soft_reboot_device = 0;
+ wait_for_device_to_appear = 1;
+ }
+ if (!wait_for_device_to_appear) die("Unable to open device\n");
+ if (!waited) {
+ printf_verbose("Waiting for Teensy device...\n");
+ printf_verbose(" (hint: press the reset button)\n");
+ waited = 1;
+ }
+ delay(0.25);
+ }
+ printf_verbose("Found HalfKay Bootloader\n");
+
+ // if we waited for the device, read the hex file again
+ // perhaps it changed while we were waiting?
+ if (waited) {
+ num = read_intel_hex(filename);
+ if (num < 0) die("error reading intel hex file \"%s\"", filename);
+ printf_verbose("Read \"%s\": %d bytes, %.1f%% usage\n",
+ filename, num, (double)num / (double)code_size * 100.0);
+ }
+
+ // program the data
+ printf_verbose("Programming");
+ fflush(stdout);
+ for (addr = 0; addr < code_size; addr += block_size) {
+ if (!first_block && !ihex_bytes_within_range(addr, addr + block_size - 1)) {
+ // don't waste time on blocks that are unused,
+ // but always do the first one to erase the chip
+ continue;
+ }
+ if (!first_block && memory_is_blank(addr, block_size)) continue;
+ printf_verbose(".");
+ if (block_size <= 256 && code_size < 0x10000) {
+ buf[0] = addr & 255;
+ buf[1] = (addr >> 8) & 255;
+ ihex_get_data(addr, block_size, buf + 2);
+ write_size = block_size + 2;
+ } else if (block_size == 256) {
+ buf[0] = (addr >> 8) & 255;
+ buf[1] = (addr >> 16) & 255;
+ ihex_get_data(addr, block_size, buf + 2);
+ write_size = block_size + 2;
+ } else if (block_size == 512 || block_size == 1024) {
+ buf[0] = addr & 255;
+ buf[1] = (addr >> 8) & 255;
+ buf[2] = (addr >> 16) & 255;
+ memset(buf + 3, 0, 61);
+ ihex_get_data(addr, block_size, buf + 64);
+ write_size = block_size + 64;
+ } else {
+ die("Unknown code/block size\n");
+ }
+ r = teensy_write(buf, write_size, first_block ? 3.0 : 0.25);
+ if (!r) die("error writing to Teensy\n");
+ first_block = 0;
+ }
+ printf_verbose("\n");
+
+ // reboot to the user's new code
+ if (reboot_after_programming) {
+ boot(buf, write_size);
+ }
+ teensy_close();
+ return 0;
+}
+
+
+
+
+/****************************************************************/
+/* */
+/* USB Access - libusb (Linux & FreeBSD) */
+/* */
+/****************************************************************/
+
+#if defined(USE_LIBUSB)
+
+// http://libusb.sourceforge.net/doc/index.html
+#include
+
+usb_dev_handle * open_usb_device(int vid, int pid)
+{
+ struct usb_bus *bus;
+ struct usb_device *dev;
+ usb_dev_handle *h;
+ char buf[128];
+ int r;
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+ //printf_verbose("\nSearching for USB device:\n");
+ for (bus = usb_get_busses(); bus; bus = bus->next) {
+ for (dev = bus->devices; dev; dev = dev->next) {
+ //printf_verbose("bus \"%s\", device \"%s\" vid=%04X, pid=%04X\n",
+ // bus->dirname, dev->filename,
+ // dev->descriptor.idVendor,
+ // dev->descriptor.idProduct
+ //);
+ if (dev->descriptor.idVendor != vid) continue;
+ if (dev->descriptor.idProduct != pid) continue;
+ h = usb_open(dev);
+ if (!h) {
+ printf_verbose("Found device but unable to open\n");
+ continue;
+ }
+ #ifdef LIBUSB_HAS_GET_DRIVER_NP
+ r = usb_get_driver_np(h, 0, buf, sizeof(buf));
+ if (r >= 0) {
+ r = usb_detach_kernel_driver_np(h, 0);
+ if (r < 0) {
+ usb_close(h);
+ printf_verbose("Device is in use by \"%s\" driver\n", buf);
+ continue;
+ }
+ }
+ #endif
+ // Mac OS-X - removing this call to usb_claim_interface() might allow
+ // this to work, even though it is a clear misuse of the libusb API.
+ // normally Apple's IOKit should be used on Mac OS-X
+ // r = usb_claim_interface(h, 0);
+ // if (r < 0) {
+ // usb_close(h);
+ // printf_verbose("Unable to claim interface, check USB permissions\n");
+ // continue;
+ // }
+ return h;
+ }
+ }
+ return NULL;
+}
+
+static usb_dev_handle *libusb_teensy_handle = NULL;
+
+int teensy_open(void)
+{
+ teensy_close();
+ libusb_teensy_handle = open_usb_device(0x16C0, 0x0478);
+ if (libusb_teensy_handle) return 1;
+ return 0;
+}
+
+int teensy_write(void *buf, int len, double timeout)
+{
+ int r;
+
+ if (!libusb_teensy_handle) return 0;
+ while (timeout > 0) {
+ r = usb_control_msg(libusb_teensy_handle, 0x21, 9, 0x0200, 0,
+ (char *)buf, len, (int)(timeout * 1000.0));
+ if (r >= 0) return 1;
+ //printf("teensy_write, r=%d\n", r);
+ usleep(10000);
+ timeout -= 0.01; // TODO: subtract actual elapsed time
+ }
+ return 0;
+}
+
+void teensy_close(void)
+{
+ if (!libusb_teensy_handle) return;
+ usb_release_interface(libusb_teensy_handle, 0);
+ usb_close(libusb_teensy_handle);
+ libusb_teensy_handle = NULL;
+}
+
+int hard_reboot(void)
+{
+ usb_dev_handle *rebootor;
+ int r;
+
+ rebootor = open_usb_device(0x16C0, 0x0477);
+ if (!rebootor) return 0;
+ r = usb_control_msg(rebootor, 0x21, 9, 0x0200, 0, "reboot", 6, 100);
+ usb_release_interface(rebootor, 0);
+ usb_close(rebootor);
+ if (r < 0) return 0;
+ return 1;
+}
+
+int soft_reboot(void)
+{
+ usb_dev_handle *serial_handle = NULL;
+
+ serial_handle = open_usb_device(0x16C0, 0x0483);
+ if (!serial_handle) {
+ char *error = usb_strerror();
+ printf("Error opening USB device: %s\n", error);
+ return 0;
+ }
+
+ char reboot_command = 134;
+ int response = usb_control_msg(serial_handle, 0x21, 0x20, 0, 0, &reboot_command, 1, 10000);
+
+ usb_release_interface(serial_handle, 0);
+ usb_close(serial_handle);
+
+ if (response < 0) {
+ char *error = usb_strerror();
+ printf("Unable to soft reboot with USB error: %s\n", error);
+ return 0;
+ }
+
+ return 1;
+}
+
+#endif
+
+
+/****************************************************************/
+/* */
+/* USB Access - Microsoft WIN32 */
+/* */
+/****************************************************************/
+
+#if defined(USE_WIN32)
+
+// http://msdn.microsoft.com/en-us/library/ms790932.aspx
+#include
+#include
+#include
+#include
+
+HANDLE open_usb_device(int vid, int pid)
+{
+ GUID guid;
+ HDEVINFO info;
+ DWORD index, required_size;
+ SP_DEVICE_INTERFACE_DATA iface;
+ SP_DEVICE_INTERFACE_DETAIL_DATA *details;
+ HIDD_ATTRIBUTES attrib;
+ HANDLE h;
+ BOOL ret;
+
+ HidD_GetHidGuid(&guid);
+ info = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
+ if (info == INVALID_HANDLE_VALUE) return NULL;
+ for (index=0; 1 ;index++) {
+ iface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
+ ret = SetupDiEnumDeviceInterfaces(info, NULL, &guid, index, &iface);
+ if (!ret) {
+ SetupDiDestroyDeviceInfoList(info);
+ break;
+ }
+ SetupDiGetInterfaceDeviceDetail(info, &iface, NULL, 0, &required_size, NULL);
+ details = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(required_size);
+ if (details == NULL) continue;
+ memset(details, 0, required_size);
+ details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+ ret = SetupDiGetDeviceInterfaceDetail(info, &iface, details,
+ required_size, NULL, NULL);
+ if (!ret) {
+ free(details);
+ continue;
+ }
+ h = CreateFile(details->DevicePath, GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ FILE_FLAG_OVERLAPPED, NULL);
+ free(details);
+ if (h == INVALID_HANDLE_VALUE) continue;
+ attrib.Size = sizeof(HIDD_ATTRIBUTES);
+ ret = HidD_GetAttributes(h, &attrib);
+ if (!ret) {
+ CloseHandle(h);
+ continue;
+ }
+ if (attrib.VendorID != vid || attrib.ProductID != pid) {
+ CloseHandle(h);
+ continue;
+ }
+ SetupDiDestroyDeviceInfoList(info);
+ return h;
+ }
+ return NULL;
+}
+
+int write_usb_device(HANDLE h, void *buf, int len, int timeout)
+{
+ static HANDLE event = NULL;
+ unsigned char tmpbuf[1040];
+ OVERLAPPED ov;
+ DWORD n, r;
+
+ if (len > sizeof(tmpbuf) - 1) return 0;
+ if (event == NULL) {
+ event = CreateEvent(NULL, TRUE, TRUE, NULL);
+ if (!event) return 0;
+ }
+ ResetEvent(&event);
+ memset(&ov, 0, sizeof(ov));
+ ov.hEvent = event;
+ tmpbuf[0] = 0;
+ memcpy(tmpbuf + 1, buf, len);
+ if (!WriteFile(h, tmpbuf, len + 1, NULL, &ov)) {
+ if (GetLastError() != ERROR_IO_PENDING) return 0;
+ r = WaitForSingleObject(event, timeout);
+ if (r == WAIT_TIMEOUT) {
+ CancelIo(h);
+ return 0;
+ }
+ if (r != WAIT_OBJECT_0) return 0;
+ }
+ if (!GetOverlappedResult(h, &ov, &n, FALSE)) return 0;
+ if (n <= 0) return 0;
+ return 1;
+}
+
+void print_win32_err(void)
+{
+ char buf[256];
+ DWORD err;
+
+ err = GetLastError();
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+ 0, buf, sizeof(buf), NULL);
+ printf("err %ld: %s\n", err, buf);
+}
+
+static HANDLE win32_teensy_handle = NULL;
+
+int teensy_open(void)
+{
+ teensy_close();
+ win32_teensy_handle = open_usb_device(0x16C0, 0x0478);
+ if (win32_teensy_handle) return 1;
+ return 0;
+}
+
+int teensy_write(void *buf, int len, double timeout)
+{
+ int r;
+ if (!win32_teensy_handle) return 0;
+ r = write_usb_device(win32_teensy_handle, buf, len, (int)(timeout * 1000.0));
+ //if (!r) print_win32_err();
+ return r;
+}
+
+void teensy_close(void)
+{
+ if (!win32_teensy_handle) return;
+ CloseHandle(win32_teensy_handle);
+ win32_teensy_handle = NULL;
+}
+
+int hard_reboot(void)
+{
+ HANDLE rebootor;
+ int r;
+
+ rebootor = open_usb_device(0x16C0, 0x0477);
+ if (!rebootor) return 0;
+ r = write_usb_device(rebootor, "reboot", 6, 100);
+ CloseHandle(rebootor);
+ return r;
+}
+
+int soft_reboot(void)
+{
+ printf("Soft reboot is not implemented for Win32\n");
+ return 0;
+}
+
+#endif
+
+
+
+/****************************************************************/
+/* */
+/* USB Access - Apple's IOKit, Mac OS-X */
+/* */
+/****************************************************************/
+
+#if defined(USE_APPLE_IOKIT)
+
+// http://developer.apple.com/technotes/tn2007/tn2187.html
+#include
+#include
+#include
+
+struct usb_list_struct {
+ IOHIDDeviceRef ref;
+ int pid;
+ int vid;
+ struct usb_list_struct *next;
+};
+
+static struct usb_list_struct *usb_list=NULL;
+static IOHIDManagerRef hid_manager=NULL;
+
+void attach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev)
+{
+ CFTypeRef type;
+ struct usb_list_struct *n, *p;
+ int32_t pid, vid;
+
+ if (!dev) return;
+ type = IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDVendorIDKey));
+ if (!type || CFGetTypeID(type) != CFNumberGetTypeID()) return;
+ if (!CFNumberGetValue((CFNumberRef)type, kCFNumberSInt32Type, &vid)) return;
+ type = IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDProductIDKey));
+ if (!type || CFGetTypeID(type) != CFNumberGetTypeID()) return;
+ if (!CFNumberGetValue((CFNumberRef)type, kCFNumberSInt32Type, &pid)) return;
+ n = (struct usb_list_struct *)malloc(sizeof(struct usb_list_struct));
+ if (!n) return;
+ //printf("attach callback: vid=%04X, pid=%04X\n", vid, pid);
+ n->ref = dev;
+ n->vid = vid;
+ n->pid = pid;
+ n->next = NULL;
+ if (usb_list == NULL) {
+ usb_list = n;
+ } else {
+ for (p = usb_list; p->next; p = p->next) ;
+ p->next = n;
+ }
+}
+
+void detach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev)
+{
+ struct usb_list_struct *p, *tmp, *prev=NULL;
+
+ p = usb_list;
+ while (p) {
+ if (p->ref == dev) {
+ if (prev) {
+ prev->next = p->next;
+ } else {
+ usb_list = p->next;
+ }
+ tmp = p;
+ p = p->next;
+ free(tmp);
+ } else {
+ prev = p;
+ p = p->next;
+ }
+ }
+}
+
+void init_hid_manager(void)
+{
+ CFMutableDictionaryRef dict;
+ IOReturn ret;
+
+ if (hid_manager) return;
+ hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
+ if (hid_manager == NULL || CFGetTypeID(hid_manager) != IOHIDManagerGetTypeID()) {
+ if (hid_manager) CFRelease(hid_manager);
+ printf_verbose("no HID Manager - maybe this is a pre-Leopard (10.5) system?\n");
+ return;
+ }
+ dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
+ &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ if (!dict) return;
+ IOHIDManagerSetDeviceMatching(hid_manager, dict);
+ CFRelease(dict);
+ IOHIDManagerScheduleWithRunLoop(hid_manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, attach_callback, NULL);
+ IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, detach_callback, NULL);
+ ret = IOHIDManagerOpen(hid_manager, kIOHIDOptionsTypeNone);
+ if (ret != kIOReturnSuccess) {
+ IOHIDManagerUnscheduleFromRunLoop(hid_manager,
+ CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ CFRelease(hid_manager);
+ printf_verbose("Error opening HID Manager\n");
+ }
+}
+
+static void do_run_loop(void)
+{
+ while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) == kCFRunLoopRunHandledSource) ;
+}
+
+IOHIDDeviceRef open_usb_device(int vid, int pid)
+{
+ struct usb_list_struct *p;
+ IOReturn ret;
+
+ init_hid_manager();
+ do_run_loop();
+ for (p = usb_list; p; p = p->next) {
+ if (p->vid == vid && p->pid == pid) {
+ ret = IOHIDDeviceOpen(p->ref, kIOHIDOptionsTypeNone);
+ if (ret == kIOReturnSuccess) return p->ref;
+ }
+ }
+ return NULL;
+}
+
+void close_usb_device(IOHIDDeviceRef dev)
+{
+ struct usb_list_struct *p;
+
+ do_run_loop();
+ for (p = usb_list; p; p = p->next) {
+ if (p->ref == dev) {
+ IOHIDDeviceClose(dev, kIOHIDOptionsTypeNone);
+ return;
+ }
+ }
+}
+
+static IOHIDDeviceRef iokit_teensy_reference = NULL;
+
+int teensy_open(void)
+{
+ teensy_close();
+ iokit_teensy_reference = open_usb_device(0x16C0, 0x0478);
+ if (iokit_teensy_reference) return 1;
+ return 0;
+}
+
+int teensy_write(void *buf, int len, double timeout)
+{
+ IOReturn ret;
+
+ // timeouts do not work on OS-X
+ // IOHIDDeviceSetReportWithCallback is not implemented
+ // even though Apple documents it with a code example!
+ // submitted to Apple on 22-sep-2009, problem ID 7245050
+ if (!iokit_teensy_reference) return 0;
+
+ double start = CFAbsoluteTimeGetCurrent();
+ while (CFAbsoluteTimeGetCurrent() - timeout < start) {
+ ret = IOHIDDeviceSetReport(iokit_teensy_reference,
+ kIOHIDReportTypeOutput, 0, buf, len);
+ if (ret == kIOReturnSuccess) return 1;
+ usleep(10000);
+ }
+
+ return 0;
+}
+
+void teensy_close(void)
+{
+ if (!iokit_teensy_reference) return;
+ close_usb_device(iokit_teensy_reference);
+ iokit_teensy_reference = NULL;
+}
+
+int hard_reboot(void)
+{
+ IOHIDDeviceRef rebootor;
+ IOReturn ret;
+
+ rebootor = open_usb_device(0x16C0, 0x0477);
+ if (!rebootor) return 0;
+ ret = IOHIDDeviceSetReport(rebootor,
+ kIOHIDReportTypeOutput, 0, (uint8_t *)("reboot"), 6);
+ close_usb_device(rebootor);
+ if (ret == kIOReturnSuccess) return 1;
+ return 0;
+}
+
+int soft_reboot(void)
+{
+ printf("Soft reboot is not implemented for OSX\n");
+ return 0;
+}
+
+#endif
+
+
+
+/****************************************************************/
+/* */
+/* USB Access - BSD's UHID driver */
+/* */
+/****************************************************************/
+
+#if defined(USE_UHID)
+
+// Thanks to Todd T Fries for help getting this working on OpenBSD
+// and to Chris Kuethe for the initial patch to use UHID.
+
+#include
+#include
+#include
+#include
+#ifndef USB_GET_DEVICEINFO
+#include
+#endif
+
+int open_usb_device(int vid, int pid)
+{
+ int r, fd;
+ DIR *dir;
+ struct dirent *d;
+ struct usb_device_info info;
+ char buf[256];
+
+ dir = opendir("/dev");
+ if (!dir) return -1;
+ while ((d = readdir(dir)) != NULL) {
+ if (strncmp(d->d_name, "uhid", 4) != 0) continue;
+ snprintf(buf, sizeof(buf), "/dev/%s", d->d_name);
+ fd = open(buf, O_RDWR);
+ if (fd < 0) continue;
+ r = ioctl(fd, USB_GET_DEVICEINFO, &info);
+ if (r < 0) {
+ // NetBSD: added in 2004
+ // OpenBSD: added November 23, 2009
+ // FreeBSD: missing (FreeBSD 8.0) - USE_LIBUSB works!
+ die("Error: your uhid driver does not support"
+ " USB_GET_DEVICEINFO, please upgrade!\n");
+ close(fd);
+ closedir(dir);
+ exit(1);
+ }
+ //printf("%s: v=%d, p=%d\n", buf, info.udi_vendorNo, info.udi_productNo);
+ if (info.udi_vendorNo == vid && info.udi_productNo == pid) {
+ closedir(dir);
+ return fd;
+ }
+ close(fd);
+ }
+ closedir(dir);
+ return -1;
+}
+
+static int uhid_teensy_fd = -1;
+
+int teensy_open(void)
+{
+ teensy_close();
+ uhid_teensy_fd = open_usb_device(0x16C0, 0x0478);
+ if (uhid_teensy_fd < 0) return 0;
+ return 1;
+}
+
+int teensy_write(void *buf, int len, double timeout)
+{
+ int r;
+
+ // TODO: imeplement timeout... how??
+ r = write(uhid_teensy_fd, buf, len);
+ if (r == len) return 1;
+ return 0;
+}
+
+void teensy_close(void)
+{
+ if (uhid_teensy_fd >= 0) {
+ close(uhid_teensy_fd);
+ uhid_teensy_fd = -1;
+ }
+}
+
+int hard_reboot(void)
+{
+ int r, rebootor_fd;
+
+ rebootor_fd = open_usb_device(0x16C0, 0x0477);
+ if (rebootor_fd < 0) return 0;
+ r = write(rebootor_fd, "reboot", 6);
+ delay(0.1);
+ close(rebootor_fd);
+ if (r == 6) return 1;
+ return 0;
+}
+
+int soft_reboot(void)
+{
+ printf("Soft reboot is not implemented for UHID\n");
+ return 0;
+}
+
+#endif
+
+
+
+/****************************************************************/
+/* */
+/* Read Intel Hex File */
+/* */
+/****************************************************************/
+
+// the maximum flash image size we can support
+// chips with larger memory may be used, but only this
+// much intel-hex data can be loaded into memory!
+#define MAX_MEMORY_SIZE 0x20000
+
+static unsigned char firmware_image[MAX_MEMORY_SIZE];
+static unsigned char firmware_mask[MAX_MEMORY_SIZE];
+static int end_record_seen=0;
+static int byte_count;
+static unsigned int extended_addr = 0;
+static int parse_hex_line(char *line);
+
+int read_intel_hex(const char *filename)
+{
+ FILE *fp;
+ int i, lineno=0;
+ char buf[1024];
+
+ byte_count = 0;
+ end_record_seen = 0;
+ for (i=0; i= MAX_MEMORY_SIZE) return 0;
+ ptr += 2;
+ sum = (len & 255) + ((addr >> 8) & 255) + (addr & 255) + (code & 255);
+ if (code != 0) {
+ if (code == 1) {
+ end_record_seen = 1;
+ return 1;
+ }
+ if (code == 2 && len == 2) {
+ if (!sscanf(ptr, "%04x", &i)) return 1;
+ ptr += 4;
+ sum += ((i >> 8) & 255) + (i & 255);
+ if (!sscanf(ptr, "%02x", &cksum)) return 1;
+ if (((sum & 255) + (cksum & 255)) & 255) return 1;
+ extended_addr = i << 4;
+ //printf("ext addr = %05X\n", extended_addr);
+ }
+ if (code == 4 && len == 2) {
+ if (!sscanf(ptr, "%04x", &i)) return 1;
+ ptr += 4;
+ sum += ((i >> 8) & 255) + (i & 255);
+ if (!sscanf(ptr, "%02x", &cksum)) return 1;
+ if (((sum & 255) + (cksum & 255)) & 255) return 1;
+ extended_addr = i << 16;
+ //printf("ext addr = %08X\n", extended_addr);
+ }
+ return 1; // non-data line
+ }
+ byte_count += len;
+ while (num != len) {
+ if (sscanf(ptr, "%02x", &i) != 1) return 0;
+ i &= 255;
+ firmware_image[addr + extended_addr + num] = i;
+ firmware_mask[addr + extended_addr + num] = 1;
+ ptr += 2;
+ sum += i;
+ (num)++;
+ if (num >= 256) return 0;
+ }
+ if (!sscanf(ptr, "%02x", &cksum)) return 0;
+ if (((sum & 255) + (cksum & 255)) & 255) return 0; /* checksum error */
+ return 1;
+}
+
+int ihex_bytes_within_range(int begin, int end)
+{
+ int i;
+
+ if (begin < 0 || begin >= MAX_MEMORY_SIZE ||
+ end < 0 || end >= MAX_MEMORY_SIZE) {
+ return 0;
+ }
+ for (i=begin; i<=end; i++) {
+ if (firmware_mask[i]) return 1;
+ }
+ return 0;
+}
+
+void ihex_get_data(int addr, int len, unsigned char *bytes)
+{
+ int i;
+
+ if (addr < 0 || len < 0 || addr + len >= MAX_MEMORY_SIZE) {
+ for (i=0; i MAX_MEMORY_SIZE) return 1;
+
+ while (block_size && addr < MAX_MEMORY_SIZE) {
+ if (firmware_mask[addr] && firmware_image[addr] != 255) return 0;
+ addr++;
+ block_size--;
+ }
+ return 1;
+}
+
+
+
+
+/****************************************************************/
+/* */
+/* Misc Functions */
+/* */
+/****************************************************************/
+
+int printf_verbose(const char *format, ...)
+{
+ va_list ap;
+ int r;
+
+ va_start(ap, format);
+ if (verbose) {
+ r = vprintf(format, ap);
+ fflush(stdout);
+ return r;
+ }
+ return 0;
+}
+
+void delay(double seconds)
+{
+ #ifdef WIN32
+ Sleep(seconds * 1000.0);
+ #else
+ usleep(seconds * 1000000.0);
+ #endif
+}
+
+void die(const char *str, ...)
+{
+ va_list ap;
+
+ va_start(ap, str);
+ vfprintf(stderr, str, ap);
+ fprintf(stderr, "\n");
+ exit(1);
+}
+
+#if defined(WIN32)
+#define strcasecmp stricmp
+#endif
+
+
+static const struct {
+ const char *name;
+ int code_size;
+ int block_size;
+} MCUs[] = {
+ {"at90usb162", 15872, 128},
+ {"atmega32u4", 32256, 128},
+ {"at90usb646", 64512, 256},
+ {"at90usb1286", 130048, 256},
+#if defined(USE_LIBUSB) || defined(USE_APPLE_IOKIT)
+ {"mkl26z64", 63488, 512},
+ {"mk20dx128", 131072, 1024},
+ {"mk20dx256", 262144, 1024},
+#endif
+ {NULL, 0, 0},
+};
+
+
+void list_mcus()
+{
+ int i;
+ printf("Supported MCUs are:\n");
+ for(i=0; MCUs[i].name != NULL; i++)
+ printf(" - %s\n", MCUs[i].name);
+ exit(1);
+}
+
+
+void read_mcu(char *name)
+{
+ int i;
+
+ if(name == NULL) {
+ fprintf(stderr, "No MCU specified.\n");
+ list_mcus();
+ }
+
+ for(i=0; MCUs[i].name != NULL; i++) {
+ if(strcasecmp(name, MCUs[i].name) == 0) {
+ code_size = MCUs[i].code_size;
+ block_size = MCUs[i].block_size;
+ return;
+ }
+ }
+
+ fprintf(stderr, "Unknown MCU type \"%s\"\n", name);
+ list_mcus();
+}
+
+
+void parse_flag(char *arg)
+{
+ int i;
+ for(i=1; arg[i]; i++) {
+ switch(arg[i]) {
+ case 'w': wait_for_device_to_appear = 1; break;
+ case 'r': hard_reboot_device = 1; break;
+ case 's': soft_reboot_device = 1; break;
+ case 'n': reboot_after_programming = 0; break;
+ case 'v': verbose = 1; break;
+ case 'b': boot_only = 1; break;
+ default:
+ fprintf(stderr, "Unknown flag '%c'\n\n", arg[i]);
+ usage(NULL);
+ }
+ }
+}
+
+
+void parse_options(int argc, char **argv)
+{
+ int i;
+ char *arg;
+
+ for (i=1; i