)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Axe (Ia.Ftn.Cl.Models.Business.Ericsson)

Public general use code classes and xml files that we've compiled and used over the years:

Ericsson AXE support class of Fixed Telecommunications Network (FTN) business model.

    1: using System;
    2: using System.Collections.Generic;
    3: using System.IO;
    4: using System.Linq;
    5: using System.Text.RegularExpressions;
    6:  
    7: namespace Ia.Ftn.Cl.Models.Business.Ericsson
    8: {
    9:     ////////////////////////////////////////////////////////////////////////////
   10:  
   11:     /// <summary publish="true">
   12:     /// Ericsson AXE support class of Fixed Telecommunications Network (FTN) business model.
   13:     /// </summary>
   14:     /// 
   15:     /// <remarks> 
   16:     /// Copyright © 2018-2025 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   17:     /// </remarks> 
   18:     public class Axe
   19:     {
   20:         private static List<string> properlySelectedAxeServiceList = new List<string>();
   21:         private static Queue<ProvisioningWorkflow> synchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>();
   22:         private static Queue<ProvisioningWorkflow> serviceSuspentionSynchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>();
   23:  
   24:         /// <summary/>
   25:         public enum Opcode {
   26:             /// <summary/>
   27:             Suscp,
   28:  
   29:             /// <summary/>
   30:             Sulie,
   31:  
   32:             /// <summary/>
   33:             SusccXxx,
   34:  
   35:             /// <summary/>
   36:             SusccTboTbi,
   37:  
   38:             /// <summary/>
   39:             SusccIcs,
   40:  
   41:             /// <summary/>
   42:             ConfirmCommandSemicolon,
   43:  
   44:             /// <summary/>
   45:             KeepAliveCommandSemicolon
   46:         }
   47:  
   48:         /// <summary/>
   49:         public class ProvisioningWorkflow
   50:         {
   51:             /// <summary/>
   52:             public Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn Pstn { get; set; }
   53:  
   54:             /// <summary/>
   55:             public string ReadCommand { get; set; }
   56:  
   57:             /// <summary/>
   58:             public string UpdateCommand { get; set; }
   59:  
   60:             /// <summary/>
   61:             public string DeleteCommand { get; set; }
   62:  
   63:             /// <summary/>
   64:             public string ServiceSuspensionCommand { get; set; }
   65:  
   66:             /// <summary/>
   67:             public string ExecuteSemicolon { get; set; }
   68:  
   69:             /// <summary/>
   70:             public ProvisioningWorkflow()
   71:             {
   72:  
   73:             }
   74:         }
   75:  
   76:         /// <summary/>
   77:         public static string Host(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn)
   78:         {
   79:             string host;
   80:  
   81:             switch (pstn.Name)
   82:             {
   83:                 case "MSF": host = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeMsfEricssonServerHost"); break;
   84:                 case "SLMA": host = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeSlmaEricssonServerHost"); break;
   85:                 default: host = string.Empty; break;
   86:             }
   87:  
   88:             return host;
   89:         }
   90:  
   91:         /// <summary/>
   92:         public static int Port { get { return 23; } } // 23 telnet port
   93:  
   94:         /// <summary/>
   95:         public static string UserName(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn)
   96:         {
   97:             string userName;
   98:  
   99:             switch (pstn.Name)
  100:             {
  101:                 case "MSF": userName = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeMsfEricssonServerUserName"); break;
  102:                 case "SLMA": userName = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeSlmaEricssonServerUserName"); break;
  103:                 default: userName = string.Empty; break;
  104:             }
  105:  
  106:             return userName;
  107:         }
  108:  
  109:         /// <summary/>
  110:         public static string Password(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn)
  111:         {
  112:             string password;
  113:  
  114:             switch (pstn.Name)
  115:             {
  116:                 case "MSF": password = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeMsfEricssonServerPassword"); break;
  117:                 case "SLMA": password = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeSlmaEricssonServerPassword"); break;
  118:                 default: password = string.Empty; break;
  119:             }
  120:  
  121:             return password;
  122:         }
  123:  
  124:         /// <summary/>
  125:         public static string LogoutCommand { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeEricssonServerLogoutCommand"); } }
  126:  
  127:         /// <summary/>
  128:         public static List<string> ServiceSymbolList { get; } = new List<string>();
  129:  
  130:         ////////////////////////////////////////////////////////////////////////////
  131:  
  132:         /// <summary>
  133:         /// Response of Ericsson AXE
  134:         /// </summary>
  135:         public class Response
  136:         {
  137:             /// <summary/>
  138:             public int Service { get; set; }
  139:  
  140:             /// <summary/>
  141:             public bool IsSuccess { get { return ReturnCode == Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Successful; } }
  142:  
  143:             /// <summary/>
  144:             public bool IsProvisioned { get; set; }
  145:  
  146:             /// <summary/>
  147:             public Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode ReturnCode { get; set; }
  148:  
  149:             /// <summary/>
  150:             //public string Ctag { get; set; } // no need because the commad string is included in response body
  151:  
  152:             /// <summary/>
  153:             public DateTime DateTime { get; set; }
  154:  
  155:             /// <summary/>
  156:             public string CommandString { get; set; }
  157:  
  158:             /// <summary/>
  159:             public int Snb { get; set; }
  160:  
  161:             /// <summary/>
  162:             public string Dev { get; set; }
  163:  
  164:             /// <summary/>
  165:             public string Dety { get; set; }
  166:  
  167:             /// <summary/>
  168:             public string Sut { get; set; }
  169:  
  170:             /// <summary/>
  171:             public string Scl { get; set; }
  172:  
  173:             /// <summary/>
  174:             public string Mis { get; set; }
  175:  
  176:             /// <summary/>
  177:             public string Cos { get; set; }
  178:  
  179:             /// <summary/>
  180:             public string Content { get; set; }
  181:  
  182:             /// <summary/>
  183:             //public Dictionary<string, string> QueryDictionary { get; set; }
  184:  
  185:             /// <summary/>
  186:             public Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService ServiceSupplementaryService { get; set; }
  187:  
  188:             ////////////////////////////////////////////////////////////////////////////
  189:  
  190:             /// <summary>
  191:             ///
  192:             /// </summary>
  193:             public Response(string content)
  194:             {
  195:                 string service;
  196:                 Match match;
  197:                 Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService serviceSupplementaryService;
  198:                 Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode returnCode;
  199:  
  200:                 if (content.Contains("GENERAL AVAILABILITY FOR SUPPLEMENTARY SERVICES SUBSCRIBER CATEGORIES")) // result of SULIE
  201:                 {
  202:                     /*
  203:         SUBSCRIBER DATA
  204:         SNB        DEV            DETY    SUT SCL         MIS             COS
  205:         25381611   LIMA-18146
  206:         GENERAL AVAILABILITY FOR SUPPLEMENTARY SERVICES SUBSCRIBER CATEGORIES
  207: 
  208:         SCL
  209:         ALS-1
  210: 
  211:         SUBSCRIBER METER DATA
  212:         SNB        UCMS    CMV1                                MISC
  213:         25381611   1       0
  214:                            SUB1     SUB2     SUB3     SUB4
  215:                            0        0        0        0
  216:         END
  217:                      */
  218:  
  219:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Successful;
  220:                 }
  221:                 else if (content.StartsWith("SUBSCRIBER DATA") && content.EndsWith("END")) // order important
  222:                 {
  223:                     /*
  224:         SUBSCRIBER DATA
  225:         SNB        DEV            DETY    SUT SCL         MIS             COS
  226:         25382234   LIMA-634                   CCB-1
  227: 
  228:         END
  229: 
  230: 
  231:         SUBSCRIBER DATA
  232:         SNB        DEV            DETY    SUT SCL         MIS             COS
  233:         25387526                          NC
  234:         END
  235: 
  236: 
  237:         SUBSCRIBER DATA
  238:         SNB        DEV            DETY    SUT SCL         MIS             COS
  239:         25381111                          PB  IPT-2
  240:                                               ANT-2
  241:                                               CBA-2
  242: 
  243:         END
  244:                      */
  245:                     match = Regex.Match(content, @"\r\n(\d{8})\s+");
  246:  
  247:                     if (match.Success)
  248:                     {
  249:                         service = match.Groups[1].Value;
  250:  
  251:                         this.CommandString = @"SUSCP:SNB=" + service + ";";
  252:  
  253:                         this.Service = int.Parse(service);
  254:  
  255:                         if (content.Contains("            NC"))
  256:                         {
  257:                             this.IsProvisioned = false;
  258:                         }
  259:                         else
  260:                         {
  261:                             serviceSupplementaryService = Ia.Ftn.Cl.Models.Business.Ericsson.Axe.ServiceSupplementaryServiceStateFromServiceNetManagerOutputString(content);
  262:  
  263:                             this.IsProvisioned = true;
  264:                             this.ServiceSupplementaryService = serviceSupplementaryService;
  265:                         }
  266:  
  267:                         returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Successful;
  268:                     }
  269:                     else
  270:                     {
  271:                         returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Failed;
  272:                     }
  273:                 }
  274:                 else if (content.Contains("EXECUTED"))
  275:                 {
  276:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Successful;
  277:                 }
  278:                 else if (content.Contains("NOT ACCEPTED") && content.Contains("UNREASONABLE VALUE"))
  279:                 {
  280:                     /*
  281:     <SUSCP:SNB=25612222;
  282:     NOT ACCEPTED
  283:     UNREASONABLE VALUE
  284:     (0)SNB=25612222
  285:                      */
  286:                     match = Regex.Match(content, @"SNB=(\d{8})");
  287:  
  288:                     if (match.Success)
  289:                     {
  290:                         service = match.Groups[1].Value;
  291:  
  292:                         this.CommandString = @"SUSCP:SNB=" + service + ";";
  293:  
  294:                         this.Service = int.Parse(service);
  295:                         this.IsProvisioned = false;
  296:  
  297:                         returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.NotAcceptedUnreasonableValue;
  298:                     }
  299:                     else
  300:                     {
  301:                         returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Failed;
  302:                     }
  303:                 }
  304:                 else if (content.Contains("NOT ACCEPTED") && content.Contains("SUBSCRIBER NOT CONNECTED"))
  305:                 {
  306:                     /*
  307: <SULIE:SNB=25384651;
  308:  SULIE:SNB=25384651;
  309: <;
  310: NOT ACCEPTED
  311: FAULT CODE 41
  312: SUBSCRIBER NOT CONNECTED
  313: (0)SNB=25384651
  314:                      */
  315:  
  316:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.SubscriberNotConnected;
  317:                 }
  318:                 else if (content.Contains("NOT ACCEPTED") && content.Contains("COMMAND UNKNOWN"))
  319:                 {
  320:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.NotAcceptedCommandUnknown;
  321:                 }
  322:                 else if (content.Contains("TIME OUT"))
  323:                 {
  324:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.TimeOut;
  325:                 }
  326:                 else
  327:                 {
  328:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.UnknownError;
  329:                 }
  330:  
  331:                 this.ReturnCode = returnCode;
  332:                 this.Content = content;
  333:                 this.ParseSuscp(content, out int snb, out string dev, out string dety, out string sut, out string scl, out string mis, out string cos);
  334:                 this.Snb = snb;
  335:                 this.Dev = dev;
  336:                 this.Dety = dety;
  337:                 this.Sut = sut;
  338:                 this.Scl = scl;
  339:                 this.Mis = mis;
  340:                 this.Cos = cos;
  341:             }
  342:  
  343:             ////////////////////////////////////////////////////////////////////////////
  344:  
  345:             /// <summary>
  346:             ///
  347:             /// </summary>
  348:             private void ParseSuscp(string suscpOutputContent, out int snb, out string dev, out string dety, out string sut, out string scl, out string mis, out string cos)
  349:             {
  350:                 using (StringReader stringReader = new StringReader(suscpOutputContent))
  351:                 {
  352:                     bool startReadingSnbInformationFlag;
  353:                     int snbIndex, devIndex, detyIndex, sutIndex, sclIndex, misIndex, cosIndex;
  354:                     string s, line;
  355:                     List<string> snbList, devList, detyList, sutList, sclList, misList, cosList;
  356:  
  357:                     startReadingSnbInformationFlag = false;
  358:                     snbIndex = devIndex = detyIndex = sutIndex = sclIndex = misIndex = cosIndex = -1;
  359:                     snb = -1;
  360:                     dev = dety = sut = scl = mis = cos = string.Empty;
  361:  
  362:                     snbList = new List<string>();
  363:                     devList = new List<string>();
  364:                     detyList = new List<string>();
  365:                     sutList = new List<string>();
  366:                     sclList = new List<string>();
  367:                     misList = new List<string>();
  368:                     cosList = new List<string>();
  369:  
  370:                     while ((line = stringReader.ReadLine()) != null)
  371:                     {
  372:                         if (!string.IsNullOrWhiteSpace(line))
  373:                         {
  374:                             if (line.StartsWith("SUBSCRIBER DATA") || line.StartsWith("END") || line.StartsWith("GENERAL AVAILABILITY"))
  375:                             {
  376:                                 startReadingSnbInformationFlag = false;
  377:                             }
  378:                             else if (line.StartsWith("SNB") && line.Contains("DEV"))
  379:                             {
  380:                                 snbIndex = 0; // line.IndexOf("SNB");
  381:                                 devIndex = line.IndexOf("DEV");
  382:                                 detyIndex = line.IndexOf("DETY");
  383:                                 sutIndex = line.IndexOf("SUT");
  384:                                 sclIndex = line.IndexOf("SCL");
  385:                                 misIndex = line.IndexOf("MIS");
  386:                                 cosIndex = line.IndexOf("COS");
  387:  
  388:                                 startReadingSnbInformationFlag = true;
  389:                             }
  390:                             else if (startReadingSnbInformationFlag)
  391:                             {
  392:                                 line = line.PadRight(cosIndex + 3, ' '); // 3 for the string COS
  393:  
  394:                                 s = line.Substring(snbIndex, devIndex - snbIndex).Trim();
  395:                                 if (!string.IsNullOrEmpty(s)) snbList.Add(s);
  396:  
  397:                                 s = line.Substring(devIndex, detyIndex - devIndex).Trim();
  398:                                 if (!string.IsNullOrEmpty(s)) devList.Add(s);
  399:  
  400:                                 s = line.Substring(detyIndex, sutIndex - detyIndex).Trim();
  401:                                 if (!string.IsNullOrEmpty(s)) detyList.Add(s);
  402:  
  403:                                 s = line.Substring(sutIndex, sclIndex - sutIndex).Trim();
  404:                                 if (!string.IsNullOrEmpty(s)) sutList.Add(s);
  405:  
  406:                                 s = line.Substring(sclIndex, misIndex - sclIndex).Trim();
  407:                                 if (!string.IsNullOrEmpty(s)) sclList.Add(s);
  408:  
  409:                                 s = line.Substring(misIndex, cosIndex - misIndex).Trim();
  410:                                 if (!string.IsNullOrEmpty(s)) misList.Add(s);
  411:  
  412:                                 s = line.Substring(cosIndex, line.Length - cosIndex).Trim();
  413:                                 if (!string.IsNullOrEmpty(s)) cosList.Add(s);
  414:  
  415:                                 snb = int.Parse(string.Join(",", snbList));
  416:                                 dev = string.Join(",", devList);
  417:                                 dety = string.Join(",", detyList);
  418:                                 sut = string.Join(",", sutList);
  419:                                 scl = string.Join(",", sclList);
  420:                                 mis = string.Join(",", misList);
  421:                                 cos = string.Join(",", cosList);
  422:                             }
  423:                             else
  424:                             {
  425:  
  426:                             }
  427:                         }
  428:                         else
  429:                         {
  430:  
  431:                         }
  432:                     }
  433:                 }
  434:             }
  435:  
  436:             ////////////////////////////////////////////////////////////////////////////
  437:             ////////////////////////////////////////////////////////////////////////////
  438:         }
  439:  
  440:         ////////////////////////////////////////////////////////////////////////////
  441:  
  442:         /// <summary>
  443:         ///
  444:         /// </summary>
  445:         public Axe() { }
  446:  
  447:         ////////////////////////////////////////////////////////////////////////////
  448:  
  449:         /// <summary>
  450:         ///
  451:         /// </summary>
  452:         public static string ProperlySelectedSingleServiceQueueServiceNumber(ref int referenceIndex, List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn> pstnList, out int itemIndex, out int listCount)
  453:         {
  454:             string service;
  455:  
  456:             if (properlySelectedAxeServiceList.JustStartedOrRolledOver())
  457:             {
  458:                 properlySelectedAxeServiceList = AllPossibleServiceNumbersPreferablyNotInAxeSubscriberWithinPstn(pstnList).ToList();
  459:  
  460:                 // Sort the strings by their reversed characters
  461:                 // https://www.codingame.com/playgrounds/213/using-c-linq---a-practical-overview/reverse-and-orderby
  462:  
  463:                 properlySelectedAxeServiceList = properlySelectedAxeServiceList.OrderBy(str => new string(str.Reverse().ToArray())).ToList();
  464:             }
  465:  
  466:             service = properlySelectedAxeServiceList.Next(ref referenceIndex, out itemIndex, out listCount);
  467:  
  468:             return service;
  469:         }
  470:  
  471:         ////////////////////////////////////////////////////////////////////////////
  472:  
  473:         /// <summary>
  474:         ///
  475:         /// </summary>
  476:         public static List<string> AllPossibleServiceNumbersPreferablyNotInAxeSubscriberWithinPstn(List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn> pstnList)
  477:         {
  478:             var allPossibleServiceNumbersWithinPstn = new List<int>();
  479:  
  480:             foreach (var pstn in pstnList)
  481:             {
  482:                 allPossibleServiceNumbersWithinPstn.AddRange(Ia.Ftn.Cl.Models.Data.Service.AllPossibleServiceNumbersWithinPstn(pstn.Name));
  483:             }
  484:  
  485:             var snbList = Ia.Ftn.Cl.Models.Data.Ericsson.Subscriber.SnbList();
  486:  
  487:             var list = allPossibleServiceNumbersWithinPstn.Except(snbList).ToList();
  488:  
  489:             // if list is empty then will use the all list
  490:             if (list.Count == 0) list = allPossibleServiceNumbersWithinPstn;
  491:  
  492:             var servicelist = list.ConvertAll<string>(u => u.ToString());
  493:  
  494:             var hashSet = new HashSet<string>(servicelist);
  495:  
  496:             return hashSet.ToList();
  497:         }
  498:  
  499:         ////////////////////////////////////////////////////////////////////////////
  500:  
  501:         /// <summary>
  502:         ///
  503:         /// </summary>
  504:         public static ProvisioningWorkflow SynchronizeAxeServiceIcsxRouteToMatchImsServiceRouterVendorProvisioningWorkflowItem(Ia.Ftn.Cl.Models.Business.Default.Procedure procedure)
  505:         {
  506:             ProvisioningWorkflow provisioningWorkflow;
  507:             List<ProvisioningWorkflow> list;
  508:  
  509:             provisioningWorkflow = null;
  510:  
  511:             if (synchronizationProvisioningWorkflowQueue.Count == 0 && procedure == Ia.Ftn.Cl.Models.Business.Default.Procedure.InitializeOrIterate)
  512:             {
  513:                 list = Ia.Ftn.Cl.Models.Business.Ericsson.Axe.DeleteAndUpdateAndReadCommandToSynchronizeAxeServiceIcsxRouteToMatchImsServiceRouterVendorProvisioningWorkflowList();
  514:  
  515:                 synchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>(list); // don't shuffle because a modify command is followed by a read .Shuffle());
  516:             }
  517:  
  518:             if (synchronizationProvisioningWorkflowQueue.Count > 0) provisioningWorkflow = synchronizationProvisioningWorkflowQueue.Dequeue();
  519:  
  520:             return provisioningWorkflow;
  521:         }
  522:  
  523:         ////////////////////////////////////////////////////////////////////////////
  524:  
  525:         /// <summary>
  526:         ///
  527:         /// </summary>
  528:         public static List<ProvisioningWorkflow> DeleteAndUpdateAndReadCommandToSynchronizeAxeServiceIcsxRouteToMatchImsServiceRouterVendorProvisioningWorkflowList()
  529:         {
  530:             int icsxRoute;
  531:             string service;
  532:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor vendor;
  533:             Ia.Ftn.Cl.Models.Business.Default.SwitchRoute pstnSwitchRoute, switchRouteToMigratedRouterVendor;
  534:             ProvisioningWorkflow provisioningWorkflow;
  535:             List<ProvisioningWorkflow> provisioningWorkflowList;
  536:  
  537:             provisioningWorkflowList = new List<ProvisioningWorkflow>();
  538:  
  539:             var imsServiceToOntRouterVendorInAllowedToBeMigratedOltDictionary = Ia.Ftn.Cl.Models.Data.Service.ImsServiceToOntRouterVendorInAllowedToBeMigratedOltDictionary;
  540:  
  541:             var axeServiceToSwitchRouteDictionary = Ia.Ftn.Cl.Models.Data.Ericsson.Subscriber.PstnServiceToSwitchRouteDictionary();
  542:  
  543:             // will exclude exempt numbers
  544:             var serviceExemptionList = Ia.Ftn.Cl.Models.Data.Provision.ServiceOfServiceExemptFromProvisionProcessingList();
  545:  
  546:             foreach (KeyValuePair<string, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor> kvp in imsServiceToOntRouterVendorInAllowedToBeMigratedOltDictionary)
  547:             {
  548:                 service = kvp.Key;
  549:                 vendor = kvp.Value;
  550:  
  551:                 if (axeServiceToSwitchRouteDictionary.ContainsKey(service))
  552:                 {
  553:                     pstnSwitchRoute = axeServiceToSwitchRouteDictionary[service];
  554:  
  555:                     if (vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia) switchRouteToMigratedRouterVendor = Ia.Ftn.Cl.Models.Business.Default.SwitchRoute.NokiaIms;
  556:                     else if (vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Huawei) switchRouteToMigratedRouterVendor = Ia.Ftn.Cl.Models.Business.Default.SwitchRoute.HuaweiIms;
  557:                     else switchRouteToMigratedRouterVendor = Ia.Ftn.Cl.Models.Business.Default.SwitchRoute.Unknown;
  558:  
  559:                     if (pstnSwitchRoute != switchRouteToMigratedRouterVendor && switchRouteToMigratedRouterVendor != Ia.Ftn.Cl.Models.Business.Default.SwitchRoute.Unknown)
  560:                     {
  561:                         if (!serviceExemptionList.Contains(service))
  562:                         {
  563:                             provisioningWorkflow = new ProvisioningWorkflow();
  564:  
  565:                             icsxRoute = Ia.Ftn.Cl.Models.Business.Ericsson.Subscriber.SwitchRouteToIcsxRoute(switchRouteToMigratedRouterVendor);
  566:  
  567:                             provisioningWorkflow.Pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  568:  
  569:                             provisioningWorkflow.ExecuteSemicolon = ConfirmCommandSemicolon();
  570:  
  571:                             provisioningWorkflow.DeleteCommand = DeleteServiceCommand(service);
  572:                             provisioningWorkflow.UpdateCommand = UpdateServiceRouteCommand(service, icsxRoute);
  573:                             provisioningWorkflow.ReadCommand = ReadServiceCommand(service);
  574:  
  575:                             provisioningWorkflowList.Add(provisioningWorkflow);
  576:                         }
  577:                     }
  578:                 }
  579:             }
  580:  
  581:             return provisioningWorkflowList;
  582:         }
  583:  
  584:         ////////////////////////////////////////////////////////////////////////////
  585:  
  586:         /// <summary>
  587:         ///
  588:         /// </summary>
  589:         public static ProvisioningWorkflow SynchronizeBetweenServiceRequestAdministrativeIssueAndEricssonAxePstnServiceProvisioningWorkflowItem()
  590:         {
  591:             ProvisioningWorkflow provisioningWorkflow;
  592:             List<ProvisioningWorkflow> list;
  593:  
  594:             provisioningWorkflow = null;
  595:  
  596:             if (serviceSuspentionSynchronizationProvisioningWorkflowQueue.Count == 0)
  597:             {
  598:                 list = Ia.Ftn.Cl.Models.Business.Ericsson.Axe.ServiceSuspentionAndReadCommandSynchronizeBetweenServiceRequestAdministrativeIssueAndEricssonAxePstnServiceProvisioningWorkflowList();
  599:  
  600:                 serviceSuspentionSynchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>(list); // don't shuffle because a modify command is followed by a read .Shuffle());
  601:             }
  602:  
  603:             if (serviceSuspentionSynchronizationProvisioningWorkflowQueue.Count > 0) provisioningWorkflow = serviceSuspentionSynchronizationProvisioningWorkflowQueue.Dequeue();
  604:  
  605:             return provisioningWorkflow;
  606:         }
  607:  
  608:         ////////////////////////////////////////////////////////////////////////////
  609:  
  610:         /// <summary>
  611:         ///
  612:         /// </summary>
  613:         public static List<ProvisioningWorkflow> ServiceSuspentionAndReadCommandSynchronizeBetweenServiceRequestAdministrativeIssueAndEricssonAxePstnServiceProvisioningWorkflowList()
  614:         {
  615:             bool state;
  616:             ProvisioningWorkflow provisioningWorkflow;
  617:             List<ProvisioningWorkflow> provisioningWorkflowList;
  618:  
  619:             provisioningWorkflowList = new List<ProvisioningWorkflow>();
  620:  
  621:             Ia.Ftn.Cl.Models.Data.Provision.EricssonAxePstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out _, out _);
  622:  
  623:             // will exclude exempt numbers
  624:             var serviceExemptionList = Ia.Ftn.Cl.Models.Data.Provision.ServiceOfServiceExemptFromProvisionProcessingList();
  625:  
  626:             state = true;
  627:  
  628:             foreach (var service in serviceToSuspendList)
  629:             {
  630:                 if (!serviceExemptionList.Contains(service))
  631:                 {
  632:                     provisioningWorkflow = new ProvisioningWorkflow();
  633:  
  634:                     provisioningWorkflow.Pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  635:  
  636:                     provisioningWorkflow.ExecuteSemicolon = ConfirmCommandSemicolon();
  637:  
  638:                     provisioningWorkflow.ServiceSuspensionCommand = ServiceSuspensionCommand(service, state);
  639:  
  640:                     provisioningWorkflow.ReadCommand = ReadServiceCommand(service);
  641:  
  642:                     provisioningWorkflowList.Add(provisioningWorkflow);
  643:                 }
  644:             }
  645:  
  646:  
  647:             state = false;
  648:  
  649:             foreach (var service in serviceToReleaseList)
  650:             {
  651:                 if (!serviceExemptionList.Contains(service))
  652:                 {
  653:                     provisioningWorkflow = new ProvisioningWorkflow();
  654:  
  655:                     provisioningWorkflow.Pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  656:  
  657:                     provisioningWorkflow.ExecuteSemicolon = ConfirmCommandSemicolon();
  658:  
  659:                     provisioningWorkflow.ServiceSuspensionCommand = ServiceSuspensionCommand(service, state);
  660:  
  661:                     provisioningWorkflow.ReadCommand = ReadServiceCommand(service);
  662:  
  663:                     provisioningWorkflowList.Add(provisioningWorkflow);
  664:                 }
  665:             }
  666:  
  667:             return provisioningWorkflowList;
  668:         }
  669:  
  670:         ////////////////////////////////////////////////////////////////////////////
  671:  
  672:         /// <summary>
  673:         /// 
  674:         /// </summary>
  675:         public static Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService ServiceSupplementaryServiceStateFromServiceNetManagerOutputString(string content)
  676:         {
  677:             string service;
  678:             Match match;
  679:             Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService serviceSupplementaryService;
  680:  
  681:             serviceSupplementaryService = new Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService();
  682:  
  683:             /*
  684:     SUBSCRIBER DATA
  685:     SNB        DEV            DETY    SUT SCL         MIS             COS
  686:     25382234   LIMA-634                   CCB-1
  687: 
  688:     END
  689: 
  690:     SUBSCRIBER DATA
  691:     SNB        DEV            DETY    SUT SCL         MIS             COS
  692:     25381111                          PB  IPT-2
  693:                                       ANT-2
  694:                                       CBA-2
  695: 
  696:     END
  697:              */
  698:  
  699:  
  700:             /*
  701:     2019-12-29 07:58:44: ServiceSymbolList: Service symbol list: CBA-2, IPT-2, ANT-2, FLA-2, GUG-5, CAW-1, ENQ-2, CCB-1, CDP-1, CBA-1, CFUF-1, IPT-3, APT-2, CFUV-1,
  702:     CBP-1, CCB-2, FLA-1, ENQ-1, CBB-1, CBA-9, TCL-9, CBA-3, GUG-2, TBO-2, TBI-1, ICS-3, FDC-1, LNR-1, CBA-15, TBO-1, CBA-7, BIC-1, FDC-2, CBA-10, MCIDSC-1, ADI-2,
  703:     LIBAMA-14, OCG-1, TLI-14, BAT-1, GUG-0, GUG-3, BOC-1
  704:              */
  705:  
  706:             /*
  707:     Unknown: IPT-2, CDP-1, APT-2, ENQ-1, CBP-1, CBB-1, CBA-7, CBA-15, CBA-1, CBA-9, TCL-9, CBA-10, FDC-1, CCB-2, FLA-1, CBA-3, OCG-1, TLI-14, BAT-1, FDC-2, LIBAMA-14, MCIDSC-1, LNR-1, GUG-2, GUG-0, GUG-3
  708: 
  709:     IPT-3,ANT-2    CallerId
  710:     CFUF-1,CFUV-1    CallForwarding
  711:     CAW-1,FLA-2    CallWaiting
  712:     ENQ-2,FLA-2    ConferenceCall
  713:     GUG-5    WakeupCall
  714:     ADI-2    AbbriviatedCalling
  715:     CCB-1    InternationalCallingUserControlled
  716:     CBA-2    InternationalCalling
  717:     TBO-1,TBI-1    ServiceSuspension
  718:     TBO-2,TBI-1    ServiceSuspension due to ServiceAdministrativelySuspendedByBillingDepartment
  719:     BIC-1,BOC-1    ServiceSuspension due to ServiceAdministrativelySuspendedForOtherReasons
  720:     BIC-1    ServiceSuspension
  721:     BOC-1    ServiceSuspension
  722: 
  723:              */
  724:             match = Regex.Match(content, @"\r\n(\d{8})\s+");
  725:  
  726:             if (match.Success)
  727:             {
  728:                 service = match.Groups[1].Value;
  729:  
  730:                 if (int.TryParse(service, out int snb))
  731:                 {
  732:                     serviceSupplementaryService.Service = snb;
  733:  
  734:                     if (content.Contains("IPT-3") && content.Contains("ANT-2") /*&& outputContent.Contains("APT-2")*/) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallerId);
  735:                     if (/*outputContent.Contains("CDP-1") &&*/ content.Contains("CFUF-1") && content.Contains("CFUV-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallForwarding);
  736:                     //if (outputContent.Contains("OCG-1") && outputContent.Contains("TLI-14")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.MagneticCart);
  737:                     //if (outputContent.Contains("FLA-2") && outputContent.Contains("MCIDSC-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.CallMonitoring);
  738:                     if (content.Contains("CAW-1") && content.Contains("FLA-2")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallWaiting);
  739:                     if (content.Contains("ENQ-2") && content.Contains("FLA-2")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ConferenceCall);
  740:                     if (content.Contains("GUG-5")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.WakeupCall);
  741:                     if (content.Contains("ADI-2")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.AbbriviatedCalling);
  742:                     if (content.Contains("CCB-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCallingUserControlled);
  743:                     if (content.Contains("CBA-2")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCalling);
  744:  
  745:                     //if (outputContent.Contains("FDC-1") && outputContent.Contains("LNR-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.OneWayHotoutputContent);
  746:                     //if (outputContent.Contains("FDC-2") && outputContent.Contains("LNR-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.TwoWayHotoutputContent);
  747:  
  748:                     //if (outputContent.Contains("SSI-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.???);
  749:  
  750:                     if (content.Contains("TBO-1") && content.Contains("TBI-1"))
  751:                     {
  752:                         //serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.ManualBillingDisconnect);
  753:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  754:                     }
  755:  
  756:                     if (content.Contains("TBO-2") && content.Contains("TBI-1"))
  757:                     {
  758:                         serviceSupplementaryService.ServiceAdministrativelySuspendedByBillingDepartment = true;
  759:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  760:                     }
  761:  
  762:                     if (content.Contains("BIC-1") && content.Contains("BOC-1"))
  763:                     {
  764:                         serviceSupplementaryService.ServiceAdministrativelySuspendedForOtherReasons = true;
  765:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  766:                     }
  767:                     else if (content.Contains("BIC-1"))
  768:                     {
  769:                         //serviceSupplementaryService.IncomingDisconnect = true;
  770:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  771:                     }
  772:                     else if (content.Contains("BOC-1"))
  773:                     {
  774:                         //serviceSupplementaryService.OutgoingDisconnect = true;
  775:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  776:                     }
  777:  
  778:                     if (content.Contains("PB")) serviceSupplementaryService.IsPbx = true;
  779:  
  780:                     Ia.Ftn.Cl.Models.Business.Ericsson.Axe.ExtractAndUpdateUniqueAxeServiceSymbolListFromOutputContent(content);
  781:                 }
  782:                 else
  783:                 {
  784:                 }
  785:             }
  786:             else
  787:             {
  788:             }
  789:  
  790:             return serviceSupplementaryService;
  791:         }
  792:  
  793:         ////////////////////////////////////////////////////////////////////////////
  794:         ////////////////////////////////////////////////////////////////////////////
  795:  
  796:         /// <summary>
  797:         ///
  798:         /// </summary>
  799:         public static string ReadServiceCommand(string service)
  800:         {
  801:             return AxeCommand(Opcode.Suscp, int.Parse(service));
  802:         }
  803:  
  804:         ////////////////////////////////////////////////////////////////////////////
  805:  
  806:         /// <summary>
  807:         ///
  808:         /// </summary>
  809:         public static string DeleteServiceCommand(string service)
  810:         {
  811:             return AxeCommand(Opcode.Sulie, int.Parse(service));
  812:         }
  813:  
  814:         ////////////////////////////////////////////////////////////////////////////
  815:  
  816:         /// <summary>
  817:         ///
  818:         /// </summary>
  819:         public static string UpdateSupplementaryServiceCommand(string service, Ia.Ftn.Cl.Models.Business.Service.SupplementaryService supplementaryService, bool supplementaryServiceState)
  820:         {
  821:             int snb;
  822:             string command;
  823:  
  824:             snb = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Number(service);
  825:  
  826:             switch (supplementaryService)
  827:             {
  828:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.AbbriviatedCalling):
  829:                     {
  830:                         command = AxeCommand(Opcode.SusccXxx, snb);
  831:                         break;
  832:                     }
  833:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallerId):
  834:                     {
  835:                         command = AxeCommand(Opcode.SusccXxx, snb);
  836:                         break;
  837:                     }
  838:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallForwarding):
  839:                     {
  840:                         command = AxeCommand(Opcode.SusccXxx, snb);
  841:                         break;
  842:                     }
  843:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallWaiting):
  844:                     {
  845:                         command = AxeCommand(Opcode.SusccXxx, snb);
  846:                         break;
  847:                     }
  848:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ConferenceCall):
  849:                     {
  850:                         command = AxeCommand(Opcode.SusccXxx, snb);
  851:                         break;
  852:                     }
  853:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.WakeupCall):
  854:                     {
  855:                         command = AxeCommand(Opcode.SusccXxx, snb);
  856:                         break;
  857:                     }
  858:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCallingUserControlled):
  859:                     {
  860:                         command = AxeCommand(Opcode.SusccXxx, snb);
  861:                         break;
  862:                     }
  863:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCalling):
  864:                     {
  865:                         command = AxeCommand(Opcode.SusccXxx, snb);
  866:                         break;
  867:                     }
  868:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension):
  869:                     {
  870:                         command = AxeCommand(Opcode.SusccXxx, snb);
  871:                         break;
  872:                     }
  873:                 default:
  874:                     {
  875:                         command = snb + ",unknown SupplementaryService: " + supplementaryServiceState.ToString().ToLower();
  876:                         break;
  877:                     }
  878:             }
  879:  
  880:             return command;
  881:         }
  882:  
  883:         ////////////////////////////////////////////////////////////////////////////
  884:  
  885:         /// <summary>
  886:         ///
  887:         /// </summary>
  888:         public static string UpdateServiceRouteCommand(string service, int ics)
  889:         {
  890:             var snb = int.Parse(service);
  891:  
  892:             return AxeCommand(Opcode.SusccIcs, snb, ics);
  893:         }
  894:  
  895:         ////////////////////////////////////////////////////////////////////////////
  896:  
  897:         /// <summary>
  898:         ///
  899:         /// </summary>
  900:         public static string ServiceSuspensionCommand(string service, bool serviceSuspensionState)
  901:         {
  902:             string command;
  903:  
  904:             var snb = int.Parse(service);
  905:  
  906:             if (serviceSuspensionState) command = AxeCommand(Opcode.SusccTboTbi, snb, 2, 1); // suspend
  907:             else command = AxeCommand(Opcode.SusccTboTbi, snb, 0, 0); // release
  908:  
  909:             return command;
  910:         }
  911:  
  912:         ////////////////////////////////////////////////////////////////////////////
  913:  
  914:         /// <summary>
  915:         ///
  916:         /// </summary>
  917:         public static string ConfirmCommandSemicolon()
  918:         {
  919:             return AxeCommand(Opcode.ConfirmCommandSemicolon);
  920:         }
  921:  
  922:         ////////////////////////////////////////////////////////////////////////////
  923:  
  924:         /// <summary>
  925:         ///
  926:         /// </summary>
  927:         public static string KeepAliveCommandSemicolon()
  928:         {
  929:             return AxeCommand(Opcode.KeepAliveCommandSemicolon);
  930:         }
  931:  
  932:         ////////////////////////////////////////////////////////////////////////////
  933:         ////////////////////////////////////////////////////////////////////////////
  934:  
  935:         /// <summary>
  936:         ///
  937:         /// </summary>
  938:         private static string AxeCommand(Opcode opcode)
  939:         {
  940:             string command;
  941:  
  942:             if (opcode == Opcode.ConfirmCommandSemicolon) command = ";";
  943:             else if (opcode == Opcode.KeepAliveCommandSemicolon) command = ";";
  944:             else throw new System.ArgumentOutOfRangeException("AxeCommand(): Opcode unrecognized. ");
  945:  
  946:             return command;
  947:         }
  948:  
  949:         ////////////////////////////////////////////////////////////////////////////
  950:  
  951:         /// <summary>
  952:         ///
  953:         /// </summary>
  954:         private static string AxeCommand(Opcode opcode, int snb)
  955:         {
  956:             string command;
  957:  
  958:             if (opcode == Opcode.Suscp) command = "SUSCP:SNB=" + snb + ";";
  959:             else if (opcode == Opcode.Sulie) command = "SULIE:SNB=" + snb + ";"; // SULIE must be followed with semicolon';'
  960:             else if (opcode == Opcode.SusccXxx) command = "SUSCC:SNB=" + snb + ",SCL=Xxx;"; // SUSCC must be followed with semicolon';'
  961:             else throw new System.ArgumentOutOfRangeException("AxeCommand(): Opcode unrecognized. ");
  962:  
  963:             return command;
  964:         }
  965:  
  966:         ////////////////////////////////////////////////////////////////////////////
  967:  
  968:         /// <summary>
  969:         ///
  970:         /// </summary>
  971:         private static string AxeCommand(Opcode opcode, int snb, int parameter)
  972:         {
  973:             string command;
  974:  
  975:             if (opcode == Opcode.SusccIcs) command = "SUSCC:SNB=" + snb + ",SCL=ICS-" + parameter + "&TBO-0&TBI-0&BOC-0&BIC-0;"; // SUSCC must be followed with semicolon';'
  976:             else if (opcode == Opcode.SusccXxx) command = "SUSCC:SNB=" + snb + ",SCL=Xxx-" + parameter + ";"; // SUSCC must be followed with semicolon';'
  977:             else throw new System.ArgumentOutOfRangeException("AxeCommand(): Opcode unrecognized. ");
  978:  
  979:             return command;
  980:         }
  981:  
  982:         ////////////////////////////////////////////////////////////////////////////
  983:  
  984:         /// <summary>
  985:         ///
  986:         /// </summary>
  987:         private static string AxeCommand(Opcode opcode, int snb, int parameter1, int parameter2)
  988:         {
  989:             string command;
  990:  
  991:             if (opcode == Opcode.SusccTboTbi) command = "SUSCC:SNB=" + snb + ",SCL=TBO-" + parameter1 + "&TBI-" + parameter2 + ";"; // SUSCC must be followed with semicolon';'
  992:             else throw new System.ArgumentOutOfRangeException("AxeCommand(): Opcode unrecognized. ");
  993:  
  994:             return command;
  995:         }
  996:  
  997:         ////////////////////////////////////////////////////////////////////////////
  998:  
  999:         /// <summary>
 1000:         ///
 1001:         /// </summary>
 1002:         public static string AxeDisplayTimeCommand
 1003:         {
 1004:             get
 1005:             {
 1006:                 return ";";
 1007:             }
 1008:         }
 1009:  
 1010:         ////////////////////////////////////////////////////////////////////////////
 1011:  
 1012:         /// <summary>
 1013:         /// Extract unique AXE service symbols into array 
 1014:         /// </summary>
 1015:         public static void ExtractAndUpdateUniqueAxeServiceSymbolListFromOutputContent(string outputContent)
 1016:         {
 1017:             MatchCollection matchCollection;
 1018:  
 1019:             matchCollection = Regex.Matches(outputContent, @"\b[A-Z]{3,8}-\d+\b");
 1020:  
 1021:             if (matchCollection.Count > 0)
 1022:             {
 1023:                 foreach (Match match in matchCollection)
 1024:                 {
 1025:                     if (!match.Value.StartsWith("LIMA")) // LIMA-3445 is a circuit
 1026:                     {
 1027:                         if (!ServiceSymbolList.Contains(match.Value))
 1028:                         {
 1029:                             ServiceSymbolList.Add(match.Value);
 1030:                         }
 1031:                     }
 1032:                 }
 1033:             }
 1034:         }
 1035:  
 1036:         ////////////////////////////////////////////////////////////////////////////
 1037:         ////////////////////////////////////////////////////////////////////////////
 1038:     }
 1039:  
 1040:     ////////////////////////////////////////////////////////////////////////////
 1041:     ////////////////////////////////////////////////////////////////////////////    
 1042: }
 1043: