#!/usr/bin/env perl
use warnings;
#
# XASTIR, Amateur Station Tracking and Information Reporting
# Copyright (C) 2000-2023 The Xastir Group
#
# Converts "dump1090" telnet port output to Xastir UDP input, for decoding
# packets directly from aircraft.  This script will parse packets containing
# lat/long, turn them into APRS-like packets, then use "xastir_udp_client"
# to inject them into Xastir. Must have "dump1090" running, and optionally
# "dump978" to dump packets into "dump1090" from the other frequency/protocol
# for ADS-B.
#
#
# TODO: Create probability circle around my position for aircraft sending altitude
# but no lat/long. Change the size of the circle based on altitude and/or RSSI
# (Need to tie into Beast-mode port, raw data port, or JSON port to get RSSI).
# Would need to keep track of these objects and kill them when the aircraft timed-out
# or sent lat/long. Could switch back to the circle when lat/long times out but
# altitude is still coming in as well.
#
# TODO: Check everywhere that we set a variable to "". Make sure we're not setting
# it when a sentence including it comes in, then resetting it on all other sentences
# so that it never gets seen. "squawk_txt" and "squawk" were 2 of these.
# Check everywhere that $fields[] are checked/saved/used.
#
# TODO: Expire data values from hashes XX minutes after receiving them.
#
#
# Invoke it as:
#   ./ads-b.pl planes <passcode> [--circles] [--logging]
#
# If you add " --circles" to the end you'll also get a red circle around plane
# symbols at your current location which represent the area that a plane might
# be min, if it's only reporting altitude and not lat/long.
#
# If you add " --logging" to the end, this script will save the APRS portion of
# the output to a file called "~/.xastir/logs/planes.log". You can later suck
# this file back in to see the planes move around the map in hyperspeed. Useful
# for a quick demo.
#
# Injecting them from "planes" or "p1anes" assures that Xastir won't try to adopt
# the APRS Item packets as its own and re-transmit them.
#
#
# I got the "dump1090" program from here originally:
#       https://github.com/antirez/dump1090
# Newer fork:
#       https://github.com/MalcolmRobb/dump1090
# Newer-yet fork, seems to decode much better:
#       https://github.com/mutability/dump1090
#
# Invoke Mutability's "dump1090" program like so:
#   "./dump1090 --interactive --net --net-sbs-port 30003 --phase-enhance --oversample --fix --ppm -1 --gain -10 --device-index 0
#
#
# NOTE: There's also "dump978" which listens to 978 MHz ADS-B transmissions. You can
# invoke "dump1090" as above, then invoke "dump978" like this:
#
#       rtl_sdr -f 978000000 -s 2083334 -g 0 -d 1 - | ./dump978 | ./uat2esnt | nc -q1 localhost 30001
#
# which will convert the 978 MHz packets into ADS-B ES packets and inject them into "dump1090"
# for decoding. I haven't determined yet whether those packets will come out on "dump1090"'s
# port 30003 (which this Perl script uses). The above command also uses RTL device 1 instead of 0.
# If you're only interested in 978 MHz decoding, there's a way to start "dump1090" w/o a
# device attached, then start "dump978" and connect it to "dump1090".
#
# Then invoke this script in another xterm using "planes" as the callsign:
#   "./ads-b.pl planes <passcode>"
#
# NOTE: Do NOT use the same callsign as your Xastir instance, else it will
# "adopt" those APRS Item packets as its own and retransmit them. Code was
# added to the script to prevent such operation, but using "planes" as the
# callsign works great too!
#
#
# This script snags packets from port 30003 of "dump1090", parses them, then injects
# APRS packets into Xastir's UDP port (2023) if "Server Ports" are enabled in Xastir.
#
#
# Port 30001 is an input port (dump978 connects there and dumps data in).
#
# Port 30002 outputs in raw format, like:
#   *8D451E8B99019699C00B0A81F36E;
#   Every entry is separated by a simple newline (LF character, hex 0x0A).
#   The "callsign" (6 digits of hex) in chunk #4 = ICAO (airframe identifier).
#   Decoding the sentences:
#     https://www.sussex.ac.uk/webteam/gateway/file.php?name=coote-proj.pdf&site=20]
#     http://adsb-decode-guide.readthedocs.org/en/latest/
#
# Port 30003 outputs data is SBS1 (BaseStation) format, and is used by this script.
#   Decoding the sentences:
#   http://woodair.net/SBS/Article/Barebones42_Socket_Data.htm
#   NOTE: I changed the numbers by -1 to fit Perl's "split()" command field numbering.
#     Field 0:
#       Message type    (MSG, STA, ID, AIR, SEL or CLK)
#     Field 1:
#       Transmission Type   MSG sub types 1 to 8. Not used by other message types.
#     Field 2:
#       Session ID      Database Session record number
#     Field 3:
#       AircraftID      Database Aircraft record number
#     Field 4:
#       HexIdent    Aircraft Mode S hexadecimal code (What we use here... Unique identifier)
#     Field 5:
#       FlightID    Database Flight record number
#     Field 6:
#       Date message generated       As it says
#     Field 7:
#       Time message generated       As it says
#     Field 8:
#       Date message logged      As it says
#     Field 9:
#       Time message logged      As it says
#     Field 10:
#       Callsign    An eight digit flight ID - can be flight number or registration (or even nothing).
#     Field 11:
#       Altitude    Mode C altitude. Height relative to 1013.2mb (Flight Level). Not height AMSL..
#     Field 12:
#       GroundSpeed     Speed over ground (not indicated airspeed)
#     Field 13:
#       Track   Track of aircraft (not heading). Derived from the velocity E/W and velocity N/S
#     Field 14:
#       Latitude    North and East positive. South and West negative.
#     Field 15:
#       Longitude   North and East positive. South and West negative.
#     Field 16:
#       VerticalRate    64ft resolution
#     Field 17:
#       Squawk      Assigned Mode A squawk code.
#     Field 18:
#       Alert (Squawk change)   Flag to indicate squawk has changed.
#     Field 19:
#       Emergency   Flag to indicate emergency code has been set
#     Field 20:
#       SPI (Ident)     Flag to indicate transponder Ident has been activated.
#     Field 21:
#       IsOnGround      Flag to indicate ground squat switch is active
#
#
# Squawk Codes:
#   https://en.wikipedia.org/wiki/Transponder_%28aeronautics%29
#
#
# For reference, using 468/frequency (MHz) to get length of 1/2 wave dipole in feet:
#
#   1/2 wavelength on 1090 MHz: 5.15"
#   1/4 wavelength on 1090 MHz: 2.576" or 2  9/16"
#
#   1/2 wavelength on 978 MHz: 5.74"
#   1/4 wavelength on 978 MHz: 2.87" or 2  7/8"
#
#
# NOTE: In the tables below, lines marked with "Per Countries.dat file" are derived
# from the work of "Alexis" of the Group "https://mode-s.groups.io/g/mode-s"
# most likely arrived at via observation of Mode-S transponder activity. They are
# not guaranteed to represent reality in any way. Find the file in the Files section
# of the group.
#
# Most of the rest of the data in the tables was derived from:
#   http://www.kloth.net/radio/icao24alloc.php (Created 2003-01-12, Last modified 2011-06-23).
# Which in turn came from:
# "ICAO Annex 10 Volume III Chapter 9. Aircraft Addressing System"
#
#


eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
& eval 'exec perl -S $0 $argv:q'
if 0;

use IO::Socket;


$my_alt = 600;     # In feet. Used by probability circles.


# Fetch my lat/long from Xastir config file
$my_lat = `grep STATION_LAT ~/.xastir/config/xastir.cnf`;
if (! ($my_lat =~ m/STATION_LAT:/) ) {
  die "Couldn't get STATION_LAT from Xastir config file\n";
}
$my_lon = `grep STATION_LONG ~/.xastir/config/xastir.cnf`;
if (! ($my_lon =~ m/STATION_LONG:/) ) {
  die "Couldn't get STATION_LONG from Xastir config file\n";
}
chomp $my_lat;
chomp $my_lon;
$my_lat =~ s/STATION_LAT://;
$my_lon =~ s/STATION_LONG://;
$my_lat =~ s/(\d+\.\d\d)\d(.)/$1$2/;
$my_lon =~ s/(\d+\.\d\d)\d(.)/$1$2/;
#print "$my_lat  $my_lon\n";


$udp_client = "xastir_udp_client";
$dump1090_host = "localhost"; # Server where dump1090 is running
$dump1090_port = 30003;     # 30003 is dump1090 default port

$xastir_host = "localhost"; # Server where Xastir is running
$xastir_port = 2023;        # 2023 is Xastir default UDP port

$plane_TTL = 1;            # Secs after which posits too old to create APRS packets from

