Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab 3.3.sln
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab 3.3.sln	(revision 11259)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab 3.3.sln	(revision 11260)
@@ -411,4 +411,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Orienteering.Views-3.3", "HeuristicLab.Problems.Orienteering.Views\3.3\HeuristicLab.Problems.Orienteering.Views-3.3.csproj", "{BBF2CCC8-4D87-4297-8E18-8241FF93F966}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Instances.Orienteering-3.3", "HeuristicLab.Problems.Instances.Orienteering\3.3\HeuristicLab.Problems.Instances.Orienteering-3.3.csproj", "{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}"
 EndProject
 Global
@@ -1994,4 +1996,12 @@
 		{BBF2CCC8-4D87-4297-8E18-8241FF93F966}.Release|x64.ActiveCfg = Release|Any CPU
 		{BBF2CCC8-4D87-4297-8E18-8241FF93F966}.Release|x86.ActiveCfg = Release|Any CPU
+		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Release|x64.ActiveCfg = Release|Any CPU
+		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/HeuristicLab.Problems.Instances.Orienteering-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/HeuristicLab.Problems.Instances.Orienteering-3.3.csproj	(revision 11259)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/HeuristicLab.Problems.Instances.Orienteering-3.3.csproj	(revision 11260)
@@ -37,9 +37,16 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ICSharpCode.SharpZipLib, Version=0.85.4.369, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\HeuristicLab.PluginInfrastructure\3.3\ICSharpCode.SharpZipLib.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="SchildeOPParser.cs" />
     <None Include="HeuristicLab.snk" />
     <None Include="Plugin.cs.frame" />
+    <Compile Include="OPDataDescriptor.cs" />
+    <Compile Include="SchildeOPInstanceProvider.cs" />
     <Compile Include="Plugin.cs" />
     <None Include="Properties\AssemblyInfo.cs.frame" />
@@ -47,7 +54,15 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
       <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
       <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj">
