static void ImportRouteSegments(IMediator CommandBus, Wgs84GraphBuilder graphBuilder)
        {
            // Import node objects to database
            var segmentJsonText = File.ReadAllText(_builderDataPath + "RouteSegments.geojson");

            var segmentsJson = JsonConvert.DeserializeObject(segmentJsonText) as JObject;

            var features = segmentsJson["features"];

            foreach (var feature in features)
            {
                var properties = feature["properties"] as JObject;

                var geometry = feature["geometry"];

                var geometryType = geometry["type"].ToString();
                var geometryCoordinates = geometry["coordinates"].ToString().Replace("\r\n", "").Replace(" ", "");

                var segmentId = _segmentIdPrefix + properties["Id"].ToString().PadLeft(6, '0');
                var segmentKind = properties["RouteSegmentKind"].ToString();
                var assetStatus = properties["Status"].ToString();

                if (properties["BuildTestData"].ToString() != "")
                {
                    var buildCodes = properties["BuildTestData"].ToString().Split(';');
                    _segmentBuildCodes.Add(segmentId, buildCodes);
                }

                // Add link to graph
                var coordinates = geometry["coordinates"] as JArray;
                var startX = coordinates.First[0];
                var startY = coordinates.First[1];

                var endX = coordinates.Last[0];
                var endY = coordinates.Last[1];

                graphBuilder.AddLinkToGraph(segmentId, (double)startX, (double)startY, (double)endX, (double)endY);

                // Derive node and function kind
                var segmentKindCode = RouteSegmentKindEnum.Unknown;

                if (segmentKind == "buried")
                {
                    segmentKindCode = RouteSegmentKindEnum.Underground;
                }

                var link = _routeGraph.Links[segmentId];

                var addSegmentCmd = new AddSegmentCommand()
                {
                    Id = Guid.Parse(segmentId),
                    FromNodeId = Guid.Parse(link.StartNode.Id),
                    ToNodeId = Guid.Parse(link.EndNode.Id),
                    SegmentKind = segmentKindCode,
                    Geometry = new Geometry(geometryType, geometryCoordinates)
                };

                CommandBus.Send(addSegmentCmd).Wait();
            }
        }
Ejemplo n.º 2
0
        static void ImportRouteSegments(MigrationBuilder migrationBuilder, Wgs84GraphBuilder graphBuilder)
        {
            // Import node objects to database
            var segmentJsonText = File.ReadAllText(_builderDataPath + "Builder/RouteSegments.geojson");

            var segmentsJson = JsonConvert.DeserializeObject(segmentJsonText) as JObject;

            var features = segmentsJson["features"];

            foreach (var feature in features)
            {
                var properties = feature["properties"] as JObject;

                var geometry = feature["geometry"];

                var geometryType        = geometry["type"].ToString();
                var geometryCoordinates = geometry["coordinates"].ToString().Replace("\r\n", "").Replace(" ", "");

                var segmentId   = _segmentIdPrefix + properties["Id"].ToString().PadLeft(6, '0');
                var segmentKind = properties["RouteSegmentKind"].ToString();
                var assetStatus = properties["Status"].ToString();

                if (properties["BuildTestData"].ToString() != "")
                {
                    var buildCodes = properties["BuildTestData"].ToString().Split(';');
                    SegmentBuildCodes.Add(segmentId, buildCodes);
                }


                // Add link to graph
                var coordinates = geometry["coordinates"] as JArray;
                var startX      = coordinates.First[0];
                var startY      = coordinates.First[1];

                var endX = coordinates.Last[0];
                var endY = coordinates.Last[1];

                graphBuilder.AddLinkToGraph(segmentId, (double)startX, (double)startY, (double)endX, (double)endY);


                // Derive node and function kind
                int segmentKindCode = (int)RouteSegmentKindEnum.Unknown;

                if (segmentKind == "buried")
                {
                    segmentKindCode = (int)RouteSegmentKindEnum.Underground;
                }

                migrationBuilder.InsertData(
                    table: "RouteSegments",
                    columns: new[] { "Id", "SegmentKind", "GeoJsonType", "GeoJsonCoordinates", "AssetStatus" },
                    values: new object[] {
                    segmentId,
                    segmentKindCode,
                    geometryType,
                    geometryCoordinates,
                    Int32.Parse(assetStatus)
                });
            }
        }
        public static void Run(IMediator CommandBust)
        {
            // Create route nodes and segments
            var graphBuilder = new Wgs84GraphBuilder(_routeGraph);

            ImportRouteNodes(CommandBust, graphBuilder);
            ImportRouteSegments(CommandBust, graphBuilder);
        }
