diff --git a/.gitignore b/.gitignore index a5575c7..e379011 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ obj/ .cache .build .config.old +.gdb_history build.log include diff --git a/Makefile b/Makefile index f2a0af3..3e96b95 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ else CFLAGS := $(CFLAGS) -lX11 endif -TARGETS := pm3-lvgl cvend_test audio_test +TARGETS := pm3-lvgl cvend_test cvend_decode audio_test EXES := $(patsubst %,bin/%,$(TARGETS)) SRCS := $(shell find src inc -type f -iname '*.c') OBJS := $(patsubst src/%.c,obj/%.o,$(patsubst inc/%.c,obj/lib/%.o,$(SRCS))) diff --git a/assets/hop_success.aup3 b/assets/hop_success.aup3 index c18e280..39e29a4 100644 Binary files a/assets/hop_success.aup3 and b/assets/hop_success.aup3 differ diff --git a/assets/hop_success.aup3-shm b/assets/hop_success.aup3-shm deleted file mode 100644 index d1ed0ec..0000000 Binary files a/assets/hop_success.aup3-shm and /dev/null differ diff --git a/assets/hop_success.aup3-wal b/assets/hop_success.aup3-wal deleted file mode 100644 index e778988..0000000 Binary files a/assets/hop_success.aup3-wal and /dev/null differ diff --git a/extra/README.md b/extra/README.md new file mode 100644 index 0000000..1392dcb --- /dev/null +++ b/extra/README.md @@ -0,0 +1,3 @@ +These are pulled from the pm3 wiki. + + diff --git a/extra/startup-host.bin b/extra/startup-host.bin new file mode 100644 index 0000000..ca5a8c0 Binary files /dev/null and b/extra/startup-host.bin differ diff --git a/extra/startup-host.hex b/extra/startup-host.hex new file mode 100644 index 0000000..11ccb9b --- /dev/null +++ b/extra/startup-host.hex @@ -0,0 +1,142 @@ +0x00 +0x00 +0xBC +0x01 +0x00 +0xEA +0x00 +0x02 +0xA6 +0x01 +0x00 +0x41 +0xDC +0x3D +0xA7 +0xBC +0x02 +0x00 +0x02 +0x00 +0x00 +0xB6 +0xBC +0x03 +0x00 +0xE4 +0x00 +0x04 +0x0C +0x00 +0x05 +0x01 +0x01 +0xDF +0xE3 +0x6C +0xB6 +0xBC +0x04 +0x00 +0xE4 +0x00 +0x04 +0x5D +0x00 +0x07 +0x01 +0x01 +0xB1 +0x37 +0xE8 +0xB5 +0xBC +0x05 +0x00 +0xE4 +0x00 +0x04 +0x90 +0x00 +0x0A +0x01 +0x01 +0xE2 +0xA4 +0x30 +0xBD +0xBC +0x06 +0x00 +0xAA +0x00 +0x04 +0x1B +0x69 +0xA2 +0x95 +0x6C +0x48 +0x42 +0x5B +0x0A +0xBC +0x07 +0x00 +0xE8 +0x00 +0x05 +0xF6 +0x04 +0xFE +0x0A +0x00 +0x00 +0x60 +0x4A +0x73 +0xA7 +0xBC +0x08 +0x00 +0x02 +0x00 +0x00 +0x0B +0xBC +0x09 +0x00 +0x98 +0x00 +0x1A +0x67 +0x00 +0x12 +0x2F +0x68 +0x6F +0x6D +0x65 +0x2F +0x61 +0x70 +0x70 +0x30 +0x2F +0x76 +0x65 +0x72 +0x73 +0x69 +0x6F +0x6E +0x00 +0x00 +0x00 +0x00 +0x00 +0x64 +0xF8 +0x78 +0x80 +0x2B diff --git a/extra/startup-reader.bin b/extra/startup-reader.bin new file mode 100644 index 0000000..00dc233 Binary files /dev/null and b/extra/startup-reader.bin differ diff --git a/extra/startup-reader.hex b/extra/startup-reader.hex new file mode 100644 index 0000000..94e9e1b --- /dev/null +++ b/extra/startup-reader.hex @@ -0,0 +1,4483 @@ +0x00 +0x00 +0x02 +0x01 +0x00 +0x09 +0x01 +0xFC +0x2A +0xB8 +0x50 +0xBC +0x01 +0x00 +0xED +0x00 +0x4E +0x39 +0x01 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x49 +0x4E +0x49 +0x54 +0x20 +0x46 +0x45 +0x49 +0x47 +0x20 +0x63 +0x56 +0x45 +0x4E +0x44 +0x20 +0x41 +0x70 +0x70 +0x6C +0x69 +0x63 +0x61 +0x74 +0x69 +0x6F +0x6E +0x2C +0x20 +0x56 +0x65 +0x72 +0x73 +0x69 +0x6F +0x6E +0x20 +0x30 +0x32 +0x2E +0x33 +0x35 +0x20 +0x28 +0x65 +0x35 +0x30 +0x62 +0x39 +0x32 +0x31 +0x30 +0x29 +0x20 +0x5B +0x6D +0x61 +0x69 +0x6E +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x34 +0x5D +0x00 +0xEB +0xAB +0xA1 +0x51 +0xBC +0x02 +0x00 +0xED +0x00 +0x61 +0x15 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x30 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x74 +0xFA +0x86 +0x87 +0xBC +0x03 +0x00 +0xED +0x00 +0x61 +0xD8 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x31 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x9C +0x21 +0x7D +0x3E +0xBC +0x04 +0x00 +0xED +0x00 +0x61 +0x89 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x32 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0xE5 +0x4B +0x00 +0x2F +0xBC +0x05 +0x00 +0xED +0x00 +0x61 +0x44 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x33 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x0D +0x90 +0xFB +0x96 +0xBC +0x06 +0x00 +0xED +0x00 +0x61 +0x0A +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x34 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x17 +0x9F +0xFA +0x0D +0xBC +0x07 +0x00 +0xED +0x00 +0x40 +0xBA +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x46 +0x61 +0x69 +0x6C +0x65 +0x64 +0x20 +0x74 +0x6F +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x65 +0x20 +0x73 +0x61 +0x6D +0x20 +0x73 +0x6C +0x6F +0x74 +0x20 +0x30 +0x20 +0x5B +0x53 +0x61 +0x6D +0x43 +0x74 +0x72 +0x6C +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x36 +0x5D +0x00 +0x0A +0x21 +0x3D +0x63 +0xBC +0x08 +0x00 +0xED +0x00 +0x61 +0xA8 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x30 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x74 +0xFA +0x86 +0x87 +0xBC +0x09 +0x00 +0xED +0x00 +0x61 +0x65 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x31 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x9C +0x21 +0x7D +0x3E +0xBC +0x0A +0x00 +0xED +0x00 +0x61 +0x2B +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x33 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x32 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0xE5 +0x4B +0x00 +0x2F +0xBC +0x0B +0x00 +0xED +0x00 +0x61 +0xE6 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x33 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0xF4 +0x96 +0x3F +0x71 +0xBC +0x0C +0x00 +0xED +0x00 +0x61 +0xB7 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x34 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0xEE +0x99 +0x3E +0xEA +0xBC +0x0D +0x00 +0xED +0x00 +0x40 +0x07 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x46 +0x61 +0x69 +0x6C +0x65 +0x64 +0x20 +0x74 +0x6F +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x65 +0x20 +0x73 +0x61 +0x6D +0x20 +0x73 +0x6C +0x6F +0x74 +0x20 +0x31 +0x20 +0x5B +0x53 +0x61 +0x6D +0x43 +0x74 +0x72 +0x6C +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x36 +0x5D +0x00 +0x77 +0xDA +0x34 +0xE4 +0xBC +0x0E +0x00 +0xED +0x00 +0x61 +0x34 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x30 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x8D +0xFC +0x42 +0x60 +0xBC +0x0F +0x00 +0xED +0x00 +0x61 +0xF9 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x31 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x65 +0x27 +0xB9 +0xD9 +0xBC +0x10 +0x00 +0xED +0x00 +0x61 +0xEA +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x32 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x1C +0x4D +0xC4 +0xC8 +0xBC +0x11 +0x00 +0xED +0x00 +0x61 +0x27 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x33 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0xF4 +0x96 +0x3F +0x71 +0xBC +0x12 +0x00 +0xED +0x00 +0x61 +0x69 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x34 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0xEE +0x99 +0x3E +0xEA +0xBC +0x13 +0x00 +0xED +0x00 +0x40 +0xD9 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x46 +0x61 +0x69 +0x6C +0x65 +0x64 +0x20 +0x74 +0x6F +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x65 +0x20 +0x73 +0x61 +0x6D +0x20 +0x73 +0x6C +0x6F +0x74 +0x20 +0x32 +0x20 +0x5B +0x53 +0x61 +0x6D +0x43 +0x74 +0x72 +0x6C +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x36 +0x5D +0x00 +0xDE +0x5C +0x62 +0x47 +0xBC +0x14 +0x00 +0xED +0x00 +0x61 +0xF5 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x30 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x8D +0xFC +0x42 +0x60 +0xBC +0x15 +0x00 +0xED +0x00 +0x61 +0x38 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x31 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x65 +0x27 +0xB9 +0xD9 +0xBC +0x16 +0x00 +0xED +0x00 +0x61 +0x76 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x32 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0x1C +0x4D +0xC4 +0xC8 +0xBC +0x17 +0x00 +0xED +0x00 +0x61 +0xBB +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x33 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0xF4 +0x96 +0x3F +0x71 +0xBC +0x18 +0x00 +0xED +0x00 +0x61 +0xD4 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x69 +0x6E +0x67 +0x20 +0x53 +0x41 +0x4D +0x3A +0x20 +0x72 +0x65 +0x74 +0x20 +0x2D +0x31 +0x2C +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x30 +0x78 +0x32 +0x35 +0x63 +0x20 +0x55 +0x6E +0x6B +0x6E +0x6F +0x77 +0x6E +0x20 +0x65 +0x72 +0x72 +0x6F +0x72 +0x20 +0x36 +0x30 +0x34 +0x2C +0x20 +0x74 +0x72 +0x79 +0x20 +0x34 +0x20 +0x5B +0x53 +0x41 +0x4D +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x33 +0x5D +0x00 +0xEE +0x99 +0x3E +0xEA +0xBC +0x19 +0x00 +0xED +0x00 +0x40 +0x64 +0x03 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x34 +0x20 +0x45 +0x72 +0x72 +0x6F +0x72 +0x3A +0x20 +0x46 +0x61 +0x69 +0x6C +0x65 +0x64 +0x20 +0x74 +0x6F +0x20 +0x61 +0x63 +0x74 +0x69 +0x76 +0x61 +0x74 +0x65 +0x20 +0x73 +0x61 +0x6D +0x20 +0x73 +0x6C +0x6F +0x74 +0x20 +0x33 +0x20 +0x5B +0x53 +0x61 +0x6D +0x43 +0x74 +0x72 +0x6C +0x2E +0x63 +0x70 +0x70 +0x3A +0x35 +0x36 +0x5D +0x00 +0x86 +0xDC +0x80 +0x90 +0xBC +0x1A +0x00 +0x0F +0x00 +0x01 +0xBA +0x00 +0xBC +0x1B +0x00 +0x07 +0x00 +0x02 +0xB0 +0x00 +0x00 +0xBC +0x1C +0x00 +0xD1 +0x00 +0x3F +0x6A +0x05 +0xFF +0xFE +0xE0 +0x04 +0x39 +0xDF +0xFE +0xE0 +0x08 +0x01 +0x15 +0xDF +0xFE +0xE0 +0x09 +0x01 +0x02 +0xDF +0xFE +0xE0 +0x0A +0x03 +0x00 +0x00 +0x00 +0xDF +0xFE +0xE0 +0x0E +0x08 +0x00 +0x00 +0x00 +0x00 +0x00 +0x00 +0x00 +0x00 +0xDF +0xFE +0xE0 +0x0B +0x01 +0x00 +0xDF +0xFE +0xE0 +0x0C +0x06 +0x00 +0x00 +0x00 +0x00 +0x00 +0x00 +0xDF +0xFE +0xE0 +0x0D +0x02 +0x00 +0x00 +0x1C +0x57 +0xFE +0xDD +0xBC +0x1D +0x00 +0xED +0x00 +0x28 +0xDC +0x01 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x35 +0x20 +0x63 +0x6C +0x6F +0x73 +0x65 +0x64 +0x20 +0x73 +0x65 +0x72 +0x69 +0x61 +0x6C +0x20 +0x5B +0x53 +0x65 +0x72 +0x69 +0x61 +0x6C +0x2E +0x63 +0x70 +0x70 +0x3A +0x37 +0x37 +0x5D +0x00 +0xC8 +0x5C +0x49 +0x2C +0xBC +0x1E +0x02 +0x03 +0x00 +0x2A +0x1A +0x17 +0xF3 +0xA4 +0x11 +0x14 +0x63 +0x53 +0x30 +0x31 +0x2E +0x30 +0x35 +0x2E +0x34 +0x36 +0x2D +0x34 +0x39 +0x2E +0x30 +0x30 +0x2D +0x32 +0x2D +0x32 +0x05 +0x30 +0x32 +0x2E +0x33 +0x35 +0x0A +0x2F +0x68 +0x6F +0x6D +0x65 +0x2F +0x61 +0x70 +0x70 +0x30 +0xBC +0x1F +0x00 +0xED +0x00 +0x4F +0xB9 +0x01 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x35 +0x20 +0x45 +0x6E +0x61 +0x62 +0x6C +0x69 +0x6E +0x67 +0x20 +0x70 +0x72 +0x6F +0x78 +0x20 +0x68 +0x61 +0x6E +0x64 +0x6C +0x65 +0x72 +0x20 +0x27 +0x50 +0x72 +0x6F +0x78 +0x43 +0x61 +0x72 +0x64 +0x4D +0x69 +0x66 +0x61 +0x72 +0x65 +0x43 +0x6C +0x61 +0x73 +0x73 +0x69 +0x63 +0x27 +0x20 +0x5B +0x50 +0x72 +0x6F +0x78 +0x43 +0x61 +0x72 +0x64 +0x43 +0x74 +0x72 +0x6C +0x2E +0x63 +0x70 +0x70 +0x3A +0x31 +0x31 +0x30 +0x5D +0x00 +0x50 +0x7A +0xB2 +0xAB +0xBC +0x20 +0x03 +0xE5 +0x00 +0x04 +0x99 +0x00 +0x05 +0x00 +0x00 +0x08 +0xE2 +0x70 +0xD8 +0xBC +0x21 +0x00 +0xED +0x00 +0x49 +0x42 +0x01 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x35 +0x20 +0x45 +0x6E +0x61 +0x62 +0x6C +0x69 +0x6E +0x67 +0x20 +0x70 +0x72 +0x6F +0x78 +0x20 +0x68 +0x61 +0x6E +0x64 +0x6C +0x65 +0x72 +0x20 +0x27 +0x50 +0x72 +0x6F +0x78 +0x43 +0x61 +0x72 +0x64 +0x44 +0x65 +0x73 +0x66 +0x69 +0x72 +0x65 +0x27 +0x20 +0x5B +0x50 +0x72 +0x6F +0x78 +0x43 +0x61 +0x72 +0x64 +0x43 +0x74 +0x72 +0x6C +0x2E +0x63 +0x70 +0x70 +0x3A +0x31 +0x31 +0x30 +0x5D +0x00 +0x23 +0x60 +0x87 +0x28 +0xBC +0x22 +0x04 +0xE5 +0x00 +0x04 +0x9C +0x00 +0x07 +0x00 +0x00 +0x66 +0x36 +0xF4 +0xDB +0xBC +0x23 +0x05 +0xE5 +0x00 +0x04 +0xDE +0x00 +0x0A +0x00 +0x00 +0x35 +0xA5 +0x2C +0xD3 +0xBC +0x24 +0x00 +0xD1 +0x00 +0x3F +0xD0 +0x05 +0xFF +0xFE +0xE0 +0x04 +0x39 +0xDF +0xFE +0xE0 +0x08 +0x01 +0x15 +0xDF +0xFE +0xE0 +0x09 +0x01 +0x02 +0xDF +0xFE +0xE0 +0x0A +0x03 +0x00 +0x00 +0x00 +0xDF +0xFE +0xE0 +0x0E +0x08 +0x00 +0x00 +0x00 +0x00 +0x00 +0x00 +0x00 +0x00 +0xDF +0xFE +0xE0 +0x0B +0x01 +0x00 +0xDF +0xFE +0xE0 +0x0C +0x06 +0x00 +0x00 +0x00 +0x00 +0x00 +0x00 +0xDF +0xFE +0xE0 +0x0D +0x02 +0x00 +0x00 +0x1C +0x57 +0xFE +0xDD +0xBC +0x25 +0x00 +0xED +0x00 +0x4D +0x3C +0x01 +0x30 +0x37 +0x3A +0x32 +0x31 +0x3A +0x30 +0x36 +0x20 +0x45 +0x6E +0x61 +0x62 +0x6C +0x69 +0x6E +0x67 +0x20 +0x70 +0x72 +0x6F +0x78 +0x20 +0x68 +0x61 +0x6E +0x64 +0x6C +0x65 +0x72 +0x20 +0x27 +0x50 +0x72 +0x6F +0x78 +0x43 +0x61 +0x72 +0x64 +0x55 +0x6C +0x74 +0x72 +0x61 +0x6C +0x69 +0x67 +0x68 +0x74 +0x43 +0x27 +0x20 +0x5B +0x50 +0x72 +0x6F +0x78 +0x43 +0x61 +0x72 +0x64 +0x43 +0x74 +0x72 +0x6C +0x2E +0x63 +0x70 +0x70 +0x3A +0x31 +0x31 +0x30 +0x5D +0x00 +0x5D +0x93 +0xCD +0x42 +0xBC +0x26 +0x06 +0xAB +0x00 +0x02 +0x9C +0x00 +0x00 +0x00 +0xED +0x26 +0xBE +0xBC +0x27 +0x07 +0xE9 +0x04 +0x74 +0xBE +0x04 +0x00 +0x30 +0x82 +0x04 +0x6E +0x30 +0x82 +0x03 +0x56 +0xA0 +0x03 +0x02 +0x01 +0x02 +0x02 +0x08 +0x0F +0xF7 +0x26 +0x0F +0xC2 +0x36 +0x99 +0x4A +0x30 +0x0D +0x06 +0x09 +0x2A +0x86 +0x48 +0x86 +0xF7 +0x0D +0x01 +0x01 +0x0B +0x05 +0x00 +0x30 +0x81 +0x89 +0x31 +0x0B +0x30 +0x09 +0x06 +0x03 +0x55 +0x04 +0x06 +0x13 +0x02 +0x44 +0x45 +0x31 +0x0E +0x30 +0x0C +0x06 +0x03 +0x55 +0x04 +0x08 +0x13 +0x05 +0x48 +0x65 +0x73 +0x73 +0x65 +0x31 +0x1D +0x30 +0x1B +0x06 +0x03 +0x55 +0x04 +0x0A +0x13 +0x14 +0x46 +0x45 +0x49 +0x47 +0x20 +0x45 +0x4C +0x45 +0x43 +0x54 +0x52 +0x4F +0x4E +0x49 +0x43 +0x20 +0x47 +0x6D +0x62 +0x48 +0x31 +0x10 +0x30 +0x0E +0x06 +0x03 +0x55 +0x04 +0x0B +0x13 +0x07 +0x50 +0x41 +0x59 +0x4D +0x45 +0x4E +0x54 +0x31 +0x26 +0x30 +0x24 +0x06 +0x03 +0x55 +0x04 +0x03 +0x13 +0x1D +0x46 +0x45 +0x49 +0x47 +0x20 +0x50 +0x72 +0x6F +0x64 +0x75 +0x63 +0x74 +0x69 +0x6F +0x6E +0x20 +0x54 +0x65 +0x72 +0x6D +0x69 +0x6E +0x61 +0x6C +0x20 +0x43 +0x41 +0x20 +0x32 +0x31 +0x11 +0x30 +0x0F +0x06 +0x03 +0x55 +0x04 +0x07 +0x13 +0x08 +0x57 +0x65 +0x69 +0x6C +0x62 +0x75 +0x72 +0x67 +0x30 +0x1E +0x17 +0x0D +0x32 +0x31 +0x30 +0x34 +0x32 +0x32 +0x30 +0x30 +0x30 +0x30 +0x30 +0x30 +0x5A +0x17 +0x0D +0x33 +0x31 +0x30 +0x34 +0x32 +0x30 +0x30 +0x30 +0x30 +0x30 +0x30 +0x30 +0x5A +0x30 +0x81 +0x81 +0x31 +0x30 +0x30 +0x2E +0x06 +0x03 +0x55 +0x04 +0x03 +0x0C +0x27 +0x44 +0x45 +0x56 +0x49 +0x43 +0x45 +0x20 +0x49 +0x44 +0x20 +0x31 +0x37 +0x46 +0x33 +0x41 +0x34 +0x31 +0x31 +0x20 +0x43 +0x43 +0x20 +0x34 +0x39 +0x20 +0x4B +0x45 +0x59 +0x20 +0x45 +0x4E +0x43 +0x52 +0x59 +0x50 +0x54 +0x49 +0x4F +0x4E +0x31 +0x1D +0x30 +0x1B +0x06 +0x03 +0x55 +0x04 +0x0A +0x0C +0x14 +0x46 +0x45 +0x49 +0x47 +0x20 +0x45 +0x4C +0x45 +0x43 +0x54 +0x52 +0x4F +0x4E +0x49 +0x43 +0x20 +0x47 +0x6D +0x62 +0x48 +0x31 +0x0B +0x30 +0x09 +0x06 +0x03 +0x55 +0x04 +0x06 +0x13 +0x02 +0x44 +0x45 +0x31 +0x0E +0x30 +0x0C +0x06 +0x03 +0x55 +0x04 +0x08 +0x0C +0x05 +0x48 +0x65 +0x73 +0x73 +0x65 +0x31 +0x11 +0x30 +0x0F +0x06 +0x03 +0x55 +0x04 +0x07 +0x0C +0x08 +0x57 +0x65 +0x69 +0x6C +0x62 +0x75 +0x72 +0x67 +0x30 +0x82 +0x01 +0xA2 +0x30 +0x0D +0x06 +0x09 +0x2A +0x86 +0x48 +0x86 +0xF7 +0x0D +0x01 +0x01 +0x01 +0x05 +0x00 +0x03 +0x82 +0x01 +0x8F +0x00 +0x30 +0x82 +0x01 +0x8A +0x02 +0x82 +0x01 +0x81 +0x00 +0xB3 +0x3A +0x86 +0x62 +0x13 +0x19 +0xBB +0xBB +0x8B +0x1F +0xF3 +0x09 +0xCD +0x97 +0x19 +0x6A +0x03 +0xE9 +0xA6 +0x1C +0x3B +0x29 +0xCF +0x00 +0x22 +0x73 +0xB0 +0x60 +0x15 +0xB6 +0x95 +0x86 +0x42 +0xEE +0xE1 +0x9B +0xE4 +0xF0 +0x2F +0xF0 +0x4A +0x2F +0xE6 +0x51 +0x66 +0xE5 +0x01 +0x68 +0xA1 +0x5E +0x3D +0xD8 +0x30 +0x2A +0x4A +0x0E +0xC8 +0xD8 +0xB1 +0x24 +0x9F +0xA6 +0x1A +0x85 +0xE2 +0xD4 +0x46 +0x5D +0x6C +0x1B +0x32 +0xB4 +0x64 +0x15 +0x42 +0x94 +0x6E +0xF6 +0xBF +0x0E +0x15 +0xBF +0x06 +0x08 +0x65 +0x53 +0x5C +0xF8 +0x6C +0xD0 +0xC3 +0x8A +0x96 +0x74 +0x13 +0xC4 +0xED +0xCA +0x31 +0x2B +0xD3 +0x62 +0x5F +0x95 +0xB0 +0xC6 +0x9A +0xC7 +0xDA +0xEB +0x9F +0xC2 +0x35 +0x82 +0x68 +0xC8 +0x92 +0xC0 +0xC2 +0xE6 +0x9C +0xCC +0x7E +0x1F +0xF3 +0xED +0x4B +0xC9 +0x79 +0x76 +0x80 +0x6D +0x0F +0x64 +0xCE +0xD9 +0xEE +0x9F +0x51 +0x02 +0xED +0x13 +0x36 +0xF3 +0xDC +0xED +0xD8 +0x8F +0x38 +0x89 +0xBC +0xFC +0x2E +0x30 +0x3A +0xBB +0xB8 +0xEB +0xA3 +0xA4 +0x85 +0xC4 +0x52 +0xDA +0x36 +0x50 +0xD7 +0x7E +0x69 +0x38 +0x8D +0xD7 +0x02 +0x2F +0xD7 +0xFB +0xD6 +0xFC +0xA0 +0x61 +0xF5 +0x71 +0xCC +0x25 +0x06 +0x64 +0x41 +0x14 +0x69 +0x00 +0x72 +0x28 +0xB9 +0x36 +0xED +0x25 +0x34 +0x81 +0x67 +0x94 +0x89 +0x0C +0xB4 +0x1F +0xA1 +0x2F +0xC3 +0x79 +0x9A +0xA8 +0x14 +0x12 +0x7B +0xB5 +0x75 +0xA4 +0x12 +0x34 +0x2F +0xF8 +0x23 +0x54 +0x54 +0xD1 +0x1A +0xD5 +0x83 +0x79 +0x47 +0xB5 +0x0E +0x79 +0x92 +0x60 +0xC9 +0xFE +0x0F +0xAA +0x15 +0x68 +0xC7 +0x9E +0xF2 +0xD9 +0xD4 +0x7C +0x1F +0xB1 +0xF8 +0x67 +0x62 +0x86 +0xDE +0xF7 +0x9A +0xA2 +0x5F +0x9D +0x3F +0xD4 +0x74 +0x5B +0x13 +0x16 +0x3D +0xC9 +0xB9 +0xF0 +0x8C +0x66 +0xDB +0x42 +0x8D +0xD3 +0xBC +0x63 +0xF6 +0xED +0xC8 +0xA9 +0xF6 +0x73 +0x72 +0x65 +0xA5 +0xB8 +0x1D +0x01 +0xA3 +0xA4 +0xCB +0xCA +0xD4 +0x5D +0x07 +0x37 +0xBD +0xCD +0xB6 +0x46 +0xAC +0xFA +0xEA +0x3B +0x9E +0x48 +0x72 +0x7B +0xD5 +0x84 +0xCC +0x5C +0x33 +0x5D +0xA6 +0x56 +0xC6 +0x84 +0x57 +0x73 +0x6B +0xA3 +0x47 +0xDA +0x46 +0xAA +0x71 +0x18 +0x11 +0x80 +0x31 +0xF7 +0xF8 +0x25 +0x73 +0x85 +0x7E +0x9F +0x62 +0xE5 +0xCC +0xAF +0xC2 +0x49 +0x19 +0x99 +0xB8 +0x88 +0x55 +0x8E +0x39 +0x59 +0xA7 +0xD6 +0xE4 +0x45 +0xB5 +0x87 +0xD3 +0x60 +0x6C +0xAF +0xB1 +0x66 +0xE8 +0x33 +0x99 +0xA1 +0x52 +0x80 +0x67 +0x9F +0xBA +0x75 +0x0E +0x05 +0x75 +0x70 +0x8A +0x9A +0x31 +0x30 +0x16 +0xDF +0x02 +0x03 +0x01 +0x00 +0x01 +0xA3 +0x60 +0x30 +0x5E +0x30 +0x1D +0x06 +0x03 +0x55 +0x1D +0x0E +0x04 +0x16 +0x04 +0x14 +0x25 +0xBD +0x51 +0xC1 +0x2F +0xF6 +0x13 +0x98 +0xEE +0x47 +0xF3 +0x71 +0x5F +0x4F +0xD8 +0xEE +0x76 +0xAE +0x05 +0x36 +0x30 +0x1F +0x06 +0x03 +0x55 +0x1D +0x23 +0x04 +0x18 +0x30 +0x16 +0x80 +0x14 +0xC8 +0xB9 +0xE3 +0x9C +0x34 +0xFF +0x43 +0xFE +0x2C +0x2E +0x78 +0xB8 +0x76 +0x02 +0x06 +0xA1 +0xB1 +0x7A +0x0B +0x82 +0x30 +0x0C +0x06 +0x03 +0x55 +0x1D +0x13 +0x01 +0x01 +0xFF +0x04 +0x02 +0x30 +0x00 +0x30 +0x0E +0x06 +0x03 +0x55 +0x1D +0x0F +0x01 +0x01 +0xFF +0x04 +0x04 +0x03 +0x02 +0x05 +0x20 +0x30 +0x0D +0x06 +0x09 +0x2A +0x86 +0x48 +0x86 +0xF7 +0x0D +0x01 +0x01 +0x0B +0x05 +0x00 +0x03 +0x82 +0x01 +0x01 +0x00 +0x34 +0xA0 +0x41 +0x8A +0xD7 +0xAF +0xB1 +0xCA +0x2F +0x93 +0x67 +0x6E +0x58 +0x72 +0x32 +0x4B +0x2A +0xCF +0xE7 +0xDC +0x69 +0x41 +0xA9 +0xB8 +0x8A +0x1F +0xD5 +0x9A +0xEE +0x97 +0xE1 +0x26 +0xCD +0x92 +0x38 +0x6E +0x9C +0x49 +0x00 +0x7B +0xAF +0x64 +0x6D +0xC0 +0xC8 +0xDE +0xF3 +0x10 +0x11 +0x88 +0xA0 +0x3E +0x10 +0xAB +0xF5 +0x7C +0x39 +0xEC +0x2A +0xAA +0xB1 +0x93 +0x82 +0x09 +0x9A +0x6C +0x8E +0x93 +0x65 +0x08 +0x39 +0x2D +0x0A +0x57 +0xF7 +0xFF +0xCE +0x33 +0x75 +0xB8 +0xA3 +0x73 +0x4C +0xED +0xEC +0x70 +0xCB +0xAC +0x44 +0xD0 +0x2B +0x7A +0x19 +0x0F +0x2F +0x08 +0xD2 +0xE6 +0x13 +0xD3 +0x5C +0x50 +0x45 +0xE4 +0x88 +0xC1 +0x6B +0x61 +0xC4 +0xFD +0x92 +0xA3 +0xE2 +0x67 +0x05 +0xED +0x56 +0xE3 +0x9E +0x53 +0xEE +0x29 +0x9B +0xA9 +0xE6 +0xE4 +0x0A +0xC9 +0x00 +0xD1 +0x18 +0x26 +0x67 +0xDC +0xE2 +0x7E +0x62 +0xF4 +0xD3 +0x8F +0xBF +0xC3 +0x5F +0x11 +0x11 +0x1E +0xFC +0x2F +0xC0 +0xC4 +0x93 +0xBF +0xE7 +0x7D +0xB3 +0x13 +0xFB +0x59 +0xF1 +0x96 +0x25 +0x04 +0x21 +0x54 +0xB8 +0x32 +0x5B +0xDB +0x68 +0xAF +0xCB +0x3E +0x2A +0xBE +0xDD +0x55 +0x62 +0x02 +0xD9 +0xBF +0x38 +0x14 +0xCA +0x85 +0x95 +0x1E +0xF2 +0x67 +0xAB +0x44 +0xF1 +0xD8 +0x3A +0xD5 +0x8F +0x3F +0xDF +0x20 +0x66 +0x8D +0xC3 +0xE1 +0xF3 +0x4A +0x20 +0xE3 +0x73 +0x38 +0xCF +0x12 +0x1D +0x40 +0x6B +0xC3 +0x41 +0xFF +0xB8 +0xF2 +0xBC +0x29 +0x7A +0x74 +0x3F +0x37 +0xD7 +0xF6 +0xD6 +0x71 +0xC2 +0x3D +0xEB +0x0D +0x49 +0xB9 +0xA2 +0x33 +0x32 +0xFD +0x62 +0xE7 +0xE1 +0xE8 +0xDA +0x95 +0x2C +0xDF +0xC2 +0x77 +0xF4 +0x5D +0xCA +0xE3 +0x60 +0xD5 +0x0C +0x90 +0x7C +0x8B +0x1C +0x68 +0xBC +0x28 +0x08 +0x03 +0x00 +0x2A +0x19 +0x17 +0xF3 +0xA4 +0x11 +0x14 +0x63 +0x53 +0x30 +0x31 +0x2E +0x30 +0x35 +0x2E +0x34 +0x36 +0x2D +0x34 +0x39 +0x2E +0x30 +0x30 +0x2D +0x32 +0x2D +0x32 +0x05 +0x30 +0x32 +0x2E +0x33 +0x35 +0x0A +0x2F +0x68 +0x6F +0x6D +0x65 +0x2F +0x61 +0x70 +0x70 +0x30 +0xBC +0x29 +0x09 +0x99 +0x00 +0x0A +0x3A +0x00 +0x00 +0x00 +0x06 +0x30 +0x32 +0x2E +0x33 +0x35 +0x0A +0x94 +0xE6 +0x1A +0x84 +0xBC +0x2A +0x00 +0x07 +0x00 +0x02 +0xF9 +0x00 +0x00 +0xBC +0x2B +0x00 +0x07 +0x00 +0x02 +0x34 +0x00 +0x00 +0xBC +0x2C +0x00 +0x07 +0x00 +0x02 +0x65 +0x00 +0x00 +0xBC +0x2D +0x00 +0x07 +0x00 +0x02 +0xA8 +0x00 +0x00 +0xBC +0x2E +0x00 +0x07 +0x00 +0x02 +0xE6 +0x00 +0x00 +0xBC +0x2F +0x00 +0x07 +0x00 +0x02 +0x2B +0x00 +0x00 +0xBC +0x30 +0x00 +0x07 +0x00 +0x02 +0x38 +0x00 +0x00 +0xBC +0x31 +0x00 +0x07 +0x00 +0x02 +0xF5 +0x00 +0x00 +0xBC +0x32 +0x00 +0x07 +0x00 +0x02 +0xBB +0x00 +0x00 +0xBC +0x33 +0x00 +0x07 +0x00 +0x02 +0x76 +0x00 +0x00 +0xBC +0x34 +0x00 +0x07 +0x00 +0x02 +0x27 +0x00 +0x00 +0xBC +0x35 +0x00 +0x07 +0x00 +0x02 +0xEA +0x00 +0x00 +0xBC +0x36 +0x00 +0x07 +0x00 +0x02 +0xA4 +0x00 +0x00 diff --git a/inc/cvend.h b/inc/cvend.h index 5a58425..b940bb0 100644 --- a/inc/cvend.h +++ b/inc/cvend.h @@ -77,11 +77,14 @@ typedef struct cvend_packet { const char *stringify_msg_type(uint8_t msg_type); -void cvend_init(const char *path); -cvend_packet *cvend_read(); -cvend_packet *cvend_read_type(uint8_t msg_type); -void cvend_write(uint8_t msg_type, uint8_t *msg_data, uint16_t msg_len); +void cvend_init(); +void cvend_lock(); +void cvend_unlock(); +cvend_packet *cvend_read(FILE *file); +cvend_packet *cvend_read_type(FILE *file, uint8_t msg_type); +void cvend_write(FILE *file, uint8_t msg_type, uint8_t *msg_data, uint16_t msg_len); void cvend_free(cvend_packet *packet); void print_packet(cvend_packet *packet); +void print_packet_short(char *brief, cvend_packet *packet); #endif /* end of include guard: CVEND_H_WNGPTXM7 */ diff --git a/inc/nfc.h b/inc/nfc.h index 21babbc..abf590f 100644 --- a/inc/nfc.h +++ b/inc/nfc.h @@ -6,7 +6,7 @@ typedef void (*nfc_cb)(uint8_t status, uint8_t *version, uint16_t version_size, uint8_t *data, uint16_t data_size); -void nfc_init(const char *path); +void nfc_reset(const char *path); void *nfc_handle(void *data); #endif /* end of include guard: NFC_H_3196CYAP */ diff --git a/src/cvend.c b/src/cvend.c index 4685887..e39e96c 100644 --- a/src/cvend.c +++ b/src/cvend.c @@ -7,8 +7,6 @@ #include "crc32.h" #include "cvend.h" -const char *cvend_path; -FILE *file; pthread_mutex_t cvend_mutex = PTHREAD_MUTEX_INITIALIZER; int last_seq = 0; @@ -112,6 +110,14 @@ const char *stringify_msg_type(uint8_t msg_type) } } +void cvend_lock() { + pthread_mutex_lock(&cvend_mutex); +} + +void cvend_unlock() { + pthread_mutex_unlock(&cvend_mutex); +} + void calc_hdr_crc(cvend_packet *packet) { packet->magic = 0xbc; @@ -128,25 +134,23 @@ void calc_msg_crc(cvend_packet *packet) packet->msg_crc = 0; } -void cvend_init(const char *path) +void cvend_init() { - cvend_path = path; - file = fopen(path, "wb+"); } -cvend_packet *cvend_read() +cvend_packet *cvend_read(FILE *file) { - pthread_mutex_lock(&cvend_mutex); + cvend_lock(); uint8_t buf = 0x00; uint8_t res = 0; while (buf != 0xbc) { res = fread(&buf, 1, 1, file); if (res == 0) { - fclose(file); - file = fopen(cvend_path, "wb+"); + cvend_unlock(); + return NULL; } if (buf != 0xbc) { - printf("bad magic char: %x\n", buf); + printf("[WARN] bad magic char: %x\n", buf); } } @@ -159,35 +163,41 @@ cvend_packet *cvend_read() fread(&packet->hdr_crc, 1, 1, file); packet->msg_data = malloc(packet->msg_len); - fread(packet->msg_data, 1, packet->msg_len, file); + uint16_t read = fread(packet->msg_data, 1, packet->msg_len, file); + if (read < packet->msg_len) { + printf("[ERROR] bad packet length\n"); + cvend_free(packet); + return NULL; + } if (packet->msg_type & 0x80) fread(&packet->msg_crc, 1, 4, file); else packet->msg_crc = 0; - pthread_mutex_unlock(&cvend_mutex); + cvend_unlock(); if (packet->msg_type != MTYPE_HEARTBEAT) { - printf("RECEIVED:\n"); - print_packet(packet); + print_packet_short("received", packet); } return packet; } -cvend_packet *cvend_read_type(uint8_t msg_type) +cvend_packet *cvend_read_type(FILE *file, uint8_t msg_type) { cvend_packet *packet = NULL; do { if (packet) cvend_free(packet); - packet = cvend_read(); + packet = cvend_read(file); + if (!packet) + return NULL; } while (packet->msg_type != msg_type); return packet; } -void cvend_write(uint8_t msg_type, uint8_t *msg_data, +void cvend_write(FILE *file, uint8_t msg_type, uint8_t *msg_data, uint16_t msg_len) { - pthread_mutex_lock(&cvend_mutex); + cvend_lock(); cvend_packet packet; packet.seq = ++last_seq; packet.flags = 0; @@ -197,8 +207,7 @@ void cvend_write(uint8_t msg_type, uint8_t *msg_data, calc_hdr_crc(&packet); calc_msg_crc(&packet); - int res = fwrite(&packet.magic, 1, 1, file); - printf("wrote %i\n", res); + fwrite(&packet.magic, 1, 1, file); fwrite(&packet.seq, 1, 1, file); fwrite(&packet.flags, 1, 1, file); fwrite(&packet.msg_type, 1, 1, file); @@ -209,13 +218,14 @@ void cvend_write(uint8_t msg_type, uint8_t *msg_data, if (packet.msg_type & 0x80) fwrite(&packet.msg_crc, 1, 4, file); - pthread_mutex_unlock(&cvend_mutex); - printf("SENT:\n"); - print_packet(&packet); + cvend_unlock(); + print_packet_short("sent", &packet); } void cvend_free(cvend_packet *packet) { + if (!packet) + return; free(packet->msg_data); free(packet); } @@ -238,3 +248,18 @@ void print_packet(cvend_packet *packet) printf("\n"); printf("msg_crc = %u\n\n", packet->msg_crc); } + +void print_packet_short(char *brief, cvend_packet *packet) +{ + printf("[INFO] (cvend) %s: ", brief); + printf("%s ", stringify_msg_type(packet->msg_type)); + printf("(%02X)", packet->msg_type); + printf(", "); + if (packet->msg_type == MTYPE_LOG) { + printf("%s", packet->msg_data); + } else { + for (uint16_t i = 0; i < packet->msg_len; i++) + printf("%02x ", packet->msg_data[i]); + } + printf("\n"); +} diff --git a/src/cvend_decode.c b/src/cvend_decode.c new file mode 100644 index 0000000..3f30b21 --- /dev/null +++ b/src/cvend_decode.c @@ -0,0 +1,22 @@ +#include "cvend.h" + +int main(int argc, char *argv[]) +{ + const char *path = argc > 1 ? argv[1] : "extra/startup-reader.bin"; + FILE *file = fopen(path, "rb"); + + if (!file) { + printf("Failed to open %s\n", path); + return 1; + } + + cvend_init(); + + cvend_packet *packet = cvend_read(file); + while (packet) { + // print_packet(packet); + cvend_free(packet); + packet = cvend_read(file); + } + return 0; +} diff --git a/src/cvend_test.c b/src/cvend_test.c index 8609750..3c6eb4c 100644 --- a/src/cvend_test.c +++ b/src/cvend_test.c @@ -2,7 +2,7 @@ int main(int argc, char *argv[]) { - char *file = argc > 1 ? argv[1] : "/dev/ttymxc3"; + FILE *file = fopen(argc > 1 ? argv[1] : "/dev/ttymxc3", "wb+"); uint8_t desfire_enable[] = { 0x00, CTYPE_DESFIRE, 0x01, FUNC_ENABLE }; // uint8_t desfire_get_version[] = { 0x60 }; uint8_t desfire_select_application[] = { 0x5a, 0xF2, 0x10, 0xE0 }; @@ -10,28 +10,28 @@ int main(int argc, char *argv[]) uint8_t desfire_read[] = { 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t desfire_free[] = { 0x6e }; - cvend_init(file); - cvend_write(MTYPE_PROX_CARD_FUNCTION, desfire_enable, 4); + cvend_init(); + cvend_write(file, MTYPE_PROX_CARD_FUNCTION, desfire_enable, 4); while (1) { cvend_packet *packet; - packet = cvend_read(); + packet = cvend_read(file); // if (packet->msg_type != MTYPE_HEARTBEAT) print_packet(packet); if (packet->msg_type == MTYPE_DESFIRE_READ) { //cvend_write(MTYPE_DESFIRE_INTERACT, desfire_get_version, 1); - cvend_write(MTYPE_DESFIRE_COMMAND, desfire_select_application, 4); + cvend_write(file, MTYPE_DESFIRE_COMMAND, desfire_select_application, 4); cvend_packet *response; do { - response = cvend_read(); + response = cvend_read(file); } while (!response); print_packet(response); - cvend_write(MTYPE_DESFIRE_COMMAND, desfire_fid_list, 1); + cvend_write(file, MTYPE_DESFIRE_COMMAND, desfire_fid_list, 1); cvend_free(response); - cvend_write(MTYPE_DESFIRE_COMMAND, desfire_read, 8); - cvend_write(MTYPE_DESFIRE_COMMAND, desfire_free, 1); + cvend_write(file, MTYPE_DESFIRE_COMMAND, desfire_read, 8); + cvend_write(file, MTYPE_DESFIRE_COMMAND, desfire_free, 1); } cvend_free(packet); diff --git a/src/nfc.c b/src/nfc.c index d1291e0..ba7d02f 100644 --- a/src/nfc.c +++ b/src/nfc.c @@ -1,23 +1,68 @@ #include "cvend.h" #include +#include #include #include +#include #include "nfc.h" -void nfc_init(const char *path) +FILE *nfc_stream = NULL; +const char *nfc_path = NULL; + +void nfc_reset(const char *path) { uint8_t desfire_enable[] = { 0x00, CTYPE_DESFIRE, 0x01, FUNC_ENABLE }; + cvend_packet *packet; + struct pollfd stream_poll; - cvend_init(path); - cvend_write(MTYPE_PROX_CARD_FUNCTION, desfire_enable, 4); + if (nfc_stream) + fclose(nfc_stream); + nfc_stream = fopen(path, "wb+"); + + stream_poll.fd = fileno(nfc_stream); + stream_poll.events = POLLIN; + + cvend_init(); + printf("[INFO] checking for signs of life\n"); + cvend_write(nfc_stream, MTYPE_STATUS, NULL, 0); + int status = poll(&stream_poll, 1, 1); + if (status) { + printf("[INFO] buffer active, checking status\n"); + packet = cvend_read_type(nfc_stream, MTYPE_STATUS_REPLY); + if (!packet) { + printf("[ERROR] failed reading status\n"); + exit(1); + } + printf("[INFO] cvend seems to be working\n"); + cvend_free(packet); + } else { + printf("[INFO] waiting for startup\n"); + packet = cvend_read_type(nfc_stream, MTYPE_STARTUP); + if (!packet) { + printf("[ERROR] stream closed before startup\n"); + exit(1); + } + printf("[INFO] startup complete\n"); + cvend_free(packet); + } + + printf("[INFO] enabling desfire\n"); + cvend_write(nfc_stream, MTYPE_PROX_CARD_FUNCTION, desfire_enable, 4); + packet = cvend_read_type(nfc_stream, MTYPE_PROX_CARD_FUNCTION_REPLY); + if (!packet) { + printf("[ERROR] failed to start desfire\n"); + exit(1); + } + printf("[INFO] desfire enabled\n"); + cvend_free(packet); } void *nfc_heartbeat(void *data) { uint8_t heartbeat[2] = { 0x00, 0x00 }; while (1) { - cvend_write(MTYPE_STATUS, heartbeat, 2); - sleep(10); + cvend_write(nfc_stream, MTYPE_STATUS, heartbeat, 2); + sleep(1); } return NULL; } @@ -33,34 +78,50 @@ void *nfc_handle(void *data) uint8_t desfire_read[] = { 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; while (1) { - cvend_packet *packet = cvend_read(); + usleep(100); + cvend_packet *packet = cvend_read(nfc_stream); + cvend_packet *resp_version = NULL; + cvend_packet *resp_data = NULL; + + if (!packet) + goto reset; if (packet->msg_type != MTYPE_DESFIRE_READ) { - cvend_free(packet); - continue; + goto cleanup; } - cvend_free(packet); - cvend_write(MTYPE_DESFIRE_COMMAND, + cvend_write(nfc_stream, MTYPE_DESFIRE_COMMAND, desfire_select_application, 4); - cvend_free(cvend_read_type(MTYPE_DESFIRE_COMMAND_REPLY)); + cvend_free(cvend_read_type(nfc_stream, + MTYPE_DESFIRE_COMMAND_REPLY)); - cvend_write(MTYPE_DESFIRE_COMMAND, desfire_get_version, - 1); - cvend_packet *resp_version = - cvend_read_type(MTYPE_DESFIRE_COMMAND_REPLY); + cvend_write(nfc_stream, MTYPE_DESFIRE_COMMAND, + desfire_get_version, 1); + resp_version = cvend_read_type(nfc_stream, + MTYPE_DESFIRE_COMMAND_REPLY); + if (!resp_version) + goto reset; - if (resp_version->msg_len == 2 && resp_version->msg_data[1] == 0x6e) { - cvend_free(resp_version); - continue; - } + if (resp_version->msg_len == 2 && + resp_version->msg_data[1] == 0x6e) + goto cleanup; + + cvend_write(nfc_stream, MTYPE_DESFIRE_COMMAND, desfire_read, 8); + resp_data = cvend_read_type(nfc_stream, + MTYPE_DESFIRE_COMMAND_REPLY); + if (!resp_data) + goto reset; - cvend_write(MTYPE_DESFIRE_COMMAND, desfire_read, 8); - cvend_packet *resp_data = - cvend_read_type(MTYPE_DESFIRE_COMMAND_REPLY); callback(resp_data->msg_data[0], resp_version->msg_data, resp_version->msg_len, resp_data->msg_data, resp_version->msg_len); + goto cleanup; + +reset: + nfc_reset("/dev/ttymxc3"); + +cleanup: + cvend_free(packet); cvend_free(resp_version); cvend_free(resp_data); } diff --git a/src/pm3-lvgl.c b/src/pm3-lvgl.c index 3b95042..dc3092d 100644 --- a/src/pm3-lvgl.c +++ b/src/pm3-lvgl.c @@ -57,7 +57,7 @@ int main(int argc, char *argv[]) lv_linux_fbdev_set_file(display, "/dev/fb0"); pthread_t nfc_thread; - nfc_init("/dev/ttymxc3"); + nfc_reset("/dev/ttymxc3"); pthread_create(&nfc_thread, NULL, nfc_handle, read_card); #else display = lv_x11_window_create("LVGL X11 Simulation", 800, 480);