$log_file = "~/.xastir/logs/planes.log";


$xastir_user = shift;
if (defined($xastir_user)) {
  chomp $xastir_user;
}
if ( (!defined($xastir_user)) || ($xastir_user eq "") ) {
  print "Please enter a callsign for Xastir injection, but not Xastir's callsign/SSID!\n";
  die;
}
$xastir_user =~ tr/a-z/A-Z/;

$xastir_pass = shift;
if (defined($xastir_pass)) {
  chomp $xastir_pass;
}
if ( (!defined($xastir_pass)) || ($xastir_pass eq "") ) {
  print "Please enter a passcode for Xastir injection\n";
  die;
}

$enable_circles = 0;
$enable_logging = 0;

$flag1 = shift;
if (defined($flag1)) {
  chomp $flag1;
  if ( ($flag1 ne "") && ($flag1 eq "--circles") ) {
    $enable_circles = 1;
  }
  if ( ($flag1 ne "") && ($flag1 eq "--logging") ) {
    $enable_logging = 1;
  }
}

$flag2 = shift;
if (defined($flag2)) {
  chomp $flag2;
  if ( ($flag2 ne "") && ($flag2 eq "--circles") ) {
    $enable_circles = 1;
  }
  if ( ($flag2 ne "") && ($flag2 eq "--logging") ) {
    $enable_logging = 1;
  }
}


# Connect to the server using a tcp socket
#
$socket = IO::Socket::INET->new(PeerAddr => $dump1090_host,
                                PeerPort => $dump1090_port,
                                Proto    => "tcp",
                                Type     => SOCK_STREAM)
  or die "Couldn't connect to $dump1090_host:$dump1090_port : $@\n";


# Flush output buffers often
select((select(STDOUT), $| = 1)[0]);


# Check Xastir's callsign/SSID to make sure we don't have a collision.  This
# will prevent Xastir adopting the Items as its own and retransmitting them.
#   xastir_udp_client localhost 2023 <callsign> <passcode> -identify
#   Received: WE7U-13
#
$injection_call = $xastir_user;
$injection_call =~ s/-\d+//;    # Get rid of dash and numbers

$injection_ssid = $xastir_user;
$injection_ssid =~ s/\w+//;     # Get rid of letters
$injection_ssid =~ s/-//;       # Get rid of dash
if ($injection_ssid eq "") { $injection_ssid = 0; }

# Find out Callsign/SSID of Xastir instance
$result = `$udp_client $xastir_host $xastir_port $xastir_user $xastir_pass -identify`;
if ($result =~ m/NACK/) {
  die "Received NACK from Xastir: Callsign/Passcode don't match?\n";
}
($remote_call, $remote_ssid) = split('-', $result);

chomp($remote_call);
$remote_call =~ s/Received:\s+//;

if ( !defined($remote_ssid) ) { $remote_ssid = ""; }
if ($remote_ssid ne "") { chomp($remote_ssid); }
if ($remote_ssid eq "") { $remote_ssid = 0; }

#print "$remote_call $remote_ssid $injection_call $injection_ssid\n";
#if ($remote_call eq $injection_call) { print "Call matches\n"; }
#if ($remote_ssid == $injection_ssid) { print "SSID matches\n"; }

if (     ($remote_call eq $injection_call)
     &&  ($remote_ssid == $injection_ssid) ) {
    $remote_ssid++;
    $remote_ssid%= 16;  # Increment by 1 mod 16
    $xastir_user = "$remote_call-$remote_ssid";
    print "Injection conflict. Corrected. New user = $xastir_user\n";
}