Ejemplo n.º 4
0
        public static void Run(MigrationBuilder migrationBuilder)
        {
            // Create route nodes and segments
            var graphBuilder = new Wgs84GraphBuilder(RouteGraph);

            ImportRouteNodes(migrationBuilder, graphBuilder);
            ImportRouteSegments(migrationBuilder, graphBuilder);
        }
        public static void Run(string builderDataPath, IMediator CommandBust)
        {
            _builderDataPath = builderDataPath;

            _routeGraph = new Graph();
            _nodeBuildCodes = new Dictionary<string, string[]>();
            _segmentBuildCodes = new Dictionary<string, string[]>();

            // Create route nodes and segments
            var graphBuilder = new Wgs84GraphBuilder(_routeGraph);

            ImportRouteNodes(CommandBust, graphBuilder);
            ImportRouteSegments(CommandBust, graphBuilder);
        }
Ejemplo n.º 6
0
        public RouteNetworkBuilder Run(string routeNodeFilename, string routeSegmentFilename, RouteNetworkDatastore routeNetworkDatestore, Guid startMarker, Guid endMarker)
        {
            _routeNodeFilename     = routeNodeFilename;
            _routeSegmentFilename  = routeSegmentFilename;
            _routeNetworkDatestore = routeNetworkDatestore;
            _startMarker           = startMarker;
            _endMarker             = endMarker;

            // Create route nodes and segments
            var graphBuilder = new Wgs84GraphBuilder(_routeGraph);

            ImportRouteNodes(graphBuilder);
            ImportRouteSegments(graphBuilder);

            return(this);
        }
