/// <summary>
        /// Returns a Dictionary who's keys are Guids which represent Octgn Sets, and who's values are corresponding
        /// ConverterSet objects.  
        /// </summary>
        /// <param name="game">The Octgn.DataNew.Entities.Game object to use to read sets from</param>
        /// <returns>A Dictionary of Octgn Set Guids and corresponding ConverterSet objects</returns>
        private static Dictionary<Guid, ConverterSet> BuildCardDatabase(Octgn.DataNew.Entities.Game game)
        {
            if (game == null)
            {
                throw new ArgumentNullException();
            }

            // MTG has a property "MultiVerseId" which should be grabbed if it exists
            Octgn.DataNew.Entities.PropertyDef multiverseIdPropertyDef =
                game.CustomProperties.FirstOrDefault(p => p.Name.Equals("MultiVerseId", StringComparison.InvariantCultureIgnoreCase));

            Dictionary<Guid, ConverterSet> sets = new Dictionary<Guid, ConverterSet>();

            foreach (Octgn.DataNew.Entities.Set octgnSet in game.Sets())
            {
                sets[octgnSet.Id] = new ConverterSet(octgnSet);
                foreach (Octgn.DataNew.Entities.Card card in octgnSet.Cards)
                {
                    // Try to dig the MultiverseID property out of the Octgn.DataNew.Entities.Card
                    // During testing, all properties seemed nested under the first KeyValuePair in card.Properties
                    int multiverseID = 0;
                    if (multiverseIdPropertyDef != null)
                    {
                        if (card.Properties.Count > 0)
                        {
                            KeyValuePair<string, Octgn.DataNew.Entities.CardPropertySet> firstCardPropertyKVP = card.Properties.First();
                            object multiverseIdString = null;
                            if (firstCardPropertyKVP.Value.Properties.TryGetValue(multiverseIdPropertyDef, out multiverseIdString))
                            {
                                int.TryParse(multiverseIdString.ToString(), out multiverseID);
                            }
                        }
                    }

                    sets[octgnSet.Id].AddNewConverterCard
                    (
                        card.Id,
                        card.Name,
                        multiverseID
                    );
                }
            }

            foreach (KeyValuePair<Guid, ConverterSet> kvp in sets)
            {
                kvp.Value.SortConverterCards();

                if (SettingsManager.SingletonInstance.SetsExcludedFromSearches.Contains(kvp.Key))
                {
                    kvp.Value.IncludeInSearches = false;
                }
            }

            return sets;
        }
        /// <summary>
        /// Returns a Dictionary who's keys are Guids which represent Octgn Sets, and who's values are corresponding
        /// ConverterSet objects.  
        /// </summary>
        /// <param name="game">The Octgn.DataNew.Entities.Game object to use to read sets from</param>
        /// <returns>A Dictionary of Octgn Set Guids and corresponding ConverterSet objects</returns>
        private static Dictionary<Guid, ConverterSet> BuildCardDatabase(Octgn.DataNew.Entities.Game game)
        {
            if (game == null)
            {
                throw new ArgumentNullException();
            }

            // MTG has a property "MultiVerseId" which should be grabbed if it exists
            Octgn.DataNew.Entities.PropertyDef multiverseIdPropertyDef =
                game.CustomProperties.FirstOrDefault(p => p.Name.Equals("MultiVerseId", StringComparison.InvariantCultureIgnoreCase));

            Dictionary<Guid, ConverterSet> sets = new Dictionary<Guid, ConverterSet>();

            foreach (Octgn.DataNew.Entities.Set octgnSet in game.Sets())
            {
                sets[octgnSet.Id] = new ConverterSet(octgnSet);
                foreach (Octgn.DataNew.Entities.Card card in octgnSet.Cards)
                {
                    // Try to dig the MultiverseID property out of the Octgn.DataNew.Entities.Card
                    // During testing, all properties seemed nested under the first KeyValuePair in card.Properties
                    int multiverseID = 0;
                    if (multiverseIdPropertyDef != null)
                    {
                        if (card.Properties.Count > 0)
                        {
                            KeyValuePair<string, Octgn.DataNew.Entities.CardPropertySet> firstCardPropertyKVP = card.Properties.First();
                            object multiverseIdString = null;
                            if (firstCardPropertyKVP.Value.Properties.TryGetValue(multiverseIdPropertyDef, out multiverseIdString))
                            {
                                int.TryParse(multiverseIdString.ToString(), out multiverseID);
                            }
                        }
                    }

                    string name = card.Name;

                    // CoC uses special characters at the beginning of the card name to represent properties such as Unique and Steadfast.
                    // These characters should not be included as part of the name for comparison.
                    if (game.Id == ConvertEngine.Game.CoC.GameGuidStatic)
                    {
                        name = name.Trim(new Char[] { '{', '}', '[', ']', '<', '>', '_', '^', '*', ' ' });
                    }

                    sets[octgnSet.Id].AddNewConverterCard
                    (
                        card.Id,
                        name,
                        multiverseID
                    );
                }
            }

            foreach (KeyValuePair<Guid, ConverterSet> kvp in sets)
            {
                kvp.Value.SortConverterCards();

                if (SettingsManager.SingletonInstance.SetsExcludedFromSearches.Contains(kvp.Key))
                {
                    kvp.Value.IncludeInSearches = false;
                }
            }

            return sets;
        }