├── dpp.cot ├── Track.cs ├── protobuf │ ├── status.proto │ ├── group.proto │ ├── track.proto │ ├── precisionlocation.proto │ ├── takmessage.proto │ ├── contact.proto │ ├── takv.proto │ ├── takcontrol.proto │ ├── cotevent.proto │ ├── detail.proto │ └── protocol.txt ├── Status.cs ├── TakControl.cs ├── Group.cs ├── Contact.cs ├── Point.cs ├── PrecisionLocation.cs ├── Takv.cs ├── dpp.cot.csproj ├── Detail.cs ├── CotDescriptions.tt ├── Extensions.cs ├── CotPredicates.tt ├── Message.cs ├── Event.cs ├── CotPredicates.cs └── CotDescriptions.cs ├── readme.md ├── .github └── workflows │ ├── ci.yml │ └── release.yml ├── dpp.cot.Tests ├── GeoTests.cs ├── CotTypeTests.cs ├── dpp.cot.Tests.csproj ├── Helpers.cs └── SerializationTests.cs ├── LICENSE ├── .gitattributes ├── cot.sln └── .gitignore /dpp.cot/Track.cs: -------------------------------------------------------------------------------- 1 | namespace dpp.cot 2 | { 3 | public class Track 4 | { 5 | } 6 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # dpp.cot [![Status](https://github.com/darkplusplus/cot/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/darkplusplus/cot/actions/workflows/ci.yml) 2 | 3 | a library for handling cursor-on-target messages. 4 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/status.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | package atakmap.commoncommo.protobuf.v1; 5 | 6 | // All items are required unless otherwise noted! 7 | // "required" means if they are missing on send, the conversion 8 | // to the message format will be rejected and fall back to opaque 9 | // XML representation 10 | message Status { 11 | uint32 battery = 1; // battery= 12 | } 13 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/group.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | package atakmap.commoncommo.protobuf.v1; 5 | 6 | // All items are required unless otherwise noted! 7 | // "required" means if they are missing on send, the conversion 8 | // to the message format will be rejected and fall back to opaque 9 | // XML representation 10 | message Group { 11 | string name = 1; // name= 12 | string role = 2; // role= 13 | } 14 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/track.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | package atakmap.commoncommo.protobuf.v1; 5 | 6 | // All items are required unless otherwise noted! 7 | // "required" means if they are missing on send, the conversion 8 | // to the message format will be rejected and fall back to opaque 9 | // XML representation 10 | message Track { 11 | double speed = 1; // speed= 12 | double course = 2; // course= 13 | } 14 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/precisionlocation.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | package atakmap.commoncommo.protobuf.v1; 5 | 6 | // All items are required unless otherwise noted! 7 | // "required" means if they are missing on send, the conversion 8 | // to the message format will be rejected and fall back to opaque 9 | // XML representation 10 | message PrecisionLocation { 11 | string geopointsrc = 1; // geopointsrc= 12 | string altsrc = 2; // altsrc= 13 | } 14 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/takmessage.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | import "cotevent.proto"; 5 | import "takcontrol.proto"; 6 | 7 | package atakmap.commoncommo.protobuf.v1; 8 | 9 | // Top level message sent for TAK Messaging Protocol Version 1. 10 | message TakMessage { 11 | // Optional - if omitted, continue using last reported control 12 | // information 13 | TakControl takControl = 1; 14 | 15 | // Optional - if omitted, no event data in this message 16 | CotEvent cotEvent = 2; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/contact.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | package atakmap.commoncommo.protobuf.v1; 5 | 6 | // All items are required unless otherwise noted! 7 | // "required" means if they are missing on send, the conversion 8 | // to the message format will be rejected and fall back to opaque 9 | // XML representation 10 | message Contact { 11 | // Endpoint is optional; if missing/empty do not populate. 12 | string endpoint = 1; // endpoint= 13 | string callsign = 2; // callsign= 14 | } 15 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/takv.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | package atakmap.commoncommo.protobuf.v1; 5 | 6 | // All items are required unless otherwise noted! 7 | // "required" means if they are missing on send, the conversion 8 | // to the message format will be rejected and fall back to opaque 9 | // XML representation 10 | message Takv { 11 | string device = 1; // device= 12 | string platform = 2; // platform= 13 | string os = 3; // os= 14 | string version = 4; // version= 15 | } 16 | -------------------------------------------------------------------------------- /dpp.cot/Status.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using System.Xml.Serialization; 8 | 9 | namespace dpp.cot 10 | { 11 | [ProtoContract()] 12 | public partial class Status : IExtensible 13 | { 14 | private IExtension __pbn__extensionData; 15 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 16 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 17 | 18 | [ProtoMember(1, Name = @"battery")] 19 | [XmlAttribute(AttributeName = "battery")] 20 | public uint Battery { get; set; } 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v2 17 | 18 | - name: Setup .NET 19 | uses: actions/setup-dotnet@v1 20 | with: 21 | dotnet-version: 5.0.x 22 | 23 | - name: Restore dependencies 24 | run: dotnet restore 25 | 26 | - name: Build 27 | run: dotnet build --no-restore 28 | 29 | - name: Test 30 | run: dotnet test --no-build --verbosity normal 31 | 32 | - name: Publish 33 | run: dotnet publish 34 | -------------------------------------------------------------------------------- /dpp.cot/TakControl.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System.ComponentModel; 3 | 4 | namespace dpp.cot 5 | { 6 | [ProtoContract()] 7 | public partial class TakControl : IExtensible 8 | { 9 | private IExtension __pbn__extensionData; 10 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 11 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 12 | 13 | [ProtoMember(1)] 14 | public uint minProtoVersion { get; set; } 15 | 16 | [ProtoMember(2)] 17 | public uint maxProtoVersion { get; set; } 18 | 19 | [ProtoMember(3)] 20 | [DefaultValue("")] 21 | public string contactUid { get; set; } = ""; 22 | } 23 | } -------------------------------------------------------------------------------- /dpp.cot/protobuf/takcontrol.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | package atakmap.commoncommo.protobuf.v1; 5 | 6 | // TAK Protocol control message 7 | // This specifies to a recipient what versions 8 | // of protocol elements this sender supports during 9 | // decoding. 10 | message TakControl { 11 | // Lowest TAK protocol version supported 12 | // If not filled in (reads as 0), version 1 is assumed 13 | uint32 minProtoVersion = 1; 14 | 15 | // Highest TAK protocol version supported 16 | // If not filled in (reads as 0), version 1 is assumed 17 | uint32 maxProtoVersion = 2; 18 | 19 | // UID of the sending contact. May be omitted if 20 | // this message is paired in a TakMessage with a CotEvent 21 | // and the CotEvent contains this information 22 | string contactUid = 3; 23 | } 24 | 25 | -------------------------------------------------------------------------------- /dpp.cot.Tests/GeoTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xunit; 3 | 4 | namespace dpp.cot.Tests 5 | { 6 | public class GeoTests 7 | { 8 | [Fact] 9 | public void DistanceExtensionInMilesTest() 10 | { 11 | var evt = new cot.Event(); 12 | evt.Point.Lat = 36.12; 13 | evt.Point.Lon = -86.67; 14 | 15 | var m = evt.GetDistanceMiles(33.94, -118.4); 16 | Assert.Equal(1793.57342023, Math.Round(m, 8)); 17 | } 18 | 19 | [Fact] 20 | public void DistanceExtensionInKilometersTest() 21 | { 22 | var evt = new cot.Event(); 23 | evt.Point.Lat = 36.12; 24 | evt.Point.Lon = -86.67; 25 | 26 | var km = evt.GetDistanceKilometers(33.94, -118.4); 27 | Assert.Equal(2887.25995061, Math.Round(km, 8)); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /dpp.cot/Group.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using System.Xml.Serialization; 9 | 10 | namespace dpp.cot 11 | { 12 | [ProtoContract()] 13 | public partial class Group : IExtensible 14 | { 15 | private IExtension __pbn__extensionData; 16 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 17 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 18 | 19 | [ProtoMember(1, Name = @"name")] 20 | [DefaultValue("")] 21 | [XmlAttribute(AttributeName = @"name")] 22 | public string Name { get; set; } = ""; 23 | 24 | [ProtoMember(2, Name = @"role")] 25 | [DefaultValue("")] 26 | [XmlAttribute(AttributeName = @"role")] 27 | public string Role { get; set; } = ""; 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /dpp.cot/Contact.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using System.Xml.Serialization; 9 | 10 | namespace dpp.cot 11 | { 12 | [ProtoContract()] 13 | public partial class Contact : IExtensible 14 | { 15 | private IExtension __pbn__extensionData; 16 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 17 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 18 | 19 | [ProtoMember(1, Name = @"endpoint")] 20 | [DefaultValue("")] 21 | [XmlAttribute(AttributeName = "endpoint")] 22 | public string Endpoint { get; set; } = ""; 23 | 24 | [ProtoMember(2, Name = @"callsign")] 25 | [DefaultValue("")] 26 | [XmlAttribute(AttributeName = "callsign")] 27 | public string Callsign { get; set; } = ""; 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /dpp.cot/Point.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using System.Xml.Serialization; 8 | 9 | namespace dpp.cot 10 | { 11 | [XmlRoot(ElementName = "point")] 12 | public class Point 13 | { 14 | [ProtoMember(10, Name = @"lat")] 15 | [XmlAttribute(AttributeName = "lat")] 16 | public double Lat { get; set; } = 0; 17 | 18 | [ProtoMember(11, Name = @"lon")] 19 | [XmlAttribute(AttributeName = "lon")] 20 | public double Lon { get; set; } = 0; 21 | 22 | [ProtoMember(12, Name = @"ce")] 23 | [XmlAttribute(AttributeName = "ce")] 24 | public double Ce { get; set; } = 9999999.0; 25 | 26 | [ProtoMember(13, Name = @"hae")] 27 | [XmlAttribute(AttributeName = "hae")] 28 | public double Hae { get; set; } = 9999999.0; 29 | 30 | [ProtoMember(14, Name = @"le")] 31 | [XmlAttribute(AttributeName = "le")] 32 | public double Le { get; set; } = 9999999.0; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /dpp.cot.Tests/CotTypeTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xunit; 3 | 4 | namespace dpp.cot.Tests 5 | { 6 | public class CotTypeTests 7 | { 8 | [Theory] 9 | [InlineData(Helpers.SimplePayload, "a-.-A-M")] 10 | [InlineData(Helpers.SimplePayload, "a-h-A-M")] 11 | [InlineData(Helpers.SimplePayload, CotPredicates.air)] 12 | [InlineData(Helpers.EudPayload, CotPredicates.ground)] 13 | public void PredicateTest(string corpus, string predicate) 14 | { 15 | var evt = cot.Event.Parse(corpus); 16 | 17 | Assert.True(evt.IsA(predicate)); 18 | } 19 | 20 | [Theory] 21 | [InlineData(Helpers.SimplePayload, "UTILITY (MEDIUM)")] 22 | [InlineData(Helpers.EudPayload, "COMBAT")] 23 | public void DescriptionTest(string corpus, string description) 24 | { 25 | var evt = cot.Event.Parse(corpus); 26 | 27 | Assert.Equal(description, evt.GetDescription()); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /dpp.cot/PrecisionLocation.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using System.Xml.Serialization; 9 | 10 | namespace dpp.cot 11 | { 12 | [ProtoContract()] 13 | public partial class PrecisionLocation : IExtensible 14 | { 15 | private IExtension __pbn__extensionData; 16 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 17 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 18 | 19 | [ProtoMember(1, Name = @"geopointsrc")] 20 | [DefaultValue("")] 21 | [XmlAttribute(AttributeName = "geopointsrc")] 22 | public string Geopointsrc { get; set; } = ""; 23 | 24 | [ProtoMember(2, Name = @"altsrc")] 25 | [DefaultValue("")] 26 | [XmlAttribute(AttributeName = "altsrc")] 27 | public string Altsrc { get; set; } = ""; 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /dpp.cot.Tests/dpp.cot.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | runtime; build; native; contentfiles; analyzers; buildtransitive 14 | all 15 | 16 | 17 | runtime; build; native; contentfiles; analyzers; buildtransitive 18 | all 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 darkplusplus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /dpp.cot/Takv.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System.ComponentModel; 3 | using System.Xml.Serialization; 4 | 5 | namespace dpp.cot 6 | { 7 | [ProtoContract()] 8 | public partial class Takv : IExtensible 9 | { 10 | private IExtension __pbn__extensionData; 11 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 12 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 13 | 14 | [ProtoMember(1, Name = @"device")] 15 | [DefaultValue("")] 16 | [XmlAttribute(AttributeName = "device")] 17 | public string Device { get; set; } = ""; 18 | 19 | [ProtoMember(2, Name = @"platform")] 20 | [DefaultValue("")] 21 | [XmlAttribute(AttributeName = "platform")] 22 | public string Platform { get; set; } = ""; 23 | 24 | [ProtoMember(3, Name = @"os")] 25 | [DefaultValue("")] 26 | [XmlAttribute(AttributeName = "os")] 27 | public string Os { get; set; } = ""; 28 | 29 | [ProtoMember(4, Name = @"version")] 30 | [DefaultValue("")] 31 | [XmlAttribute(AttributeName = "version")] 32 | public string Version { get; set; } = ""; 33 | } 34 | } -------------------------------------------------------------------------------- /dpp.cot.Tests/Helpers.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace dpp.cot.Tests 8 | { 9 | public static class Helpers 10 | { 11 | public const string SimplePayload = @""; 12 | public const string EudPayload = @"<__group name='Blue' role='Team Member'/>"; 13 | } 14 | } -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v2 16 | 17 | - name: Setup .NET 18 | uses: actions/setup-dotnet@v1 19 | with: 20 | dotnet-version: 5.0.x 21 | 22 | - name: Restore dependencies 23 | run: dotnet restore 24 | 25 | - name: Build 26 | run: dotnet build -c Release --no-restore --version-suffix="$GITHUB_REF_NAME.$GITHUB_RUN_NUMBER" 27 | 28 | - name: Publish 29 | run: dotnet publish -c Release --no-build --version-suffix="$GITHUB_REF_NAME.$GITHUB_RUN_NUMBER" 30 | 31 | - name: Pack 32 | run: dotnet pack -c Release --no-build --version-suffix="$GITHUB_REF_NAME.$GITHUB_RUN_NUMBER" 33 | 34 | - name: Upload Artifacts 35 | uses: actions/upload-artifact@v2 36 | with: 37 | name: dpp.cot 38 | path: dpp.cot/bin/*/*.nupkg 39 | 40 | - name: Publish To Nuget 41 | run: dotnet nuget push dpp.cot/bin/Release/*.nupkg -k $NUGET_AUTH_TOKEN -s https://api.nuget.org/v3/index.json 42 | env: 43 | NUGET_AUTH_TOKEN: ${{ secrets.NUGET_SECRET_DPP_COT }} 44 | -------------------------------------------------------------------------------- /dpp.cot/dpp.cot.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 1.0.5.0 6 | 1.0.5.0 7 | 1.0.5 8 | 9 | 10 | 11 | 12 | TextTemplatingFileGenerator 13 | CotDescriptions.cs 14 | 15 | 16 | TextTemplatingFileGenerator 17 | CotPredicates.cs 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | True 28 | True 29 | CotDescriptions.tt 30 | 31 | 32 | True 33 | True 34 | CotPredicates.tt 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/cotevent.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option optimize_for = LITE_RUNTIME; 4 | 5 | package atakmap.commoncommo.protobuf.v1; 6 | 7 | import "detail.proto"; 8 | 9 | // A note about timestamps: 10 | // Uses "timeMs" units, which is number of milliseconds since 11 | // 1970-01-01 00:00:00 UTC 12 | // 13 | // All items are required unless otherwise noted! 14 | // "required" means if they are missing in the XML during outbound 15 | // conversion to protobuf, the message will be 16 | // rejected 17 | message CotEvent { 18 | // 19 | 20 | string type = 1; // 21 | 22 | string access = 2; // optional 23 | string qos = 3; // optional 24 | string opex = 4; // optional 25 | 26 | string uid = 5; // 27 | uint64 sendTime = 6; // converted to timeMs 28 | uint64 startTime = 7; // converted to timeMs 29 | uint64 staleTime = 8; // converted to timeMs 30 | string how = 9; // 31 | 32 | // 33 | double lat = 10; // 34 | double lon = 11; // 35 | double hae = 12; // use 999999 for unknown 36 | double ce = 13; // use 999999 for unknown 37 | double le = 14; // use 999999 for unknown 38 | 39 | // comprises children of 40 | // This is optional - if omitted, then the cot message 41 | // had no data under 42 | Detail detail = 15; 43 | } 44 | 45 | -------------------------------------------------------------------------------- /dpp.cot/Detail.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using System.Xml.Serialization; 9 | 10 | namespace dpp.cot 11 | { 12 | [ProtoContract] 13 | public class Detail : IExtensible 14 | { 15 | private IExtension __pbn__extensionData; 16 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 17 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 18 | 19 | [ProtoMember(1)] 20 | [DefaultValue("")] 21 | public string xmlDetail { get; set; } = ""; 22 | 23 | [ProtoMember(2, Name = @"contact")] 24 | [XmlElement(ElementName = "contact", IsNullable = true)] 25 | public Contact Contact { get; set; } 26 | 27 | [ProtoMember(3, Name = @"group")] 28 | [XmlElement(ElementName = "__group", IsNullable = true)] 29 | public Group Group { get; set; } 30 | 31 | [ProtoMember(4)] 32 | [XmlElement(ElementName = @"precisionlocation", IsNullable = true)] 33 | public PrecisionLocation PrecisionLocation { get; set; } 34 | 35 | [ProtoMember(5, Name = @"status")] 36 | [XmlElement(ElementName = "status", IsNullable = true)] 37 | public Status Status { get; set; } 38 | 39 | [ProtoMember(6, Name = @"takv")] 40 | [XmlElement(ElementName = "takv", IsNullable = true)] 41 | public Takv Takv { get; set; } 42 | 43 | [ProtoMember(7, Name = @"track")] 44 | [XmlElement(ElementName = "track", IsNullable = true)] 45 | public Track Track { get; set; } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /dpp.cot/CotDescriptions.tt: -------------------------------------------------------------------------------- 1 | <#@ template debug="false" hostspecific="true" language="C#" #> 2 | <#@ assembly name="System.Core" #> 3 | <#@ assembly name="System.Xml" #> 4 | <#@ import namespace="System.Linq" #> 5 | <#@ import namespace="System.Text" #> 6 | <#@ import namespace="System.Collections.Generic" #> 7 | <#@ import namespace="System.Text.RegularExpressions" #> 8 | <#@ import namespace="System.Xml.XPath" #> 9 | <#@ output extension=".cs" #> 10 | <# 11 | var f = this.Host.ResolvePath("CoTtypes.xml"); 12 | var doc = new System.Xml.XPath.XPathDocument(f); 13 | var nav = doc.CreateNavigator(); 14 | var nodes = nav.Select("/types/cot"); 15 | #> 16 | using System; 17 | using System.Collections.Generic; 18 | using System.Linq; 19 | using System.Text; 20 | using System.Threading.Tasks; 21 | using System.Text.RegularExpressions; 22 | 23 | namespace dpp.cot 24 | { 25 | public static class CotDescriptions 26 | { 27 | private static readonly Dictionary CotDescriptionsMap = new Dictionary 28 | { 29 | <# 30 | while(nodes.MoveNext()) 31 | { 32 | var cot = nodes.Current.SelectSingleNode("@cot").Value; 33 | var desc = nodes.Current.SelectSingleNode("@desc").Value; 34 | #> 35 | { "<#= cot #>", "<#= desc #>"}, 36 | <# 37 | } 38 | #> 39 | 40 | }; 41 | 42 | public static string GetDescription(this Event e) 43 | { 44 | var t = e.Type; 45 | if (t.StartsWith("a-")) 46 | { 47 | t = t.Remove(2, 1).Insert(2, "."); 48 | } 49 | if (t.StartsWith("b-g-") || t.StartsWith("b-r-")) 50 | { 51 | t = t.Remove(4, 1).Insert(4, "."); 52 | } 53 | 54 | return CotDescriptionsMap.TryGetValue(t, out var value) ? value : "Unknown"; 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /dpp.cot/Extensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Text.RegularExpressions; 6 | using System.Threading.Tasks; 7 | 8 | namespace dpp.cot 9 | { 10 | public static class Extensions 11 | { 12 | public static bool IsA(string p, string t) 13 | { 14 | var regex = new Regex(p); 15 | return regex.Matches(t).Count > 0; 16 | } 17 | 18 | public static bool IsA(this Event e, string p) 19 | { 20 | var regex = new Regex(p); 21 | return regex.Matches(e.Type).Count > 0; 22 | } 23 | 24 | private static double GetDistanceTo(double R, double lat1, double lon1, double lat2, double lon2) 25 | { 26 | // implementaion of the Haversine distance formula 27 | 28 | var rLat1 = Math.PI * lat1 / 180.0; 29 | var rLat2 = Math.PI * lat2 / 180.0; 30 | var rLon1 = Math.PI * lon1 / 180.0; 31 | var rLon2 = Math.PI * lon2 / 180.0; 32 | 33 | var dLat = rLat2 - rLat1; 34 | var dLon = rLon2 - rLon1; 35 | 36 | var d = Math.Asin(Math.Sqrt(Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(rLat1) * Math.Cos(rLat2) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2))); 37 | return 2 * R * d; 38 | } 39 | 40 | public static double GetDistanceMiles(this Event e, double lat, double lon) 41 | { 42 | var rMiles = 3958.8; 43 | return GetDistanceTo(rMiles, e.Point.Lat, e.Point.Lon, lat, lon); 44 | } 45 | public static double GetDistanceKilometers(this Event e, double lat, double lon) 46 | { 47 | var rKilometers = 6372.8; 48 | return GetDistanceTo(rKilometers, e.Point.Lat, e.Point.Lon, lat, lon); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /dpp.cot/CotPredicates.tt: -------------------------------------------------------------------------------- 1 | <#@ template debug="false" hostspecific="true" language="C#" #> 2 | <#@ assembly name="System.Core" #> 3 | <#@ assembly name="System.Xml" #> 4 | <#@ import namespace="System.Linq" #> 5 | <#@ import namespace="System.Text" #> 6 | <#@ import namespace="System.Collections.Generic" #> 7 | <#@ import namespace="System.Text.RegularExpressions" #> 8 | <#@ import namespace="System.Xml.XPath" #> 9 | <#@ output extension=".cs" #> 10 | <# 11 | var f = this.Host.ResolvePath("CoTtypes.xml"); 12 | var doc = new System.Xml.XPath.XPathDocument(f); 13 | var nav = doc.CreateNavigator(); 14 | var nodes = nav.Select("/types/is"); 15 | 16 | var predicates = new Dictionary(); 17 | 18 | var reservedWords = new List(){ "true", "false" }; 19 | 20 | while(nodes.MoveNext()) 21 | { 22 | var what = nodes.Current.SelectSingleNode("@what").Value; 23 | var match = nodes.Current.SelectSingleNode("@match").Value; 24 | 25 | // cleanup dirty characters 26 | what = what.Replace(".", "_"); 27 | what = what.Replace("-", "_"); 28 | what = what.Replace("+", "_"); 29 | 30 | if (reservedWords.Contains(what)) {continue; }; 31 | predicates[what] = match; 32 | } 33 | #> 34 | using System; 35 | using System.Collections.Generic; 36 | using System.Linq; 37 | using System.Text; 38 | using System.Threading.Tasks; 39 | using System.Text.RegularExpressions; 40 | 41 | namespace dpp.cot 42 | { 43 | public static class CotPredicates 44 | { 45 | <# 46 | foreach(var predicate in predicates) 47 | { 48 | #> 49 | public const string <#= predicate.Key #> = "<#= predicate.Value #>"; 50 | <# 51 | } 52 | #> 53 | 54 | // types not in CoTtypes.xml 55 | public const string t_ping = "t-x-c-t"; 56 | public const string t_pong = "t-x-c-t-r"; 57 | public const string t_remote_disconnect = "t-x-d-d"; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /dpp.cot/Message.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace dpp.cot 10 | { 11 | [ProtoContract()] 12 | public partial class Message : IExtensible 13 | { 14 | // versioning bytes for header 15 | // magic|version|magic|data 16 | private const byte magic = 0xef; 17 | private const byte v0_xml = 0x00; 18 | private const byte v1_protobuf = 0x01; 19 | 20 | private IExtension __pbn__extensionData; 21 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 22 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 23 | 24 | [ProtoMember(1)] 25 | public TakControl Control { get; set; } 26 | 27 | [ProtoMember(2)] 28 | public Event Event { get; set; } 29 | 30 | public static Message Parse(byte[] data, int offset, int length) 31 | { 32 | string msg; 33 | Event e; 34 | 35 | if (data[0] == magic && data[2] == magic) 36 | { 37 | switch (data[1]) 38 | { 39 | case v0_xml: 40 | msg = Encoding.UTF8.GetString(data, (int)offset + 3, (int)length); 41 | e = Event.Parse(msg); 42 | 43 | return new Message 44 | { 45 | Event = e, 46 | Control = new TakControl() 47 | { 48 | minProtoVersion = v0_xml, 49 | maxProtoVersion = v0_xml, 50 | contactUid = e.Uid, 51 | } 52 | }; 53 | 54 | case v1_protobuf: 55 | using (var ms = new MemoryStream(data, offset + 3, length)) 56 | { 57 | return ProtoBuf.Serializer.Deserialize(ms); 58 | } 59 | 60 | default: 61 | throw new NotImplementedException($"Unknown protocol version. Version={data[1]:X}"); 62 | } 63 | } 64 | 65 | // No magic bytes detected to specify version, assume it's just utf8 xml 66 | msg = Encoding.UTF8.GetString(data, (int)offset, (int)length); 67 | e = Event.Parse(msg); 68 | 69 | return new Message 70 | { 71 | Event = e, 72 | Control = new TakControl() 73 | { 74 | minProtoVersion = 0, 75 | maxProtoVersion = 0, 76 | contactUid = e.Uid, 77 | } 78 | }; 79 | } 80 | 81 | public string ToXmlString() 82 | { 83 | return this.Event.ToXmlString(); 84 | } 85 | 86 | public byte[] ToXmlBytes() 87 | { 88 | var header = new byte[]{ 89 | magic, 90 | v0_xml, 91 | magic, 92 | }; 93 | var data = Encoding.UTF8.GetBytes(this.Event.ToXmlString()); 94 | 95 | return header.Concat(data).ToArray(); 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/detail.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | option optimize_for = LITE_RUNTIME; 3 | 4 | package atakmap.commoncommo.protobuf.v1; 5 | 6 | import "contact.proto"; 7 | import "group.proto"; 8 | import "precisionlocation.proto"; 9 | import "status.proto"; 10 | import "takv.proto"; 11 | import "track.proto"; 12 | 13 | // CotEvent detail 14 | // The strong typed message fields are optional. If used, they *MUST* adhere 15 | // to the requirements of the message (see their proto file) and 16 | // their XML source element used to populate the message MUST 17 | // be omitted from the xmlDetail. 18 | // WHOLE ELEMENTS MUST BE CONVERTED TO MESSAGES. Do not try to 19 | // put part of the data from a given element into one of the messages 20 | // and put other parts of the data in an element of xmlDetail! This applies 21 | // especially if you add new things to the XML representation which do not 22 | // have a place in the equivalent protobuf message. Instead, omit the 23 | // message and put the entire element in xmlDetail! 24 | // 25 | // xmlDetail is optional. If omitted, all Detail data has been 26 | // converted to the strongly typed message fields. 27 | // If present, this contains any remaining detail data that has NOT been 28 | // included in one of the strongly typed message fields. To process the 29 | // xmlDetail, the following rules MUST be followed: 30 | // Senders of this message MUST: 31 | // 1. Remove child elements used to populate the other message 32 | // fields. If the same child element appears more times than an 33 | // associated message field(s) is intended to encompass, or if any 34 | // error occurs mapping to the message equivalent, do not remove 35 | // the element(s) in question and do not populate the message 36 | // equivalent. 37 | // 2. If no data under remains, STOP - do not populate 38 | // xmlDetail 39 | // 3. Serialize the remaining XML tree under .... 40 | // as XML in UTF-8 encoding 41 | // 4. Remove the and element tags 42 | // 5. Remove the XML header 43 | // 6. Place the result in xmlDetail 44 | // Receivers of this message MUST do the equivalent of the following: 45 | // 1. If the field is not present (zero length), stop - do nothing 46 | // 2. Prepend and append 47 | // 3. Prepend an XML header for UTF-8 encoding, version 1.0 48 | // ( or similar) 49 | // 4. Read the result, expecting a valid XML document with a document 50 | // root of 51 | // 5. Merge in XML equivalents of each of the strongly typed 52 | // messages present in this Detail message. 53 | // In the event that a sending application does not follow 54 | // sending rule #1 above properly and data for the same element 55 | // appears in xmlDetail, the data in xmlDetail should be left alone 56 | // and the data in the equivalent message should ignored. 57 | 58 | message Detail { 59 | string xmlDetail = 1; 60 | 61 | // 62 | Contact contact = 2; 63 | 64 | // <__group> 65 | Group group = 3; 66 | 67 | // 68 | PrecisionLocation precisionLocation = 4; 69 | 70 | // 71 | Status status = 5; 72 | 73 | // 74 | Takv takv = 6; 75 | 76 | // 77 | Track track = 7; 78 | } 79 | -------------------------------------------------------------------------------- /cot.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.6.30114.105 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dpp.cot", "dpp.cot\dpp.cot.csproj", "{325A00C8-CACC-4D0D-8032-A129DF9EED82}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dpp.cot.Tests", "dpp.cot.Tests\dpp.cot.Tests.csproj", "{81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}" 9 | EndProject 10 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8DCEF66B-94E3-4A59-AB9F-48B783F92790}" 11 | ProjectSection(SolutionItems) = preProject 12 | .github\workflows\ci.yml = .github\workflows\ci.yml 13 | readme.md = readme.md 14 | EndProjectSection 15 | EndProject 16 | Global 17 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 18 | Debug|Any CPU = Debug|Any CPU 19 | Debug|x64 = Debug|x64 20 | Debug|x86 = Debug|x86 21 | Release|Any CPU = Release|Any CPU 22 | Release|x64 = Release|x64 23 | Release|x86 = Release|x86 24 | EndGlobalSection 25 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 26 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Debug|x64.ActiveCfg = Debug|Any CPU 29 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Debug|x64.Build.0 = Debug|Any CPU 30 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Debug|x86.ActiveCfg = Debug|Any CPU 31 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Debug|x86.Build.0 = Debug|Any CPU 32 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Release|Any CPU.ActiveCfg = Release|Any CPU 33 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Release|Any CPU.Build.0 = Release|Any CPU 34 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Release|x64.ActiveCfg = Release|Any CPU 35 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Release|x64.Build.0 = Release|Any CPU 36 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Release|x86.ActiveCfg = Release|Any CPU 37 | {325A00C8-CACC-4D0D-8032-A129DF9EED82}.Release|x86.Build.0 = Release|Any CPU 38 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 39 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Debug|Any CPU.Build.0 = Debug|Any CPU 40 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Debug|x64.ActiveCfg = Debug|Any CPU 41 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Debug|x64.Build.0 = Debug|Any CPU 42 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Debug|x86.ActiveCfg = Debug|Any CPU 43 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Debug|x86.Build.0 = Debug|Any CPU 44 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Release|Any CPU.ActiveCfg = Release|Any CPU 45 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Release|Any CPU.Build.0 = Release|Any CPU 46 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Release|x64.ActiveCfg = Release|Any CPU 47 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Release|x64.Build.0 = Release|Any CPU 48 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Release|x86.ActiveCfg = Release|Any CPU 49 | {81EDDD43-F0A3-4122-A3FB-DD37BFEC49C5}.Release|x86.Build.0 = Release|Any CPU 50 | EndGlobalSection 51 | GlobalSection(SolutionProperties) = preSolution 52 | HideSolutionNode = FALSE 53 | EndGlobalSection 54 | GlobalSection(ExtensibilityGlobals) = postSolution 55 | SolutionGuid = {5AA3B346-0660-4C6E-B0B2-FA9A0BAB9D0D} 56 | EndGlobalSection 57 | EndGlobal 58 | -------------------------------------------------------------------------------- /dpp.cot/Event.cs: -------------------------------------------------------------------------------- 1 | using ProtoBuf; 2 | using System; 3 | using System.ComponentModel; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Text.RegularExpressions; 8 | using System.Xml; 9 | using System.Xml.Serialization; 10 | 11 | namespace dpp.cot 12 | { 13 | [ProtoContract] 14 | [XmlRoot(ElementName = "event")] 15 | public partial class Event : IExtensible 16 | { 17 | private IExtension __pbn__extensionData; 18 | IExtension IExtensible.GetExtensionObject(bool createIfMissing) 19 | => Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing); 20 | 21 | [XmlAttribute(AttributeName = "version")] 22 | public string Version { get; set; } 23 | 24 | [ProtoMember(1, Name = @"type")] 25 | [DefaultValue("")] 26 | [XmlAttribute(AttributeName = "type")] 27 | public string Type { get; set; } = ""; 28 | 29 | [ProtoMember(2, Name = @"access")] 30 | [DefaultValue("")] 31 | [XmlAttribute(AttributeName = "access")] 32 | public string Access { get; set; } = ""; 33 | 34 | [ProtoMember(3, Name = @"qos")] 35 | [DefaultValue("")] 36 | [XmlAttribute(AttributeName = "qos")] 37 | public string Qos { get; set; } = ""; 38 | 39 | [ProtoMember(4, Name = @"opex")] 40 | [DefaultValue("")] 41 | [XmlAttribute(AttributeName = "opex")] 42 | public string Opex { get; set; } = ""; 43 | 44 | [ProtoMember(5, Name = @"uid")] 45 | [DefaultValue("")] 46 | [XmlAttribute(AttributeName = "uid")] 47 | public string Uid { get; set; } = ""; 48 | 49 | [ProtoMember(6)] 50 | private ulong _time; 51 | private DateTime time; 52 | [XmlAttribute(AttributeName = "time")] 53 | public DateTime Time 54 | { 55 | get { return time; } 56 | set { time = value; _time = (ulong)time.Ticks; } 57 | } 58 | 59 | [ProtoMember(7)] 60 | private ulong _start; 61 | private DateTime start; 62 | [XmlAttribute(AttributeName = "start")] 63 | public DateTime Start 64 | { 65 | get { return start; } 66 | set { start = value; _start = (ulong)start.Ticks; } 67 | } 68 | 69 | [ProtoMember(8)] 70 | private ulong _stale; 71 | private DateTime stale; 72 | [XmlAttribute(AttributeName = "stale")] 73 | public DateTime Stale 74 | { 75 | get { return stale; } 76 | set { stale = value; _stale = (ulong)stale.Ticks; } 77 | } 78 | 79 | [ProtoMember(9, Name = @"how")] 80 | [DefaultValue("")] 81 | [XmlAttribute(AttributeName = "how")] 82 | public string How { get; set; } = ""; 83 | 84 | [XmlElement(ElementName = "point")] 85 | public Point Point { get; set; } 86 | 87 | [XmlElement(ElementName = "detail", IsNullable = true)] 88 | public Detail Detail { get; set; } 89 | 90 | public Event() 91 | { 92 | Point = new Point(); 93 | Time = DateTime.Now; 94 | Start = DateTime.Now; 95 | Stale = DateTime.Now.AddMinutes(5); 96 | } 97 | 98 | public static Event Pong(Event? ping) 99 | { 100 | var e = ping ?? new Event(); 101 | e.Uid ??= Guid.NewGuid().ToString(); 102 | e.Type = "t-x-c-t-r"; 103 | 104 | return e; 105 | } 106 | 107 | public static Event Parse(string payload) 108 | { 109 | var serializer = new XmlSerializer(typeof(Event)); 110 | using var reader = new StringReader(payload); 111 | return (Event)(serializer.Deserialize(reader)); 112 | } 113 | 114 | public static Event Parse(byte[] payload, int offset, int length) 115 | { 116 | return Parse(Encoding.UTF8.GetString(payload, offset, length)); 117 | } 118 | 119 | public String ToXmlString() 120 | { 121 | // empty namespaces to force serializer to omit them 122 | var ns = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }); 123 | 124 | var settings = new XmlWriterSettings() 125 | { 126 | Indent = false, 127 | OmitXmlDeclaration = true, 128 | ConformanceLevel = ConformanceLevel.Auto, 129 | }; 130 | 131 | using MemoryStream ms = new(); 132 | using (XmlWriter writer = XmlWriter.Create(ms, settings)) 133 | { 134 | var serializer = new XmlSerializer(typeof(Event), ""); 135 | serializer.Serialize(writer, this, ns); 136 | } 137 | 138 | var encoding = new UTF8Encoding(); 139 | var result = encoding.GetString(ms.ToArray()); 140 | 141 | // fix BOM, self closing tags quirk, and namespace from default values 142 | result = result.Replace("\ufeff", ""); 143 | result = result.Replace("", ""); 144 | result = Regex.Replace(result, @"(xmlns:)?p3(:nil)?="".+?\""", ""); 145 | 146 | return result; 147 | } 148 | } 149 | } 150 | 151 | 152 | -------------------------------------------------------------------------------- /dpp.cot.Tests/SerializationTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Xunit; 7 | 8 | namespace dpp.cot.Tests 9 | { 10 | public class SerializationTests 11 | { 12 | [Theory] 13 | [InlineData(Helpers.SimplePayload, "J-01334")] 14 | [InlineData(Helpers.EudPayload, "ANDROID-ASDFASDFASDF")] 15 | public void BasicDeserializationUidTest(string corpus, string expected) 16 | { 17 | var evt = cot.Event.Parse(corpus); 18 | 19 | Assert.Equal(expected, evt.Uid); 20 | } 21 | 22 | [Theory] 23 | [InlineData(Helpers.SimplePayload, "a-h-A-M-F-U-M")] 24 | [InlineData(Helpers.EudPayload, "a-f-G-U-C")] 25 | public void BasicDeserializationTypeStringTest(string corpus, string expected) 26 | { 27 | var evt = cot.Event.Parse(corpus); 28 | 29 | Assert.Equal(expected, evt.Type); 30 | } 31 | 32 | [Fact] 33 | public void BasicDeserializationTimeTest() 34 | { 35 | string corpus = Helpers.SimplePayload; 36 | 37 | var evt = cot.Event.Parse(corpus); 38 | 39 | Assert.Equal(new System.DateTime(2005, 4, 5, 11, 43, 38, 70, System.DateTimeKind.Utc), evt.Time); 40 | } 41 | 42 | [Fact] 43 | public void XmlDoesntContainNamespaces() 44 | { 45 | var corpus = Helpers.SimplePayload; 46 | var evt = cot.Event.Parse(corpus); 47 | var xml = evt.ToXmlString(); 48 | 49 | Assert.DoesNotContain("xmlns", xml); 50 | Assert.DoesNotContain("w3.org", xml); 51 | } 52 | 53 | [Fact] 54 | public void SimplePayloadIntegrity() 55 | { 56 | var corpus = Helpers.SimplePayload; 57 | var evt = cot.Event.Parse(corpus); 58 | 59 | Assert.Equal("J-01334", evt.Uid); 60 | Assert.Equal("a-h-A-M-F-U-M", evt.Type); 61 | Assert.Equal(30.0090027, evt.Point.Lat); 62 | Assert.Equal(-85.9578735, evt.Point.Lon); 63 | Assert.Equal(45.3, evt.Point.Ce); 64 | Assert.Equal(-42.6, evt.Point.Hae); 65 | } 66 | 67 | [Fact] 68 | public void EudPayloadIntegrity() 69 | { 70 | var corpus = Helpers.EudPayload; 71 | var evt = Event.Parse(corpus); 72 | 73 | Assert.Equal("ANDROID-ASDFASDFASDF", evt.Uid); 74 | Assert.Equal("a-f-G-U-C", evt.Type); 75 | Assert.Equal("h-e", evt.How); 76 | Assert.Equal(-0.00123456789012345, evt.Point.Lat); 77 | Assert.Equal(-0.00123456789012345, evt.Point.Lon); 78 | Assert.Equal(9999999.0, evt.Point.Ce); 79 | Assert.Equal(9999999.0, evt.Point.Hae); 80 | Assert.Equal(9999999.0, evt.Point.Le); 81 | Assert.Equal("SOMSANG FOOBAR", evt.Detail.Takv.Device); 82 | Assert.Equal("ATAK-CIV", evt.Detail.Takv.Platform); 83 | Assert.Equal("25", evt.Detail.Takv.Os); 84 | Assert.Equal("1.23.4-56789.56789-CIV", evt.Detail.Takv.Version); 85 | Assert.Equal("192.168.1.2:4242:tcp", evt.Detail.Contact.Endpoint); 86 | Assert.Equal("SUPERMAN", evt.Detail.Contact.Callsign); 87 | Assert.Equal("USER", evt.Detail.PrecisionLocation.Geopointsrc); 88 | Assert.Equal("???", evt.Detail.PrecisionLocation.Altsrc); 89 | Assert.Equal("Blue", evt.Detail.Group.Name); 90 | Assert.Equal("Team Member", evt.Detail.Group.Role); 91 | Assert.Equal((uint)45, evt.Detail.Status.Battery); 92 | } 93 | 94 | [Theory] 95 | [InlineData(Helpers.SimplePayload, 30.0090027, -85.9578735)] 96 | [InlineData(Helpers.EudPayload, -0.00123456789012345, -0.00123456789012345)] 97 | public void BasicDeserializationLatLonTest(string corpus, double expected_lat, double expected_lon) 98 | { 99 | var evt = cot.Event.Parse(corpus); 100 | 101 | Assert.Equal(expected_lat, evt.Point.Lat); 102 | Assert.Equal(expected_lon, evt.Point.Lon); 103 | } 104 | 105 | [Theory(Skip="Figure out quotes and element ordering later")] 106 | [InlineData(Helpers.SimplePayload)] // TODO: xml tag ordering? 107 | [InlineData(Helpers.EudPayload)] // TODO: do quote types actually matter? 108 | public void BasicXmlDeserializeXmlSerializeTest(string corpus) 109 | { 110 | var evt = cot.Event.Parse(corpus); 111 | var xml = evt.ToXmlString(); 112 | 113 | Assert.Equal(corpus, xml); 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Oo]ut/ 33 | [Ll]og/ 34 | [Ll]ogs/ 35 | 36 | # Visual Studio 2015/2017 cache/options directory 37 | .vs/ 38 | # Uncomment if you have tasks that create the project's static files in wwwroot 39 | #wwwroot/ 40 | 41 | # Visual Studio 2017 auto generated files 42 | Generated\ Files/ 43 | 44 | # MSTest test Results 45 | [Tt]est[Rr]esult*/ 46 | [Bb]uild[Ll]og.* 47 | 48 | # NUnit 49 | *.VisualState.xml 50 | TestResult.xml 51 | nunit-*.xml 52 | 53 | # Build Results of an ATL Project 54 | [Dd]ebugPS/ 55 | [Rr]eleasePS/ 56 | dlldata.c 57 | 58 | # Benchmark Results 59 | BenchmarkDotNet.Artifacts/ 60 | 61 | # .NET Core 62 | project.lock.json 63 | project.fragment.lock.json 64 | artifacts/ 65 | 66 | # ASP.NET Scaffolding 67 | ScaffoldingReadMe.txt 68 | 69 | # StyleCop 70 | StyleCopReport.xml 71 | 72 | # Files built by Visual Studio 73 | *_i.c 74 | *_p.c 75 | *_h.h 76 | *.ilk 77 | *.meta 78 | *.obj 79 | *.iobj 80 | *.pch 81 | *.pdb 82 | *.ipdb 83 | *.pgc 84 | *.pgd 85 | *.rsp 86 | *.sbr 87 | *.tlb 88 | *.tli 89 | *.tlh 90 | *.tmp 91 | *.tmp_proj 92 | *_wpftmp.csproj 93 | *.log 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Microsoft Azure Build Output 210 | csx/ 211 | *.build.csdef 212 | 213 | # Microsoft Azure Emulator 214 | ecf/ 215 | rcf/ 216 | 217 | # Windows Store app package directories and files 218 | AppPackages/ 219 | BundleArtifacts/ 220 | Package.StoreAssociation.xml 221 | _pkginfo.txt 222 | *.appx 223 | *.appxbundle 224 | *.appxupload 225 | 226 | # Visual Studio cache files 227 | # files ending in .cache can be ignored 228 | *.[Cc]ache 229 | # but keep track of directories ending in .cache 230 | !?*.[Cc]ache/ 231 | 232 | # Others 233 | ClientBin/ 234 | ~$* 235 | *~ 236 | *.dbmdl 237 | *.dbproj.schemaview 238 | *.jfm 239 | *.pfx 240 | *.publishsettings 241 | orleans.codegen.cs 242 | 243 | # Including strong name files can present a security risk 244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 245 | #*.snk 246 | 247 | # Since there are multiple workflows, uncomment next line to ignore bower_components 248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 249 | #bower_components/ 250 | 251 | # RIA/Silverlight projects 252 | Generated_Code/ 253 | 254 | # Backup & report files from converting an old project file 255 | # to a newer Visual Studio version. Backup files are not needed, 256 | # because we have git ;-) 257 | _UpgradeReport_Files/ 258 | Backup*/ 259 | UpgradeLog*.XML 260 | UpgradeLog*.htm 261 | ServiceFabricBackup/ 262 | *.rptproj.bak 263 | 264 | # SQL Server files 265 | *.mdf 266 | *.ldf 267 | *.ndf 268 | 269 | # Business Intelligence projects 270 | *.rdl.data 271 | *.bim.layout 272 | *.bim_*.settings 273 | *.rptproj.rsuser 274 | *- [Bb]ackup.rdl 275 | *- [Bb]ackup ([0-9]).rdl 276 | *- [Bb]ackup ([0-9][0-9]).rdl 277 | 278 | # Microsoft Fakes 279 | FakesAssemblies/ 280 | 281 | # GhostDoc plugin setting file 282 | *.GhostDoc.xml 283 | 284 | # Node.js Tools for Visual Studio 285 | .ntvs_analysis.dat 286 | node_modules/ 287 | 288 | # Visual Studio 6 build log 289 | *.plg 290 | 291 | # Visual Studio 6 workspace options file 292 | *.opt 293 | 294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 295 | *.vbw 296 | 297 | # Visual Studio LightSwitch build output 298 | **/*.HTMLClient/GeneratedArtifacts 299 | **/*.DesktopClient/GeneratedArtifacts 300 | **/*.DesktopClient/ModelManifest.xml 301 | **/*.Server/GeneratedArtifacts 302 | **/*.Server/ModelManifest.xml 303 | _Pvt_Extensions 304 | 305 | # Paket dependency manager 306 | .paket/paket.exe 307 | paket-files/ 308 | 309 | # FAKE - F# Make 310 | .fake/ 311 | 312 | # CodeRush personal settings 313 | .cr/personal 314 | 315 | # Python Tools for Visual Studio (PTVS) 316 | __pycache__/ 317 | *.pyc 318 | 319 | # Cake - Uncomment if you are using it 320 | # tools/** 321 | # !tools/packages.config 322 | 323 | # Tabs Studio 324 | *.tss 325 | 326 | # Telerik's JustMock configuration file 327 | *.jmconfig 328 | 329 | # BizTalk build output 330 | *.btp.cs 331 | *.btm.cs 332 | *.odx.cs 333 | *.xsd.cs 334 | 335 | # OpenCover UI analysis results 336 | OpenCover/ 337 | 338 | # Azure Stream Analytics local run output 339 | ASALocalRun/ 340 | 341 | # MSBuild Binary and Structured Log 342 | *.binlog 343 | 344 | # NVidia Nsight GPU debugger configuration file 345 | *.nvuser 346 | 347 | # MFractors (Xamarin productivity tool) working folder 348 | .mfractor/ 349 | 350 | # Local History for Visual Studio 351 | .localhistory/ 352 | 353 | # BeatPulse healthcheck temp database 354 | healthchecksdb 355 | 356 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 357 | MigrationBackup/ 358 | 359 | # Ionide (cross platform F# VS Code tools) working folder 360 | .ionide/ 361 | 362 | # Fody - auto-generated XML schema 363 | FodyWeavers.xsd -------------------------------------------------------------------------------- /dpp.cot/CotPredicates.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using System.Text.RegularExpressions; 7 | 8 | namespace dpp.cot 9 | { 10 | public static class CotPredicates 11 | { 12 | public const string friendly = "^a-f-"; 13 | public const string hostile = "^a-h-"; 14 | public const string unknown = "^a-u-"; 15 | public const string pending = "^a-p-"; 16 | public const string assumed = "^a-a-"; 17 | public const string neutral = "^a-n-"; 18 | public const string suspect = "^a-s-"; 19 | public const string joker = "^a-j-"; 20 | public const string faker = "^a-k-"; 21 | public const string atoms = "^a-"; 22 | public const string air = "^a-.-A"; 23 | public const string ground = "^a-.-G"; 24 | public const string installation = "^a-.-G-I"; 25 | public const string vehicle = "^a-.-G-E-V"; 26 | public const string equipment = "^a-.-G-E"; 27 | public const string surface = "^a-.-S"; 28 | public const string sea = "^a-.-S"; 29 | public const string sam = "^a-.-A-W-M-S"; 30 | public const string subsurface = "^a-.-U"; 31 | public const string sub = "^a-.-U"; 32 | public const string uav = "^a-f-A-(M-F-Q|C-F-q)"; 33 | public const string urw = "^a-f-A-M-H-Q"; 34 | public const string bits_friend = "^b-(g|r)-f-"; 35 | public const string bits_friendly = "^b-(g|r)-f-"; 36 | public const string bits_hostile = "^b-(g|r)-h-"; 37 | public const string bits_unknown = "^b-(g|r)-u-"; 38 | public const string bits_pending = "^b-(g|r)-p-"; 39 | public const string bits_assumed = "^b-(g|r)-a-"; 40 | public const string bits_neutral = "^b-(g|r)-n-"; 41 | public const string bits_suspect = "^b-(g|r)-s-"; 42 | public const string bits_joker = "^b-(g|r)-j-"; 43 | public const string bits_faker = "^b-(g|r)-k-"; 44 | public const string mayday = "^a-f-.*9-1-1"; 45 | public const string detect_nbc = "^b-d-c"; 46 | public const string bits = "^b-"; 47 | public const string detects = "^b-d"; 48 | public const string radiation = "^b-d-n"; 49 | public const string strikewarn = "^b-S"; 50 | public const string route = "^b-m-r"; 51 | public const string mappoint = "^b-m-p"; 52 | public const string cuepoint = "^b-m-p-s-p-i"; 53 | public const string click = "^b-m-p-m-c"; 54 | public const string vpi = "^b-m-p-v-p-i"; 55 | public const string spi = "^b-m-p-s-p-i"; 56 | public const string point = "^b-m-p"; 57 | public const string refpoint = "^b-m-p-r"; 58 | public const string waypoint = "^b-m-p-w"; 59 | public const string grid = "^b-m-g-o"; 60 | public const string tacelint = "^b-d-r"; 61 | public const string image = "^b-i"; 62 | public const string kimage = "^b-i-e"; 63 | public const string mootw = "^b-r-.-O"; 64 | public const string alarm = "^b-l"; 65 | public const string metoc = "^b-w"; 66 | public const string temperature = "^b-w-A-t"; 67 | public const string turbulence = "^b-w-A-T"; 68 | public const string icing = "^b-w-A-I"; 69 | public const string tstorm = "^b-w-A-S-T"; 70 | public const string winds = "^b-w-A-W"; 71 | public const string coverage = "^b-w-A-C"; 72 | public const string cloudtop = "^b-w-A-C-t"; 73 | public const string cloudbase = "^b-w-A-C-b"; 74 | public const string cloudceiling = "^b-w-A-C-c"; 75 | public const string cloudtotal = "^b-w-A-C-a"; 76 | public const string not_cot = "^b-x"; 77 | public const string any = ".*"; 78 | public const string spare = "^$"; 79 | public const string tasking = "^t-"; 80 | public const string t_isr = "^t-s"; 81 | public const string t_isr_eo = "^t-s-i-e"; 82 | public const string t_map_topo = "^t-i-m-t"; 83 | public const string t_cancel = "^t-z"; 84 | public const string t_dgps = "^t-x-c-g-d"; 85 | public const string t_strike = "^t-k"; 86 | public const string t_destroy = "^t-k-d"; 87 | public const string t_investigate = "^t-k-i"; 88 | public const string t_target = "^t-k-t"; 89 | public const string subscription = "^t-b"; 90 | public const string t_subscription = "^t-b"; 91 | public const string t_sub_bft = "^t-s-b"; 92 | public const string t_lookup = "^t-x-i-l"; 93 | public const string t_commcheck = "^t-x-a-c-c|^t-q-c-c"; 94 | public const string t_state = "^t-x-a-s"; 95 | public const string t_sync = "^t-x-a-s"; 96 | public const string t_sync_sub = "^t-x-a-s-c"; 97 | public const string t_filter = "^t-x-a-f"; 98 | public const string t_app_open = "^t-x-a-o"; 99 | public const string freetext = "^(t-x-f)|(b-t-f)"; 100 | public const string sync = "^t-x-a-s"; 101 | public const string t_medevac = "^t-x-v-m"; 102 | public const string report = "^b-r-"; 103 | public const string weather = "^b-w"; 104 | public const string deprecated_graphic = "^b-g-"; 105 | public const string deprecated_obstacle = "^b-g-.-M-O"; 106 | public const string deprecated_area = "^b-g-.-G-G-A"; 107 | public const string obstacle = "^a-.-G-O"; 108 | public const string firecoord = "^b-r-F-C"; 109 | public const string nbc = "^b-l-c-."; 110 | public const string nbc_chembio = "^b-l-c-b"; 111 | public const string nbc_nuclear = "^b-l-c-n"; 112 | public const string secmsg = "^b-x-s"; 113 | public const string casualty = "^b-r-f-h-c"; 114 | public const string reply = "^y-"; 115 | public const string r_complete = "^y-c"; 116 | public const string r_success = "^y-c-s"; 117 | public const string r_fail = "^y-c-f"; 118 | public const string r_failed = "^y-c-f"; 119 | public const string r_ack = "^y-a"; 120 | public const string r_receipt = "^y-a-r"; 121 | public const string r_wilco = "^y-a-w"; 122 | public const string r_canceling = "^y-s-c"; 123 | public const string r_executing = "^y-s-e"; 124 | public const string r_rejected = "^y-c-f-r"; 125 | public const string r_stale = "^y-c-f-s"; 126 | public const string r_review = "^y-s-r"; 127 | public const string r_completion = "^y-c"; 128 | public const string h_mensurated = "^m-i"; 129 | public const string h_human = "^h"; 130 | public const string h_retyped = "^h-t"; 131 | public const string h_machine = "^m"; 132 | public const string h_gps = "^m-g"; 133 | public const string h_nonCoT = "-g-i-g-o"; 134 | public const string h_gigo = "^h-g-i-g-o"; 135 | public const string h_estimated = "^h-e"; 136 | public const string h_calculated = "^h-c"; 137 | public const string h_transcribed = "^h-t"; 138 | public const string h_pasted = "^h-p"; 139 | public const string h_magnetic = "^m-m"; 140 | public const string h_ins = "^m-n"; 141 | public const string h_ins_gps = "^m-g-n"; 142 | public const string h_simulated = "^m-s"; 143 | public const string h_configured = "^m-c"; 144 | public const string h_radio = "^m-r"; 145 | public const string h_passed = "^m-p"; 146 | public const string h_fused = "^m-f"; 147 | public const string h_tracker = "^m-a"; 148 | public const string h_dgps = "^m-g-d"; 149 | public const string h_eplrs = "^m-r-e"; 150 | public const string h_plrs = "^m-r-p"; 151 | public const string h_doppler = "^m-r-d"; 152 | public const string h_vhf = "^m-r-v"; 153 | public const string h_tadil = "^m-r-t"; 154 | public const string h_tadila = "^m-r-t-a"; 155 | public const string h_tadilb = "^m-r-t-b"; 156 | public const string h_tadilj = "^m-r-t-j"; 157 | public const string q_guaranteed = "^.-.-g"; 158 | public const string q_assured = "^.-.-g"; 159 | public const string q_deadline = "^.-.-d"; 160 | public const string q_congestion = "^.-.-c"; 161 | public const string q_low = "^[0-3]-.-."; 162 | public const string q_med = "^[4-6]-.-."; 163 | public const string q_high = "^[7-9]-.-."; 164 | public const string q_routine = "^[0-1]-.-."; 165 | public const string q_priority = "^[2-3]-.-."; 166 | public const string q_immediate = "^[4-5]-.-."; 167 | public const string q_flash = "^[6-7]-.-."; 168 | public const string q_flashover = "^[8-9]-.-."; 169 | public const string q_replace = "^.-r-."; 170 | public const string q_follow = "^.-f-."; 171 | public const string o_exercise = "^e-"; 172 | public const string o_operation = "^o-"; 173 | public const string o_simulation = "^s-"; 174 | 175 | // types not in CoTtypes.xml 176 | public const string t_ping = "t-x-c-t"; 177 | public const string t_pong = "t-x-c-t-r"; 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /dpp.cot/protobuf/protocol.txt: -------------------------------------------------------------------------------- 1 | *** Traditional Protocol - "Protocol Version 0" 2 | 3 | Clients send and receive XML CoT messages. 4 | "Mesh" network participants announce via "SA" messages via UDP datagrams 5 | over multicast to a well known address and port. Each UDP datagram contains 6 | one (and only one) CoT XML message as its payload. 7 | 8 | Messages directed only to specific network participants are send by making 9 | TCP connection to the remote recipient, sending the CoT XML, then closing 10 | the connection. 11 | 12 | 13 | Streaming connections (to TAK servers) send the same XML-based CoT payloads 14 | over TCP sockets. The TCP stream is comprised of one CoT after 15 | another. Messages are delimited and broken apart by searching for the token 16 | "" and breaking apart immediately after that token. 17 | When sending, messages must be prefaced by XML header (), 18 | followed by a newline, followed by the complete XML . TAK servers 19 | require that no arbitrary newlines follow the end of message and 20 | that the next character immediate commences the next header. 21 | 22 | 23 | 24 | *** TAK Protocol - Design Goals 25 | 26 | The goal of the new TAK Protocol design is to allow interoperation with 27 | other legacy clients and TAK server, as well as to strongly identify 28 | what rendition of communication will be used in a session. This is to allow 29 | for future expansion or complete revision of the protocol while allowing 30 | an opportunity to support mixed client versions (and varying versions of TAK 31 | servers). 32 | 33 | 34 | *** TAK Protocol - Ground Rules 35 | 36 | All clients obey the following basic rules regardless of the version(s) 37 | of TAK protocol that they support. These rules are important base rules 38 | upon which the protocol version negotiations detailed in subsequent sections 39 | rely: 40 | 41 | 1. A client sending TAK protocol version "V" is also capable of receiving 42 | and decoding version "V" 43 | 2. All clients must support decoding TAK protocol version "0" (legacy XML) 44 | 45 | 46 | *** TAK Protocol - Generic Framework - Mesh Networks 47 | 48 | Mesh networks broadcasts (SA announces, etc) will reuse the existing UDP 49 | datagram-based networking already in place. Directed (unicasted) TCP 50 | messages will reuse the existing connect, send 1 message, disconnect 51 | networking. 52 | 53 | For both TCP and UDP, instead of sending CoT as XML, clients will send data 54 | packets whose payloads contain one message complying with the new "TAK 55 | Protocol". 56 | Both types of messages will utilize a data payload that begins with the "TAK 57 | Protocol Header" followed by the "TAK Protocol Payload". The header 58 | serves to self-identify as a TAK Protocol message, as well as indicate a 59 | particular version number to which the subsequent Payload comforms. 60 | 61 | TAK Protocol Message: 62 | 63 | 64 | The "TAK Protocol Header" is nothing more than a set of "magic numbers" to 65 | identify the message header as such, and a version identifier to indicate 66 | what TAK Protocol version the remainder of the payload is comprised of. 67 | 68 | TAK Protocol Header: 69 | Where.... 70 | is the single byte 0xbf 71 | is the version number of the TAK Protocol the payload 72 | in the remainder of the message conforms to. This is encoded as a "varint". 73 | See "TAK Protocol Varint Encoding". 74 | 75 | 76 | 77 | *** TAK Protocol - Generic Framework - Streaming Connections 78 | 79 | Steaming connections (TAK server connections) use a different message style 80 | as the repeating protocol version information in every message that is done 81 | in mesh TAK Protocol Messages would be a waste of resources in the streaming 82 | environment (since all messages will use the same Version). 83 | The TAK Protocol Stream Message is instead defined to provide the length of 84 | the streaming message (necessary to break apart the message from its 85 | neighbors to avoid need to scan for special tokens). 86 | 87 | In a streaming connection, "TAK Protocol Streaming Messages" are sent one 88 | after another (with no intervening data) over the streaming connection. 89 | 90 | TAK Protocol Stream Message: 91 | 92 | 93 | Important to note here is that the "TAK Protocol Payload" is precisely the 94 | same in form and content to that which is used for mesh network messages for 95 | a given protocol version. 96 | 97 | 98 | 99 | The "TAK Protocol Streaming Header" is as follows: 100 | 101 | TAK Protocol Streaming Header: 102 | 103 | Where... 104 | is the single byte 0xbf 105 | is the number of bytes in the "TAK Protocol Payload" which 106 | follows the header. This is encoded as a "varint". 107 | 108 | As mentioned prior, the version identification for the message's payload 109 | format is omitted from the streaming header. Protocol version negotiation 110 | is expected to occur outside of core TAK Protocol message exchange. 111 | See "Streaming Connection Protocol Negotiation". 112 | 113 | 114 | 115 | 116 | *** TAK Protocol Payload - Version 1 117 | 118 | Version 1 of the TAK Protocol Payload is a Google Protocol Buffer based 119 | payload. Each Payload consists of one (and only one) 120 | atakmap::commoncommo::v1::TakMessage message which is serialized using 121 | Google protocol buffers version 3. 122 | 123 | See the .proto files for more information on the specific messages and their 124 | fields, as well as the mapping to/from CoT XML. 125 | 126 | Revising the messages used by Version 1 may be done in accordance with the 127 | following rules: 128 | 129 | 1. Additional message fields MAY be added to the end of existing messages 130 | following normal google protobuf rules if and only if 131 | ignorance of the new fields on decoding is 100% irrelevant to correct 132 | semantic operation at the TAK application level of ALL TAK applications. 133 | 2. Otherwise, any and all changes must be tied to a protocol version change. 134 | 135 | 136 | This version of TAK Protocol does not define any additional attributes to be 137 | used during Streaming Connection Protocol Negotiation. 138 | 139 | 140 | 141 | *** Streaming Connection Protocol Negotiation 142 | 143 | TAK clients often connect to a variety of TAK servers, each of which may be 144 | a different version of software capable of different versions of the TAK 145 | Protocol (or indeed not capable of the TAK Protocol and simply only 146 | supporting traditional streaming CoT as XML). 147 | 148 | Because of the desire to allow operation of various client and server 149 | versions, and the desire to keep the traditional XML encoding available, the 150 | following negotiation is performed when connecting to a TAK server with a 151 | client that supports the TAK Protocol. 152 | 153 | 1. Once the connection is established, client and server should expect to 154 | exchange traditional CoT XML messages per "Traditional Protocol" section. 155 | Note, however, if the server requires authentication, the auth XML message 156 | MUST be the first message sent to the TAK server by the client. 157 | Even if awaiting auth, the server MAY send CoT XML. Upon supplying an 158 | auth message (when required), one of two things happens: 159 | 1a. If the server accepts the auth, proceed to 2. 160 | 1b. If the server denies the auth, the connection is closed. 161 | 2. Client and server continue to expect to exchange traditional 162 | CoT XML messages per "Traditional Protocol" section. 163 | 3. A server which supports the TAK Protocol MAY send the following CoT XML 164 | message to indicate this support (whitespace added, xml header omitted): 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | ... where the version attribute is an integer number specifying 175 | a version of the TAK Protocol the server supports. This message 176 | may contain one or more TakProtocolSupport elements inside the single 177 | detail, each specifying a supported version. 178 | The TAK server MUST send this message no more than once per connection. 179 | 180 | To allow for ancillary information in the negotiation, the 181 | TakProtocolSupport element MAY contain additional attributes compliant 182 | with the Protocol version indicated. 183 | 4. Client and server continue to expect to exchange traditional CoT XML 184 | messages per "Traditional Protocol" section. 185 | 5. If the client wishes to initiate a transfer to TAK Protocol encoding, it 186 | selects one of the supported versions advertised in the server's message 187 | from step 3. It then sends the following CoT XML: 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | ... where the version attribute is the integer version chosen above. 198 | Only ONE TakRequest element is allowed. 199 | 200 | To allow for ancillary information in the negotiation, the 201 | TakRequest element MAY contain additional attributes compliant 202 | with the Protocol version indicated. 203 | 204 | Clients SHALL NOT send this message unless they have observed the 205 | message from step #3, above, first. 206 | Server MUST examine all receive CoT events for this message from the point 207 | in time when the message in #3 is sent until at least one minute following 208 | that point in time. If a "false" status is subsequently issued per step #6 209 | below step, this time limit SHALL be extended to at least one minute 210 | from the point in time the failure response message specified in 211 | #6 is issued to allow the client additional time to retry. 212 | 213 | 6. Once the client sends the message in #5, it MUST NOT send additional 214 | CoT XML to the server. Client also MUST still process incoming CoT XML 215 | from the server. The client MUST wait in this state for a response per 216 | the following for at least one minute. 217 | The server MAY still send CoT XML messages up until it notices the 218 | control request from the client (from step #5) and is ready to respond. 219 | The server MUST then respond as soon as possible to the client with the 220 | following message to indicate either acceptance or denial of the request: 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | ... where the status attribute is either true (to indicate the server 231 | accepts the requested version) or false (to indicate that the server 232 | denies the request). 233 | Only ONE TakResponse element is allowed. 234 | 235 | To allow for ancillary information in the negotiation, the 236 | TakResponse element MAY contain additional attributes compliant 237 | with the Protocol version selected in the request that this response 238 | applies to. 239 | 240 | If no response is received by the client before its timeout elapses, 241 | the client SHALL disconnect as the entire negotiation is in an 242 | indeterminate state. The client SHOULD reconnect and begin again at step 243 | 1, possibly with a longer timeout or alternate protocol version choice. 244 | 245 | 7. Operation at this point depends on the response send in #6: 246 | 7a. If status was true: The server MUST NOT send additiona CoT XML after the 247 | "true" response in #6. Instead, the server SHALL send all future data 248 | in accordance with the TAK Protocol Streaming Connection framework 249 | and containing TAK Payloads of the negotiated version. 250 | The client MAY resume sending messages at this time but MUST immediately 251 | send said messages in accordance with the TAK Protocol Streaming 252 | Connection framework and containing TAK Payloads of the negotiated 253 | version. NOTE: the negotiated version SHALL be the same for both 254 | directions of the streaming connection! 255 | 7b. If status was false: Both client and server resume operation as though 256 | they were back at step #4. The client may attempt a new negotiation 257 | if it wishes, or may simply continue to exchange traditional XML-based 258 | CoT messages. 259 | 260 | In the messages in 3, 5, and 6 above, the following common rules apply: 261 | a. "protouid" is any valid UID representing the negotiation transaction. 262 | The server generates this when offering protocol versions. The client 263 | re-uses it when placing request(s) and the server re-uses it when 264 | issuing the response to a request. 265 | The UID SHALL be unique from UIDs used for other messages and purposes. 266 | b. "TIME" is filled with a valid time representation per the CoT schemas. 267 | The TIME values may be different from each other as needed. 268 | 269 | 270 | *** "Mesh Network" Protocol Negotiation 271 | 272 | Mesh networking in TAK products relies on repeated broadcasting of 273 | device presence and "SA" data that gives basic information on how to reach 274 | local network participants. To allow for clients with mixed TAK protocol 275 | versions (as well as legacy XML only capabilities), the following protocol 276 | selection and support advertisement shall be performed on each device: 277 | 278 | 1. All devices supporting TAK Protocol versions > 0 (legacy xml) MUST 279 | broadcast to all configured and active non-TAK server broadcast destinations 280 | the TakControl message in a TakMessage at least once every 60 seconds. 281 | This information MAY be sent alongside CotEvent data or standalone. 282 | This message indicates the minimum and maximum versions of TAK protocol 283 | that the device can **decode**. 284 | Note that devices not supporting TAK protocol > 0 will not be sending these 285 | messages. 286 | It is RECOMMENDED that devices do *not* frequently change the 287 | version information in these messages as receivers may optimize around 288 | the information being mostly static/fixed. 289 | This information SHALL be sent using the protocol level 290 | determined under the rule in 4 except when rule 4 results in 291 | protocol level 0, in which case TakControl information 292 | SHALL be sent using the lowest protocol version > 0 supported by the 293 | sender. 294 | 2. Each device MUST examine and decode the TakControl message in any message 295 | it receives and knows how to decode. If for a version that the device 296 | does not support, it MAY discard the message. 297 | 3. Each device MUST maintain the minimum and maximum supported TAK protocol 298 | versions known from every client known to exist on the network based on 299 | the following ruleset: 300 | 3a. Newly detected clients are assigned a min/max supported version 301 | equal to the version used to relay the message that resulted 302 | in discovery of the client. Note that this could be version 0 303 | (legacy XML) 304 | 3b. Upon receipt of a TakControl message, the min/max version info 305 | is updated to match the information in the message. Optimizing 306 | for infrequent changes of this info is recommended. 307 | Note that TakControl messages do NOT allow versions of 0 in them. 308 | Support for version 0 is implied (see base rules) and need not be 309 | tracked except for those clients which support *only* version 0. 310 | 3c. Known clients that have not sent any TakControl messages in the previous 311 | 2 minutes shall revert to a minimum and maximum version equal 312 | to the version used in the most recently received message that 313 | keeps the client from becoming entirely stale. Note that this could 314 | be version 0 (legacy XML). 315 | 3d. Received messages that are not decodable by the receiver should 316 | continue to be treated as not having received TakControl messages 317 | under 3c. 318 | 4. Devices MUST send out broadcast messages using the highest protocol version 319 | supported by *all* known contacts (including consideration of the 320 | sending device itself) tracked based on the rules in (3) at the time 321 | of sending. 322 | This includes SA announcements/broadcasts. 323 | If there is no version overlap suitable for all versions, then protocol 324 | "version 0" must be used. 325 | If this is "version 0" (legacy xml), then XML shall be used. 326 | 5. Whenever the version computed via rule 5 changes, clients SHALL immediately 327 | send out a TakControl message using the new version per rule 1. 328 | This must be done even if not otherwise broadcasting a message. 329 | 330 | 331 | 332 | *** TAK Protocol Varint Encoding 333 | 334 | The varints used in the headers of the TAK Protocol are encoded in 335 | accordance with the UNSIGNED varint rules for Google protocol buffers. 336 | This encoding is summarized here: 337 | 338 | 1. The value must be UNSIGNED. Only values equal to or greater than zero 339 | are allowed. 340 | 2. The value to be encoded is taken 7 bits at a time, starting with the 341 | least significant 7 bits (bits 7 -> 0), then the next least significant bits 342 | (14 -> 8), etc. This repeats over all 7 bit values that are significant 343 | (that is, up to and including the most significant '1' bit). 344 | 3. For each 7 bit group: 345 | 3a. Let S = 0 if this is the the last 7 bit group, else let S = 1 346 | 3b. Output a byte that is (S << 7) | (the 7 bits) 347 | 348 | The TAK Protocol use of Varints limits use to 64-bit values. This 349 | effectively limits the range as [ 0, (2^63 - 1) ] and the varint coded value 350 | to be limited to 10 bytes. 351 | 352 | 353 | -------------------------------------------------------------------------------- /dpp.cot/CotDescriptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using System.Text.RegularExpressions; 7 | 8 | namespace dpp.cot 9 | { 10 | public static class CotDescriptions 11 | { 12 | private static readonly Dictionary CotDescriptionsMap = new Dictionary 13 | { 14 | { "a-.-A", "Air Track"}, 15 | { "a-.-A-C", "CIVIL AIRCRAFT"}, 16 | { "a-.-A-C-F", "FIXED WING"}, 17 | { "a-.-A-C-F-q", "FIXED WING RPV/Drone"}, 18 | { "a-.-A-C-H", "ROTARY WING"}, 19 | { "a-.-A-C-L", "LIGHTER THAN AIR"}, 20 | { "a-.-A-M-F", "FIXED WING"}, 21 | { "a-.-A-M-F-g", "FIXED WING GUNSHIP"}, 22 | { "a-.-A-M-F-A", "ATTACK/STRIKE"}, 23 | { "a-.-A-M-F-B", "BOMBER"}, 24 | { "a-.-A-M-F-C", "CARGO AIRLIFT (TRANSPORT)"}, 25 | { "a-.-A-M-F-C-H", "CARGO AIRLIFT (HEAVY)"}, 26 | { "a-.-A-M-F-C-L", "CARGO AIRLIFT (LIGHT)"}, 27 | { "a-.-A-M-F-C-M", "CARGO AIRLIFT (MEDIUM)"}, 28 | { "a-.-A-M-F-D", "AIRBORNE COMMAND POST (C2)"}, 29 | { "a-.-A-M-F-F", "FIGHTER"}, 30 | { "a-.-A-M-F-F-I", "INTERCEPTOR"}, 31 | { "a-.-A-M-F-H", "COMBAT SEARCH AND RESCUE (CSAR)"}, 32 | { "a-.-A-M-F-J", "ELECTRONIC COUNTERMEASURES (ECM/JAMMER)"}, 33 | { "a-.-A-M-F-K", "TANKER"}, 34 | { "a-.-A-M-F-L", "VSTOL"}, 35 | { "a-.-A-M-F-M", "SPECIAL OPERATIONS FORCES (SOF)"}, 36 | { "a-.-A-M-F-O", "MEDEVAC"}, 37 | { "a-.-A-M-F-P", "PATROL"}, 38 | { "a-.-A-M-F-P-M", "MINE COUNTERMEASURES"}, 39 | { "a-.-A-M-F-P-N", "ANTISURFACE WARFARE/ASUW"}, 40 | { "a-.-A-M-F-Q", "DRONE (RPV/UAV)"}, 41 | { "a-.-A-M-F-R", "RECONNAISSANCE"}, 42 | { "a-.-A-M-F-R-W", "AIRBORNE EARLY WARNING (AEW)"}, 43 | { "a-.-A-M-F-R-X", "PHOTOGRAPHIC"}, 44 | { "a-.-A-M-F-R-Z", "ELECTRONIC SURVEILLANCE MEASURES"}, 45 | { "a-.-A-M-F-S", "ANTISUBMARINE WARFARE (ASW) CARRIER BASED"}, 46 | { "a-.-A-M-F-T", "TRAINER"}, 47 | { "a-.-A-M-F-U", "UTILITY"}, 48 | { "a-.-A-M-F-U-H", "UTILITY (HEAVY)"}, 49 | { "a-.-A-M-F-U-L", "UTILITY (LIGHT)"}, 50 | { "a-.-A-M-F-U-M", "UTILITY (MEDIUM)"}, 51 | { "a-.-A-M-F-Y", "COMMUNICATIONS (C3I)"}, 52 | { "a-.-A-M-H", "ROTARY WING"}, 53 | { "a-.-A-M-H-A", "ATTACK"}, 54 | { "a-.-A-M-H-C", "CARGO AIRLIFT (TRANSPORT)"}, 55 | { "a-.-A-M-H-C-H", "CARGO AIRLIFT (HEAVY)"}, 56 | { "a-.-A-M-H-C-L", "CARGO AIRLIFT (LIGHT)"}, 57 | { "a-.-A-M-H-C-M", "CARGO AIRLIFT (MEDIUM)"}, 58 | { "a-.-A-M-H-D", "AIRBORNE COMMAND POST (C2)"}, 59 | { "a-.-A-M-H-H", "COMBAT SEARCH AND RESCUE (CSAR)"}, 60 | { "a-.-A-M-H-I", "MINE COUNTERMEASURES"}, 61 | { "a-.-A-M-H-J", "ELECTRONIC COUNTERMEASURES (ECM/JAMMER)"}, 62 | { "a-.-A-M-H-K", "TANKER"}, 63 | { "a-.-A-M-H-M", "SPECIAL OPERATIONS FORCES (SOF)"}, 64 | { "a-.-A-M-H-O", "MEDEVAC"}, 65 | { "a-.-A-M-H-Q", "DRONE (RPV/UAV)"}, 66 | { "a-.-A-M-H-R", "RECONNAISSANCE"}, 67 | { "a-.-A-M-H-S", "ANTISUBMARINE WARFARE/MPA"}, 68 | { "a-.-A-M-H-T", "TRAINER"}, 69 | { "a-.-A-M-H-U", "UTILITY"}, 70 | { "a-.-A-M-H-U-H", "UTILITY (HEAVY)"}, 71 | { "a-.-A-M-H-U-L", "UTILITY (LIGHT)"}, 72 | { "a-.-A-M-H-U-M", "UTILITY (MEDIUM)"}, 73 | { "a-.-A-M-L", "LIGHTER THAN AIR"}, 74 | { "a-.-A-W", "WEAPON"}, 75 | { "a-.-A-W-D", "DECOY"}, 76 | { "a-.-A-W-M", "MISSILE IN FLIGHT"}, 77 | { "a-.-A-W-M-A", "AIR LAUNCHED MISSILE"}, 78 | { "a-.-A-W-M-A-A", "AIR TO AIR MISSILE (AAM)"}, 79 | { "a-.-A-W-M-A-S", "AIR TO SURFACE MISSILE (ASM)"}, 80 | { "a-.-A-W-M-L", "LAND ATTACK MISSILE"}, 81 | { "a-.-A-W-M-S", "SURFACE/LAND LAUNCHED MISSILE"}, 82 | { "a-.-A-W-M-S-A", "SURFACE TO AIR MISSILE (SAM)"}, 83 | { "a-.-A-W-M-S-A-f", "SAM (FixedSite)"}, 84 | { "a-.-A-W-M-S-A-i", "SAM (Manpad)"}, 85 | { "a-.-A-W-M-S-A-m", "SAM (Mobile)"}, 86 | { "a-.-A-W-M-S-S", "SURFACE TO SURFACE MISSILE (SSM)"}, 87 | { "a-.-A-W-M-U", "SUBSURFACE TO SURFACE MISSILE (S/SSM)"}, 88 | { "a-.-G", "GROUND TRACK"}, 89 | { "a-.-G-E", "EQUIPMENT"}, 90 | { "a-.-G-E-S", "SENSOR"}, 91 | { "a-.-G-E-S-E", "EMPLACED SENSOR"}, 92 | { "a-.-G-E-S-R", "RADAR"}, 93 | { "a-.-G-E-V", "GROUND VEHICLE"}, 94 | { "a-.-G-E-V-A", "Armor (GUN)"}, 95 | { "a-.-G-E-V-A-A", "Armor (APC)"}, 96 | { "a-.-G-E-V-A-A-R", "ARMORED PERSONNEL CARRIER RECOVERY"}, 97 | { "a-.-G-E-V-A-C", "C2V/ACV"}, 98 | { "a-.-G-E-V-A-I", "ARMORED INFANTRY"}, 99 | { "a-.-G-E-V-A-L", "LIGHT ARMORED VEHICLE"}, 100 | { "a-.-G-E-V-A-S", "COMBAT SERVICE SUPPORT VEHICLE"}, 101 | { "a-.-G-E-V-A-T", "TANK"}, 102 | { "a-.-G-E-V-A-T-H", "TANK HEAVY"}, 103 | { "a-.-G-E-V-A-T-H-R", "TANK HEAVY RECOVERY"}, 104 | { "a-.-G-E-V-A-T-L", "TANK LIGHT"}, 105 | { "a-.-G-E-V-A-T-L-R", "TANK LIGHT RECOVERY"}, 106 | { "a-.-G-E-V-A-T-M", "TANK MEDIUM"}, 107 | { "a-.-G-E-V-A-T-M-R", "TANK MEDIUM RECOVERY"}, 108 | { "a-.-G-E-V-C", "CIVILIAN VEHICLE"}, 109 | { "a-.-G-E-V-E", "ENGINEER VEHICLE"}, 110 | { "a-.-G-E-V-E-A", "MINE CLEARING VEHICLE"}, 111 | { "a-.-G-E-V-E-A-A", "ARMORED MOUNTED MINE CLEARING VEHICLE"}, 112 | { "a-.-G-E-V-E-A-T", "TRAILER MOUNTED MINE CLEARING VEHICLE"}, 113 | { "a-.-G-E-V-E-B", "BRIDGE"}, 114 | { "a-.-G-E-V-E-C", "CONSTRUCTION VEHICLE"}, 115 | { "a-.-G-E-V-E-D", "DOZER"}, 116 | { "a-.-G-E-V-E-E", "EARTHMOVER"}, 117 | { "a-.-G-E-V-E-M", "MINE LAYING VEHICLE"}, 118 | { "a-.-G-E-V-E-M-L", "TRUCK MOUNTED WITH VOLCANO"}, 119 | { "a-.-G-E-V-E-M-V", "ARMORED CARRIER WITH VOLCANO"}, 120 | { "a-.-G-E-V-T", "Locomotive"}, 121 | { "a-.-G-E-V-U", "UTILITY VEHICLE"}, 122 | { "a-.-G-E-V-U-B", "BUS"}, 123 | { "a-.-G-E-V-U-L", "LIMITED CROSS COUNTRY TRUCK"}, 124 | { "a-.-G-E-V-U-R", "WATER CRAFT"}, 125 | { "a-.-G-E-V-U-R-l", "Boat (Large)"}, 126 | { "a-.-G-E-V-U-R-m", "Boat (Med)"}, 127 | { "a-.-G-E-V-U-R-s", "Boat (Small)"}, 128 | { "a-.-G-E-V-U-S", "SEMI"}, 129 | { "a-.-G-E-V-U-X", "CROSS COUNTRY TRUCK"}, 130 | { "a-.-G-E-V-m", "Ambulance"}, 131 | { "a-.-G-E-W", "WEAPON"}, 132 | { "a-.-G-E-W-A", "AIR DEFENSE GUN"}, 133 | { "a-.-G-E-W-A-H", "AAA (Heavy)"}, 134 | { "a-.-G-E-W-A-L", "AAA (Light)"}, 135 | { "a-.-G-E-W-A-M", "AAA (Medium)"}, 136 | { "a-.-G-E-W-D", "DIRECT FIRE GUN"}, 137 | { "a-.-G-E-W-D-H", "DIRECT FIRE GUN HEAVY"}, 138 | { "a-.-G-E-W-D-H-S", "DIRECT FIRE GUN HEAVY SELF PROPELLED"}, 139 | { "a-.-G-E-W-D-L", "DIRECT FIRE GUN LIGHT"}, 140 | { "a-.-G-E-W-D-L-S", "DIRECT FIRE GUN LIGHT SELF PROPELLED"}, 141 | { "a-.-G-E-W-D-M", "DIRECT FIRE GUN MEDIUM"}, 142 | { "a-.-G-E-W-D-M-S", "DIRECT FIRE GUN MEDIUM SELF PROPELLED"}, 143 | { "a-.-G-E-W-G", "ANTI TANK GUN"}, 144 | { "a-.-G-E-W-G-H", "ANTI TANK GUN HEAVY"}, 145 | { "a-.-G-E-W-G-L", "ANTI TANK GUN LIGHT"}, 146 | { "a-.-G-E-W-G-M", "ANTI TANK GUN MEDIUM"}, 147 | { "a-.-G-E-W-G-R", "ANTI TANK GUN RECOILLESS"}, 148 | { "a-.-G-E-W-H", "HOWITZER"}, 149 | { "a-.-G-E-W-H-H", "HOWITZER HEAVY"}, 150 | { "a-.-G-E-W-H-H-S", "HOWITZER HEAVY SELF PROPELLED"}, 151 | { "a-.-G-E-W-H-L", "HOWITZER LIGHT"}, 152 | { "a-.-G-E-W-H-L-S", "HOWITZER LIGHT SELF PROPELLED"}, 153 | { "a-.-G-E-W-H-M", "HOWITZER MEDIUM"}, 154 | { "a-.-G-E-W-H-M-S", "HOWITZER MEDIUM SELF PROPELLED"}, 155 | { "a-.-G-E-W-M", "MISSILE LAUNCHER"}, 156 | { "a-.-G-E-W-M-A", "AIR DEFENSE (AD) MISSILE LAUNCHER"}, 157 | { "a-.-G-E-W-M-A-I", "INTERMEDIATE RANGE AD MISSILE LAUNCHER"}, 158 | { "a-.-G-E-W-M-A-L", "LONG RANGE AD MISSILE LAUNCHER"}, 159 | { "a-.-G-E-W-M-A-S", "SHORT RANGE AD MISSILE LAUNCHER"}, 160 | { "a-.-G-E-W-M-A-T", "AD MISSILE LAUNCHER THEATER"}, 161 | { "a-.-G-E-W-M-S", "SURF SURF (SS) MISSILE LAUNCHER"}, 162 | { "a-.-G-E-W-M-S-I", "INTERMEDIATE RANGE SS MISSILE LAUNCHER"}, 163 | { "a-.-G-E-W-M-S-L", "LONG RANGE SS MISSILE LAUNCHER"}, 164 | { "a-.-G-E-W-M-S-S", "SHORT RANGE SS MISSILE LAUNCHER"}, 165 | { "a-.-G-E-W-M-T", "MISSILE LAUNCHER ANTITANK (AT)"}, 166 | { "a-.-G-E-W-M-T-H", "MISSILE LAUNCHER AT HEAVY"}, 167 | { "a-.-G-E-W-M-T-L", "MISSILE LAUNCHER AT LIGHT"}, 168 | { "a-.-G-E-W-M-T-M", "MISSILE LAUNCHER AT MEDIUM"}, 169 | { "a-.-G-E-W-O", "MORTAR"}, 170 | { "a-.-G-E-W-O-H", "MORTAR HEAVY"}, 171 | { "a-.-G-E-W-O-L", "MORTAR LIGHT"}, 172 | { "a-.-G-E-W-O-M", "MORTAR MEDIUM"}, 173 | { "a-.-G-E-W-R", "RIFLE/AUTOMATIC WEAPON"}, 174 | { "a-.-G-E-W-R-H", "HEAVY MACHINE GUN"}, 175 | { "a-.-G-E-W-R-L", "LIGHT MACHINE GUN"}, 176 | { "a-.-G-E-W-R-R", "RIFLE"}, 177 | { "a-.-G-E-W-S", "SINGLE ROCKET LAUNCHER"}, 178 | { "a-.-G-E-W-S-H", "SINGLE ROCKET LAUNCHER HEAVY"}, 179 | { "a-.-G-E-W-S-L", "SINGLE ROCKET LAUNCHER LIGHT"}, 180 | { "a-.-G-E-W-S-M", "SINGLE ROCKET LAUNCHER MEDIUM"}, 181 | { "a-.-G-E-W-T", "ANTI TANK ROCKET LAUNCHER"}, 182 | { "a-.-G-E-W-T-H", "ANTI TANK ROCKET LAUNCHER HEAVY"}, 183 | { "a-.-G-E-W-T-L", "ANTI TANK ROCKET LAUNCHER LIGHT"}, 184 | { "a-.-G-E-W-T-M", "ANTI TANK ROCKET LAUNCHER MEDIUM"}, 185 | { "a-.-G-E-W-X", "MULTIPLE ROCKET LAUNCHER"}, 186 | { "a-.-G-E-W-X-H", "MULTIPLE ROCKET LAUNCHER HEAVY"}, 187 | { "a-.-G-E-W-X-L", "MULTIPLE ROCKET LAUNCHER LIGHT"}, 188 | { "a-.-G-E-W-X-M", "MULTIPLE ROCKET LAUNCHER MEDIUM"}, 189 | { "a-.-G-E-W-Z", "GRENADE LAUNCHER"}, 190 | { "a-.-G-E-W-Z-H", "GRENADE LAUNCHER HEAVY"}, 191 | { "a-.-G-E-W-Z-L", "GRENADE LAUNCHER LIGHT"}, 192 | { "a-.-G-E-W-Z-M", "GRENADE LAUNCHER MEDIUM"}, 193 | { "a-.-G-E-X", "SPECIAL EQUIPMENT"}, 194 | { "a-.-G-E-X-F", "FLAME THROWER"}, 195 | { "a-.-G-E-X-L", "LASER"}, 196 | { "a-.-G-E-X-M", "LAND MINES"}, 197 | { "a-.-G-E-X-M-C", "CLAYMORE"}, 198 | { "a-.-G-E-X-M-L", "LESS THAN LETHAL"}, 199 | { "a-.-G-E-X-N", "NBC EQUIPMENT"}, 200 | { "a-.-G-I", "Building"}, 201 | { "a-.-G-I-B", "MILITARY BASE/FACILITY"}, 202 | { "a-.-G-I-B-A", "AIRPORT/AIRBASE"}, 203 | { "a-.-G-I-B-N", "SEAPORT/NAVAL BASE"}, 204 | { "a-.-G-I-c", "Civilian"}, 205 | { "a-.-G-I-c-b", "Bridge"}, 206 | { "a-.-G-I-c-bar", "Fence/Wall/Barrier"}, 207 | { "a-.-G-I-c-can", "Canal"}, 208 | { "a-.-G-I-c-can-l", "Canal Lock"}, 209 | { "a-.-G-I-c-frm", "Farm"}, 210 | { "a-.-G-I-c-l", "Levy"}, 211 | { "a-.-G-I-c-mon", "Monument"}, 212 | { "a-.-G-I-c-o", "Offices"}, 213 | { "a-.-G-I-c-rah", "Residence/Apartment/Hotel"}, 214 | { "a-.-G-I-c-rel", "Religous"}, 215 | { "a-.-G-I-c-res", "Resevoir"}, 216 | { "a-.-G-I-c-ret", "Retail"}, 217 | { "a-.-G-I-c-sch", "School"}, 218 | { "a-.-G-I-c-vip", "VIP"}, 219 | { "a-.-G-I-c-whs", "Warehouse"}, 220 | { "a-.-G-I-E", "EQUIPMENT MANUFACTURE"}, 221 | { "a-.-G-I-E-h", "Heavy"}, 222 | { "a-.-G-I-E-l", "Light"}, 223 | { "a-.-G-I-E-o", "Plant Other"}, 224 | { "a-.-G-I-G", "GOVERNMENT LEADERSHIP"}, 225 | { "a-.-G-I-i", "IM Facilities"}, 226 | { "a-.-G-I-i-e", "Emergency Management"}, 227 | { "a-.-G-I-i-e-eoc", "Emergency Operations Center"}, 228 | { "a-.-G-I-i-e-ic", "Incident Commander"}, 229 | { "a-.-G-I-i-e-icc", "Incident Communications Center"}, 230 | { "a-.-G-I-i-e-icp", "Incident Command Post"}, 231 | { "a-.-G-I-i-e-wr", "War Room"}, 232 | { "a-.-G-I-i-f", "Fire/Hazmat"}, 233 | { "a-.-G-I-i-f-fd", "Fire Department"}, 234 | { "a-.-G-I-i-h", "Health and Medical"}, 235 | { "a-.-G-I-i-h-md", "Medical Dispatch"}, 236 | { "a-.-G-I-i-l", "Law Enforcement"}, 237 | { "a-.-G-I-i-l-cp", "Police Checkpoint"}, 238 | { "a-.-G-I-i-l-hp", "Highway Patrol"}, 239 | { "a-.-G-I-i-l-lp", "Local Police"}, 240 | { "a-.-G-I-i-l-ntz", "No Trespassing Zone"}, 241 | { "a-.-G-I-i-l-sd", "Sheriffs Department"}, 242 | { "a-.-G-I-i-l-sp", "State Police"}, 243 | { "a-.-G-I-i-m", "Emergency Medical Services"}, 244 | { "a-.-G-I-i-o", "Other"}, 245 | { "a-.-G-I-i-o-ad", "Agency Dispatch"}, 246 | { "a-.-G-I-i-o-ad-ems", "EMS"}, 247 | { "a-.-G-I-i-o-ad-f", "Fire"}, 248 | { "a-.-G-I-i-o-ad-hwy", "Highway"}, 249 | { "a-.-G-I-i-o-ad-mda", "Media"}, 250 | { "a-.-G-I-i-o-ad-pl", "Police Local"}, 251 | { "a-.-G-I-i-o-ad-ps", "Police Station"}, 252 | { "a-.-G-I-i-o-ad-tow", "Tow"}, 253 | { "a-.-G-I-i-o-ad-ts", "Transit"}, 254 | { "a-.-G-I-i-o-bcc", "Border Control Checkpoint"}, 255 | { "a-.-G-I-i-o-dmz", "DMZ"}, 256 | { "a-.-G-I-i-o-isp", "Independent Service Provider"}, 257 | { "a-.-G-I-i-o-mc", "Mobile Center"}, 258 | { "a-.-G-I-i-o-mc-f", "Fire"}, 259 | { "a-.-G-I-i-o-mc-h", "Medical"}, 260 | { "a-.-G-I-i-o-mc-l", "Law Enforcement"}, 261 | { "a-.-G-I-i-o-mes", "Message Center"}, 262 | { "a-.-G-I-i-o-mob", "Mobilization Center"}, 263 | { "a-.-G-I-i-o-mob-ems", "EMS"}, 264 | { "a-.-G-I-i-o-mob-es", "Transit"}, 265 | { "a-.-G-I-i-o-mob-f", "Fire"}, 266 | { "a-.-G-I-i-o-mob-hwy", "Highway"}, 267 | { "a-.-G-I-i-o-mob-mda", "Media"}, 268 | { "a-.-G-I-i-o-mob-pl", "Ploce Local"}, 269 | { "a-.-G-I-i-o-mob-ps", "Police Station"}, 270 | { "a-.-G-I-i-o-mob-tow", "Tow"}, 271 | { "a-.-G-I-i-o-ps", "Public Safety"}, 272 | { "a-.-G-I-i-o-rl", "Reporting Locations"}, 273 | { "a-.-G-I-i-o-sa", "Staging Area"}, 274 | { "a-.-G-I-i-o-sa-ems", "EMS"}, 275 | { "a-.-G-I-i-o-sa-f", "Fire"}, 276 | { "a-.-G-I-i-o-sa-hwy", "Highway"}, 277 | { "a-.-G-I-i-o-sa-mda", "Media"}, 278 | { "a-.-G-I-i-o-sa-pl", "Police Local"}, 279 | { "a-.-G-I-i-o-sa-ps", "Police Station"}, 280 | { "a-.-G-I-i-o-sa-tow", "Tow"}, 281 | { "a-.-G-I-i-o-sa-ts", "Transit"}, 282 | { "a-.-G-I-i-o-sc", "Security Checkpoint"}, 283 | { "a-.-G-I-i-o-seg", "Segment"}, 284 | { "a-.-G-I-i-o-t", "Transportation"}, 285 | { "a-.-G-I-i-o-t-im", "Transit Incident Management Center"}, 286 | { "a-.-G-I-i-o-t-tc", "Transit Management Center"}, 287 | { "a-.-G-I-i-o-t-td", "Traffic Inc Service Patrol Dispatch"}, 288 | { "a-.-G-I-i-o-t-tm", "Traffic Management Center"}, 289 | { "a-.-G-I-i-o-tmp", "Temporary"}, 290 | { "a-.-G-I-i-o-tmp-f", "Fire"}, 291 | { "a-.-G-I-i-o-tmp-h", "Medical"}, 292 | { "a-.-G-I-i-o-tmp-l", "Law Enforcement"}, 293 | { "a-.-G-I-i-p", "Public Works"}, 294 | { "a-.-G-I-M", "MILITARY MATERIEL FACILITY"}, 295 | { "a-.-G-I-M-A", "AIRCRAFT PRODUCTION/ASSEMBLY"}, 296 | { "a-.-G-I-M-C", "CHEMICAL/BIOLOGICAL WARFARE PRODUCTION"}, 297 | { "a-.-G-I-M-E", "AMMUNITION AND EXPLOSIVES PRODUCTION"}, 298 | { "a-.-G-I-M-F", "NUCLEAR ENERGY"}, 299 | { "a-.-G-I-M-F-A", "ATOMIC ENERGY REACTOR"}, 300 | { "a-.-G-I-M-F-P", "NUCLEAR MATERIAL PRODUCTION"}, 301 | { "a-.-G-I-M-F-P-W", "WEAPONS GRADE"}, 302 | { "a-.-G-I-M-F-S", "NUCLEAR MATERIAL STORAGE"}, 303 | { "a-.-G-I-M-G", "ARMAMENT PRODUCTION"}, 304 | { "a-.-G-I-M-M", "MISSILE/SPACE SYSTEM PRODUCTION"}, 305 | { "a-.-G-I-M-N", "ENGINEERING EQUIPMENT PRODUCTION"}, 306 | { "a-.-G-I-M-N-B", "BRIDGE"}, 307 | { "a-.-G-I-M-N-B-l", "Bridge (Large)"}, 308 | { "a-.-G-I-M-N-B-m", "Bridge (Med)"}, 309 | { "a-.-G-I-M-N-B-s", "Bridge (Small)"}, 310 | { "a-.-G-I-M-N-c", "Canal"}, 311 | { "a-.-G-I-M-S", "SHIP CONSTRUCTION"}, 312 | { "a-.-G-I-M-V", "MILITARY VEHICLE PRODUCTION"}, 313 | { "a-.-G-I-P", "PROCESSING FACILITY"}, 314 | { "a-.-G-I-P-D", "DECON"}, 315 | { "a-.-G-I-R", "RAW MATERIAL PRODUCTION/STORAGE"}, 316 | { "a-.-G-I-R-M", "MINE"}, 317 | { "a-.-G-I-R-N", "NBC"}, 318 | { "a-.-G-I-R-N-B", "BIOLOGICAL"}, 319 | { "a-.-G-I-R-N-C", "CHEMICAL"}, 320 | { "a-.-G-I-R-N-N", "NUCLEAR"}, 321 | { "a-.-G-I-R-P", "PETROLEUM/GAS/OIL"}, 322 | { "a-.-G-I-R-P-r", "Refinery"}, 323 | { "a-.-G-I-T", "TRANSPORT FACILITY"}, 324 | { "a-.-G-I-T-a", "Airport"}, 325 | { "a-.-G-I-T-hb", "Helibase"}, 326 | { "a-.-G-I-T-hs", "Helispot"}, 327 | { "a-.-G-I-T-l", "Land Port"}, 328 | { "a-.-G-I-T-pg", "Parking Garage"}, 329 | { "a-.-G-I-T-r", "Railroad"}, 330 | { "a-.-G-I-T-s", "Seaport"}, 331 | { "a-.-G-I-U", "SERVICE, RESEARCH, UTILITY FACILITY"}, 332 | { "a-.-G-I-U-E", "ELECTRIC POWER FACILITY"}, 333 | { "a-.-G-I-U-E-c", "Coal Power Plant"}, 334 | { "a-.-G-I-U-E-h", "Hydroelectric Power Plant"}, 335 | { "a-.-G-I-U-E-o", "Other Power"}, 336 | { "a-.-G-I-U-E-ps", "Power Substation"}, 337 | { "a-.-G-I-U-E-D", "DAM"}, 338 | { "a-.-G-I-U-E-F", "FOSSIL FUEL"}, 339 | { "a-.-G-I-U-E-N", "NUCLEAR PLANT"}, 340 | { "a-.-G-I-U-P", "PUBLIC WATER SERVICES"}, 341 | { "a-.-G-I-U-R", "TECHNOLOGICAL RESEARCH FACILITY"}, 342 | { "a-.-G-I-U-T", "TELECOMMUNICATIONS FACILITY"}, 343 | { "a-.-G-I-U-T-com", "Communications"}, 344 | { "a-.-G-I-U-T-com-af", "Antenna Farm"}, 345 | { "a-.-G-I-U-T-com-sat", "Satellite Communications"}, 346 | { "a-.-G-I-U-T-com-tow", "Tower"}, 347 | { "a-.-G-I-U-T-r", "Radio"}, 348 | { "a-.-G-I-U-T-r-s", "Station"}, 349 | { "a-.-G-I-U-T-tp", "Telephone"}, 350 | { "a-.-G-I-U-T-tp-ts", "Telephone Switching"}, 351 | { "a-.-G-I-U-T-tv", "Television"}, 352 | { "a-.-G-I-U-T-tv-c", "Cable"}, 353 | { "a-.-G-I-U-T-tv-s", "Station"}, 354 | { "a-.-G-I-X", "MEDICAL FACILITY"}, 355 | { "a-.-G-I-X-H", "HOSPITAL"}, 356 | { "a-.-G-I-X-hcf", "Hospital Care Facility"}, 357 | { "a-.-G-I-r", "Road"}, 358 | { "a-.-G-I-r-h", "Road (Highway)"}, 359 | { "a-.-G-I-r-i", "Road (Improved)"}, 360 | { "a-.-G-I-r-ra", "Rest Area"}, 361 | { "a-.-G-I-r-u", "Road (Un-improved)"}, 362 | { "a-.-G-U", "UNIT"}, 363 | { "a-.-G-U-C", "COMBAT"}, 364 | { "a-.-G-U-C-A", "ARMOR"}, 365 | { "a-.-G-U-C-A-A", "ANTI ARMOR"}, 366 | { "a-.-G-U-C-A-A-A", "ANTI ARMOR ARMORED"}, 367 | { "a-.-G-U-C-A-A-A-S", "ANTI ARMOR ARMORED AIR ASSAULT"}, 368 | { "a-.-G-U-C-A-A-A-T", "ANTI ARMOR ARMORED TRACKED"}, 369 | { "a-.-G-U-C-A-A-A-W", "ANTI ARMOR ARMORED WHEELED"}, 370 | { "a-.-G-U-C-A-A-C", "ANTI ARMOR ARCTIC"}, 371 | { "a-.-G-U-C-A-A-D", "ANTI ARMOR DISMOUNTED"}, 372 | { "a-.-G-U-C-A-A-L", "ANTI ARMOR LIGHT"}, 373 | { "a-.-G-U-C-A-A-M", "ANTI ARMOR AIRBORNE"}, 374 | { "a-.-G-U-C-A-A-O", "ANTI ARMOR MOTORIZED"}, 375 | { "a-.-G-U-C-A-A-O-S", "ANTI ARMOR MOTORIZED AIR ASSAULT"}, 376 | { "a-.-G-U-C-A-A-S", "ANTI ARMOR AIR ASSAULT"}, 377 | { "a-.-G-U-C-A-A-U", "ANTI ARMOR MOUNTAIN"}, 378 | { "a-.-G-U-C-A-T", "ARMOR TRACK"}, 379 | { "a-.-G-U-C-A-T-A", "ARMOR TRACK AIRBORNE"}, 380 | { "a-.-G-U-C-A-T-H", "ARMOR TRACK, HEAVY"}, 381 | { "a-.-G-U-C-A-T-L", "ARMOR TRACK, LIGHT"}, 382 | { "a-.-G-U-C-A-T-M", "ARMOR TRACK, MEDIUM"}, 383 | { "a-.-G-U-C-A-T-R", "ARMOR TRACK, RECOVERY"}, 384 | { "a-.-G-U-C-A-T-W", "ARMOR TRACK AMPHIBIOUS"}, 385 | { "a-.-G-U-C-A-T-W-R", "ARMOR TRACK AMPHIBIOUS RECOVERY"}, 386 | { "a-.-G-U-C-A-W", "ARMOR, WHEELED"}, 387 | { "a-.-G-U-C-A-W-A", "ARMOR, WHEELED AIRBORNE"}, 388 | { "a-.-G-U-C-A-W-H", "ARMOR, WHEELED HEAVY"}, 389 | { "a-.-G-U-C-A-W-L", "ARMOR, WHEELED LIGHT"}, 390 | { "a-.-G-U-C-A-W-M", "ARMOR, WHEELED MEDIUM"}, 391 | { "a-.-G-U-C-A-W-R", "ARMOR, WHEELED RECOVERY"}, 392 | { "a-.-G-U-C-A-W-S", "ARMOR, WHEELED AIR ASSAULT"}, 393 | { "a-.-G-U-C-A-W-W", "ARMOR, WHEELED AMPHIBIOUS"}, 394 | { "a-.-G-U-C-A-W-W-R", "ARMOR, WHEELED AMPHIBIOUS RECOVERY"}, 395 | { "a-.-G-U-C-D", "AIR DEFENSE"}, 396 | { "a-.-G-U-C-D-C", "COMPOSITE"}, 397 | { "a-.-G-U-C-D-G", "GUN UNIT"}, 398 | { "a-.-G-U-C-D-H", "H/MAD"}, 399 | { "a-.-G-U-C-D-H-H", "HAWK"}, 400 | { "a-.-G-U-C-D-H-P", "PATRIOT"}, 401 | { "a-.-G-U-C-D-M", "AIR DEFENSE MISSILE"}, 402 | { "a-.-G-U-C-D-M-H", "AIR DEFENSE MISSILE HEAVY"}, 403 | { "a-.-G-U-C-D-M-L", "AIR DEFENSE MISSILE LIGHT"}, 404 | { "a-.-G-U-C-D-M-L-A", "AIR DEFENSE MISSILE MOTORIZED (AVENGER)"}, 405 | { "a-.-G-U-C-D-M-M", "AIR DEFENSE MISSILE MEDIUM"}, 406 | { "a-.-G-U-C-D-O", "THEATER MISSILE DEFENSE UNIT"}, 407 | { "a-.-G-U-C-D-S", "SHORT RANGE"}, 408 | { "a-.-G-U-C-D-S-S", "STINGER"}, 409 | { "a-.-G-U-C-D-S-V", "VULCAN"}, 410 | { "a-.-G-U-C-D-T", "TARGETING UNIT"}, 411 | { "a-.-G-U-C-E", "ENGINEER"}, 412 | { "a-.-G-U-C-E-C", "ENGINEER COMBAT"}, 413 | { "a-.-G-U-C-E-C-A", "ENGINEER COMBAT AIRBORNE"}, 414 | { "a-.-G-U-C-E-C-C", "ENGINEER COMBAT ARCTIC"}, 415 | { "a-.-G-U-C-E-C-H", "ENGINEER COMBAT HEAVY"}, 416 | { "a-.-G-U-C-E-C-L", "ENGINEER COMBAT LIGHT (SAPPER)"}, 417 | { "a-.-G-U-C-E-C-M", "ENGINEER COMBAT MEDIUM"}, 418 | { "a-.-G-U-C-E-C-O", "ENGINEER COMBAT MOUNTAIN"}, 419 | { "a-.-G-U-C-E-C-R", "ENGINEER COMBAT RECON"}, 420 | { "a-.-G-U-C-E-C-S", "ENGINEER COMBAT AIR ASSAULT"}, 421 | { "a-.-G-U-C-E-C-T", "ENGINEER COMBAT MECHANIZED (TRACK)"}, 422 | { "a-.-G-U-C-E-C-W", "ENGINEER COMBAT MOTORIZED"}, 423 | { "a-.-G-U-C-E-N", "ENGINEER CONSTRUCTION"}, 424 | { "a-.-G-U-C-E-N-N", "ENGINEER NAVAL CONSTRUCTION"}, 425 | { "a-.-G-U-C-F", "Artillery (Fixed)"}, 426 | { "a-.-G-U-C-F-H", "HOWITZER/GUN"}, 427 | { "a-.-G-U-C-F-H-A", "AIRBORNE"}, 428 | { "a-.-G-U-C-F-H-C", "ARCTIC"}, 429 | { "a-.-G-U-C-F-H-E", "Artillery (Mobile)"}, 430 | { "a-.-G-U-C-F-H-H", "HEAVY"}, 431 | { "a-.-G-U-C-F-H-L", "LIGHT"}, 432 | { "a-.-G-U-C-F-H-M", "MEDIUM"}, 433 | { "a-.-G-U-C-F-H-O", "MOUNTAIN"}, 434 | { "a-.-G-U-C-F-H-S", "AIR ASSAULT"}, 435 | { "a-.-G-U-C-F-H-X", "AMPHIBIOUS"}, 436 | { "a-.-G-U-C-F-M", "MORTAR"}, 437 | { "a-.-G-U-C-F-M-L", "AMPHIBIOUS MORTAR"}, 438 | { "a-.-G-U-C-F-M-S", "SELF PROPELLED (SP) TRACKED MORTAR"}, 439 | { "a-.-G-U-C-F-M-T", "TOWED MORTAR"}, 440 | { "a-.-G-U-C-F-M-T-A", "TOWED AIRBORNE MORTAR"}, 441 | { "a-.-G-U-C-F-M-T-C", "TOWED ARCTIC MORTAR"}, 442 | { "a-.-G-U-C-F-M-T-O", "TOWED MOUNTAIN MORTAR"}, 443 | { "a-.-G-U-C-F-M-T-S", "TOWED AIR ASSAULT MORTAR"}, 444 | { "a-.-G-U-C-F-M-W", "SP WHEELED MORTAR"}, 445 | { "a-.-G-U-C-F-O", "METEOROLOGICAL"}, 446 | { "a-.-G-U-C-F-O-A", "AIRBORNE METEOROLOGICAL"}, 447 | { "a-.-G-U-C-F-O-L", "LIGHT METEOROLOGICAL"}, 448 | { "a-.-G-U-C-F-O-O", "MOUNTAIN METEOROLOGICAL"}, 449 | { "a-.-G-U-C-F-O-S", "AIR ASSAULT METEOROLOGICAL"}, 450 | { "a-.-G-U-C-F-R", "ROCKET"}, 451 | { "a-.-G-U-C-F-R-M", "Rockets (Fixed)"}, 452 | { "a-.-G-U-C-F-R-M-R", "Rockets (Mobile)"}, 453 | { "a-.-G-U-C-F-R-M-S", "MULTI ROCKET SELF PROPELLED"}, 454 | { "a-.-G-U-C-F-R-M-T", "MULTI ROCKET TOWED"}, 455 | { "a-.-G-U-C-F-R-S", "SINGLE ROCKET LAUNCHER"}, 456 | { "a-.-G-U-C-F-R-S-R", "SINGLE ROCKET TRUCK"}, 457 | { "a-.-G-U-C-F-R-S-S", "SINGLE ROCKET SELF PROPELLED"}, 458 | { "a-.-G-U-C-F-R-S-T", "SINGLE ROCKET TOWED"}, 459 | { "a-.-G-U-C-F-S", "ARTILLERY SURVEY"}, 460 | { "a-.-G-U-C-F-S-A", "AIRBORNE"}, 461 | { "a-.-G-U-C-F-S-L", "LIGHT"}, 462 | { "a-.-G-U-C-F-S-O", "MOUNTAIN"}, 463 | { "a-.-G-U-C-F-S-S", "AIR ASSAULT"}, 464 | { "a-.-G-U-C-F-T", "TARGET ACQUISITION"}, 465 | { "a-.-G-U-C-F-T-A", "ANGLICO"}, 466 | { "a-.-G-U-C-F-T-C", "COLT/FIST"}, 467 | { "a-.-G-U-C-F-T-C-D", "DISMOUNTED COLT/FIST"}, 468 | { "a-.-G-U-C-F-T-C-M", "TRACKED COLT/FIST"}, 469 | { "a-.-G-U-C-F-T-F", "FLASH (OPTICAL)"}, 470 | { "a-.-G-U-C-F-T-R", "RADAR"}, 471 | { "a-.-G-U-C-F-T-S", "SOUND"}, 472 | { "a-.-G-U-C-I", "Troops (Open)"}, 473 | { "a-.-G-U-C-I-A", "INFANTRY AIRBORNE"}, 474 | { "a-.-G-U-C-I-C", "INFANTRY ARCTIC"}, 475 | { "a-.-G-U-C-I-I", "INFANTRY FIGHTING VEHICLE"}, 476 | { "a-.-G-U-C-I-L", "INFANTRY LIGHT"}, 477 | { "a-.-G-U-C-I-M", "INFANTRY MOTORIZED"}, 478 | { "a-.-G-U-C-I-N", "INFANTRY NAVAL"}, 479 | { "a-.-G-U-C-I-O", "INFANTRY MOUNTAIN"}, 480 | { "a-.-G-U-C-I-S", "INFANTRY AIR ASSAULT"}, 481 | { "a-.-G-U-C-I-Z", "INFANTRY MECHANIZED"}, 482 | { "a-.-G-U-C-I-d", "Troops (DugIn)"}, 483 | { "a-.-G-U-C-M", "MISSILE (SURF SURF)"}, 484 | { "a-.-G-U-C-M-S", "MISSILE (SURF SURF) STRATEGIC"}, 485 | { "a-.-G-U-C-M-T", "MISSILE (SURF SURF) TACTICAL"}, 486 | { "a-.-G-U-C-R", "RECONNAISSANCE"}, 487 | { "a-.-G-U-C-R-A", "RECONNAISSANCE AIRBORNE"}, 488 | { "a-.-G-U-C-R-C", "RECONNAISSANCE ARCTIC"}, 489 | { "a-.-G-U-C-R-H", "RECONNAISSANCE HORSE"}, 490 | { "a-.-G-U-C-R-L", "RECONNAISSANCE LIGHT"}, 491 | { "a-.-G-U-C-R-O", "RECONNAISSANCE MOUNTAIN"}, 492 | { "a-.-G-U-C-R-R", "RECONNAISSANCE MARINE"}, 493 | { "a-.-G-U-C-R-R-D", "RECONNAISSANCE MARINE DIVISION"}, 494 | { "a-.-G-U-C-R-R-F", "RECONNAISSANCE MARINE FORCE"}, 495 | { "a-.-G-U-C-R-R-L", "RECONNAISSANCE MARINE LIGHT ARMORED"}, 496 | { "a-.-G-U-C-R-S", "RECONNAISSANCE AIR ASSAULT"}, 497 | { "a-.-G-U-C-R-V", "RECONNAISSANCE CAVALRY"}, 498 | { "a-.-G-U-C-R-V-A", "RECONNAISSANCE CAVALRY ARMORED"}, 499 | { "a-.-G-U-C-R-V-G", "RECONNAISSANCE CAVALRY GROUND"}, 500 | { "a-.-G-U-C-R-V-M", "RECONNAISSANCE CAVALRY MOTORIZED"}, 501 | { "a-.-G-U-C-R-V-O", "RECONNAISSANCE CAVALRY AIR"}, 502 | { "a-.-G-U-C-R-X", "RECONNAISSANCE LONG RANGE SURVEILLANCE"}, 503 | { "a-.-G-U-C-S", "INTERNAL SECURITY FORCES"}, 504 | { "a-.-G-U-C-S-A", "AVIATION"}, 505 | { "a-.-G-U-C-S-G", "GROUND"}, 506 | { "a-.-G-U-C-S-G-A", "MECHANIZED GROUND"}, 507 | { "a-.-G-U-C-S-G-D", "DISMOUNTED GROUND"}, 508 | { "a-.-G-U-C-S-G-M", "MOTORIZED GROUND"}, 509 | { "a-.-G-U-C-S-M", "WHEELED MECHANIZED"}, 510 | { "a-.-G-U-C-S-R", "Rail"}, 511 | { "a-.-G-U-C-S-W", "RIVERINE"}, 512 | { "a-.-G-U-C-V", "AVIATION"}, 513 | { "a-.-G-U-C-V-C", "COMPOSITE"}, 514 | { "a-.-G-U-C-V-F", "FIXED WING"}, 515 | { "a-.-G-U-C-V-F-A", "ATTACK FIXED WING"}, 516 | { "a-.-G-U-C-V-F-R", "RECON FIXED WING"}, 517 | { "a-.-G-U-C-V-F-U", "UTILITY FIXED WING"}, 518 | { "a-.-G-U-C-V-R", "ROTARY WING"}, 519 | { "a-.-G-U-C-V-R-A", "ATTACK ROTARY WING"}, 520 | { "a-.-G-U-C-V-R-M", "MINE COUNTERMEASURE ROTARY WING"}, 521 | { "a-.-G-U-C-V-R-S", "SCOUT ROTARY WING"}, 522 | { "a-.-G-U-C-V-R-U", "UTILITY ROTARY WING"}, 523 | { "a-.-G-U-C-V-R-U-C", "C2 ROTARY WING"}, 524 | { "a-.-G-U-C-V-R-U-E", "MEDEVAC ROTARY WING"}, 525 | { "a-.-G-U-C-V-R-U-H", "HEAVY UTILITY ROTARY WING"}, 526 | { "a-.-G-U-C-V-R-U-L", "LIGHT UTILITY ROTARY WING"}, 527 | { "a-.-G-U-C-V-R-U-M", "MEDIUM UTILITY ROTARY WING"}, 528 | { "a-.-G-U-C-V-R-W", "ANTISUBMARINE WARFARE ROTARY WING"}, 529 | { "a-.-G-U-C-V-R-d", "Helo ground unit (Dual)"}, 530 | { "a-.-G-U-C-V-R-s", "Helo ground unit (Single)"}, 531 | { "a-.-G-U-C-V-S", "SEARCH AND RESCUE"}, 532 | { "a-.-G-U-C-V-U", "UNMANNED AERIAL VEHICLE"}, 533 | { "a-.-G-U-C-V-U-F", "UNMANNED AERIAL VEHICLE FIXED WING"}, 534 | { "a-.-G-U-C-V-U-R", "UNMANNED AERIAL VEHICLE ROTARY WING"}, 535 | { "a-.-G-U-C-V-V", "VERTICAL/SHORT TAKEOFF AND LANDING"}, 536 | { "a-.-G-U-H", "SPECIAL C2 HEADQUARTERS COMPONENT"}, 537 | { "a-.-G-U-S", "COMBAT SERVICE SUPPORT"}, 538 | { "a-.-G-U-S-A", "ADMINISTRATIVE (ADMIN)"}, 539 | { "a-.-G-U-S-A-C", "ADMIN CORPS"}, 540 | { "a-.-G-U-S-A-F", "FINANCE"}, 541 | { "a-.-G-U-S-A-F-C", "FINANCE CORPS"}, 542 | { "a-.-G-U-S-A-F-T", "FINANCE THEATER"}, 543 | { "a-.-G-U-S-A-J", "JUDGE ADVOCATE GENERAL (JAG)"}, 544 | { "a-.-G-U-S-A-J-C", "JAG CORPS"}, 545 | { "a-.-G-U-S-A-J-T", "JAG THEATER"}, 546 | { "a-.-G-U-S-A-L", "LABOR"}, 547 | { "a-.-G-U-S-A-L-C", "LABOR CORPS"}, 548 | { "a-.-G-U-S-A-L-T", "LABOR THEATER"}, 549 | { "a-.-G-U-S-A-M", "MORTUARY/GRAVES REGISTRY"}, 550 | { "a-.-G-U-S-A-M-C", "MORTUARY/GRAVES REGISTRY CORPS"}, 551 | { "a-.-G-U-S-A-M-T", "MORTUARY/GRAVES REGISTRY THEATER"}, 552 | { "a-.-G-U-S-A-O", "POSTAL"}, 553 | { "a-.-G-U-S-A-O-C", "POSTAL CORPS"}, 554 | { "a-.-G-U-S-A-O-T", "POSTAL THEATER"}, 555 | { "a-.-G-U-S-A-P", "PUBLIC AFFAIRS"}, 556 | { "a-.-G-U-S-A-P-B", "PUBLIC AFFAIRS BROADCAST"}, 557 | { "a-.-G-U-S-A-P-B-C", "PUBLIC AFFAIRS BROADCAST CORPS"}, 558 | { "a-.-G-U-S-A-P-B-T", "PUBLIC AFFAIRS BROADCAST THEATER"}, 559 | { "a-.-G-U-S-A-P-C", "PUBLIC AFFAIRS CORPS"}, 560 | { "a-.-G-U-S-A-P-M", "PUBLIC AFFAIRS JOINT INFORMATION BUREAU"}, 561 | { "a-.-G-U-S-A-P-M-C", "PUBLIC AFFAIRS JIB CORPS"}, 562 | { "a-.-G-U-S-A-P-M-T", "PUBLIC AFFAIRS JIB THEATER"}, 563 | { "a-.-G-U-S-A-P-T", "PUBLIC AFFAIRS THEATER"}, 564 | { "a-.-G-U-S-A-Q", "QUARTERMASTER (SUPPLY)"}, 565 | { "a-.-G-U-S-A-Q-C", "QUARTERMASTER (SUPPLY) CORPS"}, 566 | { "a-.-G-U-S-A-Q-T", "QUARTERMASTER (SUPPLY) THEATER"}, 567 | { "a-.-G-U-S-A-R", "RELIGIOUS/CHAPLAIN"}, 568 | { "a-.-G-U-S-A-R-C", "RELIGIOUS/CHAPLAIN CORPS"}, 569 | { "a-.-G-U-S-A-R-T", "RELIGIOUS/CHAPLAIN THEATER"}, 570 | { "a-.-G-U-S-A-S", "PERSONNEL SERVICES"}, 571 | { "a-.-G-U-S-A-S-C", "PERSONNEL CORPS"}, 572 | { "a-.-G-U-S-A-S-T", "PERSONNEL THEATER"}, 573 | { "a-.-G-U-S-A-T", "ADMIN THEATER"}, 574 | { "a-.-G-U-S-A-W", "MORALE, WELFARE, RECREATION (MWR)"}, 575 | { "a-.-G-U-S-A-W-C", "MWR CORPS"}, 576 | { "a-.-G-U-S-A-W-T", "MWR THEATER"}, 577 | { "a-.-G-U-S-A-X", "REPLACEMENT HOLDING UNIT (RHU)"}, 578 | { "a-.-G-U-S-A-X-C", "RHU CORPS"}, 579 | { "a-.-G-U-S-A-X-T", "RHU THEATER"}, 580 | { "a-.-G-U-S-M", "MEDICAL"}, 581 | { "a-.-G-U-S-M-C", "MEDICAL CORPS"}, 582 | { "a-.-G-U-S-M-D", "MEDICAL DENTAL"}, 583 | { "a-.-G-U-S-M-D-C", "MEDICAL DENTAL CORPS"}, 584 | { "a-.-G-U-S-M-D-T", "MEDICAL DENTAL THEATER"}, 585 | { "a-.-G-U-S-M-M", "MEDICAL TREATMENT FACILITY"}, 586 | { "a-.-G-U-S-M-M-C", "MEDICAL TREATMENT FACILITY CORPS"}, 587 | { "a-.-G-U-S-M-M-T", "MEDICAL TREATMENT FACILITY THEATER"}, 588 | { "a-.-G-U-S-M-P", "MEDICAL PSYCHOLOGICAL"}, 589 | { "a-.-G-U-S-M-P-C", "MEDICAL PSYCHOLOGICAL CORPS"}, 590 | { "a-.-G-U-S-M-P-T", "MEDICAL PSYCHOLOGICAL THEATER"}, 591 | { "a-.-G-U-S-M-T", "MEDICAL THEATER"}, 592 | { "a-.-G-U-S-M-V", "MEDICAL VETERINARY"}, 593 | { "a-.-G-U-S-M-V-C", "MEDICAL VETERINARY CORPS"}, 594 | { "a-.-G-U-S-M-V-T", "MEDICAL VETERINARY THEATER"}, 595 | { "a-.-G-U-S-S", "SUPPLY"}, 596 | { "a-.-G-U-S-S-1", "SUPPLY CLASS I"}, 597 | { "a-.-G-U-S-S-1-C", "SUPPLY CLASS I CORPS"}, 598 | { "a-.-G-U-S-S-1-T", "SUPPLY CLASS I THEATER"}, 599 | { "a-.-G-U-S-S-2", "SUPPLY CLASS II"}, 600 | { "a-.-G-U-S-S-2-C", "SUPPLY CLASS II CORPS"}, 601 | { "a-.-G-U-S-S-2-T", "SUPPLY CLASS II THEATER"}, 602 | { "a-.-G-U-S-S-3", "SUPPLY CLASS III"}, 603 | { "a-.-G-U-S-S-3-A", "SUPPLY CLASS III AVIATION"}, 604 | { "a-.-G-U-S-S-3-A-C", "SUPPLY CLASS III AVIATION CORPS"}, 605 | { "a-.-G-U-S-S-3-A-T", "SUPPLY CLASS III AVIATION THEATER"}, 606 | { "a-.-G-U-S-S-3-C", "SUPPLY CLASS III CORPS"}, 607 | { "a-.-G-U-S-S-3-T", "SUPPLY CLASS III THEATER"}, 608 | { "a-.-G-U-S-S-4", "SUPPLY CLASS IV"}, 609 | { "a-.-G-U-S-S-4-C", "SUPPLY CLASS IV CORPS"}, 610 | { "a-.-G-U-S-S-4-T", "SUPPLY CLASS IV THEATER"}, 611 | { "a-.-G-U-S-S-5", "SUPPLY CLASS V"}, 612 | { "a-.-G-U-S-S-5-C", "SUPPLY CLASS V CORPS"}, 613 | { "a-.-G-U-S-S-5-T", "SUPPLY CLASS V THEATER"}, 614 | { "a-.-G-U-S-S-6", "SUPPLY CLASS VI"}, 615 | { "a-.-G-U-S-S-6-C", "SUPPLY CLASS VI CORPS"}, 616 | { "a-.-G-U-S-S-6-T", "SUPPLY CLASS VI THEATER"}, 617 | { "a-.-G-U-S-S-7", "SUPPLY CLASS VII"}, 618 | { "a-.-G-U-S-S-7-C", "SUPPLY CLASS VII CORPS"}, 619 | { "a-.-G-U-S-S-7-T", "SUPPLY CLASS VII THEATER"}, 620 | { "a-.-G-U-S-S-8", "SUPPLY CLASS VIII"}, 621 | { "a-.-G-U-S-S-8-C", "SUPPLY CLASS VIII CORPS"}, 622 | { "a-.-G-U-S-S-8-T", "SUPPLY CLASS VIII THEATER"}, 623 | { "a-.-G-U-S-S-9", "SUPPLY CLASS IX"}, 624 | { "a-.-G-U-S-S-9-C", "SUPPLY CLASS IX CORPS"}, 625 | { "a-.-G-U-S-S-9-T", "SUPPLY CLASS IX THEATER"}, 626 | { "a-.-G-U-S-S-C", "SUPPLY CORPS"}, 627 | { "a-.-G-U-S-S-L", "SUPPLY LAUNDRY/BATH"}, 628 | { "a-.-G-U-S-S-L-C", "SUPPLY LAUNDRY/BATH CORPS"}, 629 | { "a-.-G-U-S-S-L-T", "SUPPLY LAUNDRY/BATH THEATER"}, 630 | { "a-.-G-U-S-S-T", "SUPPLY THEATER"}, 631 | { "a-.-G-U-S-S-W", "SUPPLY WATER"}, 632 | { "a-.-G-U-S-S-W-C", "SUPPLY WATER CORPS"}, 633 | { "a-.-G-U-S-S-W-P", "SUPPLY WATER PURIFICATION"}, 634 | { "a-.-G-U-S-S-W-P-C", "SUPPLY WATER PURIFICATION CORPS"}, 635 | { "a-.-G-U-S-S-W-P-T", "SUPPLY WATER PURIFICATION THEATER"}, 636 | { "a-.-G-U-S-S-W-T", "SUPPLY WATER THEATER"}, 637 | { "a-.-G-U-S-S-X", "SUPPLY CLASS X"}, 638 | { "a-.-G-U-S-S-X-C", "SUPPLY CLASS X CORPS"}, 639 | { "a-.-G-U-S-S-X-T", "SUPPLY CLASS X THEATER"}, 640 | { "a-.-G-U-S-S-d", "SupplyDepot"}, 641 | { "a-.-G-U-S-T", "TRANSPORTATION"}, 642 | { "a-.-G-U-S-T-A", "APOD/APOE"}, 643 | { "a-.-G-U-S-T-A-C", "APOD/APOE CORPS"}, 644 | { "a-.-G-U-S-T-A-T", "APOD/APOE THEATER"}, 645 | { "a-.-G-U-S-T-C", "TRANSPORTATION CORPS"}, 646 | { "a-.-G-U-S-T-I", "MISSILE"}, 647 | { "a-.-G-U-S-T-I-C", "MISSILE CORPS"}, 648 | { "a-.-G-U-S-T-I-T", "MISSILE THEATER"}, 649 | { "a-.-G-U-S-T-M", "MOVEMENT CONTROL CENTER(MCC)"}, 650 | { "a-.-G-U-S-T-M-C", "MCC CORPS"}, 651 | { "a-.-G-U-S-T-M-T", "MCC THEATER"}, 652 | { "a-.-G-U-S-T-R", "RAILHEAD"}, 653 | { "a-.-G-U-S-T-R-C", "RAILHEAD CORPS"}, 654 | { "a-.-G-U-S-T-R-T", "RAILHEAD THEATER"}, 655 | { "a-.-G-U-S-T-S", "SPOD/SPOE"}, 656 | { "a-.-G-U-S-T-S-C", "SPOD/SPOE CORPS"}, 657 | { "a-.-G-U-S-T-S-T", "SPOD/SPOE THEATER"}, 658 | { "a-.-G-U-S-T-T", "TRANSPORTATION THEATER"}, 659 | { "a-.-G-U-S-X", "MAINTENANCE"}, 660 | { "a-.-G-U-S-X-C", "MAINTENANCE CORPS"}, 661 | { "a-.-G-U-S-X-E", "ELECTRO OPTICAL"}, 662 | { "a-.-G-U-S-X-E-C", "ELECTRO OPTICAL CORPS"}, 663 | { "a-.-G-U-S-X-E-T", "ELECTRO OPTICAL THEATER"}, 664 | { "a-.-G-U-S-X-H", "MAINTENANCE HEAVY"}, 665 | { "a-.-G-U-S-X-H-C", "MAINTENANCE HEAVY CORPS"}, 666 | { "a-.-G-U-S-X-H-T", "MAINTENANCE HEAVY THEATER"}, 667 | { "a-.-G-U-S-X-O", "ORDNANCE"}, 668 | { "a-.-G-U-S-X-O-C", "ORDNANCE CORPS"}, 669 | { "a-.-G-U-S-X-O-M", "ORDNANCE MISSILE"}, 670 | { "a-.-G-U-S-X-O-M-C", "ORDNANCE MISSILE CORPS"}, 671 | { "a-.-G-U-S-X-O-M-T", "ORDNANCE MISSILE THEATER"}, 672 | { "a-.-G-U-S-X-O-T", "ORDNANCE THEATER"}, 673 | { "a-.-G-U-S-X-R", "MAINTENANCE RECOVERY"}, 674 | { "a-.-G-U-S-X-R-C", "MAINTENANCE RECOVERY CORPS"}, 675 | { "a-.-G-U-S-X-R-T", "MAINTENANCE RECOVERY THEATER"}, 676 | { "a-.-G-U-S-X-T", "MAINTENANCE THEATER"}, 677 | { "a-.-G-U-U", "COMBAT SUPPORT"}, 678 | { "a-.-G-U-U-A", "COMBAT SUPPORT NBC"}, 679 | { "a-.-G-U-U-A-B", "BIOLOGICAL"}, 680 | { "a-.-G-U-U-A-B-R", "RECON EQUIPPED"}, 681 | { "a-.-G-U-U-A-C", "CHEMICAL"}, 682 | { "a-.-G-U-U-A-C-C", "SMOKE/DECON"}, 683 | { "a-.-G-U-U-A-C-C-K", "MECHANIZED SMOKE/DECON"}, 684 | { "a-.-G-U-U-A-C-C-M", "MOTORIZED SMOKE/DECON"}, 685 | { "a-.-G-U-U-A-C-R", "CHEMICAL RECON"}, 686 | { "a-.-G-U-U-A-C-R-S", "CHEMICAL WHEELED ARMORED VEHICLE"}, 687 | { "a-.-G-U-U-A-C-R-W", "CHEMICAL WHEELED ARMORED VEHICLE"}, 688 | { "a-.-G-U-U-A-C-S", "SMOKE"}, 689 | { "a-.-G-U-U-A-C-S-A", "ARMOR SMOKE"}, 690 | { "a-.-G-U-U-A-C-S-M", "MOTORIZED SMOKE"}, 691 | { "a-.-G-U-U-A-D", "DECONTAMINATION"}, 692 | { "a-.-G-U-U-A-N", "NUCLEAR"}, 693 | { "a-.-G-U-U-E", "EXPLOSIVE ORDINANCE DISPOSAL"}, 694 | { "a-.-G-U-U-I", "INFORMATION WARFARE UNIT"}, 695 | { "a-.-G-U-U-L", "LAW ENFORCEMENT UNIT"}, 696 | { "a-.-G-U-U-L-C", "CIVILIAN LAW ENFORCEMENT"}, 697 | { "a-.-G-U-U-L-D", "CENTRAL INTELLIGENCE DIVISION (CID)"}, 698 | { "a-.-G-U-U-L-F", "SECURITY POLICE (AIR)"}, 699 | { "a-.-G-U-U-L-M", "MILITARY POLICE"}, 700 | { "a-.-G-U-U-L-S", "SHORE PATROL"}, 701 | { "a-.-G-U-U-M", "MILITARY INTELLIGENCE"}, 702 | { "a-.-G-U-U-M-A", "AERIAL EXPLOITATION"}, 703 | { "a-.-G-U-U-M-C", "COUNTER INTELLIGENCE"}, 704 | { "a-.-G-U-U-M-J", "JOINT INTELLIGENCE CENTER"}, 705 | { "a-.-G-U-U-M-M-O", "METEOROLOGICAL"}, 706 | { "a-.-G-U-U-M-O", "OPERATIONS"}, 707 | { "a-.-G-U-U-M-Q", "INTERROGATION"}, 708 | { "a-.-G-U-U-M-R", "SURVEILLANCE"}, 709 | { "a-.-G-U-U-M-R-G", "GROUND SURVEILLANCE RADAR"}, 710 | { "a-.-G-U-U-M-R-S", "SENSOR"}, 711 | { "a-.-G-U-U-M-R-S-S", "SENSOR SCM"}, 712 | { "a-.-G-U-U-M-R-X", "GROUND STATION MODULE"}, 713 | { "a-.-G-U-U-M-S", "SIGNAL INTELLIGENCE (SIGINT)"}, 714 | { "a-.-G-U-U-M-S-E", "ELECTRONIC WARFARE"}, 715 | { "a-.-G-U-U-M-S-E-A", "ARMORED WHEELED VEHICLE"}, 716 | { "a-.-G-U-U-M-S-E-C", "CORPS"}, 717 | { "a-.-G-U-U-M-S-E-D", "DIRECTION FINDING"}, 718 | { "a-.-G-U-U-M-S-E-I", "INTERCEPT"}, 719 | { "a-.-G-U-U-M-S-E-J", "JAMMING"}, 720 | { "a-.-G-U-U-M-S-E-T", "THEATER"}, 721 | { "a-.-G-U-U-M-T", "TACTICAL EXPLOIT"}, 722 | { "a-.-G-U-U-P", "LANDING SUPPORT"}, 723 | { "a-.-G-U-U-S", "SIGNAL UNIT"}, 724 | { "a-.-G-U-U-S-A", "AREA"}, 725 | { "a-.-G-U-U-S-C", "COMMUNICATION CONFIGURED PACKAGE"}, 726 | { "a-.-G-U-U-S-C-L", "LARGE COMMUNICATION CONFIGURED PACKAGE"}, 727 | { "a-.-G-U-U-S-F", "FORWARD COMMUNICATIONS"}, 728 | { "a-.-G-U-U-S-M", "MULTIPLE SUBSCRIBER ELEMENT"}, 729 | { "a-.-G-U-U-S-M-L", "LARGE EXTENSION NODE"}, 730 | { "a-.-G-U-U-S-M-N", "NODE CENTER"}, 731 | { "a-.-G-U-U-S-M-S", "SMALL EXTENSION NODE"}, 732 | { "a-.-G-U-U-S-O", "COMMAND OPERATIONS"}, 733 | { "a-.-G-U-U-S-R", "RADIO UNIT"}, 734 | { "a-.-G-U-U-S-R-S", "TACTICAL SATELLITE"}, 735 | { "a-.-G-U-U-S-R-T", "TELETYPE CENTER"}, 736 | { "a-.-G-U-U-S-R-W", "RELAY"}, 737 | { "a-.-G-U-U-S-S", "SIGNAL SUPPORT"}, 738 | { "a-.-G-U-U-S-W", "TELEPHONE SWITCH"}, 739 | { "a-.-G-U-U-S-X", "ELECTRONIC RANGING"}, 740 | { "a-.-G-U-i", "Incident Management Resources"}, 741 | { "a-.-G-U-i-a", "Animal Health"}, 742 | { "a-.-G-U-i-a-lar", "Large Animal Rescue Strike Team"}, 743 | { "a-.-G-U-i-a-las", "Large Animal Sheltering Team"}, 744 | { "a-.-G-U-i-a-lat", "Large Animal Transport Team"}, 745 | { "a-.-G-U-i-a-sar", "Small Animal Rescue Strike Team"}, 746 | { "a-.-G-U-i-a-sas", "Small Animal Sheltering Team"}, 747 | { "a-.-G-U-i-a-sat", "Small Animal Transport Team"}, 748 | { "a-.-G-U-i-a-imt", "Incident Management Team Animal Protection"}, 749 | { "a-.-G-U-i-e", "Emergency Management"}, 750 | { "a-.-G-U-i-e-acrc", "Airborne Communications Relay(CAP)"}, 751 | { "a-.-G-U-i-e-acrt", "Airborne Communications Relay Team"}, 752 | { "a-.-G-U-i-e-att", "Airborne Transport Team"}, 753 | { "a-.-G-U-i-e-cis", "Critical Incident Stress Management Team"}, 754 | { "a-.-G-U-i-e-cst", "Communications Support Team"}, 755 | { "a-.-G-U-i-e-dc", "Donations Coordinator"}, 756 | { "a-.-G-U-i-e-dmt", "Donations Management Personnel Team"}, 757 | { "a-.-G-U-i-e-ect", "Evacuation Coordination Team"}, 758 | { "a-.-G-U-i-e-efa", "EOC Finance Administration"}, 759 | { "a-.-G-U-i-e-elt", "Evacuation Liaison Team"}, 760 | { "a-.-G-U-i-e-ems", "EOC Management Support Team"}, 761 | { "a-.-G-U-i-e-eos", "EOC Operations Section Chief"}, 762 | { "a-.-G-U-i-e-eps", "EOC Planning Section Chief"}, 763 | { "a-.-G-U-i-e-ial", "Individual Assistance Disaster Assessment Team Leader"}, 764 | { "a-.-G-U-i-e-iat", "Individual Assistance Disaster Assessment Team"}, 765 | { "a-.-G-U-i-e-imt", "Incident Management Team"}, 766 | { "a-.-G-U-i-e-mcc", "Mobile Communications Center"}, 767 | { "a-.-G-U-i-e-mfk", "Mobile Feeding Kitchen"}, 768 | { "a-.-G-U-i-e-pac", "Public Assistance Coordinator"}, 769 | { "a-.-G-U-i-e-rna", "Rapid Needs Assessment Team"}, 770 | { "a-.-G-U-i-e-smt", "Shelter Management Team"}, 771 | { "a-.-G-U-i-e-val", "Volunteer Agency Liaison"}, 772 | { "a-.-G-U-i-m", "Emergency Medical Services"}, 773 | { "a-.-G-U-i-m-aaf", "Air Ambulance (Fixed-Wing)"}, 774 | { "a-.-G-U-i-m-aar", "Air Ambulance (Rotary-Wing)"}, 775 | { "a-.-G-U-i-m-ag", "Ambulances (Ground)"}, 776 | { "a-.-G-U-i-m-ast", "Ambulance Strike Team"}, 777 | { "a-.-G-U-i-m-atf", "Ambulance Task Force"}, 778 | { "a-.-G-U-i-m-etf", "Emergency Medical Task Force"}, 779 | { "a-.-G-U-i-f", "Fire HAZMAT"}, 780 | { "a-.-G-U-i-f-act", "Area Command Team, Firefighting"}, 781 | { "a-.-G-U-i-f-bp", "Brush Patrol"}, 782 | { "a-.-G-U-i-f-ct", "Crew Transport"}, 783 | { "a-.-G-U-i-f-efp", "Engine, Fire (Pumper)"}, 784 | { "a-.-G-U-i-f-fb", "Fire Boat"}, 785 | { "a-.-G-U-i-f-ft", "Fuel Tender"}, 786 | { "a-.-G-U-i-f-fta", "Fire Truck"}, 787 | { "a-.-G-U-i-f-ftf", "Foam Tender"}, 788 | { "a-.-G-U-i-f-hc", "Hand Crew"}, 789 | { "a-.-G-U-i-f-het", "HazMat Entry Team"}, 790 | { "a-.-G-U-i-f-hf", "Helicopters, Firefighting"}, 791 | { "a-.-G-U-i-f-ht", "Helitanker"}, 792 | { "a-.-G-U-i-f-imt", "Incident Management Team Firefighting"}, 793 | { "a-.-G-U-i-f-ibt", "Interagency Buying Team Firefighting"}, 794 | { "a-.-G-U-i-f-mcu", "Mobile Communications Unit"}, 795 | { "a-.-G-U-i-f-nsf", "USCG National Strike Force"}, 796 | { "a-.-G-U-i-f-pp", "Portable Pump"}, 797 | { "a-.-G-U-i-f-st", "Strike Team, Engine (Fire)"}, 798 | { "a-.-G-U-i-f-wt", "Water Tender, Firefighting (Tanker)"}, 799 | { "a-.-G-U-i-h", "Health and Medical"}, 800 | { "a-.-G-U-i-h-dmb", "Disaster Medical Assistance Team - Basic"}, 801 | { "a-.-G-U-i-h-dmc", "Disaster Medical Assistance Team - Crush Injury Specialty"}, 802 | { "a-.-G-U-i-h-dmm", "Disaster Medical Assistance Team - Mental Health"}, 803 | { "a-.-G-U-i-h-dmp", "Disaster Medical Assistance Team - Pediatric"}, 804 | { "a-.-G-U-i-h-dms", "Disaster Medical Assistance Team - Burn"}, 805 | { "a-.-G-U-i-h-mor", "Disaster Mortuary Operational Response Team"}, 806 | { "a-.-G-U-i-h-msr", "International Medical Surgical Response Team"}, 807 | { "a-.-G-U-i-h-mst", "NDMS Management Support Team"}, 808 | { "a-.-G-U-i-h-vma", "Veterinary Medical Assistance Team"}, 809 | { "a-.-G-U-i-l", "Law Enforcement"}, 810 | { "a-.-G-U-i-l-bs", "Bomb Squad Explosives Team"}, 811 | { "a-.-G-U-i-l-cct", "Crowd Control Team"}, 812 | { "a-.-G-U-i-l-dt", "Public Safety Dive Team"}, 813 | { "a-.-G-U-i-l-hps", "Aviation-Helicopters Patrol Surveillance"}, 814 | { "a-.-G-U-i-l-oa", "Observation Aircraft"}, 815 | { "a-.-G-U-i-l-tt", "SWAT Tactical Team"}, 816 | { "a-.-G-U-i-p", "Public Works"}, 817 | { "a-.-G-U-i-p-acf", "Air Curtain Burners (Above Ground)"}, 818 | { "a-.-G-U-i-p-ach", "Air Conditioner Heater"}, 819 | { "a-.-G-U-i-p-act", "Air Curtain Burners (In Ground)"}, 820 | { "a-.-G-U-i-p-atc", "All Terrain Cranes"}, 821 | { "a-.-G-U-i-p-bh", "Backhoe Loader"}, 822 | { "a-.-G-U-i-p-cah", "Chillers Air Handlers"}, 823 | { "a-.-G-U-i-p-cc", "Crawler Cranes"}, 824 | { "a-.-G-U-i-p-cce", "Concrete Cutter Multi-Processor for Hydraulic Excavator"}, 825 | { "a-.-G-U-i-p-dat", "Disaster Assessment Team"}, 826 | { "a-.-G-U-i-p-dmm", "Debris Management Monitoring Team"}, 827 | { "a-.-G-U-i-p-dmr", "Debris Management Site Reduction Team"}, 828 | { "a-.-G-U-i-p-dmt", "Debris Management Team"}, 829 | { "a-.-G-U-i-p-drt", "Disaster Recovery Team"}, 830 | { "a-.-G-U-i-p-dt", "Dump Trailer"}, 831 | { "a-.-G-U-i-p-dtf", "Dump Truck Off Road"}, 832 | { "a-.-G-U-i-p-dtn", "Dump Truck On Road"}, 833 | { "a-.-G-U-i-p-epr", "Electrical Power Restoration Team"}, 834 | { "a-.-G-U-i-p-es", "Engineering Services"}, 835 | { "a-.-G-U-i-p-fbt", "Flat Bed Trailer Truck"}, 836 | { "a-.-G-U-i-p-gen", "Generators"}, 837 | { "a-.-G-U-i-p-hel", "Hydraulic Excavator (Large)"}, 838 | { "a-.-G-U-i-p-hem", "Hydraulic Excavator (Medium)"}, 839 | { "a-.-G-U-i-p-htc", "Hydraulic Truck Cranes"}, 840 | { "a-.-G-U-i-p-ltc", "Lattice Truck Cranes"}, 841 | { "a-.-G-U-i-p-tb", "Tug Boat"}, 842 | { "a-.-G-U-i-p-td", "Track Dozer"}, 843 | { "a-.-G-U-i-p-tg", "Tub Grinder"}, 844 | { "a-.-G-U-i-p-tt", "Tractor Trailer"}, 845 | { "a-.-G-U-i-p-wd", "Wheel Dozer"}, 846 | { "a-.-G-U-i-p-wll", "Wheel Loaders (Large)"}, 847 | { "a-.-G-U-i-p-wlm", "Wheel Loaders (Medium)"}, 848 | { "a-.-G-U-i-p-wls", "Wheel Loaders (Small)"}, 849 | { "a-.-G-U-i-p-wpt", "Water Purification Team"}, 850 | { "a-.-G-U-i-p-wt", "Water Truck"}, 851 | { "a-.-G-U-i-s", "Search and Rescue"}, 852 | { "a-.-G-U-i-s-ar", "Airborne Reconnaissance"}, 853 | { "a-.-G-U-i-s-ast", "Air Search Team"}, 854 | { "a-.-G-U-i-s-cas", "Canine SAR Team Avalanche Snow"}, 855 | { "a-.-G-U-i-s-cav", "Cave SAR Team"}, 856 | { "a-.-G-U-i-s-cdr", "Canine SAR Team Disaster Response"}, 857 | { "a-.-G-U-i-s-clc", "Canine SAR Team Land Cadaver"}, 858 | { "a-.-G-U-i-s-col", "Collapse SAR Team"}, 859 | { "a-.-G-U-i-s-cwa", "Canine SAR Team Water"}, 860 | { "a-.-G-U-i-s-cwi", "Canine SAR Team Wilderness"}, 861 | { "a-.-G-U-i-s-cwt", "Canine SAR Team Wilderness Tracking"}, 862 | { "a-.-G-U-i-s-mt", "Mine Tunnel SAR Team"}, 863 | { "a-.-G-U-i-s-mnt", "Mountain SAR Team"}, 864 | { "a-.-G-U-i-s-rdf", "Radio Direction Finding Team"}, 865 | { "a-.-G-U-i-s-sfd", "Swiftwater Flood Search and Dive Rescue Team"}, 866 | { "a-.-G-U-i-s-uis", "USAR Incident Support Team"}, 867 | { "a-.-G-U-i-s-utf", "USAR Task Force"}, 868 | { "a-.-G-U-i-s-wi", "Wilderness SAR Team"}, 869 | { "a-.-G-U-i-o", "Other"}, 870 | { "a-.-S", "SEA SURFACE TRACK"}, 871 | { "a-.-S-C", "COMBATANT"}, 872 | { "a-.-S-C-A", "AMPHIBIOUS WARFARE SHIP"}, 873 | { "a-.-S-C-A-L-A", "ASSAULT VESSEL"}, 874 | { "a-.-S-C-A-L-C", "LANDING CRAFT"}, 875 | { "a-.-S-C-A-L-S", "LANDING SHIP"}, 876 | { "a-.-S-C-H", "HOVERCRAFT"}, 877 | { "a-.-S-C-L", "LINE"}, 878 | { "a-.-S-C-L-B-B", "BATTLESHIP"}, 879 | { "a-.-S-C-L-C-C", "CRUISER"}, 880 | { "a-.-S-C-L-C-V", "CARRIER"}, 881 | { "a-.-S-C-L-D-D", "DESTROYER"}, 882 | { "a-.-S-C-L-F-F", "FRIGATE/CORVETTE"}, 883 | { "a-.-S-C-M", "MINE WARFARE VESSEL"}, 884 | { "a-.-S-C-M-M-A", "MCM SUPPORT"}, 885 | { "a-.-S-C-M-M-D", "MCM DRONE"}, 886 | { "a-.-S-C-M-M-H", "MINEHUNTER"}, 887 | { "a-.-S-C-M-M-L", "MINELAYER"}, 888 | { "a-.-S-C-M-M-S", "MINESWEEPER"}, 889 | { "a-.-S-C-P", "PATROL"}, 890 | { "a-.-S-C-P-S-B", "ANTISUBMARINE WARFARE"}, 891 | { "a-.-S-C-P-S-U", "ANTISURFACE WARFARE"}, 892 | { "a-.-S-G", "NAVY GROUP"}, 893 | { "a-.-S-G-C", "CONVOY"}, 894 | { "a-.-S-G-G", "NAVY TASK GROUP"}, 895 | { "a-.-S-G-T", "NAVY TASK FORCE"}, 896 | { "a-.-S-G-U", "NAVY TASK UNIT"}, 897 | { "a-.-S-N", "NONCOMBATANT"}, 898 | { "a-.-S-N-F", "FLEET SUPPORT"}, 899 | { "a-.-S-N-H", "HOVERCRAFT"}, 900 | { "a-.-S-N-I", "INTELLIGENCE"}, 901 | { "a-.-S-N-M", "HOSPITAL SHIP"}, 902 | { "a-.-S-N-N", "STATION"}, 903 | { "a-.-S-N-N-R", "RESCUE"}, 904 | { "a-.-S-N-R", "UNDERWAY REPLENISHMENT"}, 905 | { "a-.-S-N-S", "SERVICE/SUPPORT HARBOR"}, 906 | { "a-.-S-O", "OWN TRACK"}, 907 | { "a-.-S-S", "STATION"}, 908 | { "a-.-S-S-A", "ASW SHIP"}, 909 | { "a-.-S-S-P", "PICKET"}, 910 | { "a-.-S-X", "NON MILITARY"}, 911 | { "a-.-S-X-F", "FISHING"}, 912 | { "a-.-S-X-F-D-F", "DRIFTER"}, 913 | { "a-.-S-X-F-D-R", "DREDGE"}, 914 | { "a-.-S-X-F-T-R", "TRAWLER"}, 915 | { "a-.-S-X-H", "HOVERCRAFT"}, 916 | { "a-.-S-X-L", "LAW ENFORCEMENT VESSEL"}, 917 | { "a-.-S-X-M", "MERCHANT"}, 918 | { "a-.-S-X-M-C", "CARGO"}, 919 | { "a-.-S-X-M-F", "FERRY"}, 920 | { "a-.-S-X-M-H", "HAZARDOUS MATERIALS (HAZMAT)"}, 921 | { "a-.-S-X-M-O", "OILER/TANKER"}, 922 | { "a-.-S-X-M-P", "PASSENGER"}, 923 | { "a-.-S-X-M-R", "ROLL ON/ROLL OFF"}, 924 | { "a-.-S-X-M-T-O", "TOWING VESSEL"}, 925 | { "a-.-S-X-M-T-U", "TUG"}, 926 | { "a-.-S-X-R", "LEISURE CRAFT"}, 927 | { "a-.-U", "SUBSURFACE TRACK"}, 928 | { "a-.-U-N", "NON SUBMARINE"}, 929 | { "a-.-U-N-D", "DIVER"}, 930 | { "a-.-U-S", "SUBMARINE"}, 931 | { "a-.-U-S-C", "SUBMARINE CONVENTIONAL PROPULSION"}, 932 | { "a-.-U-S-N", "SUBMARINE NUCLEAR PROPULSION"}, 933 | { "a-.-U-S-O", "OTHER SUBMERSIBLE"}, 934 | { "a-.-U-S-S", "STATION"}, 935 | { "a-.-U-S-S-A", "ASW SUBMARINE"}, 936 | { "a-.-U-S-U", "UNMANNED UNDERWATER VEHICLE (UUV)"}, 937 | { "a-.-U-W", "UNDERWATER WEAPON"}, 938 | { "a-.-U-W-D", "UNDERWATER DECOY"}, 939 | { "a-.-U-W-D-M", "SEA MINE DECOY"}, 940 | { "a-.-U-W-M", "SEA MINE"}, 941 | { "a-.-U-W-M-D", "SEA MINE DEALT"}, 942 | { "a-.-U-W-M-F", "SEA MINE (FLOATING)"}, 943 | { "a-.-U-W-M-F-D", "SEA MINE (FLOATING) DEALT"}, 944 | { "a-.-U-W-M-G", "SEA MINE (GROUND)"}, 945 | { "a-.-U-W-M-G-D", "SEA MINE (GROUND) DEALT"}, 946 | { "a-.-U-W-M-M", "SEA MINE (MOORED)"}, 947 | { "a-.-U-W-M-M-D", "SEA MINE (MOORED) DEALT"}, 948 | { "a-.-U-W-M-O", "SEA MINE (IN OTHER POSITION)"}, 949 | { "a-.-U-W-M-O-D", "SEA MINE (IN OTHER POSITION) DEALT"}, 950 | { "a-.-U-W-T", "TORPEDO"}, 951 | { "a-.-X", "Other"}, 952 | { "a-.-X-i", "Incident"}, 953 | { "a-.-X-i-g", "Geophysical"}, 954 | { "a-.-X-i-g-a", "Geophysical Avalanche"}, 955 | { "a-.-X-i-g-e", "Geophysical Earthquake"}, 956 | { "a-.-X-i-g-e-a", "Geophysical Earthquake Aftershock"}, 957 | { "a-.-X-i-g-e-e", "Geophysical Earthquake Epicenter"}, 958 | { "a-.-X-i-g-l", "Geophysical Landslide"}, 959 | { "a-.-X-i-g-s", "Geophysical Subsistance"}, 960 | { "a-.-X-i-g-v", "Geophysical Volcano"}, 961 | { "a-.-X-i-g-v-e", "Geophysical Volcano Eruption"}, 962 | { "a-.-X-i-g-v-t", "Geophysical Volcano Threat"}, 963 | { "a-.-X-i-m", "Meteorological"}, 964 | { "a-.-X-i-m-z", "Meteorological Drizzle"}, 965 | { "a-.-X-i-m-d", "Meteorological Drought"}, 966 | { "a-.-X-i-m-f", "Meteorological Flood"}, 967 | { "a-.-X-i-m-g", "Meteorological Fog"}, 968 | { "a-.-X-i-m-h", "Meteorological Hail"}, 969 | { "a-.-X-i-m-i", "Meteorological Inversion"}, 970 | { "a-.-X-i-m-r", "Meteorological Rain"}, 971 | { "a-.-X-i-m-a", "Meteorological Sandstorm"}, 972 | { "a-.-X-i-m-s", "Meteorological Snow"}, 973 | { "a-.-X-i-m-u", "Meteorological Thunderstorm"}, 974 | { "a-.-X-i-m-t", "Meteorological Tornado"}, 975 | { "a-.-X-i-m-c", "Meteorological Cyclone"}, 976 | { "a-.-X-i-m-n", "Meteorological Tsunami"}, 977 | { "a-.-X-i-s", "Safety"}, 978 | { "a-.-X-i-l", "Security"}, 979 | { "a-.-X-i-l-c", "Security Civil Disturbance"}, 980 | { "a-.-X-i-l-c-d", "Security Civil Disturbance Demonstration"}, 981 | { "a-.-X-i-l-c-p", "Security Civil Disturbance Displaced Population"}, 982 | { "a-.-X-i-l-c-r", "Security Civil Disturbance Rioting"}, 983 | { "a-.-X-i-l-l", "Security Law Enforcement Activity"}, 984 | { "a-.-X-i-l-l-b", "Security Law Enforcement Activity Bombing"}, 985 | { "a-.-X-i-l-l-b-e", "Security Law Enforcement Activity Bombing Explosion"}, 986 | { "a-.-X-i-l-l-b-t", "Security Law Enforcement Activity Bombing Threat"}, 987 | { "a-.-X-i-l-l-l", "Security Law Enforcement Activity Looting"}, 988 | { "a-.-X-i-l-l-p", "Security Law Enforcement Activity Poisoning"}, 989 | { "a-.-X-i-l-l-s", "Security Law Enforcement Activity Shooting"}, 990 | { "a-.-X-i-r", "Rescue"}, 991 | { "a-.-X-i-f", "Incident Fire"}, 992 | { "a-.-X-i-f-w", "Incident Fire Wild"}, 993 | { "a-.-X-i-f-n", "Incident Fire Non-residential"}, 994 | { "a-.-X-i-f-n-h", "Incident Fire Non-residential Special Need"}, 995 | { "a-.-X-i-f-n-s", "Incident Fire Non-residential School"}, 996 | { "a-.-X-i-f-r", "Incident Fire Residential"}, 997 | { "a-.-X-i-f-h", "Incident Fire Hot Spot"}, 998 | { "a-.-X-i-f-o", "Incident Fire Origin"}, 999 | { "a-.-X-i-f-s", "Incident Fire Smoke"}, 1000 | { "a-.-X-i-f-p", "Incident Fire Special Needs"}, 1001 | { "a-.-X-i-h", "Medical and Public Health"}, 1002 | { "a-.-X-i-e", "Pollution and other Environmental"}, 1003 | { "a-.-X-i-t", "Public and Private transportation"}, 1004 | { "a-.-X-i-t-a", "Public and Private transportation Air Incident"}, 1005 | { "a-.-X-i-t-a-a", "Public and Private transportation Air Accident"}, 1006 | { "a-.-X-i-t-a-h", "Public and Private transportation Air Hijacking"}, 1007 | { "a-.-X-i-t-m", "Public and Private transportation Maritime Incident"}, 1008 | { "a-.-X-i-t-m-a", "Public and Private transportation Maritime Accident"}, 1009 | { "a-.-X-i-t-m-h", "Public and Private transportation Maritime Hijacking"}, 1010 | { "a-.-X-i-t-r", "Public and Private transportation Rail Incident"}, 1011 | { "a-.-X-i-t-r-a", "Public and Private transportation Rail Accident"}, 1012 | { "a-.-X-i-t-r-h", "Public and Private transportation Rail Hijacking"}, 1013 | { "a-.-X-i-t-v", "Public and Private transportation Vehicle Incident"}, 1014 | { "a-.-X-i-t-v-a", "Public and Private transportation Vehicle Accident"}, 1015 | { "a-.-X-i-t-v-h", "Public and Private transportation Vehicle Hijacking"}, 1016 | { "a-.-X-i-i", "Infrastructure"}, 1017 | { "a-.-X-i-c", "CBRNE"}, 1018 | { "a-.-X-i-o", "Other"}, 1019 | { "a-.-.*-9-1-1", "MAYDAY"}, 1020 | { "b", "Bits"}, 1021 | { "b-i", "Image"}, 1022 | { "b-m-r", "route"}, 1023 | { "b-m-p", "map point"}, 1024 | { "b-m-p-t", "targeted"}, 1025 | { "b-m-p-w", "waypoint"}, 1026 | { "b-m-p-m-c", "click"}, 1027 | { "b-m-p-s-p-i", "spi"}, 1028 | { "b-m-p-v-p-i", "vpoi"}, 1029 | { "b-m-g-o", "grid"}, 1030 | { "b-d", "Detection"}, 1031 | { "b-d-a", "Detection/Acoustic"}, 1032 | { "b-d-a-i", "Detection/Acoustic/Impulsive"}, 1033 | { "b-d-a-v", "Detection/Acoustic/Voice"}, 1034 | { "b-d-a-c", "Detection/Acoustic/Cyclostationary"}, 1035 | { "b-d-m", "Detection/Motion"}, 1036 | { "b-d-s", "Detection/Seismic"}, 1037 | { "b-d-r", "Detection/Radiaition"}, 1038 | { "b-d-n", "Detection/Nuclear"}, 1039 | { "b-d-c", "Detection/CBRNE"}, 1040 | { "b-d-c-b", "Detection/CBRNE/BioChem"}, 1041 | { "b-d-c-b-b", "Detection/CBRNE/BioChem/Biological"}, 1042 | { "b-d-c-b-c", "Detection/CBRNE/BioChem/Chemical"}, 1043 | { "b-d-c-e", "Detection/CBRNE/Explosive"}, 1044 | { "b-d-c-e-d", "Detection/CBRNE/Explosive/Device"}, 1045 | { "b-d-c-n", "Detection/CBRNE/NuclearRadiological"}, 1046 | { "b-d-c-n-n", "Detection/CBRNE/NuclearRadiological/Nuclear"}, 1047 | { "b-d-c-n-n-b", "Detection/CBRNE/NuclearRadiological/Nuclear/Bomb"}, 1048 | { "b-d-c-n-n-sm", "Detection/CBRNE/NuclearRadiological/Nuclear/Special Nuclear Material"}, 1049 | { "b-d-c-n-r", "Detection/CBRNE/NuclearRadiological/Radiation"}, 1050 | { "b-d-c-n-r-dd", "Detection/CBRNE/NuclearRadiological/Radiological/Dispersal Device (Dirty Bomb)"}, 1051 | { "b-d-l", "Detection/Launch"}, 1052 | { "b-d-l-b", "Detection/Launch/Bullet"}, 1053 | { "b-d-l-m", "Detection/Launch/Mortar"}, 1054 | { "b-d-i", "Detection/Impact"}, 1055 | { "b-d-i-m", "Detection/Impact/Mortar"}, 1056 | { "b-l", "Alarm"}, 1057 | { "b-l-c", "Alarm/CBRNE"}, 1058 | { "b-l-c-b", "Alarm/CBRNE/BioChem"}, 1059 | { "b-l-c-b-b", "Alarm/CBRNE/BioChem/Biological"}, 1060 | { "b-l-c-b-c", "Alarm/CBRNE/BioChem/Chemical"}, 1061 | { "b-l-c-e", "Alarm/CBRNE/Explosive"}, 1062 | { "b-l-c-e-d", "Alarm/CBRNE/Explosive/Device"}, 1063 | { "b-l-c-n", "Alarm/CBRNE/NuclearRadiological"}, 1064 | { "b-l-c-n-n", "Alarm/CBRNE/NuclearRadiological/Nuclear"}, 1065 | { "b-l-c-n-n-b", "Alarm/CBRNE/NuclearRadiological/Nuclear/Bomb"}, 1066 | { "b-l-c-n-n-sm", "Alarm/CBRNE/NuclearRadiological/Nuclear/Special Nuclear Material"}, 1067 | { "b-l-c-n-r", "Alarm/CBRNE/NuclearRadiological/Radiological"}, 1068 | { "b-l-c-n-r-dd", "Alarm/CBRNE/Radiological/Dispersal Device (Dirty Bomb)"}, 1069 | { "b-l-e", "Alarm/Environmental"}, 1070 | { "b-l-e-h", "Alarm/Environmental/Hazmat"}, 1071 | { "b-l-f", "Alarm/Fire"}, 1072 | { "b-l-f-a", "Alarm/Fire/Audible"}, 1073 | { "b-l-f-a-a", "Alarm/Fire/Audible/Pump Activated"}, 1074 | { "b-l-f-a-c", "Alarm/Fire/Audible/Combustion"}, 1075 | { "b-l-f-a-d", "Alarm/Fire/Audible/Duct Detector"}, 1076 | { "b-l-f-a-f", "Alarm/Fire/Audible/Flame Detector"}, 1077 | { "b-l-f-a-h", "Alarm/Fire/Audible/Heat"}, 1078 | { "b-l-f-a-p", "Alarm/Fire/Audible/Pull Station"}, 1079 | { "b-l-f-a-s", "Alarm/Fire/Audible/Smoke"}, 1080 | { "b-l-f-a-w", "Alarm/Fire/Audible/Waterflow"}, 1081 | { "b-l-g", "Alarm/Geophysical"}, 1082 | { "b-l-h", "Alarm/Medical and Public Health"}, 1083 | { "b-l-h-a", "Alarm/Medical and Public Health/Audible"}, 1084 | { "b-l-h-am", "Alarm/Medical and Public Health/Ambulance"}, 1085 | { "b-l-h-am-s", "Alarm/Medical and Public Health/Ambulance/Silent"}, 1086 | { "b-l-i", "Alarm/Infrastructure"}, 1087 | { "b-l-l", "Alarm/Security"}, 1088 | { "b-l-l-l", "Alarm/Security/Law Enforcement"}, 1089 | { "b-l-l-l-ad", "Alarm/Security/Law Enforcement/Armed and Dangerous"}, 1090 | { "b-l-l-l-an", "Alarm/Security/Law Enforcement/Animal"}, 1091 | { "b-l-l-l-an-or", "Alarm/Security/Law Enforcement/Animal/On Roadway"}, 1092 | { "b-l-l-l-as", "Alarm/Security/Law Enforcement/Assualt"}, 1093 | { "b-l-l-l-av", "Alarm/Security/Law Enforcement/Abandoned Vehicle"}, 1094 | { "b-l-l-l-ba", "Alarm/Security/Law Enforcement/Battery"}, 1095 | { "b-l-l-l-bt", "Alarm/Security/Law Enforcement/Bomb Threat"}, 1096 | { "b-l-l-l-bur", "Alarm/Security/Law Enforcement/Burglary"}, 1097 | { "b-l-l-l-bur-a", "Alarm/Security/Law Enforcement/Burglary/Audible"}, 1098 | { "b-l-l-l-bur-a-d", "Alarm/Security/Law Enforcement/Burglary/Audible/Day/Night Zone"}, 1099 | { "b-l-l-l-bur-a-e", "Alarm/Security/Law Enforcement/Burglary/Audible/Entry/Exit"}, 1100 | { "b-l-l-l-bur-a-i", "Alarm/Security/Law Enforcement/Burglary/Audible/Interior"}, 1101 | { "b-l-l-l-bur-a-o", "Alarm/Security/Law Enforcement/Burglary/Audible/Outdoor"}, 1102 | { "b-l-l-l-bur-a-p", "Alarm/Security/Law Enforcement/Burglary/Audible/Perimeter"}, 1103 | { "b-l-l-l-bur-a-t", "Alarm/Security/Law Enforcement/Burglary/Audible/24 Hour Zone"}, 1104 | { "b-l-l-l-bur-a-x", "Alarm/Security/Law Enforcement/Burglary/Audible/Exit Error"}, 1105 | { "b-l-l-l-bur-s", "Alarm/Security/Law Enforcement/Burglary/Silent"}, 1106 | { "b-l-l-l-bur-s-c", "Alarm/Security/Law Enforcement/Burglary/Silent/Recent Close"}, 1107 | { "b-l-l-l-c", "Alarm/Security/Law Enforcement/Crash"}, 1108 | { "b-l-l-l-c-a", "Alarm/Security/Law Enforcement/Crash/Aircraft"}, 1109 | { "b-l-l-l-c-wf", "Alarm/Security/Law Enforcement/Crash/With Fatalities"}, 1110 | { "b-l-l-l-c-wi", "Alarm/Security/Law Enforcement/Crash/With injuries"}, 1111 | { "b-l-l-l-c-wr", "Alarm/Security/Law Enforcement/Crash/With Roadblock"}, 1112 | { "b-l-l-l-c-pc", "Alarm/Security/Law Enforcement/Crash/Patrol Car"}, 1113 | { "b-l-l-l-ca", "Alarm/Security/Law Enforcement/Child Abuse"}, 1114 | { "b-l-l-l-cd", "Alarm/Security/Law Enforcement/Civil Disturbance or Disorder"}, 1115 | { "b-l-l-l-cr", "Alarm/Security/Law Enforcement/Callbox Request"}, 1116 | { "b-l-l-l-dc", "Alarm/Security/Law Enforcement/Drug or Contraband"}, 1117 | { "b-l-l-l-dov", "Alarm/Security/Law Enforcement/Domestic Violence"}, 1118 | { "b-l-l-l-dp", "Alarm/Security/Law Enforcement/Dead Person"}, 1119 | { "b-l-l-l-drp", "Alarm/Security/Law Enforcement/Drunk Pedestrian"}, 1120 | { "b-l-l-l-dui", "Alarm/Security/Law Enforcement/DUI"}, 1121 | { "b-l-l-l-dui-j", "Alarm/Security/Law Enforcement/DUI/Juvenile"}, 1122 | { "b-l-l-l-dv", "Alarm/Security/Law Enforcement/Disabled Vehicle"}, 1123 | { "b-l-l-l-ep", "Alarm/Security/Law Enforcement/Escaped Prisoner"}, 1124 | { "b-l-l-l-hr", "Alarm/Security/Law Enforcement/Hit and Run"}, 1125 | { "b-l-l-l-hr-wi", "Alarm/Security/Law Enforcement/Hit and Run/With Injuries"}, 1126 | { "b-l-l-l-hr-wr", "Alarm/Security/Law Enforcement/Hit and Run/With Roadblock"}, 1127 | { "b-l-l-l-hup", "Alarm/Security/Law Enforcement/Hold Up"}, 1128 | { "b-l-l-l-hup-a", "Alarm/Security/Law Enforcement/Hold Up/Audible"}, 1129 | { "b-l-l-l-hup-s", "Alarm/Security/Law Enforcement/Hold Up/Silent"}, 1130 | { "b-l-l-l-ii", "Alarm/Security/Law Enforcement/Information or Intelligence - calls to take witness info"}, 1131 | { "b-l-l-l-io", "Alarm/Security/Law Enforcement/Impersonating an Officer"}, 1132 | { "b-l-l-l-jo", "Alarm/Security/Law Enforcement/Juvenile Offense"}, 1133 | { "b-l-l-l-k", "Alarm/Security/Law Enforcement/Kidnapping"}, 1134 | { "b-l-l-l-l", "Alarm/Security/Law Enforcement/Larceny"}, 1135 | { "b-l-l-l-m", "Alarm/Security/Law Enforcement/Murder"}, 1136 | { "b-l-l-l-mi", "Alarm/Security/Law Enforcement/Mentally Ill Person"}, 1137 | { "b-l-l-l-mm", "Alarm/Security/Law Enforcement/Malacious Mischief"}, 1138 | { "b-l-l-l-mp", "Alarm/Security/Law Enforcement/Missing Person"}, 1139 | { "b-l-l-l-od", "Alarm/Security/Law Enforcement/Officer Down"}, 1140 | { "b-l-l-l-ph", "Alarm/Security/Law Enforcement/Pedestrian or Hitchhiker"}, 1141 | { "b-l-l-l-r", "Alarm/Security/Law Enforcement/Robbery"}, 1142 | { "b-l-l-l-r-sa", "Alarm/Security/Law Enforcement/Robbery/Strongarm"}, 1143 | { "b-l-l-l-rd", "Alarm/Security/Law Enforcement/Reckless Driving"}, 1144 | { "b-l-l-l-rt", "Alarm/Security/Law Enforcement/Rock Throwing"}, 1145 | { "b-l-l-l-s", "Alarm/Security/Law Enforcement/Shooting"}, 1146 | { "b-l-l-l-sc", "Alarm/Security/Law Enforcement/Suspicious Circumstances"}, 1147 | { "b-l-l-l-sd", "Alarm/Security/Law Enforcement/Special Detail"}, 1148 | { "b-l-l-l-sg", "Alarm/Security/Law Enforcement/Smuggling"}, 1149 | { "b-l-l-l-si", "Alarm/Security/Law Enforcement/Sick or Injured Person"}, 1150 | { "b-l-l-l-so", "Alarm/Security/Law Enforcement/Sex Offense"}, 1151 | { "b-l-l-l-sp", "Alarm/Security/Law Enforcement/Suspicious Person"}, 1152 | { "b-l-l-l-su", "Alarm/Security/Law Enforcement/Suicide"}, 1153 | { "b-l-l-l-sv", "Alarm/Security/Law Enforcement/Suspicious Vehcle"}, 1154 | { "b-l-l-l-te", "Alarm/Security/Law Enforcement/Toll Evasion"}, 1155 | { "b-l-l-l-vt", "Alarm/Security/Law Enforcement/Lost or Stolen Vehicle Tag"}, 1156 | { "b-l-m", "Alarm/Meteorological"}, 1157 | { "b-l-o", "Alarm/Other"}, 1158 | { "b-l-o-byp", "Alarm/Other/Bypass"}, 1159 | { "b-l-o-byp-s", "Alarm/Other/Bypass/Silent"}, 1160 | { "b-l-o-byp-s-24", "Alarm/Other/Bypass/Silent/24 Hour zone"}, 1161 | { "b-l-o-byp-s-b", "Alarm/Other/Bypass/Silent/Burglary"}, 1162 | { "b-l-o-byp-s-f", "Alarm/Other/Bypass/Silent/Fire"}, 1163 | { "b-l-o-byp-s-g", "Alarm/Other/Bypass/Silent/Group"}, 1164 | { "b-l-o-byp-s-sb", "Alarm/Other/Bypass/Silent/Swinger Bypassed"}, 1165 | { "b-l-o-byp-s-zs", "Alarm/Other/Bypass/Silent/Zone or Sensor"}, 1166 | { "b-l-o-can", "Alarm/Other/Cancel"}, 1167 | { "b-l-o-can-s", "Alarm/Other/Cancel/Silent"}, 1168 | { "b-l-o-clo", "Alarm/Other/Close"}, 1169 | { "b-l-o-clo-s", "Alarm/Other/Close/Silent"}, 1170 | { "b-l-o-clo-s-sm", "Alarm/Other/Close/Silent/Stay Mode"}, 1171 | { "b-l-o-far", "Alarm/Other/Forced Arming"}, 1172 | { "b-l-o-far-s", "Alarm/Other/Forced Arming/Silent"}, 1173 | { "b-l-o-far-s-pa", "Alarm/Other/Forced Arming/Silent/Partial Arm"}, 1174 | { "b-l-o-ftt", "Alarm/Other/Failure to Test"}, 1175 | { "b-l-o-ftt-s", "Alarm/Other/Failure to Test/Silent"}, 1176 | { "b-l-o-ftt-s-pn", "Alarm/Other/Failure to Test/Silent/Point not Tested"}, 1177 | { "b-l-o-log", "Alarm/Other/Log"}, 1178 | { "b-l-o-log-s", "Alarm/Other/Log/Silent"}, 1179 | { "b-l-o-log-s-ad", "Alarm/Other/Log/Silent/Access Denied"}, 1180 | { "b-l-o-log-s-ap", "Alarm/Other/Log/Silent/Access Permitted"}, 1181 | { "b-l-o-log-s-as", "Alarm/Other/Log/Silent/Access Schedule Change"}, 1182 | { "b-l-o-log-s-cr", "Alarm/Other/Log/Silent/Callback Requested"}, 1183 | { "b-l-o-log-s-ds", "Alarm/Other/Log/Silent/Dialer Shutdown"}, 1184 | { "b-l-o-log-s-er", "Alarm/Other/Log/Silent/Event Log Reset"}, 1185 | { "b-l-o-log-s-es", "Alarm/Other/Log/Silent/Exception Schedule Change"}, 1186 | { "b-l-o-log-s-pe", "Alarm/Other/Log/Silent/Program Mode Entry"}, 1187 | { "b-l-o-log-s-px", "Alarm/Other/Log/Silent/Program Mode Exit"}, 1188 | { "b-l-o-log-s-sa", "Alarm/Other/Log/Silent/Successful Access"}, 1189 | { "b-l-o-log-s-sr", "Alarm/Other/Log/Silent/Status Report to Follow"}, 1190 | { "b-l-o-log-s-ss", "Alarm/Other/Log/Silent/System shutdown"}, 1191 | { "b-l-o-log-s-tr", "Alarm/Other/Log/Silent/Time/Date Reset"}, 1192 | { "b-l-o-log-s-ua", "Alarm/Other/Log/Silent/Unsuccessful Access"}, 1193 | { "b-l-o-log-s-vx", "Alarm/Other/Log/Silent/Video Transmitter Active"}, 1194 | { "b-l-o-ltc", "Alarm/Other/Late to Close"}, 1195 | { "b-l-o-ltc-s", "Alarm/Other/Late to Close/Silent"}, 1196 | { "b-l-o-ltc-s-af", "Alarm/Other/Late to Close/Silent/Auto Armed Failed"}, 1197 | { "b-l-o-lto", "Alarm/Other/Late to Open"}, 1198 | { "b-l-o-lto-s", "Alarm/Other/Late to Open/Silent"}, 1199 | { "b-l-o-nul", "Alarm/Other/Null"}, 1200 | { "b-l-o-nul-s", "Alarm/Other/Null/Silent"}, 1201 | { "b-l-o-nul-s-p", "Alarm/Other/Null/Silent/Periodic"}, 1202 | { "b-l-o-nul-s-pr", "Alarm/Other/Null/Silent/Periodic Radio"}, 1203 | { "b-l-o-opn", "Alarm/Other/Open"}, 1204 | { "b-l-o-opn-s", "Alarm/Other/Open/Silent"}, 1205 | { "b-l-o-opn-s-a", "Alarm/Other/Open/Silent/Automatic"}, 1206 | { "b-l-o-opn-s-d", "Alarm/Other/Open/Silent/Deferred"}, 1207 | { "b-l-o-opn-s-e", "Alarm/Other/Open/Silent/Early"}, 1208 | { "b-l-o-opn-s-ex", "Alarm/Other/Open/Silent/Exception"}, 1209 | { "b-l-o-opn-s-g", "Alarm/Other/Open/Silent/Group"}, 1210 | { "b-l-o-opn-s-k", "Alarm/Other/Open/Silent/Keyswitch"}, 1211 | { "b-l-o-opn-s-l", "Alarm/Other/Open/Silent/Late"}, 1212 | { "b-l-o-opn-s-qa", "Alarm/Other/Open/Silent/Quick Arm"}, 1213 | { "b-l-o-opn-s-r", "Alarm/Other/Open/Silent/Remote"}, 1214 | { "b-l-o-opn-s-u", "Alarm/Other/Open/Silent/By User"}, 1215 | { "b-l-o-opn-s-up", "Alarm/Other/Open/Silent/User on Premises"}, 1216 | { "b-l-o-pan", "Alarm/Other/Panic"}, 1217 | { "b-l-o-res", "Alarm/Other/Reset"}, 1218 | { "b-l-o-res-s", "Alarm/Other/Reset/Silent"}, 1219 | { "b-l-o-res-s-er", "Alarm/Other/Reset/Silent/Exp Mod Reset"}, 1220 | { "b-l-o-spc", "Alarm/Other/Special"}, 1221 | { "b-l-o-spc-a", "Alarm/Other/Special/Audible"}, 1222 | { "b-l-o-spc-a-a", "Alarm/Other/Special/Audible/General Alarm"}, 1223 | { "b-l-o-spc-a-e", "Alarm/Other/Special/Audible/Personal Emergency"}, 1224 | { "b-l-o-spc-a-f", "Alarm/Other/Special/Audible/Air Flow Loss"}, 1225 | { "b-l-o-spc-a-g", "Alarm/Other/Special/Audible/Gas Detected"}, 1226 | { "b-l-o-spc-a-l", "Alarm/Other/Special/Audible/Low Gas Level"}, 1227 | { "b-l-o-spc-a-w", "Alarm/Other/Special/Audible/Water Leakage"}, 1228 | { "b-l-o-spc-s", "Alarm/Other/Special/Silent"}, 1229 | { "b-l-o-spc-s-f", "Alarm/Other/Special/Silent/Fail to Report"}, 1230 | { "b-l-o-spc-s-li", "Alarm/Other/Special/Silent/Listen in to Follow"}, 1231 | { "b-l-o-sps", "Alarm/Other/Supress"}, 1232 | { "b-l-o-sps-a", "Alarm/Other/Supress/Audible"}, 1233 | { "b-l-o-sps-a-g", "Alarm/Other/Supress/Audible/Gate Valve Tamper"}, 1234 | { "b-l-o-sps-s", "Alarm/Other/Supress/Silent"}, 1235 | { "b-l-o-sps-s-ar", "Alarm/Other/Supress/Silent/Alarm Relay Disabled"}, 1236 | { "b-l-o-sps-s-b1", "Alarm/Other/Supress/Silent/Bell 1 Disabled"}, 1237 | { "b-l-o-sps-s-b2", "Alarm/Other/Supress/Silent/Bell 2 Disabled"}, 1238 | { "b-l-o-sps-s-dd", "Alarm/Other/Supress/Silent/Dialer Disabled"}, 1239 | { "b-l-o-sps-s-rr", "Alarm/Other/Supress/Silent/Reversing Relay Disabled"}, 1240 | { "b-l-o-sps-s-rx", "Alarm/Other/Supress/Silent/Radio Transmitter Disabled"}, 1241 | { "b-l-o-sps-s-sr", "Alarm/Other/Supress/Silent/Sounder relay Disabled"}, 1242 | { "b-l-o-sps-s-tr", "Alarm/Other/Supress/Silent/Trouble Relay Disabled"}, 1243 | { "b-l-o-tam", "Alarm/Other/Tamper"}, 1244 | { "b-l-o-tam-a", "Alarm/Other/Tamper/Audible"}, 1245 | { "b-l-o-tam-s", "Alarm/Other/Tamper/Silent"}, 1246 | { "b-l-o-tam-s-e", "Alarm/Other/Tamper/Silent/Expansion Module"}, 1247 | { "b-l-o-tam-s-p", "Alarm/Other/Tamper/Silent/Panel Program Change"}, 1248 | { "b-l-o-tam-s-s", "Alarm/Other/Tamper/Silent/Sensor"}, 1249 | { "b-l-o-tam-s-v", "Alarm/Other/Tamper/Silent/Verify"}, 1250 | { "b-l-o-tbl", "Alarm/Other/Trouble"}, 1251 | { "b-l-o-tbl-a", "Alarm/Other/Trouble/Audible"}, 1252 | { "b-l-o-tbl-a-b", "Alarm/Other/Trouble/Audible/Foil Break"}, 1253 | { "b-l-o-tbl-a-c", "Alarm/Other/Trouble/Audible/Low CO2"}, 1254 | { "b-l-o-tbl-a-d", "Alarm/Other/Trouble/Audible/Day Trouble"}, 1255 | { "b-l-o-tbl-a-ee", "Alarm/Other/Trouble/Audible/Exit error"}, 1256 | { "b-l-o-tbl-a-l", "Alarm/Other/Trouble/Audible/Low Water Level"}, 1257 | { "b-l-o-tbl-a-p", "Alarm/Other/Trouble/Audible/Low Water Pressure"}, 1258 | { "b-l-o-tbl-a-u", "Alarm/Other/Trouble/Audible/Pump Failure"}, 1259 | { "b-l-o-tbl-s", "Alarm/Other/Trouble/Silent"}, 1260 | { "b-l-o-tbl-s-a", "Alarm/Other/Trouble/Silent/Sensor"}, 1261 | { "b-l-o-tbl-s-ar", "Alarm/Other/Trouble/Silent/Alarm Relay"}, 1262 | { "b-l-o-tbl-s-b", "Alarm/Other/Trouble/Silent/Low System Battery"}, 1263 | { "b-l-o-tbl-s-b1", "Alarm/Other/Trouble/Silent/Bell 1"}, 1264 | { "b-l-o-tbl-s-b2", "Alarm/Other/Trouble/Silent/Bell 2"}, 1265 | { "b-l-o-tbl-s-bt", "Alarm/Other/Trouble/Silent/Battery Test Fail"}, 1266 | { "b-l-o-tbl-s-c", "Alarm/Other/Trouble/Silent/Polling Loop Close"}, 1267 | { "b-l-o-tbl-s-cf", "Alarm/Other/Trouble/Silent/Communication Fail"}, 1268 | { "b-l-o-tbl-s-dc", "Alarm/Other/Trouble/Silent/Exp Mod DC Loss"}, 1269 | { "b-l-o-tbl-s-dh", "Alarm/Other/Trouble/Silent/Detector Hi Sens"}, 1270 | { "b-l-o-tbl-s-dl", "Alarm/Other/Trouble/Silent/Detector Low Sens"}, 1271 | { "b-l-o-tbl-s-e", "Alarm/Other/Trouble/Silent/Expansion Mod Fail"}, 1272 | { "b-l-o-tbl-s-e50", "Alarm/Other/Trouble/Silent/Event Log 50% Full"}, 1273 | { "b-l-o-tbl-s-e90", "Alarm/Other/Trouble/Silent/Event Log 90% Full"}, 1274 | { "b-l-o-tbl-s-em", "Alarm/Other/Trouble/Silent/Expansion Module Fail"}, 1275 | { "b-l-o-tbl-s-eo", "Alarm/Other/Trouble/Silent/Event Log Overflow"}, 1276 | { "b-l-o-tbl-s-ft", "Alarm/Other/Trouble/Silent/Fire Trouble"}, 1277 | { "b-l-o-tbl-s-gf", "Alarm/Other/Trouble/Silent/Ground Fault"}, 1278 | { "b-l-o-tbl-s-lb", "Alarm/Other/Trouble/Silent/Exp Mod Low Battery"}, 1279 | { "b-l-o-tbl-s-lo", "Alarm/Other/Trouble/Silent/Protection Loop Open"}, 1280 | { "b-l-o-tbl-s-lp", "Alarm/Other/Trouble/Silent/Lost Polling"}, 1281 | { "b-l-o-tbl-s-lr", "Alarm/Other/Trouble/Silent/Long Range Radio"}, 1282 | { "b-l-o-tbl-s-ls", "Alarm/Other/Trouble/Silent/Protection Loop Short"}, 1283 | { "b-l-o-tbl-s-ms", "Alarm/Other/Trouble/Silent/RPM Supervision"}, 1284 | { "b-l-o-tbl-s-n", "Alarm/Other/Trouble/Silent/Near Alarm"}, 1285 | { "b-l-o-tbl-s-o", "Alarm/Other/Trouble/Silent/Polling Loop Open"}, 1286 | { "b-l-o-tbl-s-p", "Alarm/Other/Trouble/Silent/AC Power Lost"}, 1287 | { "b-l-o-tbl-s-pf", "Alarm/Other/Trouble/Silent/Printer Failure"}, 1288 | { "b-l-o-tbl-s-pl", "Alarm/Other/Trouble/Silent/Protection Loop"}, 1289 | { "b-l-o-tbl-s-pp", "Alarm/Other/Trouble/Silent/Printer Paper Out"}, 1290 | { "b-l-o-tbl-s-ps", "Alarm/Other/Trouble/Silent/Polling Loop Short"}, 1291 | { "b-l-o-tbl-s-ra", "Alarm/Other/Trouble/Silent/Radio Antenna Vswr"}, 1292 | { "b-l-o-tbl-s-rf", "Alarm/Other/Trouble/Silent/Repeater Failure"}, 1293 | { "b-l-o-tbl-s-rfb", "Alarm/Other/Trouble/Silent/RF Low Battery"}, 1294 | { "b-l-o-tbl-s-rr", "Alarm/Other/Trouble/Silent/Reversing Relay"}, 1295 | { "b-l-o-tbl-s-rs", "Alarm/Other/Trouble/Silent/RF Supervision"}, 1296 | { "b-l-o-tbl-s-sh", "Alarm/Other/Trouble/Silent/Smoke Det Hi Sens"}, 1297 | { "b-l-o-tbl-s-sl", "Alarm/Other/Trouble/Silent/Smoke Det Low Sens"}, 1298 | { "b-l-o-tbl-s-sp", "Alarm/Other/Trouble/Silent/System Peripheral"}, 1299 | { "b-l-o-tbl-s-sr", "Alarm/Other/Trouble/Silent/Sounder/Relay"}, 1300 | { "b-l-o-tbl-s-ss", "Alarm/Other/Trouble/Silent/System Shutdown"}, 1301 | { "b-l-o-tbl-s-st", "Alarm/Other/Trouble/Silent/Self Test Failure"}, 1302 | { "b-l-o-tbl-s-t1", "Alarm/Other/Trouble/Silent/Telco Line 1"}, 1303 | { "b-l-o-tbl-s-t2", "Alarm/Other/Trouble/Silent/Telco Line 2"}, 1304 | { "b-l-o-tbl-s-ti", "Alarm/Other/Trouble/Silent/Time/Date Inaccurate"}, 1305 | { "b-l-o-tbl-s-tr", "Alarm/Other/Trouble/Silent/Trouble Relay"}, 1306 | { "b-l-o-tbl-s-x", "Alarm/Other/Trouble/Silent/RAM Checksum Bad"}, 1307 | { "b-l-o-tbl-s-y", "Alarm/Other/Trouble/Silent/ROM Checksum Bad"}, 1308 | { "b-l-o-tem", "Alarm/Other/Temperature"}, 1309 | { "b-l-o-tem-a", "Alarm/Other/Temperature/Audible"}, 1310 | { "b-l-o-tem-a-h", "Alarm/Other/Temperature/Audible/High Temperature"}, 1311 | { "b-l-o-tem-a-l", "Alarm/Other/Temperature/Audible/Low Temperature"}, 1312 | { "b-l-o-tem-a-lh", "Alarm/Other/Temperature/Audible/Loss of Heat"}, 1313 | { "b-l-o-tem-a-r", "Alarm/Other/Temperature/Audible/Refrigeration"}, 1314 | { "b-l-o-tst", "Alarm/Other/Test"}, 1315 | { "b-l-o-tst-s", "Alarm/Other/Test/SIlent"}, 1316 | { "b-l-o-tst-s-fa", "Alarm/Other/Test/SIlent/Fire Alarm"}, 1317 | { "b-l-o-tst-s-m", "Alarm/Other/Test/SIlent/Manual"}, 1318 | { "b-l-o-tst-s-pt", "Alarm/Other/Test/SIlent/Point Tested OK"}, 1319 | { "b-l-o-tst-s-st", "Alarm/Other/Test/SIlent/System Remains in Trouble"}, 1320 | { "b-l-o-tst-s-wm", "Alarm/Other/Test/SIlent/Walk Test Mode Entered"}, 1321 | { "b-l-r", "Alarm/Rescue"}, 1322 | { "b-l-s", "Alarm/Safety"}, 1323 | { "b-l-t", "Alarm/Transportation"}, 1324 | { "b-l-t-v", "Alarm/Transportation/Vehicle"}, 1325 | { "b-l-t-v-a", "Alarm/Transportation/Vehicle/Accident"}, 1326 | { "b-l-t-v-a-c", "Alarm/Transportation/Vehicle/Accident/Collision"}, 1327 | { "b-l-t-v-a-c-f", "Alarm/Transportation/Vehicle/Accident/Collision/Fixed Object"}, 1328 | { "b-l-t-v-a-c-n", "Alarm/Transportation/Vehicle/Accident/Collision/Non-Fixed Object"}, 1329 | { "b-l-t-v-a-e", "Alarm/Transportation/Vehicle/Accident/Equipment/Cargo Loss/Shift"}, 1330 | { "b-l-t-v-a-f", "Alarm/Transportation/Vehicle/Accident/Fire_Explosion"}, 1331 | { "b-l-t-v-a-i", "Alarm/Transportation/Vehicle/Accident/Immersion"}, 1332 | { "b-l-t-v-a-j", "Alarm/Transportation/Vehicle/Accident/Jacknife"}, 1333 | { "b-l-t-v-a-o", "Alarm/Transportation/Vehicle/Accident/Object Thrown/Fallen"}, 1334 | { "b-l-t-v-a-or", "Alarm/Transportation/Vehicle/Accident/Overturn_Rollover"}, 1335 | { "b-l-t-v-a-p", "Alarm/Transportation/Vehicle/Accident/Person Fell or Jumped"}, 1336 | { "b-l-t-v-o", "Alarm/Transportation/Vehicle/Other (Non Collision)"}, 1337 | { "c", "Capability"}, 1338 | { "c-c", "CAP: Communications"}, 1339 | { "c-f", "CAP: Fires"}, 1340 | { "c-f-d", "CAP: Direct fires"}, 1341 | { "c-f-i", "CAP: Indirect fires"}, 1342 | { "c-l", "CAP: Logistics (supply)"}, 1343 | { "c-l-f", "CAP: Fuel"}, 1344 | { "c-r", "CAP: Rescue"}, 1345 | { "c-s", "CAP: Surveillance"}, 1346 | { "t", "Tasking"}, 1347 | { "t-a", "air"}, 1348 | { "t-a-c", "close air support"}, 1349 | { "t-a-d", "air drop"}, 1350 | { "t-a-e", "electronic warfare"}, 1351 | { "t-a-k", "strike"}, 1352 | { "t-a-r", "recovery"}, 1353 | { "t-a-s", "SEAD"}, 1354 | { "t-k", "Strike"}, 1355 | { "t-k-d", "Destroy"}, 1356 | { "t-k-i", "Investigate"}, 1357 | { "t-k-t", "Target"}, 1358 | { "t-m", "Mensurate"}, 1359 | { "t-p", "WTP: pairing"}, 1360 | { "t-p-a", "WTP: air"}, 1361 | { "t-p-a-c", "WTP: CAS"}, 1362 | { "t-p-a-f", "WTP: refueling"}, 1363 | { "t-p-a-k", "WTP: strike"}, 1364 | { "t-p-k", "WTP: Strike"}, 1365 | { "t-p-k-d", "WTP: Destroy"}, 1366 | { "t-p-k-i", "WTP: Investigate"}, 1367 | { "t-p-k-t", "WTP: Target"}, 1368 | { "t-p-r", "WTP: Recovery (personnel)"}, 1369 | { "t-p-s", "WTP: ISR"}, 1370 | { "t-p-s-i", "WTP: imagery"}, 1371 | { "t-q", "Tasking Query Capable"}, 1372 | { "t-r", "Tasking Relocate"}, 1373 | { "t-s", "ISR"}, 1374 | { "t-s-b", "Tasking BFT info"}, 1375 | { "t-s-i", "imagery desired"}, 1376 | { "t-s-i-e", "ISR EO"}, 1377 | { "t-s-i-i", "ISR IR"}, 1378 | { "t-s-r", "ISR Radar"}, 1379 | { "t-s-v", "ISR Video"}, 1380 | { "t-s-v-e", "ISR Video EO"}, 1381 | { "t-s-v-i", "ISR Video IR"}, 1382 | { "t-u", "Tasking Update"}, 1383 | { "t-u-q", "Tasking Status Query"}, 1384 | { "t-u-z", "Tasking Cancel"}, 1385 | { "t-x", "Tasking (Experimental)"}, 1386 | { "t-x-i", "Tasking Data Retrieval"}, 1387 | { "t-x-i-l", "Link Dereference"}, 1388 | { "t-x-a-s", "App control- Sync (with peer)"}, 1389 | { "t-x-a-s-c", "App control- Sync (subscribe)"}, 1390 | { "t-x-a-f", "Filter"}, 1391 | { "t-x-a-o", "Open"}, 1392 | { "t-x-v-m", "Medevac"}, 1393 | { "y", "Reply"}, 1394 | { "y-a", "Ack"}, 1395 | { "y-a-r", "Rcvd"}, 1396 | { "y-a-w", "Wilco"}, 1397 | { "y-c", "Tasking Complete"}, 1398 | { "y-c-f", "Fail"}, 1399 | { "y-c-f-a", "Fail: No Assets"}, 1400 | { "y-c-f-b", "Fail: Bad Reqest (CANTPRO)"}, 1401 | { "y-c-f-d", "Fail: Denied"}, 1402 | { "y-c-f-i", "Fail: Insufficient Info"}, 1403 | { "y-c-f-r", "Fail: Rejected"}, 1404 | { "y-c-f-r-c", "Fail: C2 element"}, 1405 | { "y-c-f-r-p", "Fail: Platform (CANTCO)"}, 1406 | { "y-c-f-s", "Fail: Stale"}, 1407 | { "y-c-f-x", "Fail: Cancelled"}, 1408 | { "y-c-s", "Complete: Success"}, 1409 | { "y-s", "Status: Status"}, 1410 | { "y-s-c", "Status: Canceling"}, 1411 | { "y-s-e", "Status: Executing"}, 1412 | { "y-s-e-a", "Status: Approved"}, 1413 | { "y-s-e-d", "Status: Disseminating"}, 1414 | { "y-s-e-d-c", "Status: Disseminated"}, 1415 | { "y-s-i", "Status: Imagery Available"}, 1416 | { "y-s-m", "Status: MISREP available"}, 1417 | { "y-s-p", "Status: Planning"}, 1418 | { "y-s-r", "Status: Reviewing"}, 1419 | { "b-g-.", "TACTICAL GRAPHICS"}, 1420 | { "b-g-.-T", "TASKS"}, 1421 | { "b-g-.-T-B", "BLOCK"}, 1422 | { "b-g-.-T-H", "BREACH"}, 1423 | { "b-g-.-T-Y", "BYPASS"}, 1424 | { "b-g-.-T-C", "CANALIZE"}, 1425 | { "b-g-.-T-X", "CLEAR"}, 1426 | { "b-g-.-T-J", "CONTAIN"}, 1427 | { "b-g-.-T-K", "COUNTERATTACK (CATK)"}, 1428 | { "b-g-.-T-K-F", "COUNTERATTACK BY FIRE"}, 1429 | { "b-g-.-T-L", "DELAY"}, 1430 | { "b-g-.-T-D", "DESTROY"}, 1431 | { "b-g-.-T-T", "DISRUPT"}, 1432 | { "b-g-.-T-F", "FIX"}, 1433 | { "b-g-.-T-A", "FOLLOW AND ASSUME"}, 1434 | { "b-g-.-T-A-S", "FOLLOW AND SUPPORT"}, 1435 | { "b-g-.-T-I", "INTERDICT"}, 1436 | { "b-g-.-T-E", "ISOLATE"}, 1437 | { "b-g-.-T-N", "NEUTRALIZE"}, 1438 | { "b-g-.-T-O", "OCCUPY"}, 1439 | { "b-g-.-T-P", "PENETRATE"}, 1440 | { "b-g-.-T-R", "RELIEF IN PLACE (RIP)"}, 1441 | { "b-g-.-T-Q", "RETAIN"}, 1442 | { "b-g-.-T-M", "RETIREMENT"}, 1443 | { "b-g-.-T-S", "SECURE"}, 1444 | { "b-g-.-T-U", "SECURITY"}, 1445 | { "b-g-.-T-U-S", "SCREEN"}, 1446 | { "b-g-.-T-U-G", "GUARD"}, 1447 | { "b-g-.-T-U-C", "COVER"}, 1448 | { "b-g-.-T-Z", "SEIZE"}, 1449 | { "b-g-.-T-W", "WITHDRAW"}, 1450 | { "b-g-.-T-W-P", "WITHDRAW UNDER PRESSURE"}, 1451 | { "b-g-.-G", "COMMAND AND CONTROL AND GENERAL MANEUVER"}, 1452 | { "b-g-.-G-G", "GENERAL"}, 1453 | { "b-g-.-G-G-P", "POINTS"}, 1454 | { "b-g-.-G-G-P-U", "UNDER SEA WARFARE"}, 1455 | { "b-g-.-G-G-P-U-U", "UNDERWATER"}, 1456 | { "b-g-.-G-G-P-U-U-D", "DATUM"}, 1457 | { "b-g-.-G-G-P-U-U-B", "BRIEF CONTACT"}, 1458 | { "b-g-.-G-G-P-U-U-L", "LOST CONTACT"}, 1459 | { "b-g-.-G-G-P-U-U-S", "SINKER"}, 1460 | { "b-g-.-G-G-P-U-Y", "SONOBUOY"}, 1461 | { "b-g-.-G-G-P-U-Y-P", "PATTERN CENTER"}, 1462 | { "b-g-.-G-G-P-U-Y-D", "DIRECTIONAL FREQUENCY ANALYZING AND"}, 1463 | { "b-g-.-G-G-P-U-Y-L", "LOW FREQUENCY ANALYZING AND RECORDING"}, 1464 | { "b-g-.-G-G-P-U-Y-C", "COMMAND ACTIVE SONOBUOY SYSTEM (CASS)"}, 1465 | { "b-g-.-G-G-P-U-Y-S", "DIRECTIONAL COMMAND ACTIVE SONOBUOY SYSTEM"}, 1466 | { "b-g-.-G-G-P-U-Y-B", "BATHYTHERMOGRAPH TRANSMITTING (BT)"}, 1467 | { "b-g-.-G-G-P-U-Y-A", "ANM"}, 1468 | { "b-g-.-G-G-P-U-Y-V", "VERTICAL LINE ARRAY DIFAR (VLAD)"}, 1469 | { "b-g-.-G-G-P-U-Y-T", "ATAC"}, 1470 | { "b-g-.-G-G-P-U-Y-R", "RANGE ONLY (RO)"}, 1471 | { "b-g-.-G-G-P-U-Y-K", "KINGPIN"}, 1472 | { "b-g-.-G-G-P-U-S", "SEARCH"}, 1473 | { "b-g-.-G-G-P-U-S-A", "SEARCH AREA"}, 1474 | { "b-g-.-G-G-P-U-S-D", "DIP POSITION"}, 1475 | { "b-g-.-G-G-P-U-S-C", "SEARCH CENTER"}, 1476 | { "b-g-.-G-G-P-R", "REFERENCE POINT"}, 1477 | { "b-g-.-G-G-P-R-S", "SPECIAL POINT"}, 1478 | { "b-g-.-G-G-P-R-N", "NAV REFERENCE"}, 1479 | { "b-g-.-G-G-P-R-D", "DLRP"}, 1480 | { "b-g-.-G-G-P-R-I", "POINT OF INTEREST"}, 1481 | { "b-g-.-G-G-P-W", "WEAPON"}, 1482 | { "b-g-.-G-G-P-W-A", "AIM POINT"}, 1483 | { "b-g-.-G-G-P-W-D", "DROP POINT"}, 1484 | { "b-g-.-G-G-P-W-E", "ENTRY POINT"}, 1485 | { "b-g-.-G-G-P-W-G", "GROUND ZERO"}, 1486 | { "b-g-.-G-G-P-W-M", "MSL DETECT POINT"}, 1487 | { "b-g-.-G-G-P-W-I", "IMPACT POINT"}, 1488 | { "b-g-.-G-G-P-W-P", "PREDICTED IMPACT POINT"}, 1489 | { "b-g-.-G-G-P-F", "FORMATION"}, 1490 | { "b-g-.-G-G-P-H", "HARBOR (GENERAL)"}, 1491 | { "b-g-.-G-G-P-H-Q", "POINT Q"}, 1492 | { "b-g-.-G-G-P-H-A", "POINT A"}, 1493 | { "b-g-.-G-G-P-H-Y", "POINT Y"}, 1494 | { "b-g-.-G-G-P-H-X", "POINT X"}, 1495 | { "b-g-.-G-G-P-O", "ROUTE"}, 1496 | { "b-g-.-G-G-P-O-Z", "RENDEZVOUS"}, 1497 | { "b-g-.-G-G-P-O-D", "DIVERSIONS"}, 1498 | { "b-g-.-G-G-P-O-W", "WAYPOINT"}, 1499 | { "b-g-.-G-G-P-O-P", "PIM"}, 1500 | { "b-g-.-G-G-P-O-R", "POINT R"}, 1501 | { "b-g-.-G-G-P-A", "AIR CONTROL"}, 1502 | { "b-g-.-G-G-P-A-P", "COMBAT AIR PATROL (CAP)"}, 1503 | { "b-g-.-G-G-P-A-W", "AIRBORNE EARLY WARNING (AEW)"}, 1504 | { "b-g-.-G-G-P-A-T", "TACAN"}, 1505 | { "b-g-.-G-G-P-A-K", "TANKING"}, 1506 | { "b-g-.-G-G-P-A-A", "ANTISUBMARINE WARFARE , FIXED WING"}, 1507 | { "b-g-.-G-G-P-A-H", "ANTISUBMARINE WARFARE, ROTARY WING"}, 1508 | { "b-g-.-G-G-P-A-O", "TOMCAT"}, 1509 | { "b-g-.-G-G-P-A-R", "RESCUE"}, 1510 | { "b-g-.-G-G-P-A-L", "REPLENISH"}, 1511 | { "b-g-.-G-G-P-A-M", "MARSHALL"}, 1512 | { "b-g-.-G-G-P-A-S", "STRIKE IP"}, 1513 | { "b-g-.-G-G-P-A-C", "CORRIDOR TAB"}, 1514 | { "b-g-.-G-G-P-P", "ACTION POINTS (GENERAL)"}, 1515 | { "b-g-.-G-G-P-P-K", "CHECK POINT"}, 1516 | { "b-g-.-G-G-P-P-C", "CONTACT POINT"}, 1517 | { "b-g-.-G-G-P-P-O", "COORDINATION POINT"}, 1518 | { "b-g-.-G-G-P-P-D", "DECISION POINT"}, 1519 | { "b-g-.-G-G-P-P-L", "LINKUP POINT"}, 1520 | { "b-g-.-G-G-P-P-P", "PASSAGE POINT"}, 1521 | { "b-g-.-G-G-P-P-R", "RALLY POINT"}, 1522 | { "b-g-.-G-G-P-P-E", "RELEASE POINT"}, 1523 | { "b-g-.-G-G-P-P-S", "START POINT"}, 1524 | { "b-g-.-G-G-P-P-W", "WAYPOINT"}, 1525 | { "b-g-.-G-G-L", "LINES"}, 1526 | { "b-g-.-G-G-L-B", "BOUNDARIES"}, 1527 | { "b-g-.-G-G-L-F", "FORWARD LINE OF OWN TROOPS (FLOT)"}, 1528 | { "b-g-.-G-G-L-C", "LINE OF CONTACT"}, 1529 | { "b-g-.-G-G-L-P", "PHASE LINE"}, 1530 | { "b-g-.-G-G-L-L", "LIGHT LINE"}, 1531 | { "b-g-.-G-G-A", "AREAS"}, 1532 | { "b-g-.-G-G-A-G", "GENERAL AREA"}, 1533 | { "b-g-.-G-G-A-A", "ASSEMBLY AREA"}, 1534 | { "b-g-.-G-G-A-E", "ENGAGEMENT AREA"}, 1535 | { "b-g-.-G-G-A-F", "FORTIFIED AREA"}, 1536 | { "b-g-.-G-G-A-D", "DROP ZONE"}, 1537 | { "b-g-.-G-G-A-X", "EXTRACTION ZONE (EZ)"}, 1538 | { "b-g-.-G-G-A-L", "LANDING ZONE (LZ)"}, 1539 | { "b-g-.-G-G-A-P", "PICKUP ZONE (PZ)"}, 1540 | { "b-g-.-G-G-A-S", "SEARCH AREA/RECONNAISSANCE AREA"}, 1541 | { "b-g-.-G-G-A-Y", "LIMITED ACCESS AREA"}, 1542 | { "b-g-.-G-G-A-Z", "AIRFIELD ZONE"}, 1543 | { "b-g-.-G-A", "AVIATION"}, 1544 | { "b-g-.-G-A-P", "POINTS"}, 1545 | { "b-g-.-G-A-P-P", "AIR CONTROL POINT (ACP)"}, 1546 | { "b-g-.-G-A-P-C", "COMMUNICATIONS CHECKPOINT (CCP)"}, 1547 | { "b-g-.-G-A-P-U", "POP UP POINT (PUP)"}, 1548 | { "b-g-.-G-A-P-D", "DOWNED AIRCREW PICKUP POINT"}, 1549 | { "b-g-.-G-A-L", "LINES"}, 1550 | { "b-g-.-G-A-L-C", "AIR CORRIDOR"}, 1551 | { "b-g-.-G-A-L-M", "MINIMUM RISK ROUTE (MRR)"}, 1552 | { "b-g-.-G-A-L-S", "STANDARD USE ARMY AIRCRAFT FLIGHT ROUTE"}, 1553 | { "b-g-.-G-A-L-U", "UNMANNED AERIAL VEHICLE (UAV) ROUTE"}, 1554 | { "b-g-.-G-A-L-L", "LOW LEVEL TRANSIT ROUTE (LLTR)"}, 1555 | { "b-g-.-G-A-A", "AREAS"}, 1556 | { "b-g-.-G-A-A-R", "RESTRICTED OPERATIONS ZONE (ROZ)"}, 1557 | { "b-g-.-G-A-A-F", "FORWARD AREA AIR DEFENSE ZONE (FAADEZ)"}, 1558 | { "b-g-.-G-A-A-H", "HIGH DENSITY AIRSPACE CONTROL ZONE (HIDACZ)"}, 1559 | { "b-g-.-G-A-A-M", "MISSILE ENGAGEMENT ZONE (MEZ)"}, 1560 | { "b-g-.-G-A-A-M-L", "LOW ALTITUDE MEZ"}, 1561 | { "b-g-.-G-A-A-M-H", "HIGH ALTITUDE MEZ"}, 1562 | { "b-g-.-G-A-A-W", "WEAPONS FREE ZONE"}, 1563 | { "b-g-.-G-P", "DECEPTION"}, 1564 | { "b-g-.-G-P-D", "DUMMY (DECEPTION/DECOY)"}, 1565 | { "b-g-.-G-P-A", "AXIS OF ADVANCE FOR FEINT"}, 1566 | { "b-g-.-G-P-F", "DIRECTION OF ATTACK FOR FEINT"}, 1567 | { "b-g-.-G-P-M", "DECOY MINED AREA"}, 1568 | { "b-g-.-G-P-Y", "DECOY MINED AREA, FENCED"}, 1569 | { "b-g-.-G-P-N", "DUMMY MINEFIELD (STATIC)"}, 1570 | { "b-g-.-G-P-C", "DUMMY MINEFIELD (DYNAMIC)"}, 1571 | { "b-g-.-G-D", "DEFENSE"}, 1572 | { "b-g-.-G-D-P", "POINTS"}, 1573 | { "b-g-.-G-D-P-T", "TARGET REFERENCE POINT (TRP)"}, 1574 | { "b-g-.-G-D-P-O", "OBSERVATION POST/OUTPOST"}, 1575 | { "b-g-.-G-D-P-O-C", "COMBAT OUTPOST"}, 1576 | { "b-g-.-G-D-P-O-R", "OBSERVATION POST OCCUPIED BY DISMOUNTED"}, 1577 | { "b-g-.-G-D-P-O-F", "FORWARD OBSERVER POSITION"}, 1578 | { "b-g-.-G-D-P-O-S", "SENSOR OUTPOST/LISTENING POST (OP/LP)"}, 1579 | { "b-g-.-G-D-P-O-N", "NBC OBSERVATION POST (DISMOUNTED)"}, 1580 | { "b-g-.-G-D-L", "LINES"}, 1581 | { "b-g-.-G-D-L-F", "FORWARD EDGE OF BATTLE AREA (FEBA)"}, 1582 | { "b-g-.-G-D-L-P", "PRINCIPAL DIRECTION OF FIRE (PDF)"}, 1583 | { "b-g-.-G-D-A", "AREAS"}, 1584 | { "b-g-.-G-D-A-B", "BATTLE POSITION"}, 1585 | { "b-g-.-G-D-A-B-P", ""}, 1586 | { "b-g-.-G-D-A-E", "ENGAGEMENT AREA"}, 1587 | { "b-g-.-G-O", "OFFENSE"}, 1588 | { "b-g-.-G-O-P", "POINTS"}, 1589 | { "b-g-.-G-O-P-P", "POINT OF"}, 1590 | { "b-g-.-G-O-L", "LINES"}, 1591 | { "b-g-.-G-O-L-A", "AXIS OF ADVANCE"}, 1592 | { "b-g-.-G-O-L-A-V", "FRIENDLY AVIATION"}, 1593 | { "b-g-.-G-O-L-A-A", "FRIENDLY AIRBORNE"}, 1594 | { "b-g-.-G-O-L-A-R", "FRIENDLY ATTACK, ROTARY WING"}, 1595 | { "b-g-.-G-O-L-A-G", "GROUND"}, 1596 | { "b-g-.-G-O-L-A-G-M", "MAIN ATTACK"}, 1597 | { "b-g-.-G-O-L-A-G-S", "SUPPORTING ATTACK"}, 1598 | { "b-g-.-G-O-L-K", "DIRECTION OF ATTACK"}, 1599 | { "b-g-.-G-O-L-K-A", "AVIATION"}, 1600 | { "b-g-.-G-O-L-K-G", "GROUND"}, 1601 | { "b-g-.-G-O-L-K-G-M", "MAIN ATTACK"}, 1602 | { "b-g-.-G-O-L-K-G-S", "SUPPORTING ATTACK"}, 1603 | { "b-g-.-G-O-L-F", "FINAL COORDINATION LINE"}, 1604 | { "b-g-.-G-O-L-I", "INFILTRATION LINE"}, 1605 | { "b-g-.-G-O-L-L", "LIMIT OF ADVANCE"}, 1606 | { "b-g-.-G-O-L-T", "LINE OF"}, 1607 | { "b-g-.-G-O-L-C", "LINE OF"}, 1608 | { "b-g-.-G-O-L-P", "PROBABLE LINE OF DEPLOYMENT (PLD)"}, 1609 | { "b-g-.-G-O-A", "AREAS"}, 1610 | { "b-g-.-G-O-A-A", "ASSAULT POSITION"}, 1611 | { "b-g-.-G-O-A-K", "ATTACK POSITION"}, 1612 | { "b-g-.-G-O-A-F", "ATTACK BY FIRE POSITION"}, 1613 | { "b-g-.-G-O-A-S", "SUPPORT BY FIRE POSITION"}, 1614 | { "b-g-.-G-O-A-O", "OBJECTIVE"}, 1615 | { "b-g-.-G-O-A-P", "PENETRATION BOX"}, 1616 | { "b-g-.-G-S", "SPECIAL"}, 1617 | { "b-g-.-G-S-L", "LINE"}, 1618 | { "b-g-.-G-S-L-A", "AMBUSH"}, 1619 | { "b-g-.-G-S-L-H", "HOLDING LINE"}, 1620 | { "b-g-.-G-S-L-R", "RELEASE LINE"}, 1621 | { "b-g-.-G-S-A", "AREA"}, 1622 | { "b-g-.-G-S-A-O", "AREA OF OPERATIONS (AO)"}, 1623 | { "b-g-.-G-S-A-A", "AIRHEAD"}, 1624 | { "b-g-.-G-S-A-B", "BRIDGEHEAD"}, 1625 | { "b-g-.-G-S-A-E", "ENCIRCLEMENT"}, 1626 | { "b-g-.-G-S-A-N", "NAMED AREA OF INTEREST (NAI)"}, 1627 | { "b-g-.-G-S-A-T", "TARGETED AREA OF INTEREST (TAI)"}, 1628 | { "b-g-.-M", "MOBILITY/SURVIVABILITY"}, 1629 | { "b-g-.-M-O", "OBSTACLES"}, 1630 | { "b-g-.-M-O-G", "GENERAL"}, 1631 | { "b-g-.-M-O-G-B", "BELT"}, 1632 | { "b-g-.-M-O-G-L", "LINE"}, 1633 | { "b-g-.-M-O-G-Z", "ZONE"}, 1634 | { "b-g-.-M-O-G-F", "OBSTACLE FREE AREA"}, 1635 | { "b-g-.-M-O-G-R", "OBSTACLE RESTRICTED AREA"}, 1636 | { "b-g-.-M-O-S", "ABATIS"}, 1637 | { "b-g-.-M-O-A", "ANTITANK OBSTACLES"}, 1638 | { "b-g-.-M-O-A-D", "ANTITANK DITCH"}, 1639 | { "b-g-.-M-O-A-D-U", "UNDER CONSTRUCTION"}, 1640 | { "b-g-.-M-O-A-D-C", "COMPLETE"}, 1641 | { "b-g-.-M-O-A-R", "ANTITANK DITCH REINFORCED WITH ANTITANK MINES"}, 1642 | { "b-g-.-M-O-A-O", "ANTITANK OBSTACLES: TETRAHEDRONS, DRAGONS"}, 1643 | { "b-g-.-M-O-A-O-F", "FIXED AND PREFABRICATED"}, 1644 | { "b-g-.-M-O-A-O-M", "MOVEABLE"}, 1645 | { "b-g-.-M-O-A-O-P", "MOVEABLE AND PREFABRICATED"}, 1646 | { "b-g-.-M-O-A-W", "ANTITANK WALL"}, 1647 | { "b-g-.-M-O-B", "BOOBY TRAP"}, 1648 | { "b-g-.-M-O-M", "MINES"}, 1649 | { "b-g-.-M-O-M-U", "UNSPECIFIED MINE"}, 1650 | { "b-g-.-M-O-M-T", "ANTITANK MINE (AT)"}, 1651 | { "b-g-.-M-O-M-D", "ANTITANK MINE WITH ANTIHANDLING DEVICE"}, 1652 | { "b-g-.-M-O-M-E", "ANTITANK MINE (DIRECTIONAL)"}, 1653 | { "b-g-.-M-O-M-P", "ANTIPERSONNEL (AP) MINES"}, 1654 | { "b-g-.-M-O-M-W", "WIDE AREA MINES"}, 1655 | { "b-g-.-M-O-M-C", "MINE CLUSTER"}, 1656 | { "b-g-.-M-O-F", "MINEFIELDS"}, 1657 | { "b-g-.-M-O-F-S", "STATIC DEPICTION"}, 1658 | { "b-g-.-M-O-F-D", "DYNAMIC DEPICTION"}, 1659 | { "b-g-.-M-O-F-G", "GAP"}, 1660 | { "b-g-.-M-O-F-A", "MINED AREA"}, 1661 | { "b-g-.-M-O-E", "OBSTACLE EFFECT"}, 1662 | { "b-g-.-M-O-E-B", "BLOCK"}, 1663 | { "b-g-.-M-O-E-F", "FIX"}, 1664 | { "b-g-.-M-O-E-T", "TURN"}, 1665 | { "b-g-.-M-O-E-D", "DISRUPT"}, 1666 | { "b-g-.-M-O-U", "UNEXPLODED ORDINANCE AREA (UXO)"}, 1667 | { "b-g-.-M-O-R", "ROADBLOCKS, CRATERS, AND BLOWN BRIDGES"}, 1668 | { "b-g-.-M-O-R-P", "PLANNED"}, 1669 | { "b-g-.-M-O-R-S", "EXPLOSIVES, STATE OF READINESS 1 (SAFE)"}, 1670 | { "b-g-.-M-O-R-A", "EXPLOSIVES, STATE OF READINESS 2 (ARMED BUT"}, 1671 | { "b-g-.-M-O-R-C", "ROADBLOCK COMPLETE (EXECUTED)"}, 1672 | { "b-g-.-M-O-T", "TRIP WIRE"}, 1673 | { "b-g-.-M-O-W", "WIRE OBSTACLE"}, 1674 | { "b-g-.-M-O-W-U", "UNSPECIFIED"}, 1675 | { "b-g-.-M-O-W-S", "SINGLE FENCE"}, 1676 | { "b-g-.-M-O-W-D", "DOUBLE FENCE"}, 1677 | { "b-g-.-M-O-W-A", "DOUBLE APRON FENCE"}, 1678 | { "b-g-.-M-O-W-L", "LOW WIRE FENCE"}, 1679 | { "b-g-.-M-O-W-H", "HIGH WIRE FENCE"}, 1680 | { "b-g-.-M-O-W-C", "CONCERTINA"}, 1681 | { "b-g-.-M-O-W-C-S", "SINGLE CONCERTINA"}, 1682 | { "b-g-.-M-O-W-C-D", "DOUBLE STRAND CONCERTINA"}, 1683 | { "b-g-.-M-O-W-C-T", "TRIPLE STRAND CONCERTINA"}, 1684 | { "b-g-.-M-B", "OBSTACLE BYPASS"}, 1685 | { "b-g-.-M-B-D", "OBSTACLE BYPASS DIFFICULTY"}, 1686 | { "b-g-.-M-B-D-E", "BYPASS EASY"}, 1687 | { "b-g-.-M-B-D-D", "BYPASS DIFFICULT"}, 1688 | { "b-g-.-M-B-D-I", "BYPASS IMPOSSIBLE"}, 1689 | { "b-g-.-M-B-C", "CROSSING SITE/WATER CROSSING"}, 1690 | { "b-g-.-M-B-C-A", "ASSAULT CROSSING AREA"}, 1691 | { "b-g-.-M-B-C-B", "BRIDGE OR GAP"}, 1692 | { "b-g-.-M-B-C-F", "FERRY"}, 1693 | { "b-g-.-M-B-C-E", "FORD EASY"}, 1694 | { "b-g-.-M-B-C-D", "FORD DIFFICULT"}, 1695 | { "b-g-.-M-B-C-L", "LANE"}, 1696 | { "b-g-.-M-B-C-R", "RAFT SITE"}, 1697 | { "b-g-.-M-B-C-P", "ENGINEER REGULATING POINT"}, 1698 | { "b-g-.-M-S", "SURVIVABILITY"}, 1699 | { "b-g-.-M-S-E", "EARTHWORK, SMALL TRENCH OR FORTIFICATION"}, 1700 | { "b-g-.-M-S-F", "FORT"}, 1701 | { "b-g-.-M-S-L", "FORTIFIED LINE"}, 1702 | { "b-g-.-M-S-W", "FOXHOLE, EMPLACEMENT OR WEAPON SITE"}, 1703 | { "b-g-.-M-S-P", "STRONG POINT"}, 1704 | { "b-g-.-M-S-S", "SURFACE SHELTER"}, 1705 | { "b-g-.-M-S-U", "UNDERGROUND SHELTER"}, 1706 | { "b-g-.-M-N", "NUCLEAR, BIOLOGICAL AND CHEMICAL"}, 1707 | { "b-g-.-M-N-M", "MINIMUM SAFE DISTANCE ZONES"}, 1708 | { "b-g-.-M-N-Z", "NUCLEAR DETINATIONS GROUND ZERO"}, 1709 | { "b-g-.-M-N-F", "FALLOUT PRODUCING"}, 1710 | { "b-g-.-M-N-R", "RADIOACTIVE AREA"}, 1711 | { "b-g-.-M-N-B", "BIOLOGICALLY CONTAMINATED AREA"}, 1712 | { "b-g-.-M-N-C", "CHEMICALLY CONTAMINATED AREA"}, 1713 | { "b-g-.-M-N-E", "RELEASE EVENTS"}, 1714 | { "b-g-.-M-N-E-B", "BIOLOGICAL"}, 1715 | { "b-g-.-M-N-E-C", "CHEMICAL"}, 1716 | { "b-g-.-M-N-D", "DECONTAMINATION (DECON) POINTS"}, 1717 | { "b-g-.-M-N-D-P", "DECON SITE/POINT (UNSPECIFIED)"}, 1718 | { "b-g-.-M-N-D-A", "ALTERNATE DECON SITE/POINT (UNSPECIFIED)"}, 1719 | { "b-g-.-M-N-D-T", "DECON SITE/POINT (TROOPS)"}, 1720 | { "b-g-.-M-N-D-E", "DECON SITE/POINT (EQUIPMENT)"}, 1721 | { "b-g-.-M-N-D-B", "DECON SITE/POINT (EQUIPMENT AND TROOPS)"}, 1722 | { "b-g-.-M-N-D-O", "DECON SITE/POINT (OPERATIONAL"}, 1723 | { "b-g-.-M-N-D-D", "DECON SITE/POINT (THOROUGH DECONTAMINATION)"}, 1724 | { "b-g-.-M-N-L", "DOSE RATE CONTOUR LINES"}, 1725 | { "b-g-.-F", "FIRE SUPPORT"}, 1726 | { "b-g-.-F-P", "POINT"}, 1727 | { "b-g-.-F-P-T", "TARGET"}, 1728 | { "b-g-.-F-P-T-S", "POINT/SINGLE TARGET"}, 1729 | { "b-g-.-F-P-T-N", "NUCLEAR TARGET"}, 1730 | { "b-g-.-F-P-T-C", "CIRCULAR TARGET"}, 1731 | { "b-g-.-F-P-T-R", "RECTANGULAR TARGET"}, 1732 | { "b-g-.-F-P-S", "FIRE SUPPORT STATION"}, 1733 | { "b-g-.-F-L", "LINES"}, 1734 | { "b-g-.-F-L-F", "FIRE SUPPORT COORDINATION LINE (FSCL)"}, 1735 | { "b-g-.-F-L-C", "COORDINATED FIRE LINE (CFL)"}, 1736 | { "b-g-.-F-L-N", "NO FIRE LINE (NFL)"}, 1737 | { "b-g-.-F-L-R", "RESTRICTIVE FIRE LINE (RFL)"}, 1738 | { "b-g-.-F-L-L", "LINEAR TARGET"}, 1739 | { "b-g-.-F-L-P", "FINAL PROTECTIVE FIRE (FPF)"}, 1740 | { "b-g-.-F-L-S", "LINEAR SMOKE TARGET"}, 1741 | { "b-g-.-F-A", "AREAS"}, 1742 | { "b-g-.-F-A-A", "FIRE SUPPORT AREA (FSA)"}, 1743 | { "b-g-.-F-A-C", "AIRSPACE COORDINATION AREA (ACA)"}, 1744 | { "b-g-.-F-A-T", "AREA TARGET"}, 1745 | { "b-g-.-F-A-K", "SMOKE"}, 1746 | { "b-g-.-F-A-S", "SERIES OR GROUP OF TARGETS"}, 1747 | { "b-g-.-F-A-B", "BOMB AREA"}, 1748 | { "b-g-.-F-A-F", "FREE FIRE AREA (FFA)"}, 1749 | { "b-g-.-F-A-N", "NO FIRE AREA (NFA)"}, 1750 | { "b-g-.-F-A-R", "RESTRICTIVE FIRE AREA (RFA)"}, 1751 | { "b-g-.-F-A-P", "POSITION AREA FOR ARTILLERY (PAA)"}, 1752 | { "b-g-.-S", "COMBAT SERVICE SUPPORT"}, 1753 | { "b-g-.-S-P", "POINTS"}, 1754 | { "b-g-.-S-P-X", "AMBULANCE EXCHANGE POINT"}, 1755 | { "b-g-.-S-P-C", "CANNIBALIZATION POINT"}, 1756 | { "b-g-.-S-P-Y", "CASUALTY COLLECTION POINT"}, 1757 | { "b-g-.-S-P-T", "CIVILIAN COLLECTION POINT"}, 1758 | { "b-g-.-S-P-D", "DETAINEE COLLECTION POINT"}, 1759 | { "b-g-.-S-P-E", "ENEMY PRISONER OF WAR (EPW) COLLECTION POINT"}, 1760 | { "b-g-.-S-P-L", "LOGISTICS RELEASE POINT (LRP)"}, 1761 | { "b-g-.-S-P-M", "MAINTENANCE COLLECTION POINT"}, 1762 | { "b-g-.-S-P-R", "REARM, REFUEL AND RESUPPLY POINT"}, 1763 | { "b-g-.-S-P-U", "REFUEL ON THE MOVE (ROM) POINT"}, 1764 | { "b-g-.-S-P-O", "TRAFFIC CONTROL POST (TCP)"}, 1765 | { "b-g-.-S-P-I", "TRAILER TRANSFER POINT"}, 1766 | { "b-g-.-S-P-N", "UNIT MAINTENANCE COLLECTION POINT"}, 1767 | { "b-g-.-S-P-S", "SUPPLY POINTS"}, 1768 | { "b-g-.-S-P-S-Z", "GENERAL"}, 1769 | { "b-g-.-S-P-S-A", "CLASS 1"}, 1770 | { "b-g-.-S-P-S-B", "CLASS II"}, 1771 | { "b-g-.-S-P-S-C", "CLASS III"}, 1772 | { "b-g-.-S-P-S-D", "CLASS IV"}, 1773 | { "b-g-.-S-P-S-E", "CLASS V"}, 1774 | { "b-g-.-S-P-S-F", "CLASS VI"}, 1775 | { "b-g-.-S-P-S-G", "CLASS VII"}, 1776 | { "b-g-.-S-P-S-H", "CLASS VIII"}, 1777 | { "b-g-.-S-P-S-I", "CLASS IX"}, 1778 | { "b-g-.-S-P-S-J", "CLASS X"}, 1779 | { "b-g-.-S-P-A", "AMMUNITION POINTS"}, 1780 | { "b-g-.-S-P-A-S", "AMMUNITION SUPPLY POINT (ASP)"}, 1781 | { "b-g-.-S-P-A-T", "AMMUNITION TRANSFER POINT (ATP)"}, 1782 | { "b-g-.-S-L", "LINES"}, 1783 | { "b-g-.-S-L-C", "CONVOYS"}, 1784 | { "b-g-.-S-L-C-M", "MOVING CONVOY"}, 1785 | { "b-g-.-S-L-C-H", "HALTED CONVOY"}, 1786 | { "b-g-.-S-L-R", "SUPPLY ROUTES"}, 1787 | { "b-g-.-S-L-R-M", "MAIN SUPPLY ROUTE"}, 1788 | { "b-g-.-S-L-R-A", "ALTERNATE SUPPLY ROUTE"}, 1789 | { "b-g-.-S-L-R-O", "ONE WAY TRAFFIC"}, 1790 | { "b-g-.-S-L-R-T", "ALTERNATING TRAFFIC"}, 1791 | { "b-g-.-S-L-R-W", "TWO WAY TRAFFIC"}, 1792 | { "b-g-.-S-A", "AREA"}, 1793 | { "b-g-.-S-A-D", "DETAINEE HOLDING AREA"}, 1794 | { "b-g-.-S-A-E", "ENEMY PRISONER OF WAR (EPW) HOLDING AREA"}, 1795 | { "b-g-.-S-A-R", "FORWARD ARMING AND REFUELING AREA (FARP)"}, 1796 | { "b-g-.-S-A-H", "REFUGEE HOLDING AREA"}, 1797 | { "b-g-.-S-A-S", "SUPPORT AREAS"}, 1798 | { "b-g-.-S-A-S-B", "BRIGADE (BSA)"}, 1799 | { "b-g-.-S-A-S-D", "DIVISION (DSA)"}, 1800 | { "b-g-.-S-A-S-R", "REGIMENTAL (RSA)"}, 1801 | { "b-g-.-O", "OTHER"}, 1802 | { "b-g-.-O-E", "EMERGENCY"}, 1803 | { "b-g-.-O-E-D", "DITCHED AIRCRAFT"}, 1804 | { "b-g-.-O-E-P", "PERSON IN WATER"}, 1805 | { "b-g-.-O-E-V", "DISTRESSED VESSEL"}, 1806 | { "b-g-.-O-H", "HAZARD"}, 1807 | { "b-g-.-O-H-M", "SEA MINE LIKE"}, 1808 | { "b-g-.-O-H-N", "NAVIGATIONAL"}, 1809 | { "b-g-.-O-H-I", "ICEBERG"}, 1810 | { "b-g-.-O-H-O", "OIL RIG"}, 1811 | { "b-g-.-O-S", "SEA SUBSURFACE RETURNS"}, 1812 | { "b-g-.-O-S-B", "BOTTOM RETURN/NOMBO"}, 1813 | { "b-g-.-O-S-B-M", "INSTALLATION/MANMADE"}, 1814 | { "b-g-.-O-S-B-N", "SEABED ROCK/STONE, OBSTACLE, OTHER"}, 1815 | { "b-g-.-O-S-B-W", "WRECK"}, 1816 | { "b-g-.-O-S-M", "MARINE LIFE"}, 1817 | { "b-g-.-O-S-S", "SEA ANOMALY (WAKE, CURRENT, KNUCKLE)"}, 1818 | { "b-g-.-O-B", "BEARING LINE"}, 1819 | { "b-g-.-O-B-E", "ELECTRONIC"}, 1820 | { "b-g-.-O-B-A", "ACOUSTIC"}, 1821 | { "b-g-.-O-B-T", "TORPEDO"}, 1822 | { "b-g-.-O-B-O", "ELECTRO OPTICAL INTERCEPT"}, 1823 | { "b-g-.-O-F", "FIX"}, 1824 | { "b-g-.-O-F-A", "ACOUSTIC"}, 1825 | { "b-g-.-O-F-E", "ELECTRO MAGNETIC"}, 1826 | { "b-g-.-O-F-O", "ELECTRO OPTICAL"}, 1827 | { "b-w", "METOC"}, 1828 | { "b-w-A", "ATMOSPHERIC"}, 1829 | { "b-w-A-t", "Temperature"}, 1830 | { "b-w-A-P", "PRESSURE SYSTEMS"}, 1831 | { "b-w-A-P-L", "LOW PRESSURE CENTER"}, 1832 | { "b-w-A-P-H", "HIGH PRESSURE CENTER"}, 1833 | { "b-w-A-P-F", "FRONTAL SYSTEMS"}, 1834 | { "b-w-A-P-F-C", "COLD FRONT"}, 1835 | { "b-w-A-P-F-C-U", "UPPER COLD FRONT"}, 1836 | { "b-w-A-P-F-W", "WARM FRONT"}, 1837 | { "b-w-A-P-F-W-U", "UPPER WARM FRONT"}, 1838 | { "b-w-A-P-F-O", "OCCLUDED FRONT"}, 1839 | { "b-w-A-P-F-S", "STATIONARY FRONT"}, 1840 | { "b-w-A-P-X", "LINES"}, 1841 | { "b-w-A-P-X-T", "TROUGH LINE"}, 1842 | { "b-w-A-P-X-R", "RIDGE LINE"}, 1843 | { "b-w-A-P-X-S", "SQUALL LINE"}, 1844 | { "b-w-A-T", "TURBULENCE"}, 1845 | { "b-w-A-T-L", "LIGHT TURBULENCE"}, 1846 | { "b-w-A-T-M", "MODERATE TURBULENCE"}, 1847 | { "b-w-A-T-S", "SEVERE TURBULENCE"}, 1848 | { "b-w-A-T-E", "EXTREME TURBULENCE"}, 1849 | { "b-w-A-I", "ICING"}, 1850 | { "b-w-A-I-C", "CLEAR ICING"}, 1851 | { "b-w-A-I-C-L", "LIGHT CLEAR ICING"}, 1852 | { "b-w-A-I-C-M", "MODERATE CLEAR ICING"}, 1853 | { "b-w-A-I-C-S", "SEVERE CLEAR ICING"}, 1854 | { "b-w-A-I-R", "RIME ICING"}, 1855 | { "b-w-A-I-R-L", "LIGHT RIME ICING"}, 1856 | { "b-w-A-I-R-M", "MODERATE RIME ICING"}, 1857 | { "b-w-A-I-R-S", "SEVERE RIME ICING"}, 1858 | { "b-w-A-I-M", "MIXED ICING"}, 1859 | { "b-w-A-I-M-L", "LIGHT MIXED ICING"}, 1860 | { "b-w-A-I-M-M", "MODERATE MIXED ICING"}, 1861 | { "b-w-A-I-M-S", "SEVERE MIXED ICING"}, 1862 | { "b-w-A-W", "WIND BARB"}, 1863 | { "b-w-A-W-J", "JET STREAM"}, 1864 | { "b-w-A-F", "FLIGHT RULES"}, 1865 | { "b-w-A-F-I", "INSTRUMENT CEILING"}, 1866 | { "b-w-A-F-V", "VISUAL CEILING"}, 1867 | { "b-w-A-C", "COVERAGE SYMBOLS"}, 1868 | { "b-w-A-C-t", "Cloud tops"}, 1869 | { "b-w-A-C-b", "Cloud base"}, 1870 | { "b-w-A-C-c", "Cloud ceiling"}, 1871 | { "b-w-A-C-a", "Total Cloud Coverage"}, 1872 | { "b-w-A-C-C", "CLEAR SKY (SKC)"}, 1873 | { "b-w-A-C-S", "SCATTERED SKY (SCT)"}, 1874 | { "b-w-A-C-B", "BROKEN SKY (BKN)"}, 1875 | { "b-w-A-C-W", "OVERCAST WITH BREAKS"}, 1876 | { "b-w-A-C-O", "OVERCAST (OVC)"}, 1877 | { "b-w-A-C-P", "SKY OBSCURED OR PARTIALLY OBSCURED"}, 1878 | { "b-w-A-R", "PRECIPITATION"}, 1879 | { "b-w-A-R-R", "RAIN (RA)"}, 1880 | { "b-w-A-R-R-S", "RAIN SHOWER"}, 1881 | { "b-w-A-R-R-F", "FREEZING RAIN (FZRA)"}, 1882 | { "b-w-A-R-R-D", "DRIZZLE (DZ)"}, 1883 | { "b-w-A-R-R-D-F", "FREEZING DRIZZLE (FZDZ)"}, 1884 | { "b-w-A-R-S", "SNOW(SN)"}, 1885 | { "b-w-A-R-S-S", "SNOW SHOWERS"}, 1886 | { "b-w-A-R-S-G", "SNOW GRAINS (SG)"}, 1887 | { "b-w-A-R-H", "HAIL"}, 1888 | { "b-w-A-R-I", "ICE PELLETS (PE)"}, 1889 | { "b-w-A-R-C", "ICE CRYSTALS (IC)"}, 1890 | { "b-w-A-S", "STORMS"}, 1891 | { "b-w-A-S-T", "THUNDERSTORMS (TS)"}, 1892 | { "b-w-A-S-T-R", "THUNDERSTORM (TS) WITH RAIN (RA) "}, 1893 | { "b-w-A-S-T-F", "FUNNEL CLOUD (FC)/TORNADO/WATERSPOUT"}, 1894 | { "b-w-A-S-T-L", "LIGHTNING (LTG)"}, 1895 | { "b-w-A-S-S", "STORM SYSTEMS"}, 1896 | { "b-w-A-S-S-T", "TROPICAL STORM"}, 1897 | { "b-w-A-S-S-H", "HURRICANE"}, 1898 | { "b-w-A-O", "OBSTRUCTIONS TO VISIBILITY"}, 1899 | { "b-w-A-O-S", "BLOWING SNOW (BLSN)"}, 1900 | { "b-w-A-O-F", "FOG (FG)"}, 1901 | { "b-w-A-O-F-F", "FREEZING FOG (FZFG)"}, 1902 | { "b-w-A-O-T", "DUST/SAND STORM"}, 1903 | { "b-w-A-O-D", "DUST DEVIL"}, 1904 | { "b-w-A-O-K", "SMOKE (FU)"}, 1905 | { "b-w-A-O-H", "HAZE (HZ)"}, 1906 | { "b-w-A-O-B", "BLOWING DUST OR SAND"}, 1907 | { "b-w-O", "OCEANIC"}, 1908 | { "b-w-S", "SPACE"}, 1909 | { "b-r-.-h-c", "HEALTH/CASUALTY"}, 1910 | { "b-r-.-I", "SIGNALS INTELLIGENCE"}, 1911 | { "b-r-.-I-P", "SPACE TRACK"}, 1912 | { "b-r-.-I-P-S", "SIGNAL INTERCEPT"}, 1913 | { "b-r-.-I-P-S-C", "COMMUNICATIONS"}, 1914 | { "b-r-.-I-P-S-C-D", "SATELLITE DOWN LINK"}, 1915 | { "b-r-.-I-P-S-R", "RADAR"}, 1916 | { "b-r-.-I-P-S-R-D", "DATA TRANSMISSION"}, 1917 | { "b-r-.-I-P-S-R-E", "EARTH SURVEILLANCE"}, 1918 | { "b-r-.-I-P-S-R-I", "IFF (TRANSPONDER)"}, 1919 | { "b-r-.-I-P-S-R-M", "MULTI FUNCTION"}, 1920 | { "b-r-.-I-P-S-R-T", "TARGET ACQUISITION"}, 1921 | { "b-r-.-I-P-S-R-S", "SPACE"}, 1922 | { "b-r-.-I-P-S-R-U", "UNKNOWN"}, 1923 | { "b-r-.-I-A", "AIR TRACK"}, 1924 | { "b-r-.-I-A-S", "SIGNAL INTERCEPT"}, 1925 | { "b-r-.-I-A-S-C", "COMMUNICATIONS"}, 1926 | { "b-r-.-I-A-S-C-C", "CELLULAR/MOBILE"}, 1927 | { "b-r-.-I-A-S-C-O", "OMNI LINE OF SIGHT (LOS)"}, 1928 | { "b-r-.-I-A-S-C-P", "POINT TO POINT LINE OF SIGHT (LOS)"}, 1929 | { "b-r-.-I-A-S-C-S", "SATELLITE UP LINK"}, 1930 | { "b-r-.-I-A-S-R", "RADAR"}, 1931 | { "b-r-.-I-A-S-R-A-I", "AIRBORNE INTERCEPT"}, 1932 | { "b-r-.-I-A-S-R-A-S", "AIRBORNE SEARCH + BOMBING"}, 1933 | { "b-r-.-I-A-S-R-C", "CONTROLLED INTERCEPT"}, 1934 | { "b-r-.-I-A-S-R-D", "DATA TRANSMISSION"}, 1935 | { "b-r-.-I-A-S-R-E", "EARLY WARNING"}, 1936 | { "b-r-.-I-A-S-R-F", "FIRE CONTROL"}, 1937 | { "b-r-.-I-A-S-R-I", "IFF (TRANSPONDER)"}, 1938 | { "b-r-.-I-A-S-R-M-A", "MISSILE ACQUISITION"}, 1939 | { "b-r-.-I-A-S-R-M-D", "MISSILE DOWNLINK"}, 1940 | { "b-r-.-I-A-S-R-M-G", "MISSILE GUIDANCE"}, 1941 | { "b-r-.-I-A-S-R-M-T", "MISSILE TRACKING"}, 1942 | { "b-r-.-I-A-S-R-M-F", "MULTI FUNCTION"}, 1943 | { "b-r-.-I-A-S-R-T-I", "TARGET ILLUMINATOR"}, 1944 | { "b-r-.-I-A-S-R-T-A", "TARGET ACQUISITION"}, 1945 | { "b-r-.-I-A-S-R-T-T", "TARGET TRACKING"}, 1946 | { "b-r-.-I-A-S-R-U", "UNKNOWN"}, 1947 | { "b-r-.-I-G", "GROUND TRACK"}, 1948 | { "b-r-.-I-G-S", "SIGNAL INTERCEPT"}, 1949 | { "b-r-.-I-G-S-C", "COMMUNICATIONS"}, 1950 | { "b-r-.-I-G-S-C-C", "CELLULAR/MOBILE"}, 1951 | { "b-r-.-I-G-S-C-O", "OMNI LINE OF SIGHT (LOS)"}, 1952 | { "b-r-.-I-G-S-C-P", "POINT TO POINT LINE OF SIGHT (LOS)"}, 1953 | { "b-r-.-I-G-S-C-S", "SATELLITE UP LINK"}, 1954 | { "b-r-.-I-G-S-C-T", "TROPOSPHERIC SCATTER"}, 1955 | { "b-r-.-I-G-S-R", "RADAR"}, 1956 | { "b-r-.-I-G-S-R-A-T", "AIR TRAFFIC CONTROL"}, 1957 | { "b-r-.-I-G-S-R-A-A", "ANTI AIRCRAFT"}, 1958 | { "b-r-.-I-G-S-R-B", "BATTLEFIELD SURVEILLANCE"}, 1959 | { "b-r-.-I-G-S-R-C-S", "COASTAL SURVEILLANCE"}, 1960 | { "b-r-.-I-G-S-R-C-A", "CONTROLLED APPROACH"}, 1961 | { "b-r-.-I-G-S-R-D", "DATA TRANSMISSION"}, 1962 | { "b-r-.-I-G-S-R-E", "EARLY WARNING"}, 1963 | { "b-r-.-I-G-S-R-F", "FIRE CONTROL"}, 1964 | { "b-r-.-I-G-S-R-H", "HEIGHT FINDING"}, 1965 | { "b-r-.-I-G-S-R-I", "IDENTIFICATION FRIEND/FOE (INTERROGATOR)"}, 1966 | { "b-r-.-I-G-S-R-M-M", "METEOROLOGICAL (MILITARY)"}, 1967 | { "b-r-.-I-G-S-R-M-A", "MISSILE ACQUISITION"}, 1968 | { "b-r-.-I-G-S-R-M-G", "MISSILE GUIDANCE"}, 1969 | { "b-r-.-I-G-S-R-M-T", "MISSILE TRACKING"}, 1970 | { "b-r-.-I-G-S-R-M-F", "MULTI FUNCTION"}, 1971 | { "b-r-.-I-G-S-R-S", "SHELL TRACKING"}, 1972 | { "b-r-.-I-G-S-R-T-A", "TARGET ACQUISITION"}, 1973 | { "b-r-.-I-G-S-R-T-I", "TARGET ILLUMINATOR"}, 1974 | { "b-r-.-I-G-S-R-T-T", "TARGET TRACKING"}, 1975 | { "b-r-.-I-G-S-R-U", "UNKNOWN"}, 1976 | { "b-r-.-I-S", "SEA SURFACE TRACK"}, 1977 | { "b-r-.-I-S-S", "SIGNAL INTERCEPT"}, 1978 | { "b-r-.-I-S-S-C", "COMMUNICATIONS"}, 1979 | { "b-r-.-I-S-S-C-C", "CELLULAR/MOBILE"}, 1980 | { "b-r-.-I-S-S-C-O", "OMNI LINE OF SIGHT (LOS)"}, 1981 | { "b-r-.-I-S-S-C-P", "POINT TO POINT LINE OF SIGHT (LOS)"}, 1982 | { "b-r-.-I-S-S-C-S", "SATELLITE UP LINK"}, 1983 | { "b-r-.-I-S-S-R", "RADAR"}, 1984 | { "b-r-.-I-S-S-R-A-T", "AIR TRAFFIC CONTROL"}, 1985 | { "b-r-.-I-S-S-R-A-A", "ANTI AIRCRAFT"}, 1986 | { "b-r-.-I-S-S-R-C-A", "CONTROLLED APPROACH"}, 1987 | { "b-r-.-I-S-S-R-C-I", "CONTROLLED INTERCEPT"}, 1988 | { "b-r-.-I-S-S-R-D", "DATA TRANSMISSION"}, 1989 | { "b-r-.-I-S-S-R-E", "EARLY WARNING"}, 1990 | { "b-r-.-I-S-S-R-F", "FIRE CONTROL"}, 1991 | { "b-r-.-I-S-S-R-H", "HEIGHT FINDING"}, 1992 | { "b-r-.-I-S-S-R-I", "IDENTIFICATION FRIEND/FOE (INTERROGATOR)"}, 1993 | { "b-r-.-I-S-S-R-M-M", "METEOROLOGICAL (MILITARY)"}, 1994 | { "b-r-.-I-S-S-R-M-A", "MISSILE ACQUISITION"}, 1995 | { "b-r-.-I-S-S-R-M-G", "MISSILE GUIDANCE"}, 1996 | { "b-r-.-I-S-S-R-M-T", "MISSILE TRACKING"}, 1997 | { "b-r-.-I-S-S-R-M-F", "MULTI FUNCTION"}, 1998 | { "b-r-.-I-S-S-R-S", "SURFACE SEARCH"}, 1999 | { "b-r-.-I-S-S-R-T-A", "TARGET ACQUISITION"}, 2000 | { "b-r-.-I-S-S-R-T-I", "TARGET ILLUMINATOR"}, 2001 | { "b-r-.-I-S-S-R-T-T", "TARGET TRACKING"}, 2002 | { "b-r-.-I-S-S-R-U", "UNKNOWN"}, 2003 | { "b-r-.-I-U", "SUBSURFACE TRACK"}, 2004 | { "b-r-.-I-U-S", "SIGNAL INTERCEPT"}, 2005 | { "b-r-.-I-U-S-C", "COMMUNICATIONS"}, 2006 | { "b-r-.-I-U-S-C-O", "OMNI LINE OF SIGHT (LOS)"}, 2007 | { "b-r-.-I-U-S-C-P", "POINT TO POINT LINE OF SIGHT (LOS)"}, 2008 | { "b-r-.-I-U-S-C-S", "SATELLITE UP LINK"}, 2009 | { "b-r-.-I-U-S-R", "RADAR"}, 2010 | { "b-r-.-I-U-S-R-D", "DATA TRANSMISSION"}, 2011 | { "b-r-.-I-U-S-R-E", "EARLY WARNING"}, 2012 | { "b-r-.-I-U-S-R-M", "MULTI FUNCTION"}, 2013 | { "b-r-.-I-U-S-R-S", "SURFACE SEARCH"}, 2014 | { "b-r-.-I-U-S-R-T", "TARGET ACQUISITION"}, 2015 | { "b-r-.-I-U-S-R-U", "UNKNOWN"}, 2016 | { "b-r-.-O", "MILITARY OPERATIONS OTHER THAN WAR (MOOTW)"}, 2017 | { "b-r-.-O-V", "VIOLENT ACTIVITIES (DEATH CAUSING)"}, 2018 | { "b-r-.-O-V-A", "ARSON/FIRE"}, 2019 | { "b-r-.-O-V-M", "ASSASSINATION/MURDER/EXECUTION"}, 2020 | { "b-r-.-O-V-B", "BOMB/BOMBING"}, 2021 | { "b-r-.-O-V-Y", "BOOBY TRAP"}, 2022 | { "b-r-.-O-V-D", "DRIVE BY SHOOTING"}, 2023 | { "b-r-.-O-V-S", "SNIPING"}, 2024 | { "b-r-.-O-V-P", "POISONING"}, 2025 | { "b-r-.-O-L", "LOCATIONS"}, 2026 | { "b-r-.-O-L-B", "BLACK LIST LOCATION"}, 2027 | { "b-r-.-O-L-G", "GRAY LIST LOCATION"}, 2028 | { "b-r-.-O-L-W", "WHITE LIST LOCATION"}, 2029 | { "b-r-.-O-O", "OPERATIONS"}, 2030 | { "b-r-.-O-O-P", "PATROLLING"}, 2031 | { "b-r-.-O-O-R", "RECRUITMENT"}, 2032 | { "b-r-.-O-O-R-W", "RECRUITMENT (WILLING)"}, 2033 | { "b-r-.-O-O-R-C", "RECRUITMENT (COERCED/IMPRESSED)"}, 2034 | { "b-r-.-O-O-D", "DEMONSTRATION"}, 2035 | { "b-r-.-O-O-M", "MINE LAYING"}, 2036 | { "b-r-.-O-O-Y", "PSYCHOLOGICAL OPERATIONS (PSYOP)"}, 2037 | { "b-r-.-O-O-Y-T", "PSYOP (TV AND RADIO PROPAGANDA)"}, 2038 | { "b-r-.-O-O-Y-W", "PSYOP (WRITTEN PROPAGANA)"}, 2039 | { "b-r-.-O-O-Y-H", "HOUSE TO HOUSE PROPAGANDA"}, 2040 | { "b-r-.-O-O-F", "FORAGING/SEARCHING"}, 2041 | { "b-r-.-O-O-S", "SPY"}, 2042 | { "b-r-.-O-O-O", "FOOD DISTRIBUTION"}, 2043 | { "b-r-.-O-O-E", "EXTORTION"}, 2044 | { "b-r-.-O-O-H", "HIJACKING"}, 2045 | { "b-r-.-O-O-H-T", "HIJACKING (VEHICLE)"}, 2046 | { "b-r-.-O-O-H-A", "HIJACKING (AIRPLANE)"}, 2047 | { "b-r-.-O-O-H-V", "HIJACKING (BOAT)"}, 2048 | { "b-r-.-O-O-K", "KIDNAPPING"}, 2049 | { "b-r-.-O-O-A", "ARREST"}, 2050 | { "b-r-.-O-O-U", "DRUG OPERATION"}, 2051 | { "b-r-.-O-I", "ITEMS"}, 2052 | { "b-r-.-O-I-R", "REFUGEES"}, 2053 | { "b-r-.-O-I-S", "SAFE HOUSE"}, 2054 | { "b-r-.-O-I-G", "GRAFITTI"}, 2055 | { "b-r-.-O-I-V", "VANDALISM/RAPE/LOOT/RANSACK/PLUNDER/SACK"}, 2056 | { "b-r-.-O-I-I", "KNOWN INSURGENT VEHICLE"}, 2057 | { "b-r-.-O-I-D", "DRUG VEHICLE"}, 2058 | { "b-r-.-O-I-F", "INTERNAL SECURITY FORCE"}, 2059 | { "b-x.*", "NON-COT OBJECT"}, 2060 | { "r-c-x-c", "Chemical attack"}, 2061 | { "r-c-x-c-s", "blister: aka vesicants. Chemicals that severely blister the eyes, respiratory tract, and skin on contact"}, 2062 | { "r-c-x-c-s-m", "mustards"}, 2063 | { "r-c-x-c-s-m-hd", "istilled mustard (HD)"}, 2064 | { "r-c-x-c-s-m-h", "Mustard gas (H) (sulfur mustard)"}, 2065 | { "r-c-x-c-s-m-hl", "ustard/lewisite (HL)"}, 2066 | { "r-c-x-c-s-m-t", "Mustard/T"}, 2067 | { "r-c-x-c-s-m-n", "Nitrogen mustard (HN-1, HN-2, HN-3)"}, 2068 | { "r-c-x-c-s-m-q", "Sesqui mustard"}, 2069 | { "r-c-x-c-s-m-s", "Sulfur mustard (H) (mustard gas)"}, 2070 | { "r-c-x-c-s-cx", "hosgene oxime (CX)"}, 2071 | { "r-c-x-c-s-l", "Lewisites/chloroarsine agents"}, 2072 | { "r-c-x-c-s-l-l", "Lewisite (L, L-1, L-2, L-3)"}, 2073 | { "r-c-x-c-s-l-hl", "ustard/lewisite (HL)"}, 2074 | { "r-c-x-c-b", "blood: Poisons that affect the body by being absorbed into the blood"}, 2075 | { "r-c-x-c-b-a", "Arsine (SA)"}, 2076 | { "r-c-x-c-b-m", "Carbon Monoxide"}, 2077 | { "r-c-x-c-b-c", "Cyanide"}, 2078 | { "r-c-x-c-b-c-c", "Cyanogen chloride (CK)"}, 2079 | { "r-c-x-c-b-c-h", "Hydrogen cyanide (AC)"}, 2080 | { "r-c-x-c-b-c-p", "Potassium cyanide (KCN)"}, 2081 | { "r-c-x-c-b-c-s", "Sodium cyanide (NaCN)"}, 2082 | { "r-c-x-c-b-s", "Sodium monofluoroacetate (compound 1080)"}, 2083 | { "r-c-x-c-c", "caustics (Acids): Chemicals that burn or corrode people's skin, eyes, and mucus membranes (lining of the nose, mouth, throat, and lungs) on contact"}, 2084 | { "r-c-x-c-c-h", "Hydrofluoric acid (hydrogen fluoride)"}, 2085 | { "r-c-x-c-p", "Choking/Lung/Pulmonary Agents: Chemicals that cause severe irritation or swelling of the respiratory tract (lining of the nose, throat, and lungs)"}, 2086 | { "r-c-x-c-p-a", "Ammonia"}, 2087 | { "r-c-x-c-p-b", "Bromine (CA)"}, 2088 | { "r-c-x-c-p-c", "Chlorine (CL)"}, 2089 | { "r-c-x-c-p-h", "Hydrogen chloride"}, 2090 | { "r-c-x-c-p-m", "Methyl bromide"}, 2091 | { "r-c-x-c-p-i", "Methyl isocyanate"}, 2092 | { "r-c-x-c-p-t", "Osmium tetroxide"}, 2093 | { "r-c-x-c-p-p", "Phosgene"}, 2094 | { "r-c-x-c-p-p-d", "Diphosgene (DP)"}, 2095 | { "r-c-x-c-p-p-c", "Phosgene (CG)"}, 2096 | { "r-c-x-c-p-o", "Phosphine"}, 2097 | { "r-c-x-c-p-r", "Phosphorus, elemental"}, 2098 | { "r-c-x-c-p-r-w", "white"}, 2099 | { "r-c-x-c-p-r-y", "yellow"}, 2100 | { "r-c-x-c-p-s", "Sulfuryl fluoride"}, 2101 | { "r-c-x-c-i", "Incapacitating Agents: Drugs that make people unable to think clearly or that cause an altered state of consciousness (possibly unconsciousness)"}, 2102 | { "r-c-x-c-i-b", "BZ"}, 2103 | { "r-c-x-c-i-o", "opioids: chemical substance that causes a morphine-like action"}, 2104 | { "r-c-x-c-i-o-f", "Fentanyls"}, 2105 | { "r-c-x-c-a", "Long-Acting Anticoagulants: Poisons that prevent blood from clotting properly, which can lead to uncontrolled bleeding"}, 2106 | { "r-c-x-c-a-w", "Super warfarin"}, 2107 | { "r-c-x-c-m", "Metals: Agents that consist of metallic poisons"}, 2108 | { "r-c-x-c-m-a", "Arsenic"}, 2109 | { "r-c-x-c-m-b", "Barium"}, 2110 | { "r-c-x-c-m-m", "Mercury"}, 2111 | { "r-c-x-c-m-t", "Thallium"}, 2112 | { "r-c-x-c-n", "Nerve Agents: Highly poisonous chemicals that work by preventing the nervous system from working properly"}, 2113 | { "r-c-x-c-n-g", "G agents"}, 2114 | { "r-c-x-c-n-g-b", "Sarin (GB)"}, 2115 | { "r-c-x-c-n-g-d", "Soman (GD)"}, 2116 | { "r-c-x-c-n-g-a", "Tabun (GA)"}, 2117 | { "r-c-x-c-n-v", "V agents"}, 2118 | { "r-c-x-c-n-v-x", "VX"}, 2119 | { "r-c-x-c-o", "Organic Solvents: Agents that damage the tissues of living things by dissolving fats and oils"}, 2120 | { "r-c-x-c-o-b", "Benzene"}, 2121 | { "r-c-x-c-g", "Riot Control Agents/Tear Gas: Highly irritating agents normally used by law enforcement for crowd control or by individuals for protection (for example, mace)"}, 2122 | { "r-c-x-c-g-b", "Bromobenzylcyanide (CA)"}, 2123 | { "r-c-x-c-g-n", "Chloroacetophenone (CN)"}, 2124 | { "r-c-x-c-g-s", "Chlorobenzylidenemalononitrile (CS)"}, 2125 | { "r-c-x-c-g-p", "Chloropicrin (PS)"}, 2126 | { "r-c-x-c-g-d", "Dibenzoxazepine (CR)"}, 2127 | { "r-c-x-c-h", "Toxic Alcohols: Poisonous alcohols that can damage the heart, kidneys, and nervous system"}, 2128 | { "r-c-x-c-h-e", "Ethylene glycol"}, 2129 | { "r-c-x-c-v", "Vomiting Agents: Chemicals that cause nausea and vomiting"}, 2130 | { "r-c-x-c-v-a", "Adamsite (DM)"}, 2131 | { "r-c-x-b", "Biological attack"}, 2132 | { "r-c-x-b-m", "Mycotic biological agents"}, 2133 | { "r-c-x-b-m-c", "OC, Coccidioides mycosis"}, 2134 | { "r-c-x-b-b", "Bacterial biological agents"}, 2135 | { "r-c-x-b-b-a", "anthrax"}, 2136 | { "r-c-x-b-b-a-n", "N anthrax"}, 2137 | { "r-c-x-b-b-a-t", "TR anthrax"}, 2138 | { "r-c-x-b-b-p", "LE, plague"}, 2139 | { "r-c-x-b-b-t", "tularemia"}, 2140 | { "r-c-x-b-b-t-u", "UL, tularemia (schu S4)"}, 2141 | { "r-c-x-b-b-t-w", "TT, wet-type UL"}, 2142 | { "r-c-x-b-b-t-d", "ZZ, dry-type UL"}, 2143 | { "r-c-x-b-b-t-s", "SR, tularemia"}, 2144 | { "r-c-x-b-b-t-j", "JT, tularemia (425)"}, 2145 | { "r-c-x-b-b-c", "HO, cholera"}, 2146 | { "r-c-x-b-b-b", "brucellosis"}, 2147 | { "r-c-x-b-b-b-b", "AB, bovine brucellosis"}, 2148 | { "r-c-x-b-b-b-p", "porcine brucellosis"}, 2149 | { "r-c-x-b-b-b-p-u", "US, porcine brucellosis"}, 2150 | { "r-c-x-b-b-b-p-n", "NX, porcine brucellosis"}, 2151 | { "r-c-x-b-b-b-c", "caprine brucellosis"}, 2152 | { "r-c-x-b-b-b-c-a", "AM, caprine brucellosis"}, 2153 | { "r-c-x-b-b-b-c-b", "BX, caprine brucellosis"}, 2154 | { "r-c-x-b-b-y", "Y, bacterial dysentery"}, 2155 | { "r-c-x-b-b-g", "LA, Glanders"}, 2156 | { "r-c-x-b-b-m", "HI, Melioidosis"}, 2157 | { "r-c-x-b-b-d", "DK, diphtheria"}, 2158 | { "r-c-x-b-b-l", "TQ, listeriosis"}, 2159 | { "r-c-x-b-c", "Chlamydial biological agents"}, 2160 | { "r-c-x-b-c-s", "SI - psittacosis"}, 2161 | { "r-c-x-b-r", "Rickettsial biological agents"}, 2162 | { "r-c-x-b-r-r", "rocky mountain spotted fever"}, 2163 | { "r-c-x-b-r-r-r", "RI, rocky mountain spotted fever"}, 2164 | { "r-c-x-b-r-r-u", "UY, rocky mountain spotted fever"}, 2165 | { "r-c-x-b-r-q", "OU, Q fever"}, 2166 | { "r-c-x-b-r-q-w", "MN, wet-type OU"}, 2167 | { "r-c-x-b-r-q-d", "NT, dry-type OU"}, 2168 | { "r-c-x-b-r-t", "typhus"}, 2169 | { "r-c-x-b-r-t-h", "YE, human typhus"}, 2170 | { "r-c-x-b-r-t-m", "AV, murine typhus"}, 2171 | { "r-c-x-b-v", "Viral biological agents"}, 2172 | { "r-c-x-b-v-y", "yellow fever"}, 2173 | { "r-c-x-b-v-y-o", "OJ, yellow fever"}, 2174 | { "r-c-x-b-v-y-u", "UT, yellow fever"}, 2175 | { "r-c-x-b-v-y-l", "LU, yellow fever"}, 2176 | { "r-c-x-b-v-r", "FA, rift valley fever"}, 2177 | { "r-c-x-b-v-e", "Encephalitis"}, 2178 | { "r-c-x-b-v-e-e", "Equine Encephalitis"}, 2179 | { "r-c-x-b-v-e-e-v", "Venezuelan Equine Encephalitis"}, 2180 | { "r-c-x-b-v-e-e-v-n", "NU, Venezuelan Equine Encephalitis"}, 2181 | { "r-c-x-b-v-e-e-v-t", "TD, Venezuelan Equine Encephalitis"}, 2182 | { "r-c-x-b-v-e-e-v-f", "FX, Venezuelan Equine Encephalitis"}, 2183 | { "r-c-x-b-v-e-e-e", "ZX, Eastern Equine Encephalitis"}, 2184 | { "r-c-x-b-v-e-j", "AN, Japanese B Encephalitis"}, 2185 | { "r-c-x-b-v-s", "ZL, smallpox"}, 2186 | { "r-c-x-b-t", "Biological Toxins"}, 2187 | { "r-c-x-b-t-a", "Abrin"}, 2188 | { "r-c-x-b-t-v", "Brevetoxin"}, 2189 | { "r-c-x-b-t-b", "botulinum toxin A"}, 2190 | { "r-c-x-b-t-b-x", "X, botulinum toxin A"}, 2191 | { "r-c-x-b-t-b-xr", "XR, partially purified botulinum toxin A"}, 2192 | { "r-c-x-b-t-r", "ricin"}, 2193 | { "r-c-x-b-t-r-w", "W, ricin"}, 2194 | { "r-c-x-b-t-r-wa", "WA, ricin"}, 2195 | { "r-c-x-b-t-e", "staphylococcal enterotoxin B"}, 2196 | { "r-c-x-b-t-e-uc", "UC, staphylococcal enterotoxin B"}, 2197 | { "r-c-x-b-t-e-pg", "PG, staphylococcal enterotoxin B"}, 2198 | { "r-c-x-b-t-s", "saxitoxin"}, 2199 | { "r-c-x-b-t-s-t", "TZ, saxitoxin"}, 2200 | { "r-c-x-b-t-s-s", "SS, saxitoxin"}, 2201 | { "r-c-x-b-t-c", "Colchicine"}, 2202 | { "r-c-x-b-t-y", "Strychnine"}, 2203 | { "r-c-x-b-t-n", "Nicotine"}, 2204 | { "r-c-x-b-t-d", "Digitalis"}, 2205 | { "r-c-x-b-t-t", "PP, tetrodotoxin"}, 2206 | { "r-c-x-b-t-3", "Trichothecene"}, 2207 | { "r-c-x-b-s", "Simuants"}, 2208 | { "r-c-x-b-s-m", "MR, molasis residium"}, 2209 | { "r-c-x-b-s-g", "Bacillus globigii"}, 2210 | { "r-c-x-b-s-g-bg", "BG, Bacillus globigii"}, 2211 | { "r-c-x-b-s-g-bs", "BS, Bacillus globigii"}, 2212 | { "r-c-x-b-s-g-u", "U, Bacillus globigii"}, 2213 | { "r-c-x-b-s-s", "Serratia marescens"}, 2214 | { "r-c-x-b-s-s-s", "SM, Serratia marescens"}, 2215 | { "r-c-x-b-s-s-p", "P, Serratia marescens"}, 2216 | { "r-c-x-b-s-a", "AF, Aspergillus fumigatus mutant C-2"}, 2217 | { "r-c-x-b-s-e", "EC, E. coli"}, 2218 | { "r-c-x-b-s-t", "BT, Bacillus thursidius"}, 2219 | { "r-c-x-b-s-w", "EH, Erwinia hebicola"}, 2220 | { "r-c-x-b-s-f", "FP, fluorescent particle"}, 2221 | 2222 | }; 2223 | 2224 | public static string GetDescription(this Event e) 2225 | { 2226 | var t = e.Type; 2227 | if (t.StartsWith("a-")) 2228 | { 2229 | t = t.Remove(2, 1).Insert(2, "."); 2230 | } 2231 | if (t.StartsWith("b-g-") || t.StartsWith("b-r-")) 2232 | { 2233 | t = t.Remove(4, 1).Insert(4, "."); 2234 | } 2235 | 2236 | return CotDescriptionsMap.TryGetValue(t, out var value) ? value : "Unknown"; 2237 | } 2238 | } 2239 | } 2240 | --------------------------------------------------------------------------------