Ejemplo n.º 7
0
        private void ImportRouteNodes(Wgs84GraphBuilder graphBuilder)
        {
            // Import node objects to database
            var nodesJsonText = File.ReadAllText(_routeNodeFilename);

            var nodesJson = JsonConvert.DeserializeObject(nodesJsonText) as JObject;

            var features = nodesJson["features"];

            bool firstNode = true;

            foreach (var feature in features)
            {
                var properties = feature["properties"] as JObject;

                var geometry = feature["geometry"];

                var geometryType        = geometry["type"].ToString();
                var geometryCoordinates = geometry["coordinates"].ToString().Replace("\r\n", "").Replace(" ", "");

                var nodeId      = Guid.Parse(_nodeIdPrefix + properties["Id"].ToString().PadLeft(6, '0'));
                var nodeType    = properties["NodeType"].ToString();
                var nodeName    = properties["NodeName"].ToString();
                var assetStatus = properties["Status"].ToString();

                if (properties["BuildTestData"].ToString() != "")
                {
                    var buildCodes = properties["BuildTestData"].ToString().Split(';');
                    _nodeBuildCodes.Add(nodeId, buildCodes);
                }


                // Add node to graph
                var x = ((JArray)geometry["coordinates"])[0];
                var y = ((JArray)geometry["coordinates"])[1];


                // Derive node and function kind
                RouteNodeKindEnum?    nodeKind         = null;
                RouteNodeFunctionEnum?nodeFunctionKind = null;

                if (nodeType == "CO")
                {
                    nodeKind         = RouteNodeKindEnum.CentralOfficeSmall;
                    nodeFunctionKind = RouteNodeFunctionEnum.SecondaryNode;
                }
                else if (nodeType == "HH")
                {
                    nodeKind         = RouteNodeKindEnum.HandHole;
                    nodeFunctionKind = RouteNodeFunctionEnum.AccessibleConduitClosure;
                }
                else if (nodeType == "CC")
                {
                    nodeKind         = RouteNodeKindEnum.ConduitClosure;
                    nodeFunctionKind = RouteNodeFunctionEnum.NonAccessibleConduitClosure;
                }
                else if (nodeType == "CE")
                {
                    nodeKind         = RouteNodeKindEnum.ConduitEnd;
                    nodeFunctionKind = RouteNodeFunctionEnum.NonAccessibleConduitClosure;
                }
                else if (nodeType == "SJ")
                {
                    nodeKind         = RouteNodeKindEnum.ConduitSimpleJunction;
                    nodeFunctionKind = RouteNodeFunctionEnum.NonAccessibleConduitClosure;
                }
                else if (nodeType == "FP")
                {
                    nodeKind         = RouteNodeKindEnum.CabinetBig;
                    nodeFunctionKind = RouteNodeFunctionEnum.FlexPoint;
                }
                else if (nodeType == "SP")
                {
                    nodeKind         = RouteNodeKindEnum.CabinetSmall;
                    nodeFunctionKind = RouteNodeFunctionEnum.SplicePoint;
                }
                else if (nodeType == "A")
                {
                    nodeKind         = RouteNodeKindEnum.BuildingAccessPoint;
                    nodeFunctionKind = RouteNodeFunctionEnum.SplicePoint;
                }
                else if (nodeType == "MDU")
                {
                    nodeKind         = RouteNodeKindEnum.MultiDwellingUnit;
                    nodeFunctionKind = RouteNodeFunctionEnum.CustomerPremisesPoint;
                }
                else if (nodeType == "SDU")
                {
                    nodeKind         = RouteNodeKindEnum.SingleDwellingUnit;
                    nodeFunctionKind = RouteNodeFunctionEnum.CustomerPremisesPoint;
                }

                // On the first node, we set the start marker into applicaion info, and insert data into all the other propeties as well to test if every information is captured into the generated events
                if (firstNode)
                {
                    RouteNodeRecord routeNode = new RouteNodeRecord()
                    {
                        Id              = nodeId,
                        WorkTaskMrid    = _startMarker,
                        ApplicationName = _applicationName,
                        ApplicationInfo = _applicationName,
                        DeleteMe        = false,
                        MarkAsDeleted   = false,
                        Username        = _userName,
                        Geometry        = GeographicToProjectedCoordinateConverter.ConvertPoint(GeoJsonConversionHelper.ConvertFromPointGeoJson(geometryCoordinates)),
                        RouteNodeInfo   = new RouteNodeInfo(nodeKind, nodeFunctionKind),
                        LifecycleInfo   = new LifecycleInfo(DeploymentStateEnum.InService, DateTime.Now, DateTime.Now),
                        MappingInfo     = new MappingInfo(MappingMethodEnum.LandSurveying, "10 cm", "20 cm", DateTime.Now, "Surveyed with GPS"),
                        NamingInfo      = new NamingInfo(nodeName, "Route node"),
                        SafetyInfo      = new SafetyInfo("no danger", "might contain rats"),
                        IsAutoCreated   = false
                    };

                    graphBuilder.AddNodeToGraph(routeNode, (double)x, (double)y);
                    _routeNetworkDatestore.InsertRouteNode(routeNode);
                }
                else
                {
                    RouteNodeRecord routeNode = new RouteNodeRecord()
                    {
                        Id = nodeId,
                        ApplicationName = _applicationName,
                        ApplicationInfo = _applicationName,
                        DeleteMe        = false,
                        MarkAsDeleted   = false,
                        Username        = _userName,
                        Geometry        = GeographicToProjectedCoordinateConverter.ConvertPoint(GeoJsonConversionHelper.ConvertFromPointGeoJson(geometryCoordinates)),
                        RouteNodeInfo   = new RouteNodeInfo(nodeKind, nodeFunctionKind),
                        NamingInfo      = new NamingInfo(nodeName, "Route node"),
                        IsAutoCreated   = false
                    };

                    graphBuilder.AddNodeToGraph(routeNode, (double)x, (double)y);
                    _routeNetworkDatestore.InsertRouteNode(routeNode);
                }


                firstNode = false;
            }
        }
Ejemplo n.º 8
0
        private void ImportRouteSegments(Wgs84GraphBuilder graphBuilder)
        {
            // Import node objects to database
            var segmentJsonText = File.ReadAllText(_routeSegmentFilename);

            var segmentsJson = JsonConvert.DeserializeObject(segmentJsonText) as JObject;

            var features = segmentsJson["features"];

            bool firstSegment = true;
            bool lastSegment  = false;

            var numberOfSegmentFeatures = features.Count();

            var segmentCounter = 1;

            foreach (var feature in features)
            {
                var properties = feature["properties"] as JObject;

                var geometry = feature["geometry"];

                var geometryType        = geometry["type"].ToString();
                var geometryCoordinates = geometry["coordinates"].ToString().Replace("\r\n", "").Replace(" ", "");

                var segmentId   = Guid.Parse(_segmentIdPrefix + properties["Id"].ToString().PadLeft(6, '0'));
                var segmentKind = properties["RouteSegmentKind"].ToString();
                var assetStatus = properties["Status"].ToString();

                if (properties["BuildTestData"].ToString() != "")
                {
                    var buildCodes = properties["BuildTestData"].ToString().Split(';');
                    _segmentBuildCodes.Add(segmentId, buildCodes);
                }


                // Add link to graph
                var coordinates = geometry["coordinates"] as JArray;
                var startX      = coordinates.First[0];
                var startY      = coordinates.First[1];

                var endX = coordinates.Last[0];
                var endY = coordinates.Last[1];

                // Derive node and function kind
                RouteSegmentKindEnum?segmentKindCode = null;

                if (segmentKind == "buried")
                {
                    segmentKindCode = RouteSegmentKindEnum.Underground;
                }

                // On the first node, we set the start marker into applicaion info, and insert data into all the other propeties as well to test if every information is captured into the generated events
                if (firstSegment)
                {
                    RouteSegmentRecord routeSegment = new RouteSegmentRecord()
                    {
                        Id = segmentId,
                        ApplicationName  = _applicationName,
                        ApplicationInfo  = _applicationName,
                        DeleteMe         = false,
                        MarkAsDeleted    = false,
                        Username         = _userName,
                        Geometry         = GeographicToProjectedCoordinateConverter.ConvertLineString(GeoJsonConversionHelper.ConvertFromLineGeoJson(geometryCoordinates)),
                        RouteSegmentInfo = new RouteSegmentInfo(RouteSegmentKindEnum.Underground, "50 cm", "90 cm"),
                        LifecycleInfo    = new LifecycleInfo(DeploymentStateEnum.InService, DateTime.Now, DateTime.Now),
                        MappingInfo      = new MappingInfo(MappingMethodEnum.LandSurveying, "10 cm", "20 cm", DateTime.Now, "Surveyed with GPS"),
                        NamingInfo       = new NamingInfo("Route segment", "I'm an underground route segment"),
                        SafetyInfo       = new SafetyInfo("no danger", "might contain gophers"),
                    };

                    graphBuilder.AddEdgeToGraph(routeSegment, (double)startX, (double)startY, (double)endX, (double)endY);
                    _routeNetworkDatestore.InsertRouteSegment(routeSegment);
                }
                else
                {
                    RouteSegmentRecord routeSegment = new RouteSegmentRecord()
                    {
                        Id = segmentId,
                        ApplicationName  = _applicationName,
                        ApplicationInfo  = _applicationName,
                        DeleteMe         = false,
                        MarkAsDeleted    = false,
                        Username         = _userName,
                        Geometry         = GeographicToProjectedCoordinateConverter.ConvertLineString(GeoJsonConversionHelper.ConvertFromLineGeoJson(geometryCoordinates)),
                        RouteSegmentInfo = new RouteSegmentInfo(RouteSegmentKindEnum.Underground, "50 cm", "90 cm"),
                    };

                    // Mark last segment
                    if (segmentCounter == numberOfSegmentFeatures)
                    {
                        routeSegment.WorkTaskMrid = _endMarker;
                    }

                    graphBuilder.AddEdgeToGraph(routeSegment, (double)startX, (double)startY, (double)endX, (double)endY);
                    _routeNetworkDatestore.InsertRouteSegment(routeSegment);
                }


                firstSegment = false;
                segmentCounter++;
            }
        }
        static void ImportRouteNodes(IMediator CommandBus, Wgs84GraphBuilder graphBuilder)
        {
            // Import node objects to database
            var nodesJsonText = File.ReadAllText(_builderDataPath + "RouteNodes.geojson");

            var nodesJson = JsonConvert.DeserializeObject(nodesJsonText) as JObject;

            var features = nodesJson["features"];

            foreach (var feature in features)
            {
                var properties = feature["properties"] as JObject;

                var geometry = feature["geometry"];

                var geometryType = geometry["type"].ToString();
                var geometryCoordinates = geometry["coordinates"].ToString().Replace("\r\n", "").Replace(" ", "");

                var nodeId = _nodeIdPrefix + properties["Id"].ToString().PadLeft(6, '0');
                var nodeType = properties["NodeType"].ToString();
                var nodeName = properties["NodeName"].ToString();
                var assetStatus = properties["Status"].ToString();

                if (properties["BuildTestData"].ToString() != "")
                {
                    var buildCodes = properties["BuildTestData"].ToString().Split(';');
                    _nodeBuildCodes.Add(nodeId, buildCodes);
                }

                // Add node to graph
                var x = ((JArray)geometry["coordinates"])[0];
                var y = ((JArray)geometry["coordinates"])[1];
                graphBuilder.AddNodeToGraph(nodeId, (double)x, (double)y);

                // Derive node and function kind
                var nodeKind = RouteNodeKindEnum.Unknown;
                var nodeFunctionKind =RouteNodeFunctionKindEnum.Unknown;

                if (nodeType == "CO")
                {
                    nodeKind = RouteNodeKindEnum.CentralOfficeSmall;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.SecondaryNode;
                }
                else if (nodeType == "HH")
                {
                    nodeKind = RouteNodeKindEnum.HandHole;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.OpenConduitPoint;
                }
                else if (nodeType == "CC")
                {
                    nodeKind = RouteNodeKindEnum.ConduitClosure;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.BurriedConduitPont;
                }
                else if (nodeType == "CE")
                {
                    nodeKind = RouteNodeKindEnum.ConduitEnd;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.BurriedConduitPont;
                }
                else if (nodeType == "SJ")
                {
                    nodeKind = RouteNodeKindEnum.ConduitSimpleJunction;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.BurriedConduitPont;
                }
                else if (nodeType == "FP")
                {
                    nodeKind = RouteNodeKindEnum.CabinetBig;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.FlexPoint;
                }
                else if (nodeType == "SP")
                {
                    nodeKind = RouteNodeKindEnum.CabinetSmall;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.SplicePoint;
                }
                else if (nodeType == "A")
                {
                    nodeKind = RouteNodeKindEnum.BuildingAccessPoint;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.SplicePoint;
                }
                else if (nodeType == "MDU")
                {
                    nodeKind = RouteNodeKindEnum.MultiDwellingUnit;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.ServiceDeliveryPoint;
                }
                else if (nodeType == "SDU")
                {
                    nodeKind = RouteNodeKindEnum.SingleDwellingUnit;
                    nodeFunctionKind = RouteNodeFunctionKindEnum.ServiceDeliveryPoint;
                }

                // location info
                var locationInfo = new LocationInfo();
                locationInfo.Id = Guid.NewGuid();
                locationInfo.AccessAddress = new AccessAddressInfo()
                {
                    MunicipalCode = "0630",
                    MunicipalRoadCode = "1521",
                    StreetName = properties["StreetName"].ToString(),
                    HouseNumber = properties["HouseNumber"].ToString(),
                    PostalCode = "7120",
                    PostalName = "Vejle Ø"
                };

                var addNodeCmd = new AddNodeCommand()
                {
                    Id = Guid.Parse(nodeId),
                    Name = nodeName,
                    NodeKind = nodeKind,
                    NodeFunctionKind = nodeFunctionKind,
                    LocationInfo = locationInfo,
                    Geometry = new Geometry(geometryType, geometryCoordinates)
                };

                CommandBus.Send(addNodeCmd).Wait();
            }
        }
Ejemplo n.º 10
0
        static void ImportRouteNodes(MigrationBuilder migrationBuilder, Wgs84GraphBuilder graphBuilder)
        {
            // Import node objects to database
            var nodesJsonText = File.ReadAllText(_builderDataPath + "Builder/RouteNodes.geojson");

            var nodesJson = JsonConvert.DeserializeObject(nodesJsonText) as JObject;

            var features = nodesJson["features"];

            foreach (var feature in features)
            {
                var properties = feature["properties"] as JObject;

                var geometry = feature["geometry"];

                var geometryType        = geometry["type"].ToString();
                var geometryCoordinates = geometry["coordinates"].ToString().Replace("\r\n", "").Replace(" ", "");

                var nodeId      = _nodeIdPrefix + properties["Id"].ToString().PadLeft(6, '0');
                var nodeType    = properties["NodeType"].ToString();
                var nodeName    = properties["NodeName"].ToString();
                var assetStatus = properties["Status"].ToString();

                if (properties["BuildTestData"].ToString() != "")
                {
                    var buildCodes = properties["BuildTestData"].ToString().Split(';');
                    NodeBuildCodes.Add(nodeId, buildCodes);
                }


                // Add node to graph
                var x = ((JArray)geometry["coordinates"])[0];
                var y = ((JArray)geometry["coordinates"])[1];
                graphBuilder.AddNodeToGraph(nodeId, (double)x, (double)y);

                // Derive node and function kind
                int nodeKind         = (int)RouteNodeKindEnum.Unknown;
                int nodeFunctionKind = (int)RouteNodeFunctionKindEnum.Unknown;

                if (nodeType == "CO")
                {
                    nodeKind         = (int)RouteNodeKindEnum.CentralOfficeSmall;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.SecondaryNode;
                }
                else if (nodeType == "HH")
                {
                    nodeKind         = (int)RouteNodeKindEnum.HandHole;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.OpenConduitPoint;
                }
                else if (nodeType == "CC")
                {
                    nodeKind         = (int)RouteNodeKindEnum.ConduitClosure;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.BurriedConduitPont;
                }
                else if (nodeType == "CE")
                {
                    nodeKind         = (int)RouteNodeKindEnum.ConduitEnd;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.BurriedConduitPont;
                }
                else if (nodeType == "SJ")
                {
                    nodeKind         = (int)RouteNodeKindEnum.ConduitSimpleJunction;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.BurriedConduitPont;
                }
                else if (nodeType == "FP")
                {
                    nodeKind         = (int)RouteNodeKindEnum.CabinetBig;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.FlexPoint;
                }
                else if (nodeType == "SP")
                {
                    nodeKind         = (int)RouteNodeKindEnum.CabinetSmall;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.SplicePoint;
                }
                else if (nodeType == "A")
                {
                    nodeKind         = (int)RouteNodeKindEnum.BuildingAccessPoint;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.SplicePoint;
                }
                else if (nodeType == "MDU")
                {
                    nodeKind         = (int)RouteNodeKindEnum.MultiDwellingUnit;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.ServiceDeliveryPoint;
                }
                else if (nodeType == "SDU")
                {
                    nodeKind         = (int)RouteNodeKindEnum.SingleDwellingUnit;
                    nodeFunctionKind = (int)RouteNodeFunctionKindEnum.ServiceDeliveryPoint;
                }


                migrationBuilder.InsertData(
                    table: "RouteNodes",
                    columns: new[] { "Id", "Name", "NodeKind", "NodeFunctionKind", "GeoJsonType", "GeoJsonCoordinates", "AssetStatus" },
                    values: new object[] {
                    nodeId,
                    nodeName,
                    nodeKind,
                    nodeFunctionKind,
                    geometryType,
                    geometryCoordinates,
                    Int32.Parse(assetStatus)
                });
            }
        }