+      <Project>{3540E29E-4793-49E7-8EE2-FEA7F61C3994}</Project>
+      <Name>HeuristicLab.Problems.Instances-3.3</Name>
     </ProjectReference>
   </ItemGroup>
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/OPDataDescriptor.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/OPDataDescriptor.cs	(revision 11260)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/OPDataDescriptor.cs	(revision 11260)
@@ -0,0 +1,14 @@
+﻿namespace HeuristicLab.Problems.Instances.Orienteering {
+  internal class OPDataDescriptor : IDataDescriptor {
+    public string Name { get; internal set; }
+    public string Description { get; internal set; }
+
+    internal string InstanceIdentifier { get; set; }
+
+    internal OPDataDescriptor(string name, string description, string instanceIdentifier) {
+      Name = name;
+      Description = description;
+      InstanceIdentifier = instanceIdentifier;
+    }
+  }
+}
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/SchildeOPInstanceProvider.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/SchildeOPInstanceProvider.cs	(revision 11260)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/SchildeOPInstanceProvider.cs	(revision 11260)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using HeuristicLab.Problems.Instances.Types;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.Problems.Instances.Orienteering {
+  public class SchildeOPInstanceProvider : ProblemInstanceProvider<OPData> {
+    public override string Name {
+      get { return "Schilde OP instances"; }
+    }
+    public override string Description {
+      get { return "Modified Tsiligirdes (1984) and Chao (1996) instances by Schilde."; }
+    }
+    public override string ReferencePublication {
+      get { return "Metaheuristics for the bi-objective orienteering problem (Michael Schilde, Karl F. Doerner, Richard F. Hartl, Guenter Kiechle)"; }
+    }
+    public override Uri WebLink {
+      get { return new Uri("http://prolog.univie.ac.at/research/OP/"); }
+    }
+
+    private const string FileName = "SchildeOP";
+
+    public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
+      var instanceArchiveName = GetResourceName(FileName + @"\.zip");
+      if (String.IsNullOrEmpty(instanceArchiveName)) yield break;
+
+      using (var instanceStream = new ZipInputStream(GetType().Assembly.GetManifestResourceStream(instanceArchiveName))) {
+        foreach (var entry in GetZipContents(instanceStream).OrderBy(x => x)) {
+          yield return new OPDataDescriptor(Path.GetFileNameWithoutExtension(entry), GetInstanceDescription(), entry);
+        }
+      }
+    }
+    public override OPData LoadData(IDataDescriptor id) {
+      var descriptor = (OPDataDescriptor)id;
+      var instanceArchiveName = GetResourceName(FileName + @"\.zip");
+      var parser = new SchildeOPParser();
+      using (var instancesZipFile = new ZipFile(GetType().Assembly.GetManifestResourceStream(instanceArchiveName))) {
+        var entry = instancesZipFile.GetEntry(descriptor.InstanceIdentifier);
+        using (var stream = instancesZipFile.GetInputStream(entry)) {
+          parser.Parse(stream);
+          var instance = LoadInstance(parser);
+
+          instance.Name = id.Name;
+          instance.Description = id.Description;
+
+          return instance;
+        }
+      }
+    }
+
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override OPData ImportData(string path) {
+      var parser = new SchildeOPParser();
+      parser.Parse(path);
+      var instance = LoadInstance(parser);
+
+      instance.Name = Path.GetFileName(path);
+      instance.Description = "Loaded from file \"" + path + "\" on " + DateTime.Now.ToString();
+
+      return instance;
+    }
+
+    private OPData LoadInstance(SchildeOPParser parser) {
+      return new OPData {
+        Dimension = parser.Coordinates.GetLength(0),
+        Coordinates = parser.Coordinates,
+        Distances = parser.Distances,
+        MaximumDistance = parser.UpperBoundConstraint,
+        StartingPoint = parser.StartingPoint,
+        TerminusPoint = parser.TerminusPoint,
+        Scores = Enumerable.Range(0, parser.Scores.GetLength(0)).Select(i => parser.Scores[i, 0]).ToArray()
+      };
+    }
+
+    protected virtual string GetResourceName(string fileName) {
+      return Assembly.GetExecutingAssembly().GetManifestResourceNames()
+        .SingleOrDefault(x => Regex.Match(x, @".*\.Data\." + fileName).Success);
+    }
+    protected IEnumerable<string> GetZipContents(ZipInputStream zipFile) {
+      ZipEntry entry;
+      while ((entry = zipFile.GetNextEntry()) != null) {
+        yield return entry.Name;
+      }
+    }
+    protected virtual string GetInstanceDescription() {
+      return "Embedded instance of plugin version " + Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true).Cast<AssemblyFileVersionAttribute>().First().Version + ".";
+    }
+  }
+}
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/SchildeOPParser.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/SchildeOPParser.cs	(revision 11260)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances.Orienteering/3.3/SchildeOPParser.cs	(revision 11260)
@@ -0,0 +1,279 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace HeuristicLab.Problems.Instances.Orienteering {
+  public class SchildeOPParser {
+    private int currentPoint;
+    private int currentDistance;
+
+    public double[,] Coordinates { get; private set; }
+    public double[,] Distances { get; private set; }
+    public double[,] Scores { get; private set; }
+    public int StartingPoint { get; private set; }
+    public int TerminusPoint { get; private set; }
+    public double UpperBoundConstraint { get; private set; }
+    public double LowerConstraint { get; private set; }
+
+    public void Reset() {
+      currentPoint = 0;
+      currentDistance = 0;
+
+      Coordinates = null;
+      Distances = null;
+      Scores = null;
+      StartingPoint = 0;
+      TerminusPoint = 0;
+      UpperBoundConstraint = 0.0;
+      LowerConstraint = 0.0;
+
+    }
+
+    public void Parse(string file) {
+      using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
+        Parse(stream);
+      }
+    }
+    public void Parse(Stream stream) {
+      int lineNumber = 0;
+
+      using (var reader = new StreamReader(stream)) {
+        // Read the lines from the file
+        while (!reader.EndOfStream) {
+          string lineBuffer = reader.ReadLine();
+
+          // Remove all whitespace
+          lineBuffer = new string(lineBuffer.ToCharArray().Where(c => !char.IsWhiteSpace(c)).ToArray());
+
+          // If the line contains data, continue
+          if (lineBuffer.Length > 1) {
+            // If the line contains not only a comment, process it
+            int commentPosition = lineBuffer.IndexOf("//");
+            if (commentPosition != 0) {
+              // Count the lines that include data
+              lineNumber++;
+
+              // Remove a comment if there is one
+              if (commentPosition > 0)
+                lineBuffer = lineBuffer.Remove(commentPosition);
+
+              // Convert the line to lowercase characters
+              lineBuffer = lineBuffer.ToLower();
+
+              // Skip version info in file
+              if (lineNumber > 1) {
+                // Extract the needed information
+                ExtractData(lineBuffer);
+              }
+            }
+          }
+        }
+      }
+    }
+    private void ExtractData(string inputString) {
+      string temp;
+      int pointCount;
+
+      switch (inputString[0]) {
+        case 'p': // Point description
+          if (inputString.Length < 8)
+            throw new IOException("Invalid Definition P");
+
+          // Remove the 'p,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          // Get the position_x
+          string positionX = inputString.Substring(0, inputString.IndexOf(','));
+          // Remove the position_x
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          // Get the postion_y
+          string positionY = inputString.Substring(0, inputString.IndexOf(','));
+          // Remove the position_y to get the scores
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+
+          Coordinates[currentPoint, 0] = double.Parse(positionX);
+          Coordinates[currentPoint, 1] = double.Parse(positionY);
+
+          // Extract all score values for this point
+          int scoreIndex = 0;
+          while (true) {
+            string score;
+            if (inputString.IndexOf(',') != -1) {
+              score = inputString.Substring(0, inputString.IndexOf(','));
+              inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+              Scores[currentPoint, scoreIndex++] = int.Parse(score);
+            } else {
+              score = inputString;
+              Scores[currentPoint, scoreIndex++] = int.Parse(score);
+              break;
+            }
+          }
+          currentPoint++;
+          break;
+
+        case 'd': // Distance information
+          if (inputString.Length < 11)
+            throw new IOException("Invalid Definition D");
+
+          //var tempDistances = new List<double>();
+
+          // Remove the 'd,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+
+          // Extract all distances for this point
+          int distanceIndex = 0;
+          while (true) {
+            string distance;
+            if (inputString.IndexOf(',') != -1) {
+              distance = inputString.Substring(0, inputString.IndexOf(','));
+              inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+              Distances[currentDistance, distanceIndex++] = double.Parse(distance);
+            } else {
+              distance = inputString;
+              Distances[currentDistance, distanceIndex++] = double.Parse(distance);
+              break;
+            }
+          }
+          break;
+
+        case 'n': // Number of points
+          if (inputString.Length < 3)
+            throw new IOException("Invalid Definition N");
+
+          // Remove the 'n,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          // Extract the number of points
+
+          pointCount = int.Parse(inputString);
+          Coordinates = new double[pointCount, 2];
+          break;
+
+        case 'm': // 1 if Distance-Matrix is given
+          if (inputString.Length < 3)
+            throw new IOException("Invalid Definition M");
+
+          // Remove the 'm,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          // Extract the number of points
+          bool matrixGiven = true;
+
+          pointCount = Coordinates.GetLength(1);
+          Distances = new double[pointCount, pointCount];
+          break;
+
+        case 'c': // Number of constraints
+          if (inputString.Length < 3)
+            throw new IOException("Invalid Definition C");
+
+          // Remove the 'c,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          break;
+
+        case 's': // Number of scores per point
+          if (inputString.Length < 3)
+            throw new IOException("Invalid Definition S");
+
+          // Remove the 's,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          int scoreCount = int.Parse(inputString);
+
+          pointCount = int.Parse(inputString);
+          Scores = new double[pointCount, scoreCount];
+
+          break;
+
+        case 'b': // Index of the starting point
+          if (inputString.Length < 3)
+            throw new IOException("Invalid Definition B");
+
+          // Remove the 'b,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          StartingPoint = int.Parse(inputString);
+          break;
+
+        case 'e': // Index of the terminus point
+          if (inputString.Length < 3)
+            throw new IOException("Invalid Definition E");
+
+          // Remove the 'e,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          TerminusPoint = int.Parse(inputString);
+          break;
+
+        case 'u': // Upper bound constraint
+          if (inputString.Length < 5)
+            throw new IOException("Invalid Definition U");
+
+          // Remove the 'u,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          // Get the target
+          temp = inputString.Substring(0, inputString.IndexOf(','));
+          // Remove the target to get the target value
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+
+          UpperBoundConstraint = double.Parse(inputString);
+          break;
+
+        case 'l': // Lower bound constraint
+          if (inputString.Length < 5)
+            throw new IOException("Invalid Definition L");
+
+          // Remove the 'l,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          // Get the target
+          temp = inputString.Substring(0, inputString.IndexOf(','));
+          // Remove the target to get the target value
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+
+          LowerConstraint = double.Parse(inputString);
+          break;
+
+        case 'x': // Maximization constraint
+          if (inputString.Length < 5)
+            throw new IOException("Invalid Definition X");
+
+          // Remove the 'x,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          // Get the target
+          temp = inputString.Substring(0, inputString.IndexOf(','));
+          // Remove the target to get the target value
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+
+          break;
+
+        case 'i': // Minimization constraint
+          if (inputString.Length < 5)
+            throw new IOException("Invalid Definition I");
+
+          // Remove the 'i,'
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+          // Get the target
+          temp = inputString.Substring(0, inputString.IndexOf(','));
+          // Remove the target to get the target value
+          inputString = inputString.Remove(0, inputString.IndexOf(',') + 1);
+
+          break;
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances/3.3/HeuristicLab.Problems.Instances-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances/3.3/HeuristicLab.Problems.Instances-3.3.csproj	(revision 11259)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances/3.3/HeuristicLab.Problems.Instances-3.3.csproj	(revision 11260)
@@ -119,4 +119,5 @@
     <Compile Include="IDataDescriptor.cs" />
     <Compile Include="Types\DistanceHelper.cs" />
+    <Compile Include="Types\OPData.cs" />
     <Compile Include="Types\VRP\MDCVRPTWData.cs" />
     <Compile Include="Types\VRP\MDCVRPData.cs" />
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances/3.3/Types/OPData.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances/3.3/Types/OPData.cs	(revision 11260)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Instances/3.3/Types/OPData.cs	(revision 11260)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.Problems.Instances.Types {
+  /// <summary>
+  /// Describes instances of the Orienteering Problem (OP).
+  /// </summary>
+  public class OPData : TSPData {
+    /// <summary>
+    /// The maximum distance constraint for a Orienteering solution.
+    /// </summary>
+    public double MaximumDistance { get; set; }
+    /// <summary>
+    /// The scores of the points.
+    /// </summary>
+    public double[] Scores { get; set; }
+    /// <summary>
+    /// The penalty for each visited vertex.
+    /// </summary>
+    public double FixedPenalty { get; set; }
+    /// <summary>
+    /// Index of the starting point
+    /// </summary>
+    public int StartingPoint { get; set; }
+    /// <summary>
+    /// Index of the ending point.
+    /// </summary>
+    public int TerminusPoint { get; set; }
+  }
+}