while (<$socket>)
{

  # For testing:
  #
  #$_ = "MSG,3,,,A0CF8D,,,,,,,28000,,,47.87670,-122.27269,,,0,0,0,0";
  #$_ = "MSG,5,,,AD815E,,,,,,,575,,,,,,,,,,";
  #$_ = "MSG,4,,,AAB812,,,,,,,,454,312,,,0,,0,0,0,0";
  #$_ = "MSG,3,,,ABB2D5,,,,,,,40975,,,47.68648,-122.67834,,,0,0,0,0";   # Lat/long/altitude (ft)
  #$_ = "MSG,1,,,A2CB32,,,,,,BOE181  ,,,,,,,,0,0,0,0";  # Tail number or flight number
  #$_ = "MSG,4,,,A0F4F6,,,,,,,,175,152,,,-1152,,0,0,0,0";   # Ground speed (knots)/Track


  chomp;
  if ( $_ eq "" ) { next; }


  # Sentences have either 10 or 22 fields, assuming they aren't cut off / collided with.
  @fields = split(",");


  # Check whether we have a sentence type, message type, and plane ID. If not we're done with this loop iteration
  if ( (!defined($fields[0])) || (!defined($fields[1])) || (!defined($fields[4])) || ($fields[4] eq "") ) { next; }

  $plane_id = $fields[4];
  $print1 = $plane_id;

  # Decode the country of registration via this webpage:
  #   http://www.kloth.net/radio/icao24alloc.php
  # Add it to the APRS comment field.  Remove the Tactical call
  # from the comment field since it is redundant.
  # Match on more specific first (longer string).
  #
  # NOTE: The above link has the countries arranged alphabetically.
  # The code below is arranged in this order (because of the order
  # in which they must be decoded):
  #
  #    1024 addresses (14 bits defined)
  #    4096 addresses (12 bits defined)
  #   32768 addresses (9 bits defined)
  #  262144 addresses (6 bits defined)
  # 1048576 addresses (4 bits defined)
  #
  # The code below is basically the 1024 column from the chart in
  # alphabetical order, then the 2nd column, and so on. The chart
  # should be reviewed against the code periodically, perhaps yearly.
  # You'll see longer bits decoded here and there prior to the normal
  # bit lengths in each section, for instance "Azerbaijan Military"
  # just prior to the "Azerbaijan" entry in the 14-bit address section.
  #
  $registry = "Registry?";

  # Convert $plane_id to binary string
  $binary_plane_id = unpack ('B*', pack ('H*',$plane_id) );

  # NOTE: In the code below, more specific addresses (more bits) should
  # appear prior to less specific. The code will snag the first match.



  #
  # 4-bit addresses (column "1048576" in the table):
  # ------------------------------------------------
  if      ($binary_plane_id =~ m/^0001/) { $registry = "Russia"; }  # Russian Federation

  elsif   ($binary_plane_id =~ m/^1010/) { $registry = "U.S.";        # United States
    if    ($binary_plane_id =~ m/^1010111/) { $registry = "U.S. Military"; }        # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^1010110111111/) { $registry = "U.S. Military"; }        # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^1010110111110111111/) { $registry = "U.S. Military"; }        # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^10101101111101111101/) { $registry = "U.S. Military"; }        # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^101011011111011111001/) { $registry = "U.S. Military"; }        # Per Countries.dat file
  }

 

  #
  # 6-bit addresses (column "262144" in the table):
  # -----------------------------------------------
  elsif   ($binary_plane_id =~ m/^111000/) { $registry = "Argentina";
    if    ($binary_plane_id =~ m/^111000010100110000110001/) { $registry = "Argentina Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111000010100110000110010/) { $registry = "Argentina Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111000010100110000110011/) { $registry = "Argentina Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111000010100110001110000/) { $registry = "Argentina Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^011111/) { $registry = "Australia";
    if    ($binary_plane_id =~ m/^0111111/) { $registry = "Australia Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01111101/) { $registry = "Australia Military"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0111110011/) { $registry = "Australia Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01111100101/) { $registry = "Australia Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011111001001/) { $registry = "Australia Military"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0111110010001/) { $registry = "Australia Military"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01111100100001/) { $registry = "Australia Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0111110010000011/) { $registry = "Australia Military"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01111100100000101/) { $registry = "Australia Military"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011111001000001001/) { $registry = "Australia Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01111100100000100011/) { $registry = "Australia Military"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01111100100000100010111/) { $registry = "Australia Military"; } # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^111001/) { $registry = "Brazil";
    if    ($binary_plane_id =~ m/^11100100000/) { $registry = "Brazil Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^111001001000100110111001/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001000111110111111110/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001000111111001000000/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000000111110110/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000000111110111/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000001110111010/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000001110111011/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000100101101010/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000001011000010/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000001011000011/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000010001000011/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000010001000100/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000010111100111/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000010111101000/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000010111101001/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000100100011111/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000100100100000/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000100100100001/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000001110101000/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000001110101010/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111001001000001110101011/) { $registry = "Brazil Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^110000/) { $registry = "Canada";
    if    ($binary_plane_id =~ m/^1100001/) { $registry = "Canada Military"; }   # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^011110/) { $registry = "China";
    if    ($binary_plane_id =~ m/^0111100000000001000/) { $registry = "China"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0111100000000001/) { $registry = "China Hong Kong"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011110000000001000/) { $registry = "China Hong Kong"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011110000000101000/) { $registry = "China Hong Kong"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0111100000001010010/) { $registry = "China Hong Kong"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011110000000001100111/) { $registry = "China Macau"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011110000000001101000/) { $registry = "China Macau"; }   # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^001110/) { $registry = "France";
    if    ($binary_plane_id =~ m/^00111011/) { $registry = "France Military"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^001110101/) { $registry = "France Military"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^001110000000001001011011/) { $registry = "France Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^001110000000110100011011/) { $registry = "France Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^001110000001111001111011/) { $registry = "France Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^001110000001110000111011/) { $registry = "France Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^001110000001111000111011/) { $registry = "France Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^001110000001101110111011/) { $registry = "France Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^001110000000110100111011/) { $registry = "France Military"; }   # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^001111/) { $registry = "Germany";
    if    ($binary_plane_id =~ m/^0011111010/) { $registry = "Germany Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0011111101/) { $registry = "Germany Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0011111110/) { $registry = "Germany Military"; } # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^100000/) { $registry = "India";
    if    ($binary_plane_id =~ m/^1000000000000010/) { $registry = "India Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^100000000000001100001101/) { $registry = "India Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100000000000000001111000/) { $registry = "India Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100000000000000001111001/) { $registry = "India Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100000000000000011010110/) { $registry = "India Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100000011110000011100011/) { $registry = "India Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^001100/) { $registry = "Italy";
    if    ($binary_plane_id =~ m/^0011001111111111/) { $registry = "Italy Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^100001/) { $registry = "Japan";
    if    ($binary_plane_id =~ m/^100001111100110000001010/) { $registry = "Japan Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100001111100000000000000/) { $registry = "Japan Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100001111100000000000001/) { $registry = "Japan Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100001111100110000000001/) { $registry = "Japan Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100001111100110000001011/) { $registry = "Japan Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100001111100110000001000/) { $registry = "Japan Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100001111100110000001001/) { $registry = "Japan Military"; }    # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^001101/) { $registry = "Spain";
    if    ($binary_plane_id =~ m/^0011011/) { $registry = "Spain Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^00110100/) { $registry = "Spain Military"; } # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^010000/) { $registry = "U.K.";  # United Kingdom
    if    ($binary_plane_id =~ m/^010000100100010110111010/) { $registry = "Montserrat"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010000100100000111110100/) { $registry = "Falkland Is."; }   # Per Countries.dat file specific plane)
    elsif ($binary_plane_id =~ m/^010000100100000111110101/) { $registry = "Falkland Is."; }   # Per Countries.dat file specific plane)
    elsif ($binary_plane_id =~ m/^010000100100000111110110/) { $registry = "Falkland Is."; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010000100100000111110111/) { $registry = "Falkland Is."; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010000111011111001011011/) { $registry = "Falkland Is."; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010000000000110111111101/) { $registry = "U.K. Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010000000000110111111110/) { $registry = "U.K. Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010000000000110111111111/) { $registry = "U.K. Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^01000011111100101100111/) { $registry = "U.K. Jersey"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000011111001110001011/) { $registry = "Isle of Man"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000001001101/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000001001100/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100000000000000100010/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000000000000011010/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000000000000010000/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000111110011100011/) { $registry = "Isle of Man"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000100100000100111/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000100100100011011/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000010010000010010/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000010010000100011/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000010010000010011/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000010010010100000/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000000000000001100/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001110111110100/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001111100111001/) { $registry = "Isle of Man"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000001100/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000001101/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000001110/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000001000/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000010100/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000110000/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001001000111/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000111110011101/) { $registry = "Isle of Man"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000100100000101/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000100100001001/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000000000000110/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000000000000001/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000000000000111/) { $registry = "Cayman Islands"; }    # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000000000000000/) { $registry = "U.K. MoD"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000011111001111/) { $registry = "Isle of Man"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000000000000001/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000000000000010/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001111101010/) { $registry = "Isle of Man"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000000/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001000101/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001001001001/) { $registry = "Bermuda"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010000111110100/) { $registry = "Isle of Man"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001111101/) { $registry = "U.K. Guernsey"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100001111/) { $registry = "U.K. Military"; }   # Per Countries.dat file
  }



  #
  # 9-bit addresses (column "32768" in the table):
  # ----------------------------------------------
  elsif   ($binary_plane_id =~ m/^000010100/) { $registry = "Algeria";
    if    ($binary_plane_id =~ m/^000010100100/) { $registry = "Algeria Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^010001000/) { $registry = "Austria";
    if    ($binary_plane_id =~ m/^0100010001/) { $registry = "Austria Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^010001001/) { $registry = "Belgium";
    if    ($binary_plane_id =~ m/^010001001111/) { $registry = "Belgium Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010001001100000111100001/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001001100000111100101/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001001100000111100111/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001001100000111101000/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001001100000111100011/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001001100000111100100/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001001110110110000001/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001001110110110000010/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001001110110110000011/) { $registry = "Belgium Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^010001010/) { $registry = "Bulgaria";
    if    ($binary_plane_id =~ m/^010001010111/) { $registry = "Bulgaria Military"; }    # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^010010011/) { $registry = "Czech"; # Czech Republic
    if    ($binary_plane_id =~ m/^0100100110000100/) { $registry = "Czech Military"; } # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^011100100/) { $registry = "North Korea"; }  # Democratic People's Republic of Korea

  elsif   ($binary_plane_id =~ m/^010001011/) { $registry = "Denmark";
    if    ($binary_plane_id =~ m/^0100010111110100/) { $registry = "Denmark Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^000000010/) { $registry = "Egypt";
    if    ($binary_plane_id =~ m/^00000001000000000111/) { $registry = "Egypt Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^00000001000000001000/) { $registry = "Egypt Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^000000010000000100101100/) { $registry = "Egypt Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^010001100/) { $registry = "Finland";
    if    ($binary_plane_id =~ m/^0100011001111000/) { $registry = "Finland Military"; } # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^010001101/) { $registry = "Greece";
    if    ($binary_plane_id =~ m/^01000110100000/) { $registry = "Greece Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000110111101011001001/) { $registry = "Greece Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010001101010000010010001/) { $registry = "Greece Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001101010000010010011/) { $registry = "Greece Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010001101010000010010101/) { $registry = "Greece Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^010001110/) { $registry = "Hungary";
    if    ($binary_plane_id =~ m/^01000111001111/) { $registry = "Hungary Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000111011111111111/) { $registry = "Hungary Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^100010100/) { $registry = "Indonesia";
    if    ($binary_plane_id =~ m/^100010100010100100000001/) { $registry = "Indonesia Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010100010100100000010/) { $registry = "Indonesia Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010100000000000100100/) { $registry = "Indonesia Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010100000000000101001/) { $registry = "Indonesia Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^011100110/) { $registry = "Iran";   # Iran, Islamic Republic of
    if    ($binary_plane_id =~ m/^011100110100110100011110/) { $registry = "Iran Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^011100101/) { $registry = "Iraq";
    if    ($binary_plane_id =~ m/^011100101000000111111/) { $registry = "Iraq Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0111001010000010000000/) { $registry = "Iraq Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01110010100000011111011/) { $registry = "Iraq Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011100101000000111110101/) { $registry = "Iraq Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^011100111/) { $registry = "Israel";
    if    ($binary_plane_id =~ m/^0111001110001010/) { $registry = "Israel Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^011101000/) { $registry = "Jordan"; }

  elsif   ($binary_plane_id =~ m/^011101001/) { $registry = "Lebanon"; }

  elsif   ($binary_plane_id =~ m/^000000011/) { $registry = "Libya";   # Libyan Arab Jamahiriya
    if    ($binary_plane_id =~ m/^000000011000001111101011/) { $registry = "Libya Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^011101010/) { $registry = "Malaysia";
    if    ($binary_plane_id =~ m/^011101010000000101010110/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000011010100/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000000001100/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000000001111/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000000100100/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000000100101/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000000100110/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000000100111/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000010111101/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000011000101/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101010000000011010111/) { $registry = "Malaysia Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000011010/) { $registry = "Mexico";
    if    ($binary_plane_id =~ m/^000011010000011000010101/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000010011000010/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000000110111010/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000010101000110/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000010101000111/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000000000011011/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000000000111111/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000001010111001/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000000001000101/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000000001011010/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000011001001111/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011010000011001001101/) { $registry = "Mexico Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000000100/) { $registry = "Morocco";
    if    ($binary_plane_id =~ m/^00000010000000001011/) { $registry = "Morocco Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^000000100000000011000/) { $registry = "Morocco Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^000000100000000001011101/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000001011110/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000010101000/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000010101011/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000010100000/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000010100011/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000010100010/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000010100101/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000010101100/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000001001011/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000001000110/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000001001100/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000001001101/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000001001110/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000000110001/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000000110111/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000000111000/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000000111001/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000000111010/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000000111011/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000000111100/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000000111110/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000001000001/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000011001001/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000100000000011001100/) { $registry = "Morocco Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^010010000/) { $registry = "Netherlands";    # Netherlands, Kingdom of the
    if    ($binary_plane_id =~ m/^010010000000/) { $registry = "Netherlands Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010010000100000010010101/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000010010110/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000010001001/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000100001111/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000100010001/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000100010010/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000010001011/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000010000000/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000010000001/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000010000010/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000010100100/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100000010100101/) { $registry = "Netherlands Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010000100/) { $registry = "Aruba"; } # Per Countries.dat file (In Netherlands block)
  }

  elsif   ($binary_plane_id =~ m/^110010000/) { $registry = "New Zealand";
    if    ($binary_plane_id =~ m/^1100100001111111/) { $registry = "New Zealand Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^110010000010010100011100/) { $registry = "New Zealand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^110010000010010100011101/) { $registry = "New Zealand Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^010001111/) { $registry = "Norway";
    if    ($binary_plane_id =~ m/^0100011110000001/) { $registry = "Norway Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0100011110000000111/) { $registry = "Norway Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000111100000001101/) { $registry = "Norway Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010001111000000011001/) { $registry = "Norway Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^01000111100000001100011/) { $registry = "Norway Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^011101100/) { $registry = "Pakistan";
    if    ($binary_plane_id =~ m/^011101100000000011101001/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100000000000011001/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000000110000/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000011010110/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000011011000/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000000111111/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000001001011/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000001010001/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000001010010/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000001010100/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100001000001011101/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100011100110000111/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100010101011110011/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100010101111110100/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100000001011110101/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101100010000010011010/) { $registry = "Pakistan Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^011101011/) { $registry = "Philipines"; }

  elsif   ($binary_plane_id =~ m/^010010001/) { $registry = "Poland";
    if    ($binary_plane_id =~ m/^0100100011011000/) { $registry = "Poland Military"; }  # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^010010001000000110001110/) { $registry = "Poland Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^010010010/) { $registry = "Portugal";
    if    ($binary_plane_id =~ m/^0100100101111100/) { $registry = "Portugal Military"; } # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^011100011/) { $registry = "South Korea";   # Republic of Korea
    if    ($binary_plane_id =~ m/^011100011111101100000001/) { $registry = "South Korea Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100011111101100000010/) { $registry = "South Korea Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100011111100100001010/) { $registry = "South Korea Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100011111100100000110/) { $registry = "South Korea Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^010010100/) { $registry = "Romania";
    if    ($binary_plane_id =~ m/^010010100011010110101010/) { $registry = "Romania Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010100011010110101011/) { $registry = "Romania Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010100011010110101100/) { $registry = "Romania Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010100001011100101010/) { $registry = "Romania Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010100001100000010110/) { $registry = "Romania Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010100001100000101111/) { $registry = "Romania Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^011100010/) { $registry = "Saudi Arabia";
    if    ($binary_plane_id =~ m/^0111000100000010011/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0111000100000010100/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^0111000100000011100/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011100010000001001011/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011100010000000100001010/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000000100001011/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001011100001/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001011100010/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001011010101/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001011100011/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001011100100/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001011111001/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001001011010/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001001011011/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001001011100/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001001011110/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100010000001001011101/) { $registry = "Saudi Arabia Military"; } # Per Countries.dat file (specific plane)
  }

  # Serbia: See Yugoslavia slot

  elsif   ($binary_plane_id =~ m/^011101101/) { $registry = "Singapore";
    if    ($binary_plane_id =~ m/^011101101110001100000011/) { $registry = "Singapore Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101101110001100000010/) { $registry = "Singapore Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101101110001100000100/) { $registry = "Singapore Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101101110001100000001/) { $registry = "Singapore Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011101101000010011000011/) { $registry = "Singapore Military"; }   # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000000001/) { $registry = "South Africa"; }

  elsif   ($binary_plane_id =~ m/^011101110/) { $registry = "Sri Lanka"; }

  elsif   ($binary_plane_id =~ m/^010010101/) { $registry = "Sweden";
    if    ($binary_plane_id =~ m/^010010101000000110000001/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000110000010/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000110000011/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000110000100/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000110000101/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000110000110/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000110000111/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000110001000/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000111100110/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000100010100/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000001000011111/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000111110010/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000001000000111/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000111110011/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000111110100/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000111110101/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000011010000/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000111111001/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000111111000/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000000110011001/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010010101000001000101010/) { $registry = "Sweden Military"; }   # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^010010110/) { $registry = "Switzerland";
    if    ($binary_plane_id =~ m/^010010110111/) { $registry = "Switzerland Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^011101111/) { $registry = "Syria"; }   # Syrian Arab Republic

  elsif   ($binary_plane_id =~ m/^100010000/) { $registry = "Thailand";
    if    ($binary_plane_id =~ m/^100010000101001100110011/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000010001001001000/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110100011/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110110000/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010000000001/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000011101011000001/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000000000100111/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000000000101100/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110100111/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110101000/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110101001/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110101010/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110101011/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110101100/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110101101/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110101110/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000010110101111/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000000001001001/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000101001100110010/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000001110001100001/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000001110001100010/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000001110001100011/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000001110001100100/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010000000110110110110/) { $registry = "Thailand Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000000101/) { $registry = "Tunisia"; }

  elsif   ($binary_plane_id =~ m/^010010111/) { $registry = "Turkey";
    if    ($binary_plane_id =~ m/^0100101110000010/) { $registry = "Turkey Military"; }  # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^010100001/) { $registry = "Ukraine"; }

  elsif   ($binary_plane_id =~ m/^000011011/) { $registry = "Venezuela";
    if    ($binary_plane_id =~ m/^000011011000000000110010/) { $registry = "Venezuela Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011011000000001100000/) { $registry = "Venezuela Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000011011000000001101100/) { $registry = "Venezuela Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^100010001/) { $registry = "Viet Nam"; }

  elsif   ($binary_plane_id =~ m/^010011000/) { $registry = "Serbia";  # Was Yugoslavia
    if    ($binary_plane_id =~ m/^010011000000000101010101/) { $registry = "Serbia Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^111100000/) { $registry = "ICAO(1) Temp. Address"; }



  #
  # 12-bit addresses (column "4096" in the table):
  # ----------------------------------------------
  elsif   ($binary_plane_id =~ m/^011100000000/) { $registry = "Afghanistan"; }

  elsif   ($binary_plane_id =~ m/^000010010000/) { $registry = "Angola"; }

  elsif   ($binary_plane_id =~ m/^000010101000/) { $registry = "Bahamas";
    if    ($binary_plane_id =~ m/^000010101000000000100001/) { $registry = "Bahamas Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^100010010100/) { $registry = "Bahrain";
    if    ($binary_plane_id =~ m/^100010010100000000010001/) { $registry = "Bahrain Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010010100000000010110/) { $registry = "Bahrain Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^011100000010/) { $registry = "Bangladesh";
    if    ($binary_plane_id =~ m/^011100000010110000000010/) { $registry = "Bangladesh Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100000010110000000011/) { $registry = "Bangladesh Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100000010110000000100/) { $registry = "Bangladesh Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^111010010100/) { $registry = "Bolivia";
    if    ($binary_plane_id =~ m/^111010010100000011111010/) { $registry = "Bolivia Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111010010100000100000100/) { $registry = "Bolivia Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000010011100/) { $registry = "Burkina Faso"; }

  elsif   ($binary_plane_id =~ m/^000000110010/) { $registry = "Burundi"; }

  elsif   ($binary_plane_id =~ m/^011100001110/) { $registry = "Cambodia"; }

  elsif   ($binary_plane_id =~ m/^000000110100/) { $registry = "Cameroon";
    if    ($binary_plane_id =~ m/^000000110100010001000011/) { $registry = "Cameroon Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000110100010001000101/) { $registry = "Cameroon Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000001101100/) { $registry = "Central African Rep."; }    # Central African Republic

  elsif   ($binary_plane_id =~ m/^000010000100/) { $registry = "Chad"; }

  elsif   ($binary_plane_id =~ m/^111010000000/) { $registry = "Chile";
    if    ($binary_plane_id =~ m/^1110100000000110/) { $registry = "Chile Military"; }    # Per Countries.dat file
  }

  elsif   ($binary_plane_id =~ m/^000010101100/) { $registry = "Colombia";
    if    ($binary_plane_id =~ m/^000010101100000000000101/) { $registry = "Columbia Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000010101100000000111011/) { $registry = "Columbia Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000010101100000001100110/) { $registry = "Columbia Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000010101100000001100111/) { $registry = "Columbia Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000010101100000001110001/) { $registry = "Columbia Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000010101100000100001100/) { $registry = "Columbia Military"; }    # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000010101100000000110110/) { $registry = "Columbia Military"; }    # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000010001100/) { $registry = "Congo DRC"; } # Democratic Republic of the Congo

  elsif   ($binary_plane_id =~ m/^000000110110/) { $registry = "Congo ROC"; }

  elsif   ($binary_plane_id =~ m/^000010101110/) { $registry = "Costa Rica"; }

  elsif   ($binary_plane_id =~ m/^000000111000/) { $registry = "Cote d Ivoire"; }

  elsif   ($binary_plane_id =~ m/^000010110000/) { $registry = "Cuba"; }

  elsif   ($binary_plane_id =~ m/^000011000100/) { $registry = "Dominican Republic"; }

  elsif   ($binary_plane_id =~ m/^111010000100/) { $registry = "Ecuador";
    if    ($binary_plane_id =~ m/^111010000100000000110101/) { $registry = "Ecuador Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^111010000100000000110000/) { $registry = "Ecuador Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000010110010/) { $registry = "El Salvador"; }

  elsif   ($binary_plane_id =~ m/^000001000010/) { $registry = "Equatorial Guinea"; }

  elsif   ($binary_plane_id =~ m/^000001000000/) { $registry = "Ethiopia"; }

  elsif   ($binary_plane_id =~ m/^110010001000/) { $registry = "Fiji"; }

  elsif   ($binary_plane_id =~ m/^000000111110/) { $registry = "Gabon"; }

  elsif   ($binary_plane_id =~ m/^000010011010/) { $registry = "Gambia"; }

  elsif   ($binary_plane_id =~ m/^000001000100/) { $registry = "Ghana"; }

  elsif   ($binary_plane_id =~ m/^000010110100/) { $registry = "Guatemala"; }

  elsif   ($binary_plane_id =~ m/^000001000110/) { $registry = "Guinea"; }

  elsif   ($binary_plane_id =~ m/^000010110110/) { $registry = "Guyana"; }

  elsif   ($binary_plane_id =~ m/^000010111000/) { $registry = "Haiti"; }

  elsif   ($binary_plane_id =~ m/^000010111010/) { $registry = "Honduras"; }

  elsif   ($binary_plane_id =~ m/^010011001100/) { $registry = "Iceland"; }

  elsif   ($binary_plane_id =~ m/^010011001010/) { $registry = "Ireland";
    if    ($binary_plane_id =~ m/^010011001010000000100011/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000100111110/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000100111111/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000101011000/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001000000100/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000111100111/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000111101000/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000111101001/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000111101010/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000111101011/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000111101100/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000111101101/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010000111101110/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001010001100/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001010001011/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001100011010/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001100011110/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001100110000/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001100110001/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001100110010/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001100110101/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010011001010001100110110/) { $registry = "Ireland Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000010111110/) { $registry = "Jamaica"; }

  elsif   ($binary_plane_id =~ m/^000001001100/) { $registry = "Kenya"; }

  elsif   ($binary_plane_id =~ m/^011100000110/) { $registry = "Kuwait"; }

  elsif   ($binary_plane_id =~ m/^011100001000/) { $registry = "Laos"; }    # Lao People's Democratic Republic

  elsif   ($binary_plane_id =~ m/^000001010000/) { $registry = "Liberia"; }

  elsif   ($binary_plane_id =~ m/^000001010100/) { $registry = "Madagascar"; }

  elsif   ($binary_plane_id =~ m/^000001011000/) { $registry = "Malawi"; }

  elsif   ($binary_plane_id =~ m/^000001011100/) { $registry = "Mali"; }

  elsif   ($binary_plane_id =~ m/^000000000110/) { $registry = "Mozambique"; }

  elsif   ($binary_plane_id =~ m/^011100000100/) { $registry = "Myanmar"; }

  elsif   ($binary_plane_id =~ m/^011100001010/) { $registry = "Nepal"; }

  elsif   ($binary_plane_id =~ m/^000011000000/) { $registry = "Nicaragua"; }

  elsif   ($binary_plane_id =~ m/^000001100010/) { $registry = "Niger"; }

  elsif   ($binary_plane_id =~ m/^000001100100/) { $registry = "Nigeria";
    if    ($binary_plane_id =~ m/^000001100100000001010001/) { $registry = "Nigeria Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001100100000011110000/) { $registry = "Nigeria Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000011000010/) { $registry = "Panama";
    if    ($binary_plane_id =~ m/^000011000010000001001110/) { $registry = "Panama Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^100010011000/) { $registry = "Papua New Guinea"; }

  elsif   ($binary_plane_id =~ m/^111010001000/) { $registry = "Paraguay"; }

  elsif   ($binary_plane_id =~ m/^111010001100/) { $registry = "Peru";
    if    ($binary_plane_id =~ m/^111010001100000000000111/) { $registry = "Peru Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000001101110/) { $registry = "Rwanda"; }

  elsif   ($binary_plane_id =~ m/^000001110000/) { $registry = "Senegal"; }

  elsif   ($binary_plane_id =~ m/^000001111000/) { $registry = "Somalia"; }

  elsif   ($binary_plane_id =~ m/^000001111100/) { $registry = "Sudan"; }

  elsif   ($binary_plane_id =~ m/^000011001000/) { $registry = "Suriname"; }

  elsif   ($binary_plane_id =~ m/^000010001000/) { $registry = "Togo"; }

  elsif   ($binary_plane_id =~ m/^000011000110/) { $registry = "Trinidad and Tobago"; }

  elsif   ($binary_plane_id =~ m/^000001101000/) { $registry = "Uganda"; }

  elsif   ($binary_plane_id =~ m/^100010010110/) { $registry = "United Arab Emirates";
    if    ($binary_plane_id =~ m/^100010010110110000/) { $registry = "United Arab Emirates Military"; } # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^100010010110000100100110/) { $registry = "United Arab Emirates Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010010110000000101001/) { $registry = "United Arab Emirates Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010010110000000101010/) { $registry = "United Arab Emirates Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010010110000000101011/) { $registry = "United Arab Emirates Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010010110000000101110/) { $registry = "United Arab Emirates Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^100010010110000000101100/) { $registry = "United Arab Emirates Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^000010000000/) { $registry = "Tanzania"; } # United Republic of Tanzania

  elsif   ($binary_plane_id =~ m/^111010010000/) { $registry = "Uruguay"; }

  elsif   ($binary_plane_id =~ m/^100010010000/) { $registry = "Yemen"; }

  elsif   ($binary_plane_id =~ m/^000010001010/) { $registry = "Zambia"; }



  # 14-bit addresses (column "1024" in the table):
  # ----------------------------------------------
  elsif   ($binary_plane_id =~ m/^01010000000100/) { $registry = "Albania"; }

  elsif   ($binary_plane_id =~ m/^00001100101000/) { $registry = "Antigua and Barbuda"; }

  elsif   ($binary_plane_id =~ m/^01100000000000/) { $registry = "Armenia"; }

  elsif   ($binary_plane_id =~ m/^01100000000010/) { $registry = "Azerbaijan";
    if    ($binary_plane_id =~ m/^011000000000100000000001/) { $registry = "Azerbaijan Military"; }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^00001010101000/) { $registry = "Barbados"; }

  elsif   ($binary_plane_id =~ m/^01010001000000/) { $registry = "Belarus"; }

  elsif   ($binary_plane_id =~ m/^00001010101100/) { $registry = "Belize"; }

  elsif   ($binary_plane_id =~ m/^00001001010000/) { $registry = "Benin"; }

  elsif   ($binary_plane_id =~ m/^01101000000000/) { $registry = "Bhutan"; }

  elsif   ($binary_plane_id =~ m/^01010001001100/) { $registry = "Bosnia and Herzegovina"; }

  elsif   ($binary_plane_id =~ m/^00000011000000/) { $registry = "Botswana";
    if    ($binary_plane_id =~ m/^000000110000000000010010/) { $registry = "Botswana Military" }  # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000000110000000000011010/) { $registry = "Botswana Military" }  # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^10001001010100/) { $registry = "Brunei Darussalam"; }

  elsif   ($binary_plane_id =~ m/^00001001011000/) { $registry = "Cape Verde"; }

  elsif   ($binary_plane_id =~ m/^00000011010100/) { $registry = "Comoros"; }

  elsif   ($binary_plane_id =~ m/^10010000000100/) { $registry = "Cook Islands"; }

  elsif   ($binary_plane_id =~ m/^01010000000111/) { $registry = "Croatia";
    if    ($binary_plane_id =~ m/^010100000001110100010011/) { $registry = "Croatia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010100000001111110000101/) { $registry = "Croatia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010100000001111110000110/) { $registry = "Croatia Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^01001100100000/) { $registry = "Cyprus"; }

  elsif   ($binary_plane_id =~ m/^00001001100000/) { $registry = "Djibouti"; }

  elsif   ($binary_plane_id =~ m/^00100000001000/) { $registry = "Eritrea"; }

  elsif   ($binary_plane_id =~ m/^01010001000100/) { $registry = "Estonia"; }

  elsif   ($binary_plane_id =~ m/^01010001010000/) { $registry = "Georgia"; }

  elsif   ($binary_plane_id =~ m/^00001100110000/) { $registry = "Grenada"; }

  elsif   ($binary_plane_id =~ m/^00000100100000/) { $registry = "Guinea-Bissau"; }

  elsif   ($binary_plane_id =~ m/^01101000001100/) { $registry = "Kazakhstan"; }

  elsif   ($binary_plane_id =~ m/^11001000111000/) { $registry = "Kiribati"; }

  elsif   ($binary_plane_id =~ m/^01100000000100/) { $registry = "Kyrgyzstan"; }

  elsif   ($binary_plane_id =~ m/^01010000001011/) { $registry = "Latvia"; }

  elsif   ($binary_plane_id =~ m/^00000100101000/) { $registry = "Lesotho"; }

  elsif   ($binary_plane_id =~ m/^01010000001111/) { $registry = "Lithuania";
    if    ($binary_plane_id =~ m/^010100000011111111010010/) { $registry = "Lithuania Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010100000011111111010011/) { $registry = "Lithuania Military"; }   # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^01001101000000/) { $registry = "Luxembourg";
    if    ($binary_plane_id =~ m/^0100110100000011110/) { $registry = "NATO"; }   # Per Countries.dat file (In Luxembourg block)
  }

  # Also see NATO in the Luxembourg block above
  elsif   ($binary_plane_id =~ m/^010001110111111111110001/) { $registry = "NATO Military"; } # Per Countries.dat file (specific plane)
  elsif   ($binary_plane_id =~ m/^010001110111111111110010/) { $registry = "NATO Military"; } # Per Countries.dat file (specific plane)
  elsif   ($binary_plane_id =~ m/^010001110111111111110011/) { $registry = "NATO Military"; } # Per Countries.dat file (specific plane)


  elsif   ($binary_plane_id =~ m/^00000101101000/) { $registry = "Maldives"; }

  elsif   ($binary_plane_id =~ m/^01001101001000/) { $registry = "Malta";
    if    ($binary_plane_id =~ m/^010011010010000001011000/) { $registry = "Malta Military"; }   # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^10010000000000/) { $registry = "Marshall Islands"; }

  elsif   ($binary_plane_id =~ m/^00000101111000/) { $registry = "Mauritania"; }

  elsif   ($binary_plane_id =~ m/^00000110000000/) { $registry = "Mauritius"; }

  elsif   ($binary_plane_id =~ m/^01101000000100/) { $registry = "Micronesia"; }   # Micronesia, Federated States of

  elsif   ($binary_plane_id =~ m/^01001101010000/) { $registry = "Monaco"; }

  elsif   ($binary_plane_id =~ m/^01101000001000/) { $registry = "Mongolia"; }

  elsif   ($binary_plane_id =~ m/^01010001011000/) { $registry = "Montenegro"; } # Per Countries.dat file

  elsif   ($binary_plane_id =~ m/^00100000000100/) { $registry = "Namibia"; }

  elsif   ($binary_plane_id =~ m/^11001000101000/) { $registry = "Nauru"; }

  elsif   ($binary_plane_id =~ m/^01110000110000/) { $registry = "Oman";
    if    ($binary_plane_id =~ m/^01110000110000000111/) { $registry = "Oman Military"; }   # Per Countries.dat file
    elsif ($binary_plane_id =~ m/^011100001100000010001100/) { $registry = "Oman Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^011100001100000010001011/) { $registry = "Oman Military"; }   # Per Countries.dat file (specific plane)
 
  }

  elsif   ($binary_plane_id =~ m/^01101000010000/) { $registry = "Palau"; }

  elsif   ($binary_plane_id =~ m/^00000110101000/) { $registry = "Qatar";
    if    ($binary_plane_id =~ m/^000001101010001001001010/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010001001001011/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010001001001100/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010001001001101/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010000011011001/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010000011011010/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010001001001000/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010001001001001/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010001001010101/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^000001101010001001010110/) { $registry = "Qatar Military"; }   # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^01010000010011/) { $registry = "Moldova"; }   # Republic of Moldova

  elsif   ($binary_plane_id =~ m/^11001000110000/) { $registry = "Saint Lucia"; }

  elsif   ($binary_plane_id =~ m/^00001011110000/) { $registry = "Saint Vincent and the Grenadines"; }

  elsif   ($binary_plane_id =~ m/^10010000001000/) { $registry = "Samoa"; }

  elsif   ($binary_plane_id =~ m/^01010000000000/) { $registry = "San Marino"; }

  elsif   ($binary_plane_id =~ m/^00001001111000/) { $registry = "Sao Tome and Principe"; }

  elsif   ($binary_plane_id =~ m/^00000111010000/) { $registry = "Seychelles"; }

  elsif   ($binary_plane_id =~ m/^00000111011000/) { $registry = "Sierra Leone"; }

  elsif   ($binary_plane_id =~ m/^01010000010111/) { $registry = "Slovakia";
    if    ($binary_plane_id =~ m/^010100000101111101101100/) { $registry = "Slovakia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010100000101111101100011/) { $registry = "Slovakia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010100000101111101100001/) { $registry = "Slovakia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010100000101111101100010/) { $registry = "Slovakia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010100000101111101101010/) { $registry = "Slovakia Military"; } # Per Countries.dat file (specific plane)
    elsif ($binary_plane_id =~ m/^010100000101111101101000/) { $registry = "Slovakia Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^01010000011011/) { $registry = "Slovenia";
    if    ($binary_plane_id =~ m/^0101000001101111/) { $registry = "Slovenia Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^10001001011100/) { $registry = "Solomon Islands"; }

  elsif   ($binary_plane_id =~ m/^00000111101000/) { $registry = "Swaziland"; }

  elsif   ($binary_plane_id =~ m/^01010001010100/) { $registry = "Tajikistan"; }

  elsif   ($binary_plane_id =~ m/^01010001001000/) { $registry = "Macedonia"; } # The former Yugoslav Republic of Macedonia

  elsif   ($binary_plane_id =~ m/^11001000110100/) { $registry = "Tonga"; }

  elsif   ($binary_plane_id =~ m/^01100000000110/) { $registry = "Turkmenistan";
    if    ($binary_plane_id =~ m/^011000000001100001100010/) { $registry = "Turkmenistan Military"; } # Per Countries.dat file (specific plane)
  }

  elsif   ($binary_plane_id =~ m/^01010000011111/) { $registry = "Uzbekistan"; }

  elsif   ($binary_plane_id =~ m/^11001001000000/) { $registry = "Vanuatu"; }

  elsif   ($binary_plane_id =~ m/^00000000010000/) { $registry = "Zimbabwe"; }

  elsif   ($binary_plane_id =~ m/^10001001100100/) { $registry = "Taiwan";   # Per Countries.dat file (In ICAO(2) Flight Safety block below)
    if    ($binary_plane_id =~ m/^100010011001000101100000/) { $registry = "Taiwan Military"; } # Per Countries.dat file (specific plane)
  }
  elsif   ($binary_plane_id =~ m/^10001001100100/) { $registry = "ICAO(2) Flight Safety"; }

  elsif   ($binary_plane_id =~ m/^11110000100100/) { $registry = "ICAO(2) Flight Safety"; }

# NOTE: ICAO blocks are different in Countries.dat file


  #
  # Blocks of addresses for anything that hasn't matched so far, from <http://www.kloth.net/radio/icao24alloc.php> :
  # ------------------------------------------------------------
  elsif   ($binary_plane_id =~ m/^00100/)  { $registry = "Africa Region"; }                   # AFI Region
  elsif   ($binary_plane_id =~ m/^00101/)  { $registry = "South America Region"; }            # SAM Region
  elsif   ($binary_plane_id =~ m/^0101/)   { $registry = "Europe/North Atlantic Regions"; }   # EUR and NAT Regions
  elsif   ($binary_plane_id =~ m/^01100/)  { $registry = "Middle East Region"; }              # MID Region
  elsif   ($binary_plane_id =~ m/^01101/)  { $registry = "Asia Region"; }                     # ASIA Region
  elsif   ($binary_plane_id =~ m/^1001/)   { $registry = "North America/Pacific Regions"; }   # NAM and PAC Regions
  elsif   ($binary_plane_id =~ m/^111011/) { $registry = "Carribean Region"; }                # CAR Region
  elsif   ($binary_plane_id =~ m/^1011/)   { $registry = "Country Code RESERVED"; }           # Reserved for future use
  elsif   ($binary_plane_id =~ m/^1101/)   { $registry = "Country Code RESERVED"; }           # Reserved for future use
  elsif   ($binary_plane_id =~ m/^1111/)   { $registry = "Country Code RESERVED"; }           # Reserved for future use
  elsif   ($binary_plane_id =~ m/^000000000000000000000000/) { $registry = "Country Code DISALLOWED"; }   # Shall not be assigned
  elsif   ($binary_plane_id =~ m/^111111111111111111111111/) { $registry = "Country Code DISALLOWED"; }   # Shall not be assigned


 
  # Parse altitude if MSG Type 2, 3, 5, 6, or 7, save in hash.
  $print2 = "       ";
  if (    $fields[1] == 2
       || $fields[1] == 3
       || $fields[1] == 5
       || $fields[1] == 6
       || $fields[1] == 7 ) {

    if ( defined($fields[11])
         && $fields[11] ne ""
         && $fields[11] ne 0 ) {

      $old = "";
      if (defined($altitude{$plane_id})) {
        $old = $altitude{$plane_id};
      }

      # Save new altitude
      $altitude{$plane_id} = sprintf("%06d", $fields[11]);

      if ($old ne $altitude{$plane_id}) {
        $print2 = sprintf("%5sft", $fields[11]);
        $newdata{$plane_id}++;  # Found a new altitude!
      }
    }
  }


  # Parse ground speed and track if MSG Type 2 or 4, save in hash.
  $print3 = "     ";
  $print4 = "    ";
  if ( $fields[1] ==  4 || $fields[1] == 2 ) {

    if ( defined($fields[12]) && $fields[12] ne "" ) {

      $old = "";
      if (defined($groundspeed{$plane_id})) {
        $old = $groundspeed{$plane_id};
      }

      # Save new ground speed
      $groundspeed{$plane_id} = $fields[12];

      if ($old ne $groundspeed{$plane_id}) {
        $print3 = sprintf("%3skn", $fields[12]);
        $newdata{$plane_id}++;  # Found a new ground speed!
      }
    }

    if ( defined($fields[13]) && $fields[13] ne "" ) {

      $old = "";
      if (defined($track{$plane_id})) {
        $old = $track{$plane_id};
      }

      # Save new track
      $track{$plane_id} = $fields[13];

      if ($old ne $track{$plane_id}) {
        $print4 = sprintf("%3s°", $fields[13]);
        $newdata{$plane_id}++;  # Found a new track!
      }
    }
  }


  # Parse lat/long if MSG Type 2 or 3, save in hash.
  $print5 = "                 ";
  if (  ( $fields[1] == 2 || $fields[1] == 3 )
       && defined($fields[14]) && $fields[14] ne ""
       && defined($fields[15]) && $fields[15] ne "" ) {

    $oldlat = "";
    if (defined($lat{$plane_id})) {
      $oldlat = $lat{$plane_id};
    }

    $lat = $fields[14] * 1.0;
    if ($lat >= 0.0) {
      $NS = 'N';
    } else {
      $NS = 'S';
      $lat = abs($lat);
    }
    $latdeg = int($lat);
    $latmins = $lat - $latdeg;
    $latmins2 = $latmins * 60.0;
    # Save new latitude
    $lat{$plane_id} = sprintf("%02d%05.2f%s", $latdeg, $latmins2, $NS);

    $oldlon = "";
    if (defined($lon{$plane_id})) {
      $oldlon = $lon{$plane_id};
    }

    $lon = $fields[15] * 1.0;
    if ($lon >= 0.0) {
      $EW = 'E';
    } else {
      $EW = 'W';
      $lon = abs($lon);
    }
    $londeg = int($lon);
    $lonmins = $lon - $londeg;
    $lonmins2 = $lonmins * 60.0;
    # Save new longitude
    $lon{$plane_id} = sprintf("%03d%05.2f%s", $londeg, $lonmins2, $EW);

    if ( ($oldlat ne $lat{$plane_id}) || ($oldlon ne $lon{$plane_id}) ) {
      $print5 = sprintf("%8s,%9s", $lat{$plane_id},$lon{$plane_id});

      # Save most recent posit time
      $last_posit_time{$plane_id} = time();

      $newdata{$plane_id}++;    # Found a new lat/lon!

      # Tactical callsign:
      # Have new lat/lon. Check whether we have a tactical call
      # already defined. If not, assign one that includes
      # the plane_id and the country of registration.
      if ( !defined($tactical{$plane_id}) ) {

        # Assign tactical call = $plane_id + registry
        # Max tactical call in Xastir is 57 chars (56 + terminator?)
        #
        $tactical{$plane_id} = $plane_id . " (" . $registry . ")";
        $tactical{$plane_id} =~ s/\s+/ /g; # Change multiple spaces to one
        $aprs = $xastir_user . '>' . "APRS::TACTICAL :" . $plane_id . "=" . $tactical{$plane_id};

        $print6 = sprintf("%-18s", $tactical{$plane_id});
        print("$print1  $print2  $print3  $print4  $print6  $aprs\n");

        # xastir_udp_client  <hostname> <port> <callsign> <passcode> {-identify | [-to_rf] <message>}
        $result = `$udp_client $xastir_host $xastir_port $xastir_user $xastir_pass \"$aprs\"`;
        if ($result =~ m/NACK/) {
          die "Received NACK from Xastir: Callsign/Passcode don't match?\n";
        }

        if ($enable_logging == 1) {
          `echo \"$aprs\" >> $log_file`;
        }

      }
    }
  }


  # Save tail or flight number in hash if MSG Type 1 or "ID" sentence.
  if (    ($fields[0] eq "ID" || $fields[1] ==  1)
       && defined($fields[10])
       && $fields[10] ne "????????"
       && $fields[10] ne ""
       && !($fields[10] =~ m/^\s+$/) ) {

    $old = "";
    if (defined($tail{$plane_id})) {
      $old = $tail{$plane_id}; 
    }

    # Save new tail number or flight number, assign tactical call
    $temp_tail = $fields[10];
    $temp_tail =~ s/[^a-zA-Z0-9,]//g; # Filter out all but alphanumeric chars
    $tail{$plane_id} = $temp_tail;
    $tail{$plane_id} =~ s/\s//g;    # Remove spaces

    if ($old ne $tail{$plane_id}) {
      $print6 = sprintf("%-18s", $temp_tail);
      $newdata{$plane_id}++;    # Found a new tail or flight number!
 
      # Assign tactical call = tail number or flight number + registry (if defined)
      # Max tactical call in Xastir is 57 chars (56 + terminator?)
      #
      $tactical{$plane_id} = $temp_tail;
      if ($registry ne "Registry?") {
        $tactical{$plane_id} = $temp_tail . " (" . $registry . ")";
        $tactical{$plane_id} =~ s/\s+/ /g; # Change multiple spaces to one
      }
      $aprs = $xastir_user . '>' . "APRS::TACTICAL :" . $plane_id . "=" . $tactical{$plane_id};

      print("$print1  $print2  $print3  $print4  $print6  $aprs\n");
 
      # xastir_udp_client  <hostname> <port> <callsign> <passcode> {-identify | [-to_rf] <message>}
      $result = `$udp_client $xastir_host $xastir_port $xastir_user $xastir_pass \"$aprs\"`;
      if ($result =~ m/NACK/) {
        die "Received NACK from Xastir: Callsign/Passcode don't match?\n";
      }

      if ($enable_logging == 1) {
        `echo \"$aprs\" >> $log_file`;
      }

    }
  }


  $squawk_txt = "";
  if ( defined($fields[17]) && ($fields[17] ne "") ) {

    $old = "";
    if (defined($squawk{$plane_id})) {
      $old = $squawk{$plane_id};
    }
    $squawk{$plane_id} = $fields[17];
 
    if ($old ne $squawk{$plane_id}) {
      $newdata{$plane_id}++;    # Found a new squawk!
    }
  }
  if (defined($squawk{$plane_id})) {
    $squawk_txt = sprintf(" SQUAWK=%04d", $squawk{$plane_id}); 
  }
 


  $emerg_txt = "";
  $emergency = "0";
  if ( defined($fields[19]) ) {
    $emergency = $fields[19];
  }
  if ( $emergency eq "-1" ) {       # Emergency of some type
    $emerg_txt = " EMERGENCY=";     # Keyword triggers Xastir's emergency mode!!!
 
    # Check squawk code
    if ( defined($squawk{$plane_id}) ) {
      if ($squawk{$plane_id} eq "7500") {        # Unlawful Interference (hijacking)
        $emerg_txt = $emerg_txt . "Hijacking";
      }
      if ($squawk{$plane_id} eq "7600") {        # Communications failure/problems
        $emerg_txt = $emerg_txt . "Comms_Failure";
      }
      if ($squawk{$plane_id} eq "7700") {        # General Emergency
        $emerg_txt = $emerg_txt . "General";
      }
    }
    $newdata{$plane_id}++;
  }


  $onGroundTxt = "";
  if ( defined($fields[21]) ) {
    $onGround = $fields[21];
    if ($onGround eq "-1") {
      $onGroundTxt = " On_Ground";
      $newdata{$plane_id}++;
    }
  }
 

  $newtrack = "360";
  if ( defined($track{$plane_id}) ) {
    if ($track{$plane_id} == 0) {
      $newtrack = "360";
    }
    else {
      $newtrack = sprintf("%03d", $track{$plane_id} );
    }
  }

  $newspeed = "000";
  if ( defined ($groundspeed{$plane_id}) ) {
    $newspeed = sprintf("%03d", $groundspeed{$plane_id} );
    if ( ($groundspeed{$plane_id} > 0) && ($groundspeed{$plane_id} < 57) ) {
      $symbol = "X";  # Switch to helicopter symbol
    }
    if ($groundspeed{$plane_id} > 126) {
      $symbol = "^";  # Switch to large aircraft symbol
    } 
  }

  $newtail = "";
  if ( defined($tail{$plane_id}) ) {
    $newtail = " $tail{$plane_id}";
  }

  # Auto-switch the symbol based on speed/altitude.
  # Symbols:
  #   Small airplane = /'
  #       Helicopter = /X 
  #   Large aircraft = /^
  #         Aircraft = \^ (Not used in this script)
  #
  #  Cessna 150:  57 knots minimum.
  # Twin Cessna: 215 knots maximum.
  #  UH-1N Huey: 110 knots maximum.
  # Landing speed Boeing 757: 126 knots.
  #
  # If <= 10000 feet and  1 -  56 knots: Helicopter
  # If <= 20000 feet and 57 - 125 knots: Small aircraft
  # If >  20000 feet                   : Large aircraft
  # if                      > 126 knots: Large aircraft
  #
  $symbol = "'"; # Start with small aircraft symbol
 
  $newalt = "";
  if ( defined($altitude{$plane_id}) ) {
    $newalt = " /A=$altitude{$plane_id}";

    if ($altitude{$plane_id} > 20000) {
      $symbol = "^";  # Switch to large aircraft symbol
    }
    elsif ($symbol eq "^") {
      # Do nothing, already switched to large aircraft due to speed
    }
    elsif ($symbol eq "X" && $altitude{$plane_id} > 10000) {
      $symbol = "'";  # Switch to small aircraft from helicopter
    }
  }



  # Above we parsed some message that changed some of our data, send out the
  # new APRS string if we have enough data defined.
  #
  if ( defined($newdata{$plane_id})
       && $newdata{$plane_id} ) {

    # Count percentage of planes with lat/lon out of total planes that have altitude listed.
    # This should show an approximate implementation percentage for ADS-B transponders.
    $alt_planes = 0;
    $lat_planes = 0;
    $print_adsb_percentage = "";
    foreach $key (keys %lat) {
      $lat_planes++;
    }
    foreach $key (keys %altitude) {
      $alt_planes++;
    }
    if ($alt_planes != 0) {
      $adsb_percentage = ( ($lat_planes * 1.0) / $alt_planes) * 100.0;
      $print_adsb_percentage = sprintf("ADS-B:%-1.1f%% ($lat_planes/$alt_planes)", $adsb_percentage);
    }


    # Do we have a lat/lon and is it recent enough?
    if (    defined($lat{$plane_id})
         && defined($lon{$plane_id}) ) {

      #
      # Yes we have a lat/lon
      #

      # Check the age of the lat/lon
      $age = time() - $last_posit_time{$plane_id};
      if ( $age > $plane_TTL ) {
        #
        # We have a lat/lon but it is too old
        #
        $print_age1 = sprintf("(%s%s)", $age, "s");
        $print_age2 = sprintf("%18s", $print_age1);
        $print_aprs = sprintf("%-96s", "$newtail$emerg_txt$squawk_txt$onGroundTxt ($registry)");
        print("$print1  $print2  $print3  $print4  $print_age2 $print_aprs  $print_adsb_percentage\n");
 
      }
      else {
        #
        # We have a recent lat/lon
        #
        $aprs="$xastir_user>APRS:)$plane_id!$lat{$plane_id}/$lon{$plane_id}$symbol$newtrack/$newspeed$newalt$newtail$emerg_txt$squawk_txt$onGroundTxt ($registry)";
        $print_aprs = sprintf("%-95s", $aprs);
        if (    $age > 0                    # Lat/lon is aging a bit
             || $print5 eq "                 " ) {     # Didn't parse lat/lon this time
          $print_age1 = sprintf("%s%s", $age, "s");
          $print_age2 = sprintf("%18s", $print_age1);
          print("$print1  $print2  $print3  $print4  $print_age2  $print_aprs  $print_adsb_percentage\n");
        }
        else {
          print("$print1  $print2  $print3  $print4  $print5  $print_aprs  $print_adsb_percentage\n");
        }

        # xastir_udp_client  <hostname> <port> <callsign> <passcode> {-identify | [-to_rf] <message>}
#        $result = `$udp_client $xastir_host $xastir_port $xastir_user $xastir_pass \"$aprs [Pmin0.0,]\"`;
        $result = `$udp_client $xastir_host $xastir_port $xastir_user $xastir_pass \"$aprs\"`;
        if ($result =~ m/NACK/) {
          die "Received NACK from Xastir: Callsign/Passcode don't match?\n";
        }

        if ($enable_logging == 1) {
          `echo \"$aprs\" >> $log_file`;
        }

      }
    }
    else {
      #
      # No, we have no lat/lon
      #
      $print_age = sprintf("%18s", "-");
      $print_aprs = sprintf("%-96s", "$newtail$emerg_txt$squawk_txt$onGroundTxt ($registry)");
      print("$print1  $print2  $print3  $print4   $print_age$print_aprs  $print_adsb_percentage\n");

      if ($enable_circles == 1) {
        $radius = 10.0; # Set a default of 10 miles
        if ( defined($altitude{$plane_id}) ) {
          $radius = ( ( ($altitude{$plane_id} - $my_alt) / 1000 ) * 2 );  # 40k = 80 miles, 20k = 40 miles, 10k = 20 miles, 1k = 2 miles
        }
        $print_radius = sprintf("%2.1f", $radius);
        $aprs="$xastir_user>APRS:)$plane_id!$my_lat/$my_lon$symbol$newtrack/$newspeed$newalt$newtail$emerg_txt$squawk_txt$onGroundTxt ($registry) [Pmin$print_radius,]";
  #     print "$aprs\n";

        # xastir_udp_client  <hostname> <port> <callsign> <passcode> {-identify | [-to_rf] <message>}
        $result = `$udp_client $xastir_host $xastir_port $xastir_user $xastir_pass \"$aprs\"`;
        if ($result =~ m/NACK/) {
          die "Received NACK from Xastir: Callsign/Passcode don't match?\n";
        }

        if ($enable_logging == 1) {
          `echo \"$aprs\" >> $log_file`;
        }

      }
    }

    # Reset the newdata flag
    $newdata{$plane_id} = 0;
  }


  # Convert altitude to altitude above MSL instead of altitude from a reference barometric reading?
  # Info:  http://forums.flyer.co.uk/viewtopic.php?t=16375
  # How many millibar in 1 feet of air? The answer is 0.038640888 @ 0C (25.879232 ft/mb).
  # How many millibar in 1 foot of air [15 °C]? The answer is 0.036622931 @ 15C (27.3053 ft/mb).
  # Flight Level uses a pressure of 29.92 "Hg (1,013.2 mb).
  # Yesterday the pressure here was about 1013, so the altitudes looked right on. Today the planes
  # are reporting ~500' higher via ADS-B when landing at Paine Field. Turns out the pressure today
  # is 21mb lower, which equates to an additional 573' of altitude reported using the 15C figure!
  # 
  # /A=aaaaaa feet
  # CSE/SPD, i.e. 180/999 (speed in knots, direction is WRT true North), if unknown:  .../...
  # )AIDV#2!4903.50N/07201.75WA
  # ;LEADERVVV*092345z4903.50N/07201.75W>088/036
  # )A19E61!4903.50N/07201.75W' 356/426 /A=29275  # Example Small Airplane Object 


# end of while loop
}

close($socket);


