public override string ToString()
 {
     if (SignalName.StartsWith("$USS_"))
     {
         return(BaseUtils.FieldBuilder.Build("", USSTypeLocalised,
                                             "Threat Level:".T(EDTx.FSSSignal_ThreatLevel), ThreatLevel,
                                             "Faction:".T(EDTx.FSSSignal_Faction), SpawingFaction_Localised,
                                             ";Station".T(EDTx.FSSSignal_StationBool), IsStation,
                                             "State:".T(EDTx.FSSSignal_State), SpawingState_Localised
                                             ));
     }
     else
     {
         return(BaseUtils.FieldBuilder.Build("", SignalName_Localised,
                                             "USS Type:".T(EDTx.FSSSignal_USSType), USSTypeLocalised,
                                             "Threat Level:".T(EDTx.FSSSignal_ThreatLevel), ThreatLevel,
                                             "Faction:".T(EDTx.FSSSignal_Faction), SpawingFaction_Localised,
                                             ";Station".T(EDTx.FSSSignal_StationBool), IsStation,
                                             "State:".T(EDTx.FSSSignal_State), SpawingState_Localised
                                             ));
     }
 }
            const int CarrierExpiryTime = 10 * (60 * 60 * 24);              // days till we consider the carrier signal expired..

            public FSSSignal(JObject evt, System.DateTime EventTimeUTC)
            {
                SignalName = evt["SignalName"].Str();
                string loc = evt["SignalName_Localised"].Str();       // not present for stations/installations

                SignalName_Localised = loc.Alt(SignalName);           // don't mangle if no localisation, its prob not there because its a proper name

                SpawningState           = evt["SpawningState"].Str(); // USS only, checked
                SpawningState_Localised = JournalFieldNaming.CheckLocalisation(evt["SpawningState_Localised"].Str(), SpawningState);

                SpawningFaction           = evt["SpawningFaction"].Str(); // USS only, checked
                SpawningFaction_Localised = JournalFieldNaming.CheckLocalisation(evt["SpawningFaction_Localised"].Str(), SpawningFaction);

                USSType          = evt["USSType"].Str();            // USS Only, checked
                USSTypeLocalised = JournalFieldNaming.CheckLocalisation(evt["USSType_Localised"].Str(), USSType);

                ThreatLevel = evt["ThreatLevel"].IntNull();         // USS only, checked

                TimeRemaining = evt["TimeRemaining"].DoubleNull();  // USS only, checked

                SystemAddress = evt["SystemAddress"].LongNull();

                bool?isstation = evt["IsStation"].BoolNull();

                if (isstation == true)          // station flag
                {
                    int dash = SignalName.LastIndexOf('-');
                    if (SignalName.Length >= 5 && dash == SignalName.Length - 4 && char.IsLetterOrDigit(SignalName[dash + 1]) && char.IsLetterOrDigit(SignalName[dash - 1]))
                    {
                        ClassOfSignal = Classification.Carrier;
                        TimeRemaining = CarrierExpiryTime;
                    }
                    else
                    {
                        ClassOfSignal = Classification.Station;
                    }
                }
                else if (loc.Length == 0)       // other types, and old station entries, don't have localisation, so its an installation
                {
                    ClassOfSignal = Classification.Installation;
                }
                else if (SignalName.StartsWith("$USS", StringComparison.InvariantCultureIgnoreCase) || SignalName.StartsWith("$RANDOM", StringComparison.InvariantCultureIgnoreCase))
                {
                    ClassOfSignal = Classification.USS;
                }
                else if (SignalName.StartsWith("$Warzone", StringComparison.InvariantCultureIgnoreCase))
                {
                    ClassOfSignal = Classification.ConflictZone;
                }
                else if (SignalName.StartsWith("$Fixed_Event_Life", StringComparison.InvariantCultureIgnoreCase))
                {
                    ClassOfSignal = Classification.NotableStellarPhenomena;
                }
                else if (SignalName.StartsWith("$MULTIPLAYER_SCENARIO14", StringComparison.InvariantCultureIgnoreCase) || SignalName.StartsWith("$MULTIPLAYER_SCENARIO7", StringComparison.InvariantCultureIgnoreCase))
                {
                    ClassOfSignal = Classification.ResourceExtraction;
                }
                else
                {
                    ClassOfSignal = Classification.Other;
                }

                RecordedUTC = EventTimeUTC;

                if (TimeRemaining != null)
                {
                    ExpiryUTC   = EventTimeUTC.AddSeconds(TimeRemaining.Value);
                    ExpiryLocal = ExpiryUTC.ToLocalTime();
                }
            }