/// <summary>
        /// Returns Broombridge deserialized into the current version data structure.
        /// Data structure is automatically updated to the current Broombridge version.
        /// </summary>
        /// <param name="filename">Broombridge file address.</param>
        /// <returns>Deserializer Broombridge data strauture.</returns>
        public static Data DeserializeBroombridge(string filename)
        {
            VersionNumber versionNumber = GetVersionNumber(filename);
            var           output        = new V0_2.Data();

            if (versionNumber == VersionNumber.v0_1)
            {
                output = DataStructures.Update(Deserialize <V0_1.Data>(filename));
            }
            else if (versionNumber == VersionNumber.v0_2)
            {
                output = Deserialize <V0_2.Data>(filename);
            }
            else
            {
                throw new System.InvalidOperationException("Unrecognized Broombridge version number.");
            }
            return(new Data(output));
        }
        /// <summary>
        /// Returns Broombridge deserialized into the current version data structure.
        /// Data structure is automatically updated to the current Broombridge version.
        /// </summary>
        /// <param name="reader">Stream for reading Broombridge data.</param>
        /// <returns>Deserializer Broombridge data structure.</returns>
        public static Data DeserializeBroombridge(TextReader reader)
        {
            // We'll need the stream twice: once to get the version of
            // Broombridge used to serialize the data,
            // and again to actually deserialize once we know the right
            // version. Since we can't actually duplicate the stream,
            // we'll read into memory first, then use a string reader
            // in both cases.
            var rawData       = reader.ReadToEnd();
            var versionNumber = GetVersionNumber(new StringReader(rawData));
            var stringReader  = new StringReader(rawData);

            return(new Data(
                       versionNumber switch
            {
                VersionNumber.v0_1 => DataStructures.Update(
                    Deserialize <V0_1.Data>(stringReader)
                    ),
                VersionNumber.v0_2 => Deserialize <V0_2.Data>(stringReader),
                _ => throw new System.InvalidOperationException(
                    "Unrecognized Broombridge version number."
                    )
            }