commit 90957931f2f55d341d39adc09414cafb57b1f9e4
Author: Markus Birth <mbirth@gmail.com>
Date:   Sun Oct 14 22:23:54 2018 +0200

    Initial commit

diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..e58fb03
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,31 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Python: Current File (Integrated Terminal)",
+            "type": "python",
+            "request": "launch",
+            "program": "${file}",
+            "args": ["D2Delta_300.gcd", "fenix5Plus_510.gcd", "GUPDATE.GCD", "fenix5Plus_510.gcd"],
+            "console": "integratedTerminal"
+        },
+        {
+            "name": "Python: Attach",
+            "type": "python",
+            "request": "attach",
+            "port": 5678,
+            "host": "localhost"
+        },
+        {
+            "name": "Python: Current File (External Terminal)",
+            "type": "python",
+            "request": "launch",
+            "program": "${file}",
+            "args": ["fenix5Plus_510.gcd"],
+            "console": "externalTerminal"
+        }
+    ]
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..e95dbe7
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,16 @@
+{
+    // See https://go.microsoft.com/fwlink/?LinkId=733558
+    // for the documentation about the tasks.json format
+    "version": "2.0.0",
+    "tasks": [
+        {
+            "label": "Run fenix5Plus_510.gcd",
+            "type": "shell",
+            "command": "python3 gcd.py fenix5Plus_510.gcd",
+            "group": {
+                "kind": "build",
+                "isDefault": true
+            }
+        }
+    ]
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7103d74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=115804&whichpage=1
+http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=137838&whichpage=50
diff --git a/gcd.py b/gcd.py
new file mode 100644
index 0000000..f9cce7e
--- /dev/null
+++ b/gcd.py
@@ -0,0 +1,215 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+GCD_SIG = b"GARMINd\00"
+
+from binascii import hexlify
+from struct import unpack
+import sys
+
+FILE = sys.argv[1]
+
+TLV_TYPES = {
+    0x0001: "Checksum remainder",
+    0x0002: "Skip?",
+    0x0003: "Part number",
+    0x0005: "Copyright notice",
+    0x0006: "Block Type 7 format definition",
+    0x0007: "Binary descriptor",
+    0x0008: "Binary Region 0C (boot.bin)",
+    0x0401: "Binary Component Firmware (SensorHub, ANT_BLE_BT, GPS, WiFi)",
+    0x0505: "Binary Region 05",
+    0x0555: "Binary Region 55",
+    0x0557: "Binary Region 57",
+    0x02bd: "Binary Region 0E (fw_all.bin)",
+    0xffff: "EOF marker",
+}
+
+DEV_TYPES = {
+    1551: "fenix/D2/tactix",
+    2900: "fenix 5 Plus",
+    3196: "D2 Delta",
+}
+
+running_cksum = 0
+all_cksum_ok = True
+last_type6_format = ""
+last_type6_fields = []
+
+def add_to_cksum(payload):
+    global running_cksum
+    for c in payload:
+        running_cksum += c
+        running_cksum &= 0xff
+
+def get_tlv_comment(ttype):
+    if ttype in TLV_TYPES:
+        return TLV_TYPES[ttype]
+    else:
+        return "Type {:04x} / {:d}".format(ttype, ttype)
+
+def get_device(hwid):
+    if hwid in DEV_TYPES:
+        return DEV_TYPES[hwid]
+    else:
+        return "Unknown"
+
+print("Opening {}".format(FILE))
+
+def parseTLVheader(hdr):
+    (ttype, tlen) = unpack("<HH", hdr)
+    return (ttype, tlen)
+
+def parseTLV1(payload):
+    global running_cksum, all_cksum_ok
+    if len(payload) != 1:
+        print("  ! Checksum has invalid length!")
+        all_cksum_ok = False
+    expected = ( 0x100 - running_cksum ) & 0xFF
+    payload = unpack("B", payload)[0]
+    state = "INVALID!"
+    if expected == payload:
+        state = "valid."
+    else:
+        all_cksum_ok = False
+    print("  - Checksum expected: {:02x} / found: {:02x} - {}".format(expected, payload, state))
+
+def parseTLV3(payload):
+    # Part number?
+    # 10 d4 5c 13 04 45 0d 14 41  - fenix5Plus_SensorHub_220
+    # 10 d4 5c 13 04 45 0d 14 41  - fenix_D2_tactix_500
+    # 10 d4 5c 13 04 45 0d 14 41  - fenix5_1100
+    # 10 d4 5c 13 04 45 0d 14 41  - fenix5Plus_420_rollback
+    # 10 d4 5c 13 04 45 0d 14 41  - fenix5Plus_420
+    # 10 d4 5c 13 04 45 0d 14 41  - fenix5Plus_510
+    # 10 d4 5c 13 04 45 0d 14 41  - D2Delta_300
+    print("  > " + " ".join("{:02x}".format(c) for c in payload))
+    #print(hexlify(payload).decode("utf-8"))
+    print("  > " + repr(payload))
+
+def parseTLV6(payload):
+    global last_type6_format, last_type6_fields
+    # Describes following TLV7:
+    # http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=137838&whichpage=12
+    # First nibble might be data type: 0 = B, 1 = H, 2 = L
+    FIELD_TYPES = {
+        0x000a: ["B", "XOR flag/value"],
+        0x000b: ["B", "Reboot/Downgrade flag"],
+        0x1009: ["H", "Device hw_id"],
+        0x100a: ["H", "Block type"],
+        0x1014: ["H", "Field 1014"],
+        0x1015: ["H", "Field 1015"],
+        0x1016: ["H", "Field 1016 (WiFi fw)"],
+        0x2015: ["L", "Block size"],
+        0x5003: ["", "End of definition marker"],
+    }
+    #             0a 10 15 20 09 10             0d 10 03 50 - 10 - fenix_D2_tactix_500 (before 0008)
+    # 0b 00 0a 00 0a 10 15 20 09 10             0d 10 03 50 - 14 - fenix_D2_tactix_500 (before 0555)
+    # 0b 00 0a 00 0a 10 15 20 09 10             0d 10 03 50 - 14 - fenix_D2_tactix_500 (before 0557)
+    # 0b 00 0a 00 0a 10 15 20                         03 50 - 10 - fenix5Plus_SensorHub_220
+    # 0b 00 0a 00 0a 10 15 20                         03 50 - 10 - fenix5Plus_ANT_BLE_300
+    # 0b 00 0a 00 0a 10 15 20                   16 10 03 50 - 12 - fenix5Plus_WiFi_250
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - fenix5_1100 (before 0505)
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - fenix5_1100 (before 02BD)
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - fenix5Plus_420_rollback.gcd (has only 1 Type 02BD)
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - fenix5Plus_420.gcd (before Type 0505)
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - fenix5Plus_420.gcd (before Type 02BD)
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - fenix5Plus_510.gcd (before Type 0505)
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - fenix5Plus_510.gcd (before Type 02BD)
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - D2Delta_300 (before 0505)
+    # 0b 00 0a 00 0a 10 15 20 09 10 14 10 15 10 0d 10 03 50 - 18 - D2Delta_300 (before 02BD)
+    print("  > " + " ".join("{:02x}".format(c) for c in payload))
+    #print(hexlify(payload).decode("utf-8"))
+    print("  > " + repr(payload))
+
+def parseTLV7(payload):
+    # fenix/D2/tactix: hwid 060f
+    # fenix 5 Plus: hwid 0b54
+    # D2 Delta: hwid 0c7c
+    #       08 00 00 a2 04 00 0f 06             f4 01  - 10 - fenix_D2_tactix_500 (before 0008)
+    # 00 00 55 05 00 c0 01 00 0f 06             f4 01  - 12 - fenix_D2_tactix_500 (before 0555)
+    # 00 00 57 05 00 90 01 00 0f 06             f4 01  - 12 - fenix_D2_tactix_500 (before 0557)
+    # 00 00 05 05 00 94 00 00 89 0a c8 00 4e 00 4c 04  - 16 - fenix5_1100 (before 0505)
+    # 00 00 bd 02 00 46 3b 00 89 0a c8 00 4e 00 4c 04  - 16 - fenix5_1100 (before 02BD)
+    # 01 00 01 04 0c 0e 06 00                          -  8 - fenix5Plus_SensorHub_220 (before 0401)
+    # 01 00 01 04 f7 0f 02 00                          -  8 - fenix5Plus_ANT_BLE_300 (before 0401)
+    # 00 00 01 04 e4 4f 06 00       40 33              - 10 - fenix5Plus_WiFi_250
+    # 01 00 bd 02 00 2a 8d 00 54 0b c8 00 3b 00 a4 01  - 16 - fenix5Plus_420_rollback.gcd (has only 02BD)
+    # 00 00 05 05 00 ce 00 00 54 0b c8 00 3b 00 a4 01  - 16 - fenix5Plus_420.gcd (before Type 0505)
+    # 00 00 bd 02 00 2a 8d 00 54 0b c8 00 3b 00 a4 01  - 16 - fenix5Plus_420.gcd (before Type 02BD)
+    # 00 00 05 05 00 ce 00 00 54 0b c8 00 3b 00 fe 01  - 16 - fenix5Plus_510.gcd (before Type 0505)
+    # 00 00 bd 02 00 fa 93 00 54 0b c8 00 3b 00 fe 01  - 16 - fenix5Plus_510.gcd (before Type 02BD)
+    # 00 00 05 05 00 ce 00 00 7c 0c c8 00 01 00 2c 01  - 16 - D2Delta_300.gcd (before Type 0505)
+    # 00 00 bd 02 00 99 94 00 7c 0c c8 00 01 00 2c 01  - 16 - D2Delta_300.gcd (before Type 02BD)
+    # ^^ ^^ ^___^ ^_________^ ^___^             ^___^
+    # E  X  btype   blength    HWID             FwVer
+    erase = None
+    xor = None
+    hwid = None
+    nn6 = None
+    nn7 = None
+    fwver = None
+    if len(payload) == 16:
+        (erase, xor, btype, blen, hwid, nn6, nn7, fwver) = unpack("<BBHLHHHH", payload)
+    elif len(payload) == 12:
+        (erase, xor, btype, blen, hwid, fwver) = unpack("<BBHLHH", payload)
+    elif len(payload) == 10:
+        (btype, blen, hwid, fwver) = unpack("<HLHH", payload)
+        if btype == 0x0:
+            # other format
+            print("  ! First try to parse didn't make sense. Trying other format.")
+            hwid  = None   # reset
+            fwver = None   # reset
+            (erase, xor, btype, blen, nn6) = unpack("<BBHLH", payload)
+    elif len(payload) == 8:
+        (erase, xor, btype, blen) = unpack("<BBHL", payload)
+    else:
+        print("Type 7 not an expected length. ({} Bytes)".format(len(payload)))
+        return
+    if erase is not None: print("  - Reset/Downgrade flag?: {}".format(erase))
+    if xor is not None: print("  - XOR flag?: {}".format(xor))
+    print("  - Block type: {:04x}".format(btype))
+    print("  - Block length: {:d} Bytes".format(blen))
+    if hwid is not None: print("  - Device hw_id: 0x{:04x} / {:d} ({})".format(hwid, hwid, get_device(hwid)))
+    if nn6 is not None: print("  - Unknown: {:04x} / {:d}".format(nn6, nn6))
+    if nn7 is not None: print("  - Unknown: {:04x} / {:d}".format(nn7, nn7))
+    if fwver is not None: print("  - Firmware version: {:d}".format(fwver))
+
+with open(FILE, "rb") as f:
+    sig = f.read(8)
+    add_to_cksum(sig)
+    if sig == GCD_SIG:
+        print("Signature ok.")
+    else:
+        raise Exception("Signature mismatch ({}, should be {})!".format(repr(sig), repr(GCD_SIG)))
+
+    i = 0
+
+    while True:
+        hdr = f.read(4)
+        add_to_cksum(hdr)
+        (ttype, tlen) = parseTLVheader(hdr)
+        print("#{:04} TLV type {:04x} (offset 0x{:x}, length {} Bytes) - {}".format(i, ttype, f.tell(), tlen, get_tlv_comment(ttype)))
+        if ttype == 0xFFFF:
+            print("End of file reached.")
+            break
+        payload = f.read(tlen)
+        if ttype == 0x01:
+            parseTLV1(payload)
+        elif ttype == 0x06:
+            parseTLV6(payload)
+        elif ttype == 0x07:
+            parseTLV7(payload)
+        else:
+            payloadshort = payload[:64]
+            #print("  > " + " ".join("{:02x}".format(c) for c in payloadshort))
+            #print(hexlify(payload).decode("utf-8"))
+            #print("  > " + repr(payloadshort))
+        add_to_cksum(payload)
+        if ttype in [0x0505]:
+            with open("fw_{:04x}.bin".format(ttype), "ab") as of:
+                of.write(payload)
+        i = i + 1
+
+if not all_cksum_ok:
+    print("There were problems with at least one checksum!")
diff --git a/gcksum.py b/gcksum.py
new file mode 100644
index 0000000..b8c2528
--- /dev/null
+++ b/gcksum.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from binascii import hexlify
+from struct import unpack
+import sys
+
+FILE = sys.argv[1]
+
+print("Opening {}".format(FILE))
+
+csum = 0
+
+with open(FILE, "rb") as f:
+    while True:
+        block = f.read(1024)
+        for c in block:
+            csum += c
+            csum &= 0xff
+        if len(block) < 1024:
+            print("End reached.")
+            break
+
+print("Sum of all bytes: {}".format(csum))
diff --git a/hwids.txt b/hwids.txt
new file mode 100644
index 0000000..b8bee77
--- /dev/null
+++ b/hwids.txt
@@ -0,0 +1,671 @@
+111=eMap
+126=GPSMAP 168 Sounder
+128=GPSMAP 295
+130=eTrex
+136=GPSMAP 176
+141=eTrex Summit
+144=GPSMAP 176C
+145=GPSMAP 196
+151=StreetPilot III
+154=eTrex Venture/Mariner
+155=GPS V
+156=eTrex Camo/Euro
+168=NavTalk GSM
+169=eTrex Vista rev A
+173=GPS 76 Rev A
+177=GPSMAP 76 Rev. A
+179=eTrex Legend Rev A
+194=GPSMAP 76S Rev. A
+197=Rino 110
+209=Rino 120
+210=StreetPilot 26xx
+231=Quest
+247=GPS 72 Rev A
+248=Geko 201
+256=Geko 301
+260=GPSMAP 296
+264=Rino 130/120/110
+273=GPS 18
+282=Forerunner 201
+283=Forerunner 301
+285=GPSMAP 276C
+289=GPS 60
+291=GPSMAP 60C/60CS/76C/76CS
+292=GPSMAP 60Cx/60CSx/76Cx/76CSx
+295=eTrex Camo
+308=GPSMAP 60
+314=Foretrex 101/201
+315=eTrex Legend C/Vista C
+364=GPSMAP 96
+365=GPSMAP 96C
+381=Rino 520/530
+382=StreetPilot c320/c330
+402=GPSMAP 396
+404=StreetPilot 27xx
+406=GPSMAP 376C
+410=GPSMAP 276C Plus
+411=eTrex Legend Rev B
+412=StreetPilot 7200/7500
+418=GPSMAP 76CS Plus
+420=eTrex Vista rev B
+421=eTrex Legend Cx/Vista Cx/Venture Cx
+426=Firmware Update for GXM30 Receiver
+429=StreetPilot i3
+430=GPS 72 Rev B
+439=GPSMAP 76 Rev. B
+444=GPS 76 Rev B
+450=Edge 205/305
+463=Quest 2
+476=nuvi 300/350
+478=GPS Chipset Type G
+480=GPS 60
+481=StreetPilot c340
+484=Forerunner 205/305
+497=StreetPilot c310/c320/c330
+505=StreetPilot i3/i5
+520=StreetPilot 2820
+530=Marine Network Minimum
+532=StreetPilot i2
+537=Chartplotters
+539=StreetPilot c5xx
+553=Firmware Update for c550 Bluetooth Module
+557=GPSMAP 378
+558=GPSMAP 478
+566=nuvi 310/360/370
+570=Astro 220
+574=Geko 201/301
+577=Rino 520HCx/530HCx
+580=zumo 4xx/5xx
+583=Firmware Update for STP2820 / BMW Navigator III Bluetooth Module
+584=GPSMAP 76S Rev. B
+585=GPSMAP 278
+595=GPSMAP 496
+596=nuvi 6xx
+600=Where2 c550
+601=StreetPilot c5xx Smart
+602=StreetPilot c5xx Mopar
+603=StreetPilot c5xx Mercedes
+609=Rino 520 Australia
+617=GPS Chipset Type G2
+625=Edge 605/705
+660=nuvi 2xx
+661=Colorado
+672=nuvi 350 Toyota DIO
+673=nuvi 360 MINI
+675=nuvi 360 BMW3
+680=GPS Chipset Type B
+681=nuvi 350 Honda Access
+682=nuvi 360 Honda Access
+683=nuvi 350 Toyota PIO
+689=DC20/DC30/DC40
+694=eTrex Legend HCx/Vista HCx
+695=eTrex Summit HC/Venture HC
+696=eTrex H
+697=BMW Motorrad Navigator III plus
+698=Zumo BMW
+711=Zumo Honda
+717=Forerunner 405
+723=nuvi 5xx
+726=nuvi 8xx
+732=StreetPilot c5xx Mercedes Phase2
+733=GPS Chipset Type M
+737=nuvi 2xxW
+739=GPS Chipset Type M2
+743=Nuvi 5000
+745=GPSMAP 695/696
+754=nuvi 7xx
+775=GPS Chipset Type B
+781=GPS 17x HVS
+786=eTrex Venture HC/Summit HC
+788=nuvi 7x0 Mercedes/Smart
+795=Oregon
+796=GPS 15x|15xH/xL|16x|18x OEM
+811=GPS 18x USB/GPS 20x USB
+814=nuvi 900T
+827=nuvi 2x5W
+832=GPSMAP 6x0
+834=nuvi 2xx
+835=nuvi 2xxW
+836=nuvi 760 TWN
+851=nuvi 2x5
+853=StreetPilot C5XX Cendant-Avis Australia
+855=nuvi 300/350 MLC
+856=nuvi 310/360/370 MLC
+861=GolfLogix Black
+862=GXM40 Software
+865=GPS 18x 5Hz
+870=nuvi 7x5
+887=GPSMAP 495
+896=Oregon x50
+897=Colorado TWN
+901=Firmware Update for GTMxx Traffic Receiver Type 3
+913=Aera GPS Software
+924=BMW Motorrad Navigator IV/zumo 660
+930=nuvi 255W SG
+932=nuvi 2x5W TWN
+943=nuvi 465T
+956=Honda Navi Gen3
+960=Dakota
+969=Firmware Update for FMI Cables with Traffic
+970=Mount Software
+971=nuvi 12xx
+972=nuvi 13xx and 14xx
+977=Firmware Update for Bluetooth
+978=nuvi 7x5 DSP Software
+979=GPS Chipset Type M3
+983=Oregon TWN
+988=FR60
+1005=Approach G5
+1007=nuvi 765 TWN
+1018=Forerunner 310XT
+1020=Foretrex 301/401
+1033=zumo 66x Echo Cancellation Software
+1036=Edge 500
+1039=Forerunner 405CX
+1046=nuvi 16xx NA
+1058=Nuvi 5xx TWN
+1059=GPS Chipset Type M3
+1063=aera 5xx
+1073=Firmware Update for ecoRoute HD
+1074=nuvi 2x5 MTK
+1091=nuvi 2x5W MTK
+1095=GPS 72H
+1101=nuvi 37xx
+1103=Nuvi 13xx TWN
+1104=nuvi 13xx and 14xx MTK
+1106=nuvi 12xx MTK
+1113=GPSMAP 62/78
+1118=KNA-G600
+1120=Oregon x50 TWN
+1124=Forerunner 110
+1128=Aera DSP Software
+1132=nuvi 16xx EU
+1136=Approach G3
+1137=Nuvi 1480 TWN
+1138=zumo 2x0
+1142=Oregon 550 Thai
+1147=zumo 665
+1156=nuvi 16xx AU
+1157=nuvi 16xx CA
+1161=Nuvi 16xx TWN
+1169=Edge 800
+1186=nuvi 22xx
+1187=nuvi 23xx
+1188=nuLink 1695
+1196=nuvi 1490TV
+1201=GTU 10 US
+1204=Dakota TWN
+1209=Oregon 550 Korea
+1211=Firmware Update for Touchscreen Module - Nuvi 37xx
+1213=Edge 500 JPN
+1247=Rino 6xx
+1250=Forerunner 410
+1252=Oregon 450tc Japan
+1254=nuLink 23xx
+1258=nuvi 35xx
+1259=Nuvi 37xx, Taiwan
+1264=Forerunner 210
+1266=Nuvi 2585 TWN
+1269=dezl 560
+1271=Approach S1
+1273=nuvi 24xx
+1275=Montana
+1301=GPSMAP 62SJ Japan
+1304=eTrex 10
+1305=eTrex 20/30
+1318=GPSMAP Series with SDCard
+1325=Edge 200
+1327=Nuvi 24x5 Taiwan
+1328=Forerunner 910XT
+1331=GTU 10 EU
+1334=Edge 800 JPN
+1339=Astro 320
+1340=GPSMAP 62sc/62stc
+1343=GDL 39
+1344=GTU 10 CA
+1345=Forerunner 610
+1349=nuvi 30
+1350=nuvi 40 and 50
+1352=Nuvi 25x5 Taiwan
+1353=GPSMAP 62S Korea
+1354=GPSMAP 62S/78S Thai & Indonesia
+1364=aera 7xx
+1371=nuvi 24x5 and 25x5
+1376=nuvi 34xx
+1379=GPS Chipset Type M3
+1381=Vector
+1389=Nuvi 2585LT EU
+1392=GPS 19x HVS
+1400=DC20/DC30/DC40
+1405=Approach G10
+1420=Chrysler RHB15 v4/RHB17 v2/RHB17 v4/RHB18 v1
+1422=Edge 500 Korea
+1425=Chrysler CTP16 v3/CTP17 v4/CTP18 v1
+1429=Montana 650t Taiwan
+1431=Montana Korea
+1441=nuvi 3595,JPN
+1443=Nuvi 40/50 China
+1445=nuvi 2495 LT GLONASS
+1446=Forerunner 310XT
+1452=Approach G6
+1461=UAT 163
+1463=Nuvi 2585 Russia
+1468=FujiMY16 v1/Fuji MY17 
+1469=Approach S3
+1471=eTrex 20/30 JPN
+1472=eTrex 10 JPN
+1473=zumo 3x0
+1475=fleet 590 U.S.
+1482=Forerunner 10
+1484=GPS Chipset Type M4
+1485=GPS Chipset Type M4
+1490=GLO
+1497=Edge 800 Korea
+1498=eTrex 20/30 SEA
+1499=Garmin Swim
+1504=eTrex 10 SEA
+1506=Nordic Rino650
+1510=Nuvi 40/50 Taiwan
+1516=dezl 760
+1517=nuvi 27x7 and 27x8
+1521=Nuvi 35xx Taiwan
+1522=Nuvi 2460 India
+1525=Oregon 550 China
+1532=GPSMAP 62sc China
+1533=GPSMAP 62sc Japan
+1535=Nuvi 2580 South America
+1536=Oregon 550tc Japan
+1537=Forerunner 910XT China
+1541=BMW Motorrad Navigator V
+1545=TT10
+1546=Firmware Update for GTMxx Digital Radio Type S
+1548=Yushan
+1550=Zumo 660 Taiwan
+1551=Fenix/D2/tactix
+1556=eTrex 20/30 China
+1561=Edge 510
+1562=Alpha 100
+1563=Nuvi 3595 Taiwan
+1566=Garmin Swim Strings
+1567=Edge 810
+1582=nuvi 2xx7 and 2xx8
+1587=Rino 6xx China
+1593=Nuvi 2568 India
+1594=eTrex 20/30 Taiwan
+1595=nuvi 140/150
+1597=Approach S3 APAC
+1599=GPSmap 62stc Taiwan
+1600=ForeAthlete 910XTJ Japan
+1603=nuvi 35x7 and 35x8
+1613=nuvi x2 and x4
+1617=Nuvi c155/c165/c175 China
+1619=GPS Chipset Type M5
+1620=GPS Chipset Type M5
+1621=GPS Chipset Type M5
+1623=Forerunner 620
+1624=GPS Chipset Type M426
+1628=Garmin HUD
+1630=Forerunner 620/920, Wi-Fi
+1632=Forerunner 220
+1635=Montana 650t China
+1649=Approach S2
+1651=Oregon 6x0
+1664=Forerunner 910XT, Korea
+1676=Fenix China
+1677=Fenix Japan
+1678=Fenix Korea
+1679=Fenix Taiwan
+1681=Nuvi 2795 Japan
+1688=ForeAthlete 10J
+1689=GPS Chipset Type M426
+1692=quatix
+1696=DC 50
+1697=nuvi 53/55/56
+1708=fleet 590 EU
+1711=Nuvi 2795 South America
+1712=Nuvi 42/52 SGMY
+1714=Nuvi 42/52 Taiwan
+1716=Monterra
+1719=GPSMAP 62sc SEA
+1721=Edge 810, Japan
+1722=Nuvi 24x7/25x7 Taiwan
+1723=Nuvi 3590 CHN
+1724=Nuvi 3592 SGMY
+1725=Nuvi 3592 THAI
+1726=Monterra Outdoor Software
+1730=RV and Camper 760
+1731=Nuvi 3590 TWN
+1735=VIRB China
+1736=Edge Touring
+1739=GPSMAP 629sc CHN
+1740=Nuvi 1690 lite Taiwan
+1741=eTrex 20S SG
+1742=Edge 510, Japan
+1749=nuvi 65/66
+1758=nuvi 25x9
+1765=Forerunner 920XT
+1766=Nuvi 42/52 India
+1769=SIRIUS/XM Weather Support File
+1772=nuvi 26x9
+1786=GPS 15x|15xH/xL|16x|18x OEM/5Hz 1786
+1796=zumo 590
+1811=Approach S4
+1815=Carmax 310A/310V
+1817=UAT-1817
+1820=eTrex 209/309 China
+1821=Edge 510 China & Taiwan
+1822=Edge 810 China
+1823=Edge 810, Taiwan
+1836=Edge 1000
+1837=vivofit
+1842=Approach G7
+1843=Oregon 6xx System, SEA
+1850=Forerunner 620/220 Display
+1851=Forerunner 620/220 ANT
+1857=Oregon 6xx System, JPN
+1859=GPSMAP 64
+1876=Rino 6xx Korea
+1878=GPSMAP 7x08
+1879=GPSMAP 7x10/7x12
+1884=Nuvi 2798
+1885=vivoki
+1891=Approach S2 JPN
+1895=Monterra, GPS/BeiDou CHN
+1903=Forerunner 15
+1907=vivoactive
+1908=vivoactive Display
+1909=VivoActive, Fenix3 ANT | ANT / BLE N4
+1917=Approach G8
+1918=Edge 510, Korea
+1925=Approach S6 Display
+1928=ForeAthlete 620J
+1929=Forerunner 620 China
+1930=ForeAthlete 220J
+1931=Forerunner 220 China
+1932=nuvi 27x9
+1936=Approach S6
+1939=Virb CHN
+1940=Virb System ASIA
+1942=Forerunner 920XT Display
+1947=nuvi 25x9 C4
+1948=nuvi 26x9 C4
+1955=vivosmart ANT
+1956=VivoSmart
+1958=nuvi C255 China
+1959=nuvi C265 China
+1966=Nuvi 55TV Brazil
+1967=Fenix 2
+1969=Forerunner 15, ANT
+1982=MWNavV Japan
+1987=Epix Display
+1988=Epix
+1999=Approach S2 APAC
+2002=dezl 770
+2003=dezl 570
+2005=vivosmart, PSOC
+2024=Quatix China
+2030=HAC 2CT
+2032=T 5, TT 15
+2035=Approach S4 APAC
+2043=nuviCam
+2044=nuviCam Camera Firmware
+2047=ANT/BLE N1 Firmware
+2050=fenix 3/tactix Bravo/quatix 3
+2051=fenix 3/tactix Bravo/quatix 3, Display
+2052=Edge 1000, Taiwan
+2053=Edge 1000, Japan
+2054=Fenix 2 China
+2061=ForeAthlete 15J
+2062=Fleet 660 GPS
+2063=Fleet 670 GPS
+2067=Edge 520
+2068=SW,HondaPH
+2070=Edge 1000, China
+2077=nuvi 2xx7/2xx8 C4
+2079=Vector S
+2081=GPSMAP 7x07
+2087=nuvi 57/58
+2088=nuvi 67/68
+2094=Fenix 2 Japan
+2100=Edge 1000, Korea
+2108=fenix 3/tactix Bravo/quatix 3, Wi-Fi
+2112=Firmware Update for the BC30 RX
+2123=GPSMAP 64S, SEA
+2124=GPSMAP 64SJ, Japan
+2130=Forerunner 920XT Taiwan
+2131=Forerunner 920XT China
+2132=Forerunner 920XT Japan
+2134=VIRB X
+2135=VivoSmart APAC
+2140=eTrex Touch 25/35
+2141=dezlCam
+2147=Edge 25
+2148=Forerunner 25
+2150=vivofit2
+2151=Forerunner 225, OHR
+2153=Forerunner 225
+2156=Forerunner 630
+2157=Forerunner 230
+2158=Forerunner 735XT
+2159=Forerunner Display A1 Firmware
+2160=vivoactive APAC
+2161=Vector 2
+2162=Vector 2S
+2172=VIRB XE
+2173=Forerunner 620 Taiwan
+2175=TruSwing
+2182=Approach S5
+2188=fenix 3, K65, China
+2189=fenix 3, Taiwan
+2190=T5/TT15 Mini
+2192=Varia Headlight
+2194=Approach S6 APAC
+2196=Wi-Fi A1 Firmware
+2197=Forerunner 630 Touchscreen
+2198=Dash Cam 30
+2199=Dash Cam 35
+2201=GPS 12H
+2204=Edge Explore 1000
+2219=Forerunner 225 Asia
+2220=ForeAthlete 225J
+2225=Varia Radar Tail Light
+2226=Varia Radar Display Unit
+2228=Forerunner 225 Display
+2231=Oregon 650TCJ2, JPN
+2232=SW,Captain
+2235=SW,Storm
+2237=Camper/RV 660
+2238=Edge 20
+2250=eTrex 20x/30x
+2260=Edge 520 Asia
+2261=Edge 520 Japan
+2262=D2 Bravo
+2266=Approach S20
+2267=Drive and DriveSmart 40/50
+2268=Drive, DriveSmart 60/70 and DriveTrack 70
+2269=DriveLuxe 50
+2270=DriveAssist 50
+2273=ANT/BLE N2 Firmware
+2274=Edge 1000, Thai
+2281=GPSMAP 64s, KOR
+2285=GPSMAP 64st, TWN
+2288=Edge 25 Asia
+2289=Edge 25 Japan
+2290=Edge 20 Asia
+2292=Approach X40
+2293=fenix 3, K65, Japan
+2296=nuviCam APAC
+2297=nuvi 57, APAC
+2298=nuvi 67, APAC
+2299=Montana 610/680
+2302=eTrex 20x/30x China OPM & TWN
+2310=Forerunner 630 APAC
+2311=ForeAthlete 630J
+2313=ForeAthlete 230J
+2316=eTrex 20x/30x JPN
+2317=eTrex 20x/30x SEA
+2325=UAT-B2325-00
+2329=VIRBXE APAC System
+2332=Epix JPN
+2337=vivoactive HR
+2338=vivoactive HR Sensor Hub
+2340=vivoactive HR Display
+2347=vivosmart HR plus
+2348=vivosmart HR
+2361=vivosmart HR APAC
+2362=vivosmart HR plus APAC
+2368=Vivomove
+2369=Forerunner 235 Sensor Hub
+2379=Varia Tail Light
+2392=fenix Chronos, Display
+2393=fenix Chronos, Sensor Hub
+2396=Forerunner 235 APAC
+2397=ForeAthlete 235J
+2398=Varia Vision
+2400=aera 660
+2405=Approach X40 BLE Firmware
+2406=vivofit3
+2407=fenix 3, K65, Korea
+2408=fenix 3, K65, SEA
+2413=fenix 3 HR
+2414=fenix 3 HR, Display
+2415=fenix 3 HR, Sensor Hub
+2417=Virb Ultra 30
+2423=ANT/BLE N3 Firmware
+2429=Index Smart Scale
+2431=Forerunner 235
+2432=fenix Chronos
+2435=Zumo 3x5
+2436=Zumo 595
+2440=GDR E350/C300
+2442=Astro 430/Alpha 50
+2444=Rino 7xx
+2449=PRO Control 2 RR
+2450=Delta Smart
+2467=D2 Bravo, K65, China
+2470=GDR C530
+2471=Varia Vision, APAC
+2473=fenix 3 HR, K26, CHN
+2478=zumo 590, APAC
+2479=GPSMAP 276cx
+2485=GDR E350 Japan
+2495=DriveAssist 50 Camera FW
+2496=Garmin Nautix
+2497=vivoactive HR APAC
+2503=Forerunner 35
+2510=Forerunner 735XT, Sensor Hub
+2512=Oregon 7xx
+2517=zumo 590 JPN
+2530=Edge 820
+2531=Edge Explore 820
+2533=Forerunner 735XT APAC
+2534=ForeAthlete 735XTJ
+2544=fenix 5S
+2545=Dash Cam 30
+2546=Dash Cam 35
+2547=D2 Bravo Titanium
+2559=Approach S20 APAC
+2560=D2 Bravo Titanium, Sensor Hub
+2561=DriveSmart 50 APAC
+2563=eTrex Touch 35 APAC
+2569=fleet 660 8G, GPS
+2570=fleet 670 8G, GPS
+2576=eTrex Venture Mariner
+2583=Delta Smart nRF51
+2584=BMW Motorrad Navigator VI
+2586=Drive and DriveSmart 51
+2587=Drive 61
+2588=DriveSmart 61
+2589=DriveLuxe 51
+2590=DriveAssist 51
+2596=DriveAssist 50, APAC
+2599=Edge 820 China
+2600=Edge 820 Japan
+2604=fenix 5X
+2606=vivofit jr
+2614=GPSMAP 64sc
+2622=vivosmart 3
+2623=vivosport
+2624=fenix 3 HR APAC, Sensor Hub
+2628=Edge 820 Taiwan
+2629=Edge 820 Korea
+2630=Edge 820 SEA
+2639=vivosmart HR plus Israel
+2641=Xero A1(i)
+2650=Forerunner 35 Israel
+2652=Approach G30
+2653=FR235, NFC CIB
+2655=FR235 Sensor Hub
+2656=Approach S60
+2667=Forerunner 35 APAC
+2668=Forerunner 35 JPN
+2675=fenix CHRONOS APAC
+2681=Oregon 7xx APAC
+2684=RV/Camper 770
+2691=Forerunner 935
+2697=fenix 5
+2700=vivoactive 3
+2705=Avtex Tourer One Plus
+2713=Edge 1030
+2725=aera 79x China
+2726=aera 660 China
+2727=Forerunner 35 SEA
+2733=FR235, NFC, ExpressPay
+2763=GPSMAP 64sc JPN
+2764=GPSMAP 64sc SEA
+2769=Foretrex 601/701
+2771=Impact
+2772=vivomove HR
+2777=Rino 700
+2796=Fenix 5 APAC
+2797=Fenix 5S APAC
+2798=Fenix 5X APAC
+2803=Drive and DriveSmart 51, APAC
+2807=echoMAP Plus 4x
+2808=echoMAP Plus 6x
+2809=echoMAP Plus 7x/9x
+2810=echoMAP Plus 63
+2814=Forerunner 35 KOR
+2819=D2 Charlie
+2826=UAT-2826
+2831=Vivosmart 3, APAC
+2832=Vivosport, APAC
+2833=Forerunner 935 APAC
+2859=Descent Mk1
+2886=Forerunner 645
+2888=Forerunner 645 Music
+2891=Forerunner 30
+2893=Atemos 50
+2894=Atemos 100
+2907=Approach S60, Host, APAC
+2924=Edge 1030 APAC
+2927=vivosmart 4
+2945=vivomove HR, APAC
+2956=Alpha 50 CHN
+2962=Approach X10
+2976=vivoactive 3, APAC
+2977=Forerunner 30 APAC
+2991=Descent APAC
+2994=D2 Charlie, APAC
+2996=DriveSmart 61, APAC
+2997=eTrex 302 CHN
+3003=Forerunner 645 APAC
+3004=Forerunner 645M APAC
+3028=GPSMAP 66
+3049=Approach S10
+3089=Fenix 5 Plus APAC
+3092=Edge 130 APAC
+3095=Edge 1030 Bontrager
+3109=DriveAssist 51, APAC
+3112=Edge 520 Plus
+3115=GPSMAP 64sc SiteSurvey
+3134=Fenix 5S Plus APAC
+3135=Fenix 5X Plus APAC
+3139=zumo 396, APAC
+3142=Edge 520 Plus, APAC
+3144=Forerunner 235 Lite APAC
+3163=vivoactive 3M, WiFi, APAC
+3196=D2 Delta
+3197=D2 Delta S
+3198=D2 Delta PX
+3218=Vivosmart 4, APAC
\ No newline at end of file