From a6bfc275308c9d9325374fe0948125320e6b89f4 Mon Sep 17 00:00:00 2001 From: YaBa Date: Tue, 26 Dec 2023 21:45:36 +0000 Subject: [PATCH 1/4] Added plugin to read WashCity card balance --- applications/main/nfc/application.fam | 9 + .../nfc/plugins/supported_cards/washcity.c | 200 ++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 applications/main/nfc/plugins/supported_cards/washcity.c diff --git a/applications/main/nfc/application.fam b/applications/main/nfc/application.fam index 1b999e37e..ecab91ab5 100644 --- a/applications/main/nfc/application.fam +++ b/applications/main/nfc/application.fam @@ -101,6 +101,15 @@ App( sources=["plugins/supported_cards/metromoney.c"], ) +App( + appid="washcity_parser", + apptype=FlipperAppType.PLUGIN, + entry_point="washcity_plugin_ep", + targets=["f7"], + requires=["nfc"], + sources=["plugins/supported_cards/washcity.c"], +) + App( appid="kazan_parser", apptype=FlipperAppType.PLUGIN, diff --git a/applications/main/nfc/plugins/supported_cards/washcity.c b/applications/main/nfc/plugins/supported_cards/washcity.c new file mode 100644 index 000000000..0ba66e8b7 --- /dev/null +++ b/applications/main/nfc/plugins/supported_cards/washcity.c @@ -0,0 +1,200 @@ +/* + * Parser for WashCity MarkItaly Card (Europe). + * + * Copyright 2023 Filipe Polido (YaBaPT) + * + * Based on MetroMoney by Leptoptilos + * + * 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 . + */ +#include "nfc_supported_card_plugin.h" + +#include "protocols/mf_classic/mf_classic.h" +#include + +#include +#include +#include +#include + +#define TAG "WashCity" + +typedef struct { + uint64_t a; + uint64_t b; +} MfClassicKeyPair; + +static const MfClassicKeyPair washcity_1k_keys[] = { + {.a = 0xA0A1A2A3A4A5, .b = 0x010155010100}, // Sector 00 + {.a = 0xC78A3D0E1BCD, .b = 0xFFFFFFFFFFFF}, // Sector 01 + {.a = 0xC78A3D0E0000, .b = 0xFFFFFFFFFFFF}, // Sector 02 + {.a = 0xC78A3D0E0000, .b = 0xFFFFFFFFFFFF}, // Sector 03 + {.a = 0xC78A3D0E0000, .b = 0xFFFFFFFFFFFF}, // Sector 04 + {.a = 0xC78A3D0E0000, .b = 0xFFFFFFFFFFFF}, // Sector 05 + {.a = 0xC78A3D0E0000, .b = 0xFFFFFFFFFFFF}, // Sector 06 + {.a = 0xC78A3D0E0000, .b = 0xFFFFFFFFFFFF}, // Sector 07 + {.a = 0xC78A3D0E0000, .b = 0xFFFFFFFFFFFF}, // Sector 08 + {.a = 0x010155010100, .b = 0xFFFFFFFFFFFF}, // Sector 09 + {.a = 0x010155010100, .b = 0xFFFFFFFFFFFF}, // Sector 10 + {.a = 0x010155010100, .b = 0xFFFFFFFFFFFF}, // Sector 11 + {.a = 0x010155010100, .b = 0xFFFFFFFFFFFF}, // Sector 12 + {.a = 0x010155010100, .b = 0xFFFFFFFFFFFF}, // Sector 13 + {.a = 0x010155010100, .b = 0xFFFFFFFFFFFF}, // Sector 14 + {.a = 0x010155010100, .b = 0xFFFFFFFFFFFF}, // Sector 15 +}; + +static bool washcity_verify(Nfc* nfc) { + bool verified = false; + + do { + const uint8_t ticket_sector_number = 0; + const uint8_t ticket_block_number = + mf_classic_get_first_block_num_of_sector(ticket_sector_number) + 1; + FURI_LOG_D(TAG, "Verifying sector %u", ticket_sector_number); + + MfClassicKey key = {0}; + nfc_util_num2bytes(washcity_1k_keys[ticket_sector_number].a, COUNT_OF(key.data), key.data); + + MfClassicAuthContext auth_context; + MfClassicError error = mf_classic_poller_sync_auth( + nfc, ticket_block_number, &key, MfClassicKeyTypeA, &auth_context); + if(error != MfClassicErrorNone) { + FURI_LOG_D(TAG, "Failed to read block %u: %d", ticket_block_number, error); + break; + } + + verified = true; + } while(false); + + return verified; +} + +static bool washcity_read(Nfc* nfc, NfcDevice* device) { + furi_assert(nfc); + furi_assert(device); + + bool is_read = false; + + MfClassicData* data = mf_classic_alloc(); + nfc_device_copy_data(device, NfcProtocolMfClassic, data); + + do { + MfClassicType type = MfClassicTypeMini; + MfClassicError error = mf_classic_poller_sync_detect_type(nfc, &type); + if(error != MfClassicErrorNone) break; + + data->type = type; + if(type != MfClassicType1k) break; + + MfClassicDeviceKeys keys = { + .key_a_mask = 0, + .key_b_mask = 0, + }; + for(size_t i = 0; i < mf_classic_get_total_sectors_num(data->type); i++) { + nfc_util_num2bytes(washcity_1k_keys[i].a, sizeof(MfClassicKey), keys.key_a[i].data); + FURI_BIT_SET(keys.key_a_mask, i); + nfc_util_num2bytes(washcity_1k_keys[i].b, sizeof(MfClassicKey), keys.key_b[i].data); + FURI_BIT_SET(keys.key_b_mask, i); + } + + error = mf_classic_poller_sync_read(nfc, &keys, data); + if(error != MfClassicErrorNone) { + FURI_LOG_W(TAG, "Failed to read data"); + break; + } + + nfc_device_set_data(device, NfcProtocolMfClassic, data); + + is_read = true; + } while(false); + + mf_classic_free(data); + + return is_read; +} + +static bool washcity_parse(const NfcDevice* device, FuriString* parsed_data) { + furi_assert(device); + + const MfClassicData* data = nfc_device_get_data(device, NfcProtocolMfClassic); + + bool parsed = false; + + do { + // Verify key + const uint8_t ticket_sector_number = 1; + const uint8_t ticket_block_number = 0; + + const MfClassicSectorTrailer* sec_tr = + mf_classic_get_sector_trailer_by_sector(data, ticket_sector_number); + + const uint64_t key = nfc_util_bytes2num(sec_tr->key_a.data, COUNT_OF(sec_tr->key_a.data)); + if(key != washcity_1k_keys[ticket_sector_number].a) break; + + // Parse data + const uint8_t start_block_num = + mf_classic_get_first_block_num_of_sector(ticket_sector_number); + + const uint8_t* block_start_ptr = + &data->block[start_block_num + ticket_block_number].data[0]; + + uint32_t balance = nfc_util_bytes2num(block_start_ptr+2, 2); + + uint32_t balance_eur = balance / 100; + uint8_t balance_cents = balance % 100; + + size_t uid_len = 0; + const uint8_t* uid = mf_classic_get_uid(data, &uid_len); + + // Card Number is printed in HEX (equal to UID) + char card_number[2 * uid_len + 1]; + + for(size_t i = 0; i < uid_len; ++i) { + card_number[2 * i] = "0123456789ABCDEF"[uid[i] >> 4]; + card_number[2 * i + 1] = "0123456789ABCDEF"[uid[i] & 0xF]; + } + + card_number[2 * uid_len] = '\0'; + + furi_string_printf( + parsed_data, + "\e#WashCity\nCard number: %s\nBalance: %lu.%02u EUR", + card_number, + balance_eur, + balancecentsi); + parsed = true; + } while(false); + + return parsed; +} + +/* Actual implementation of app<>plugin interface */ +static const NfcSupportedCardsPlugin washcity_plugin = { + .protocol = NfcProtocolMfClassic, + .verify = washcity_verify, + .read = washcity_read, + .parse = washcity_parse, +}; + +/* Plugin descriptor to comply with basic plugin specification */ +static const FlipperAppPluginDescriptor washcity_plugin_descriptor = { + .appid = NFC_SUPPORTED_CARD_PLUGIN_APP_ID, + .ep_api_version = NFC_SUPPORTED_CARD_PLUGIN_API_VERSION, + .entry_point = &washcity_plugin, +}; + +/* Plugin entry point - must return a pointer to const descriptor */ +const FlipperAppPluginDescriptor* washcity_plugin_ep() { + return &washcity_plugin_descriptor; +} \ No newline at end of file From ca62254ee7ed922fd195982ade1461a879a1f767 Mon Sep 17 00:00:00 2001 From: YaBa Date: Tue, 26 Dec 2023 23:19:48 +0000 Subject: [PATCH 2/4] Fixed clang format and typo in var balance_cents --- applications/main/nfc/plugins/supported_cards/washcity.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/applications/main/nfc/plugins/supported_cards/washcity.c b/applications/main/nfc/plugins/supported_cards/washcity.c index 0ba66e8b7..a0edeef6a 100644 --- a/applications/main/nfc/plugins/supported_cards/washcity.c +++ b/applications/main/nfc/plugins/supported_cards/washcity.c @@ -149,14 +149,14 @@ static bool washcity_parse(const NfcDevice* device, FuriString* parsed_data) { const uint8_t* block_start_ptr = &data->block[start_block_num + ticket_block_number].data[0]; - uint32_t balance = nfc_util_bytes2num(block_start_ptr+2, 2); + uint32_t balance = nfc_util_bytes2num(block_start_ptr + 2, 2); uint32_t balance_eur = balance / 100; uint8_t balance_cents = balance % 100; size_t uid_len = 0; const uint8_t* uid = mf_classic_get_uid(data, &uid_len); - + // Card Number is printed in HEX (equal to UID) char card_number[2 * uid_len + 1]; @@ -172,7 +172,7 @@ static bool washcity_parse(const NfcDevice* device, FuriString* parsed_data) { "\e#WashCity\nCard number: %s\nBalance: %lu.%02u EUR", card_number, balance_eur, - balancecentsi); + balance_cents); parsed = true; } while(false); From f7e0338a75153ee47a7e1c1fe931c6f422d55e36 Mon Sep 17 00:00:00 2001 From: YaBa Date: Wed, 27 Dec 2023 00:48:30 +0000 Subject: [PATCH 3/4] Added demo file --- .../main/nfc/resources/nfc/Demo_WC_20E.nfc | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 applications/main/nfc/resources/nfc/Demo_WC_20E.nfc diff --git a/applications/main/nfc/resources/nfc/Demo_WC_20E.nfc b/applications/main/nfc/resources/nfc/Demo_WC_20E.nfc new file mode 100755 index 000000000..c8c9cd005 --- /dev/null +++ b/applications/main/nfc/resources/nfc/Demo_WC_20E.nfc @@ -0,0 +1,77 @@ +Filetype: Flipper NFC device +Version: 3 +# Nfc device type can be UID, Mifare Ultralight, Mifare Classic or ISO15693 +Device type: Mifare Classic +# UID is common for all formats +UID: 96 00 CA FE +# ISO14443 specific fields +ATQA: 00 04 +SAK: 08 +# Mifare Classic specific data +Mifare Classic type: 1K +Data format version: 2 +# Mifare Classic blocks, '??' means unknown data +Block 0: 96 00 CA FE A2 08 04 00 01 B4 B9 86 13 27 F8 1D +Block 1: FF 00 00 02 00 02 00 02 00 02 00 02 00 02 00 02 +Block 2: 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 3: A0 A1 A2 A3 A4 A5 78 77 88 81 01 01 55 01 01 00 +Block 4: 02 E4 07 D0 80 01 00 00 00 00 00 00 00 00 00 01 +Block 5: 00 00 00 00 00 00 00 00 1B 93 CD 00 00 00 00 FF +Block 6: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 +Block 7: C7 8A 3D 0E 1B CD FF 07 80 69 FF FF FF FF FF FF +Block 8: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 +Block 9: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF +Block 10: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 +Block 11: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF +Block 12: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 +Block 13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF +Block 14: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 +Block 15: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF +Block 16: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 +Block 17: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF +Block 18: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 +Block 19: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF +Block 20: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 +Block 21: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF +Block 22: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 +Block 23: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF +Block 24: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 +Block 25: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF +Block 26: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 +Block 27: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF +Block 28: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 +Block 29: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF +Block 30: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 +Block 31: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF +Block 32: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 +Block 33: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF +Block 34: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 +Block 35: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF +Block 36: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 37: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 38: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 39: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF +Block 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 41: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 42: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 43: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF +Block 44: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 45: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 46: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 47: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF +Block 48: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 49: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 51: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF +Block 52: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 53: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 54: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 55: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF +Block 56: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 57: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 58: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 59: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF +Block 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 61: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 62: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Block 63: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF From d2549b3b1a7b81c3c7b56520d4bdd682d9c186b4 Mon Sep 17 00:00:00 2001 From: Methodius Date: Sat, 6 Jan 2024 03:18:32 +0900 Subject: [PATCH 4/4] Code cleanup --- applications/main/nfc/application.fam | 18 ++--- .../nfc/plugins/supported_cards/washcity.c | 17 ++-- .../main/nfc/resources/nfc/Demo_WC_20E.nfc | 77 ------------------- 3 files changed, 14 insertions(+), 98 deletions(-) delete mode 100755 applications/main/nfc/resources/nfc/Demo_WC_20E.nfc diff --git a/applications/main/nfc/application.fam b/applications/main/nfc/application.fam index 871471b69..fec3b6c76 100644 --- a/applications/main/nfc/application.fam +++ b/applications/main/nfc/application.fam @@ -101,15 +101,6 @@ App( sources=["plugins/supported_cards/metromoney.c"], ) -App( - appid="washcity_parser", - apptype=FlipperAppType.PLUGIN, - entry_point="washcity_plugin_ep", - targets=["f7"], - requires=["nfc"], - sources=["plugins/supported_cards/washcity.c"], -) - App( appid="kazan_parser", apptype=FlipperAppType.PLUGIN, @@ -164,6 +155,15 @@ App( sources=["plugins/supported_cards/hid.c"], ) +App( + appid="washcity_parser", + apptype=FlipperAppType.PLUGIN, + entry_point="washcity_plugin_ep", + targets=["f7"], + requires=["nfc"], + sources=["plugins/supported_cards/washcity.c"], +) + App( appid="nfc_start", targets=["f7"], diff --git a/applications/main/nfc/plugins/supported_cards/washcity.c b/applications/main/nfc/plugins/supported_cards/washcity.c index a0edeef6a..93b069093 100644 --- a/applications/main/nfc/plugins/supported_cards/washcity.c +++ b/applications/main/nfc/plugins/supported_cards/washcity.c @@ -26,7 +26,6 @@ #include #include #include -#include #define TAG "WashCity" @@ -151,27 +150,21 @@ static bool washcity_parse(const NfcDevice* device, FuriString* parsed_data) { uint32_t balance = nfc_util_bytes2num(block_start_ptr + 2, 2); - uint32_t balance_eur = balance / 100; + uint32_t balance_usd = balance / 100; uint8_t balance_cents = balance % 100; size_t uid_len = 0; const uint8_t* uid = mf_classic_get_uid(data, &uid_len); // Card Number is printed in HEX (equal to UID) - char card_number[2 * uid_len + 1]; - - for(size_t i = 0; i < uid_len; ++i) { - card_number[2 * i] = "0123456789ABCDEF"[uid[i] >> 4]; - card_number[2 * i + 1] = "0123456789ABCDEF"[uid[i] & 0xF]; - } - - card_number[2 * uid_len] = '\0'; + uint64_t card_number = nfc_util_bytes2num(uid, uid_len); furi_string_printf( parsed_data, - "\e#WashCity\nCard number: %s\nBalance: %lu.%02u EUR", + "\e#WashCity\nCard number: %0*llX\nBalance: %lu.%02u USD", + uid_len * 2, card_number, - balance_eur, + balance_usd, balance_cents); parsed = true; } while(false); diff --git a/applications/main/nfc/resources/nfc/Demo_WC_20E.nfc b/applications/main/nfc/resources/nfc/Demo_WC_20E.nfc deleted file mode 100755 index c8c9cd005..000000000 --- a/applications/main/nfc/resources/nfc/Demo_WC_20E.nfc +++ /dev/null @@ -1,77 +0,0 @@ -Filetype: Flipper NFC device -Version: 3 -# Nfc device type can be UID, Mifare Ultralight, Mifare Classic or ISO15693 -Device type: Mifare Classic -# UID is common for all formats -UID: 96 00 CA FE -# ISO14443 specific fields -ATQA: 00 04 -SAK: 08 -# Mifare Classic specific data -Mifare Classic type: 1K -Data format version: 2 -# Mifare Classic blocks, '??' means unknown data -Block 0: 96 00 CA FE A2 08 04 00 01 B4 B9 86 13 27 F8 1D -Block 1: FF 00 00 02 00 02 00 02 00 02 00 02 00 02 00 02 -Block 2: 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 3: A0 A1 A2 A3 A4 A5 78 77 88 81 01 01 55 01 01 00 -Block 4: 02 E4 07 D0 80 01 00 00 00 00 00 00 00 00 00 01 -Block 5: 00 00 00 00 00 00 00 00 1B 93 CD 00 00 00 00 FF -Block 6: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 -Block 7: C7 8A 3D 0E 1B CD FF 07 80 69 FF FF FF FF FF FF -Block 8: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 -Block 9: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF -Block 10: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 -Block 11: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF -Block 12: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 -Block 13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF -Block 14: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 -Block 15: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF -Block 16: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 -Block 17: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF -Block 18: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 -Block 19: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF -Block 20: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 -Block 21: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF -Block 22: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 -Block 23: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF -Block 24: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 -Block 25: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF -Block 26: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 -Block 27: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF -Block 28: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 -Block 29: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF -Block 30: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 -Block 31: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF -Block 32: 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 -Block 33: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF -Block 34: 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 01 -Block 35: C7 8A 3D 0E 00 00 FF 07 80 69 FF FF FF FF FF FF -Block 36: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 37: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 38: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 39: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF -Block 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 41: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 42: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 43: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF -Block 44: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 45: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 46: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 47: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF -Block 48: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 49: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 51: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF -Block 52: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 53: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 54: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 55: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF -Block 56: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 57: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 58: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 59: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF -Block 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 61: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 62: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Block 63: 01 01 55 01 01 00 FF 07 80 69 FF FF FF FF FF FF